201 lines
8.2 KiB
Python
201 lines
8.2 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
###############################################################################
|
|
|
|
import xbmc
|
|
import xbmcgui
|
|
import xbmcaddon
|
|
|
|
import utils
|
|
import clientinfo
|
|
import downloadutils
|
|
import userclient
|
|
|
|
import PlexAPI
|
|
|
|
###############################################################################
|
|
|
|
|
|
@utils.logging
|
|
class InitialSetup():
|
|
|
|
def __init__(self):
|
|
|
|
self.addon = xbmcaddon.Addon()
|
|
self.__language__ = self.addon.getLocalizedString
|
|
|
|
self.clientInfo = clientinfo.ClientInfo()
|
|
self.addonId = self.clientInfo.getAddonId()
|
|
self.doUtils = downloadutils.DownloadUtils()
|
|
self.userClient = userclient.UserClient()
|
|
self.plx = PlexAPI.PlexAPI()
|
|
|
|
def setup(self):
|
|
"""
|
|
Initial setup. Run once upon startup.
|
|
Check server, user, direct paths, music, direct stream if not direct
|
|
path.
|
|
"""
|
|
# SERVER INFO #####
|
|
self.logMsg("Initial setup called.", 0)
|
|
server = self.userClient.getServer()
|
|
clientId = self.clientInfo.getDeviceId()
|
|
serverid = utils.settings('plex_machineIdentifier')
|
|
myplexlogin, plexhome, plexLogin, plexToken = \
|
|
self.plx.GetPlexLoginFromSettings()
|
|
dialog = xbmcgui.Dialog()
|
|
|
|
# Optionally sign into plex.tv. Will not be called on very first run
|
|
# as plexToken will be ''
|
|
if plexToken and myplexlogin == 'true':
|
|
chk = self.plx.CheckConnection('plex.tv', plexToken)
|
|
# HTTP Error: unauthorized
|
|
if chk == 401:
|
|
dialog.ok(
|
|
self.addonName,
|
|
'Could not login to plex.tv.',
|
|
'Please try signing in again.'
|
|
)
|
|
result = self.plx.PlexTvSignInWithPin()
|
|
if result:
|
|
plexLogin = result['username']
|
|
plexToken = result['token']
|
|
elif chk is False or chk >= 400:
|
|
dialog.ok(
|
|
self.addonName,
|
|
'Problems connecting to plex.tv.',
|
|
'Network or internet issue?'
|
|
)
|
|
# If a Plex server IP has already been set, return.
|
|
if server:
|
|
self.logMsg("Server is already set.", 0)
|
|
self.logMsg("url: %s, Plex machineIdentifier: %s"
|
|
% (server, serverid), 0)
|
|
return
|
|
|
|
# If not already retrieved myplex info, optionally let user sign in
|
|
# to plex.tv.
|
|
if not plexToken and myplexlogin == 'true':
|
|
result = self.plx.PlexTvSignInWithPin()
|
|
if result:
|
|
plexLogin = result['username']
|
|
plexToken = result['token']
|
|
# Get g_PMS list of servers (saved to plx.g_PMS)
|
|
while True:
|
|
tokenDict = {'MyPlexToken': plexToken} if plexToken else {}
|
|
# Populate g_PMS variable with the found Plex servers
|
|
self.plx.discoverPMS(clientId,
|
|
None,
|
|
xbmc.getIPAddress(),
|
|
tokenDict=tokenDict)
|
|
self.logMsg("Result of setting g_PMS variable: %s"
|
|
% self.plx.g_PMS, 2)
|
|
isconnected = False
|
|
serverlist = self.plx.returnServerList(clientId, self.plx.g_PMS)
|
|
# Let user pick server from a list
|
|
# Get a nicer list
|
|
dialoglist = []
|
|
# Exit if no servers found
|
|
if len(serverlist) == 0:
|
|
dialog.ok(
|
|
self.addonName,
|
|
'Could not find any Plex server in the network.'
|
|
'Aborting...'
|
|
)
|
|
break
|
|
for server in serverlist:
|
|
if server['local'] == '1':
|
|
# server is in the same network as client
|
|
dialoglist.append(str(server['name']) + ' (nearby)')
|
|
else:
|
|
dialoglist.append(str(server['name']))
|
|
resp = dialog.select(
|
|
'Choose your Plex server',
|
|
dialoglist)
|
|
server = serverlist[resp]
|
|
activeServer = server['machineIdentifier']
|
|
url = server['scheme'] + '://' + server['ip'] + ':' + \
|
|
server['port']
|
|
# Deactive SSL verification if the server is local!
|
|
if server['local'] == '1':
|
|
utils.settings('sslverify', 'false')
|
|
self.logMsg("Setting SSL verify to false, because server is "
|
|
"local", 1)
|
|
else:
|
|
utils.settings('sslverify', 'true')
|
|
self.logMsg("Setting SSL verify to true, because server is "
|
|
"not local", 1)
|
|
chk = self.plx.CheckConnection(url, server['accesstoken'])
|
|
# Unauthorized
|
|
if chk == 401:
|
|
dialog.ok(self.addonName,
|
|
'Not yet authorized for Plex server %s'
|
|
% str(server['name']),
|
|
'Please sign in to plex.tv.')
|
|
result = self.plx.PlexTvSignInWithPin()
|
|
if result:
|
|
plexLogin = result['username']
|
|
plexToken = result['token']
|
|
else:
|
|
# Exit while loop if user cancels
|
|
break
|
|
# Problems connecting
|
|
elif chk >= 400 or chk is False:
|
|
resp = dialog.yesno(self.addonName,
|
|
'Problems connecting to server.',
|
|
'Pick another server?')
|
|
# Exit while loop if user chooses No
|
|
if not resp:
|
|
break
|
|
# Otherwise: connection worked!
|
|
else:
|
|
isconnected = True
|
|
break
|
|
if not isconnected:
|
|
# Enter Kodi settings instead
|
|
xbmc.executebuiltin('Addon.OpenSettings(%s)' % self.addonId)
|
|
return
|
|
# Write to Kodi settings file
|
|
utils.settings('plex_machineIdentifier', activeServer)
|
|
utils.settings('ipaddress', server['ip'])
|
|
utils.settings('port', server['port'])
|
|
if server['scheme'] == 'https':
|
|
utils.settings('https', 'true')
|
|
else:
|
|
utils.settings('https', 'false')
|
|
self.logMsg("Wrote to Kodi user settings file:", 0)
|
|
self.logMsg("PMS machineIdentifier: %s, ip: %s, port: %s, https: %s "
|
|
% (activeServer, server['ip'], server['port'],
|
|
server['scheme']), 0)
|
|
|
|
# ADDITIONAL PROMPTS #####
|
|
directPaths = dialog.yesno(
|
|
heading="%s: Playback Mode" % self.addonName,
|
|
line1=(
|
|
"Caution! If you choose Native mode, you "
|
|
"will probably lose access to certain Plex "
|
|
"features."),
|
|
nolabel="Addon (Default)",
|
|
yeslabel="Native (Direct Paths)")
|
|
if directPaths:
|
|
self.logMsg("User opted to use direct paths.", 1)
|
|
utils.settings('useDirectPaths', value="1")
|
|
|
|
musicDisabled = dialog.yesno(
|
|
heading="%s: Music Library" % self.addonName,
|
|
line1="Disable Plex music library?")
|
|
if musicDisabled:
|
|
self.logMsg("User opted to disable Plex music library.", 1)
|
|
utils.settings('enableMusic', value="false")
|
|
else:
|
|
# Only prompt if the user didn't select direct paths for videos
|
|
if not directPaths:
|
|
musicAccess = dialog.yesno(
|
|
heading="%s: Music Library" % self.addonName,
|
|
line1=(
|
|
"Direct stream the music library? Select "
|
|
"this option only if you plan on listening "
|
|
"to music outside of your network."))
|
|
if musicAccess:
|
|
self.logMsg("User opted to direct stream music.", 1)
|
|
utils.settings('streamMusic', value="true")
|