def ATTRIB_URL(self, src, srcXML, param): key, leftover, dfltd = self.getKey(src, srcXML, param) res = 'http://' + g_param['HostOfPlexConnect'] # base address to PlexConnect if key.endswith('.js'): # link to PlexConnect owned .js stuff pass elif key.startswith('http://'): # external server parts = urlparse.urlsplit(key) # (scheme, networklocation, path, ...) key = urlparse.urlunsplit(('', '', parts[2], parts[3], parts[4])) # keep path only PMS_uuid = PlexAPI.getPMSFromIP(g_param['PMS_list'], parts.hostname) PMSaddress = PlexAPI.getAddress(g_param['PMS_list'], PMS_uuid) # get PMS address (might be local as well!?!) res = res + '/PMS(' + quote_plus(PMSaddress) + ')' else: # include current PMS address res = res + '/PMS(' + quote_plus(self.PMSaddress) + ')' if key.startswith('/'): # internal full path. res = res + key elif key == '': # internal path res = res + self.path[srcXML] else: # internal path, add-on res = res + self.path[srcXML] + '/' + key return res
def XML_PMS2aTV(PMSaddress, path, options): # double check aTV UDID, redo from client IP if needed/possible if not 'PlexConnectUDID' in options: UDID = getATVFromIP(options['aTVAddress']) if UDID: options['PlexConnectUDID'] = UDID else: declareATV(options['PlexConnectUDID'], options['aTVAddress']) # update with latest info # double check PMS IP address # the hope is: aTV sends either PMS address coded into URL or UDID in options if PMSaddress=='': if 'PlexConnectUDID' in options: PMS_uuid = g_ATVSettings.getSetting(options['PlexConnectUDID'], 'pms_uuid') PMS_list = g_param['PMS_list'] PMSaddress = PlexAPI.getAddress(PMS_list, PMS_uuid) # check cmd to work on cmd = '' if 'PlexConnect' in options: cmd = options['PlexConnect'] dprint(__name__, 1, "PlexConnect Cmd: "+cmd) # check aTV language setting if not 'aTVLanguage' in options: dprint(__name__, 1, "no aTVLanguage - pick en") options['aTVLanguage'] = 'en' # XML Template selector # - PlexConnect command # - path # - PMS ViewGroup XMLtemplate = '' PMS = None PMSroot = None # XML direct request or # XMLtemplate defined by solely PlexConnect Cmd if path.endswith(".xml"): XMLtemplate = path.lstrip('/') path = '' # clear path - we don't need PMS-XML elif cmd=='Play': XMLtemplate = 'PlayVideo.xml' elif cmd=='PlayVideo_ChannelsV1': dprint(__name__, 1, "playing Channels XML Version 1: {0}".format(path)) return XML_PlayVideo_ChannelsV1(PMSaddress, path) # direct link, no PMS XML available elif cmd=='PhotoBrowser': XMLtemplate = 'Photo_Browser.xml' elif cmd=='MoviePreview': XMLtemplate = 'MoviePreview.xml' elif cmd=='MoviePrePlay': XMLtemplate = 'MoviePrePlay.xml' elif cmd=='EpisodePrePlay': XMLtemplate = 'EpisodePrePlay.xml' elif cmd=='ChannelPrePlay': XMLtemplate = 'ChannelPrePlay.xml' elif cmd=='Channels': XMLtemplate = 'Channels.xml' elif cmd=='ChannelsVideo': XMLtemplate = 'ChannelsVideo.xml' elif cmd=='ByFolder': XMLtemplate = 'ByFolder.xml' elif cmd == 'MovieSection': XMLtemplate = 'MovieSection.xml' elif cmd == 'TVSection': XMLtemplate = 'TVSection.xml' elif cmd.find('SectionPreview') != -1: XMLtemplate = cmd + '.xml' elif cmd == 'AllMovies': XMLtemplate = 'Movie_'+g_ATVSettings.getSetting(options['PlexConnectUDID'], 'movieview')+'.xml' elif cmd == 'MovieSecondary': XMLtemplate = 'MovieSecondary.xml' elif cmd == 'AllShows': XMLtemplate = 'Show_'+g_ATVSettings.getSetting(options['PlexConnectUDID'], 'showview')+'.xml' elif cmd == 'TVSecondary': XMLtemplate = 'TVSecondary.xml' elif cmd == 'PhotoSecondary': XMLtemplate = 'PhotoSecondary.xml' elif cmd == 'Directory': XMLtemplate = 'Directory.xml' elif cmd == 'DirectoryWithPreview': XMLtemplate = 'DirectoryWithPreview.xml' elif cmd == 'DirectoryWithPreviewActors': XMLtemplate = 'DirectoryWithPreviewActors.xml' elif cmd=='Settings': XMLtemplate = 'Settings.xml' path = '' # clear path - we don't need PMS-XML elif cmd=='SettingsVideoOSD': XMLtemplate = 'Settings_VideoOSD.xml' path = '' # clear path - we don't need PMS-XML elif cmd=='SettingsMovies': XMLtemplate = 'Settings_Movies.xml' path = '' # clear path - we don't need PMS-XML elif cmd=='SettingsTVShows': XMLtemplate = 'Settings_TVShows.xml' path = '' # clear path - we don't need PMS-XML elif cmd.startswith('SettingsToggle:'): opt = cmd[len('SettingsToggle:'):] # cut command: parts = opt.split('+') g_ATVSettings.toggleSetting(options['PlexConnectUDID'], parts[0].lower()) XMLtemplate = parts[1] + ".xml" dprint(__name__, 2, "ATVSettings->Toggle: {0} in template: {1}", parts[0], parts[1]) path = '' # clear path - we don't need PMS-XML elif cmd==('MyPlexLogin'): dprint(__name__, 2, "MyPlex->Logging In...") if not 'PlexConnectCredentials' in options: return XML_Error('PlexConnect', 'MyPlex Sign In called without Credentials.') parts = options['PlexConnectCredentials'].split(':',1) (username, auth_token) = PlexAPI.MyPlexSignIn(parts[0], parts[1], options) UDID = options['PlexConnectUDID'] g_ATVSettings.setSetting(UDID, 'myplex_user', username) g_ATVSettings.setSetting(UDID, 'myplex_auth', auth_token) XMLtemplate = 'Settings.xml' path = '' # clear path - we don't need PMS-XML elif cmd=='MyPlexLogout': dprint(__name__, 2, "MyPlex->Logging Out...") UDID = options['PlexConnectUDID'] auth_token = g_ATVSettings.getSetting(UDID, 'myplex_auth') PlexAPI.MyPlexSignOut(auth_token) g_ATVSettings.setSetting(UDID, 'myplex_user', '') g_ATVSettings.setSetting(UDID, 'myplex_auth', '') XMLtemplate = 'Settings.xml' path = '' # clear path - we don't need PMS-XML elif cmd.startswith('Discover'): discoverPMS() XMLtemplate = 'Settings.xml' path = '' # clear path - we don't need PMS-XML elif path.startswith('/search?'): XMLtemplate = 'Search_Results.xml' """ # check PMS availability # todo: re-discover needs to be done differently... how to trigger? PMS_list = g_param['PMS_list'] PMS_uuid = g_ATVSettings.getSetting(options['PlexConnectUDID'], 'pms_uuid') # we need PMS but don't see selected one: re-discover (PlexGDM) if not path=='' and not PMS_uuid in PMS_list: if not discoverPMS(): return XML_Error('PlexConnect', 'No Plex Media Server in Proximity') PMS_list = g_param['PMS_list'] g_ATVSettings.checkSetting(options['PlexConnectUDID'], 'pms_uuid') # verify PMS_uuid PMS_uuid = g_ATVSettings.getSetting(options['PlexConnectUDID'], 'pms_uuid') PMSaddress = '?' # todo: """ # request PMS XML if not path=='': if 'PlexConnectUDID' in options: UDID = options['PlexConnectUDID'] auth_token = g_ATVSettings.getSetting(UDID, 'myplex_auth') else: auth_token = '' PMS = PlexAPI.getXMLFromPMS(PMSaddress, path, options, authtoken=auth_token) if PMS==False: return XML_Error('PlexConnect', 'No Response from Plex Media Server') PMSroot = PMS.getroot() dprint(__name__, 1, "viewGroup: "+PMSroot.get('ViewGroup','None')) # XMLtemplate defined by PMS XML content if path=='': pass # nothing to load elif not XMLtemplate=='': pass # template already selected elif PMSroot.get('viewGroup','')=="secondary" and (PMSroot.get('art','').find('movie') != -1 or PMSroot.get('thumb','').find('movie') != -1): XMLtemplate = 'MovieSectionTopLevel.xml' elif PMSroot.get('viewGroup','')=="secondary" and (PMSroot.get('art','').find('show') != -1 or PMSroot.get('thumb','').find('show') != -1): XMLtemplate = 'TVSectionTopLevel.xml' elif PMSroot.get('viewGroup','')=="secondary" and (PMSroot.get('art','').find('photo') != -1 or PMSroot.get('thumb','').find('photo') != -1): XMLtemplate = 'PhotoSectionTopLevel.xml' elif PMSroot.get('viewGroup','')=="secondary": XMLtemplate = 'Directory.xml' elif PMSroot.get('viewGroup','')=='show': if PMSroot.get('title2')=='By Folder': # By Folder View XMLtemplate = 'ByFolder.xml' else: # TV Show grid view XMLtemplate = 'Show_'+g_ATVSettings.getSetting(options['PlexConnectUDID'], 'showview')+'.xml' elif PMSroot.get('viewGroup','')=='season': # TV Season view XMLtemplate = 'Season_'+g_ATVSettings.getSetting(options['PlexConnectUDID'], 'seasonview')+'.xml' elif PMSroot.get('viewGroup','')=='movie': if PMSroot.get('title2')=='By Folder': # By Folder View XMLtemplate = 'ByFolder.xml' else: # Movie listing XMLtemplate = 'Movie_'+g_ATVSettings.getSetting(options['PlexConnectUDID'], 'movieview')+'.xml' elif PMSroot.get('viewGroup','')=='track': XMLtemplate = 'Music_Track.xml' elif PMSroot.get('viewGroup','')=='episode': if PMSroot.get('title2')=='On Deck' or \ PMSroot.get('title2')=='Recently Viewed Episodes' or \ PMSroot.get('title2')=='Recently Aired' or \ PMSroot.get('title2')=='Recently Added': # TV On Deck View XMLtemplate = 'TV_OnDeck.xml' else: # TV Episode view XMLtemplate = 'Episode.xml' elif PMSroot.get('viewGroup','')=='photo': # Photo listing XMLtemplate = 'Photo.xml' else: XMLtemplate = 'Directory.xml' dprint(__name__, 1, "XMLTemplate: "+XMLtemplate) # get XMLtemplate aTVTree = etree.parse(sys.path[0]+'/assets/templates/'+XMLtemplate) aTVroot = aTVTree.getroot() # convert PMS XML to aTV XML using provided XMLtemplate global g_CommandCollection g_CommandCollection = CCommandCollection(options, PMSroot, PMSaddress, path) XML_ExpandTree(aTVroot, PMSroot, 'main') XML_ExpandAllAttrib(aTVroot, PMSroot, 'main') del g_CommandCollection dprint(__name__, 1, "====== generated aTV-XML ======") dprint(__name__, 1, prettyXML(aTVTree)) dprint(__name__, 1, "====== aTV-XML finished ======") return etree.tostring(aTVroot)