diff --git a/default.py b/default.py index bfc9b517..fe646441 100644 --- a/default.py +++ b/default.py @@ -102,9 +102,11 @@ class Main(): 'ondeck': entrypoint.getOnDeck, 'chooseServer': entrypoint.chooseServer, 'watchlater': entrypoint.watchlater, + 'channels': entrypoint.channels, 'enterPMS': entrypoint.enterPMS, 'togglePlexTV': entrypoint.togglePlexTV, - 'Plex_Node': entrypoint.Plex_Node + 'Plex_Node': entrypoint.Plex_Node, + 'browse_plex_folder': entrypoint.browse_plex_folder } if "/extrafanart" in argv[0]: @@ -134,10 +136,10 @@ class Main(): elif mode in ("nextup", "inprogressepisodes"): limit = int(params['limit']) modes[mode](params['tagname'], limit) - - elif mode in ("channels","getsubfolders"): + + elif mode in ("getsubfolders"): modes[mode](itemid) - + elif mode == "browsecontent": modes[mode](itemid, params.get('type'), params.get('folderid')) @@ -162,6 +164,8 @@ class Main(): elif mode == 'Plex_Node': modes[mode](params.get('id'), params.get('viewOffset')) + elif mode == 'browse_plex_folder': + modes[mode](params.get('id')) else: modes[mode]() else: diff --git a/resources/lib/entrypoint.py b/resources/lib/entrypoint.py index 2aa33cd3..50eae44b 100644 --- a/resources/lib/entrypoint.py +++ b/resources/lib/entrypoint.py @@ -106,7 +106,10 @@ def Plex_Node(url, viewOffset, playdirectly=False, node=True): log.info('Plex_Node called with url: %s, viewOffset: %s' % (url, viewOffset)) # Plex redirect, e.g. watch later. Need to get actual URLs - xml = downloadutils.DownloadUtils().downloadUrl(url) + if url.startswith('http'): + xml = downloadutils.DownloadUtils().downloadUrl(url) + else: + xml = downloadutils.DownloadUtils().downloadUrl('{server}%s' % url) try: xml[0].attrib except: @@ -194,6 +197,9 @@ def doMainListing(): # Plex Watch later addDirectoryItem(lang(39211), "plugin://plugin.video.plexkodiconnect/?mode=watchlater") + # Plex Channels + addDirectoryItem(lang(30173), + "plugin://plugin.video.plexkodiconnect/?mode=channels") # Plex user switch addDirectoryItem(lang(39200) + window('plex_username'), "plugin://plugin.video.plexkodiconnect/" @@ -927,6 +933,85 @@ def watchlater(): cacheToDisc=settings('enableTextureCache') == 'true') +def channels(): + """ + Listing for Plex Channels + """ + if window('plex_restricteduser') == 'true': + log.error('No Plex Channels - restricted user') + return xbmcplugin.endOfDirectory(HANDLE, False) + + xml = downloadutils.DownloadUtils().downloadUrl('{server}/channels/all') + try: + xml[0].attrib + except (ValueError, AttributeError, IndexError): + log.error('Could not download Plex Channels') + return xbmcplugin.endOfDirectory(HANDLE, False) + + log.info('Displaying Plex Channels') + xbmcplugin.setContent(HANDLE, 'files') + for item in xml: + __build_folder(item) + xbmcplugin.endOfDirectory( + handle=HANDLE, + cacheToDisc=settings('enableTextureCache') == 'true') + + +def browse_plex_folder(key): + """ + Lists the content of a Plex folder, e.g. channels + """ + xml = downloadutils.DownloadUtils().downloadUrl('{server}%s' % key) + try: + xml[0].attrib + except (ValueError, AttributeError, IndexError): + log.error('Could not browse to %s' % key) + return xbmcplugin.endOfDirectory(HANDLE, False) + xbmcplugin.setContent(HANDLE, 'files') + for item in xml: + if item.tag == 'Directory': + __build_folder(item) + else: + __build_item(item) + xbmcplugin.endOfDirectory( + handle=HANDLE, + cacheToDisc=settings('enableTextureCache') == 'true') + + +def __build_folder(xml_element): + url = "plugin://plugin.video.plexkodiconnect/" + params = { + 'mode': "browse_plex_folder", + 'id': xml_element.attrib.get('key') + } + listitem = ListItem(xml_element.attrib.get('title')) + listitem.setArt({'thumb': xml_element.attrib.get('thumb'), + 'poster': xml_element.attrib.get('art')}) + xbmcplugin.addDirectoryItem( + handle=HANDLE, + url="%s?%s" % (url, urlencode(params)), + isFolder=True, + listitem=listitem) + + +def __build_item(xml_element): + url = "plugin://plugin.video.plexkodiconnect/" + api = API(xml_element) + listitem = api.CreateListItemFromPlexItem() + api.AddStreamInfo(listitem) + api.set_listitem_artwork(listitem) + params = { + 'mode': "Plex_Node", + 'id': xml_element.attrib.get('key'), + 'viewOffset': xml_element.attrib.get('viewOffset', '0'), + 'plex_type': xml_element.attrib.get('type') + } + xbmcplugin.addDirectoryItem( + handle=HANDLE, + url="%s?%s" % (url, urlencode(params)), + listitem=listitem) + + def enterPMS(): """ Opens dialogs for the user the plug in the PMS details