From 897780f059b2071405f4d8b5a31b87e67a33278f Mon Sep 17 00:00:00 2001 From: angelblue05 Date: Thu, 3 Mar 2016 23:32:33 -0600 Subject: [PATCH 01/10] Fix views GroupedFolders sometimes return empty, even if the user's views are grouped (seems like a bug). Added a failsafe. --- resources/lib/librarysync.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/resources/lib/librarysync.py b/resources/lib/librarysync.py index 4ac5cdea..b40d5507 100644 --- a/resources/lib/librarysync.py +++ b/resources/lib/librarysync.py @@ -382,8 +382,9 @@ class LibrarySync(threading.Thread): result = doUtils(url) grouped_views = result['Items'] ordered_views = emby.getViews(sortedlist=True) - sorted_views = [] + all_views = [] for view in ordered_views: + all_views.append(view['name']) if view['type'] == "music": continue @@ -392,13 +393,6 @@ class LibrarySync(threading.Thread): sorted_views.append(view['name']) log("Sorted views: %s" % sorted_views, 1) - try: - groupedFolders = self.user.userSettings['Configuration']['GroupedFolders'] - except TypeError: - url = "{server}/emby/Users/{UserId}?format=json" - result = doUtils(url) - groupedFolders = result['Configuration']['GroupedFolders'] - # total nodes for window properties vnodes.clearProperties() totalnodes = len(sorted_views) + 0 @@ -427,12 +421,12 @@ class LibrarySync(threading.Thread): foldername = folder['name'] viewtype = folder['type'] - if folderid in groupedFolders: + if foldername not in all_views: # Media folders are grouped into userview url = "{server}/emby/Users/{UserId}/Items?format=json" params = { - 'ParentId': folderid, + 'Recursive': True, 'Limit': 1, 'IncludeItemTypes': emby_mediatypes[mediatype] } # Get one item from server using the folderid @@ -460,6 +454,12 @@ class LibrarySync(threading.Thread): sorted_views.append(foldername) log("Couldn't find corresponding grouped view: %s" % sorted_views, 1) + # Failsafe + try: + sorted_views.index(foldername) + except ValueError: + sorted_views.append(foldername) + # Get current media folders from emby database view = emby_db.getView_byId(folderid) try: From 48950820792fa9176c466908654f8df708a430c9 Mon Sep 17 00:00:00 2001 From: angelblue05 Date: Thu, 3 Mar 2016 23:54:53 -0600 Subject: [PATCH 02/10] Fix typo Accidentally pasted over line --- resources/lib/librarysync.py | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/lib/librarysync.py b/resources/lib/librarysync.py index b40d5507..4b885ca9 100644 --- a/resources/lib/librarysync.py +++ b/resources/lib/librarysync.py @@ -383,6 +383,7 @@ class LibrarySync(threading.Thread): grouped_views = result['Items'] ordered_views = emby.getViews(sortedlist=True) all_views = [] + sorted_views = [] for view in ordered_views: all_views.append(view['name']) if view['type'] == "music": From b05033c9b848f47a23224a8c0ccfcc4cd5b9c535 Mon Sep 17 00:00:00 2001 From: angelblue05 Date: Fri, 4 Mar 2016 03:00:25 -0600 Subject: [PATCH 03/10] Fix unicode and invalid handle --- resources/lib/entrypoint.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/resources/lib/entrypoint.py b/resources/lib/entrypoint.py index 652d089f..d6d03cab 100644 --- a/resources/lib/entrypoint.py +++ b/resources/lib/entrypoint.py @@ -456,10 +456,10 @@ def BrowseContent(viewname, type="", folderid=""): if not folderid: views = emby.getViews(type) for view in views: - if view.get("name") == viewname: + if view.get("name") == viewname.decode('utf-8'): folderid = view.get("id") - utils.logMsg("BrowseContent","viewname: %s - type: %s - folderid: %s - filter: %s" %(viewname, type, folderid, filter)) + utils.logMsg("BrowseContent","viewname: %s - type: %s - folderid: %s - filter: %s" %(viewname.decode('utf-8'), type.decode('utf-8'), folderid.decode('utf-8'), filter.decode('utf-8'))) #set the correct params for the content type #only proceed if we have a folderid if folderid: @@ -494,14 +494,13 @@ def BrowseContent(viewname, type="", folderid=""): li = createListItemFromEmbyItem(item,art,doUtils) if item.get("IsFolder") == True: #for folders we add an additional browse request, passing the folderId - path = "%s?id=%s&mode=browsecontent&type=%s&folderid=%s" % (sys.argv[0], viewname, type, item.get("Id")) + path = "%s?id=%s&mode=browsecontent&type=%s&folderid=%s" % (sys.argv[0].decode('utf-8'), viewname.decode('utf-8'), type.decode('utf-8'), item.get("Id").decode('utf-8')) xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=path, listitem=li, isFolder=True) else: #playable item, set plugin path and mediastreams xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=li.getProperty("path"), listitem=li) - xbmcplugin.endOfDirectory(handle=int(sys.argv[1])) if filter == "recent": xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_DATE) else: @@ -510,6 +509,8 @@ def BrowseContent(viewname, type="", folderid=""): xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_VIDEO_RATING) xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_VIDEO_RUNTIME) + xbmcplugin.endOfDirectory(handle=int(sys.argv[1])) + ##### CREATE LISTITEM FROM EMBY METADATA ##### def createListItemFromEmbyItem(item,art=artwork.Artwork(),doUtils=downloadutils.DownloadUtils()): API = api.API(item) From c04a0bab64da34369d64798b1f18054da475d2bb Mon Sep 17 00:00:00 2001 From: angelblue05 Date: Fri, 4 Mar 2016 04:08:42 -0600 Subject: [PATCH 04/10] update url --- addon.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addon.xml b/addon.xml index 246aea0f..5fd8a5a3 100644 --- a/addon.xml +++ b/addon.xml @@ -28,7 +28,7 @@ en GNU GENERAL PUBLIC LICENSE. Version 2, June 1991 - http://mediabrowser.tv/ + http://emby.media/ Welcome to Emby for Kodi A whole new way to manage and view your media library. The Emby addon for Kodi combines the best of Kodi - ultra smooth navigation, beautiful UIs and playback of any file under the sun, and Emby - the most powerful fully open source multi-client media metadata indexer and server. Emby for Kodi is the absolute best way to enjoy the incredible Kodi playback engine combined with the power of Emby's centralized database. Features: Direct integration with the Kodi library for native Kodi speed Instant synchronization with the Emby server Full support for Movie, TV and Music collections Emby Server direct stream and transcoding support - use Kodi when you are away from home! From 3c36af932a6f626b4f10c80e62c01bd887b63dd4 Mon Sep 17 00:00:00 2001 From: marcelveldt Date: Fri, 4 Mar 2016 14:03:15 +0100 Subject: [PATCH 05/10] fix extrafanart for homescreen widgets --- default.py | 4 +++- resources/lib/entrypoint.py | 19 +++++-------------- resources/lib/musicutils.py | 2 +- 3 files changed, 9 insertions(+), 16 deletions(-) diff --git a/default.py b/default.py index eeb99c00..24e845cc 100644 --- a/default.py +++ b/default.py @@ -67,7 +67,9 @@ class Main: } if "extrafanart" in sys.argv[0]: - entrypoint.getExtraFanArt() + embypath = sys.argv[2][1:] + embyid = params.get('id',[""])[0] + entrypoint.getExtraFanArt(embyid,embypath) if modes.get(mode): # Simple functions diff --git a/resources/lib/entrypoint.py b/resources/lib/entrypoint.py index 652d089f..5fe9ea67 100644 --- a/resources/lib/entrypoint.py +++ b/resources/lib/entrypoint.py @@ -951,27 +951,18 @@ def getRecentEpisodes(tagname, limit): xbmcplugin.endOfDirectory(handle=int(sys.argv[1])) ##### GET EXTRAFANART FOR LISTITEM ##### -def getExtraFanArt(): +def getExtraFanArt(embyId,embyPath): emby = embyserver.Read_EmbyServer() art = artwork.Artwork() - embyId = "" # Get extrafanart for listitem # will be called by skinhelper script to get the extrafanart try: # for tvshows we get the embyid just from the path - if xbmc.getCondVisibility("Container.Content(tvshows) | Container.Content(seasons) | Container.Content(episodes)"): - itemPath = xbmc.getInfoLabel("ListItem.Path").decode('utf-8') - if "plugin.video.emby" in itemPath: - embyId = itemPath.split("/")[-2] - else: - #for movies we grab the emby id from the params - itemPath = xbmc.getInfoLabel("ListItem.FileNameAndPath").decode('utf-8') - if "plugin.video.emby" in itemPath: - params = urlparse.parse_qs(itemPath) - embyId = params.get('id') - if embyId: embyId = embyId[0] + if not embyId: + if "plugin.video.emby" in embyPath: + embyId = embyPath.split("/")[-2] if embyId: #only proceed if we actually have a emby id @@ -1015,7 +1006,7 @@ def getExtraFanArt(): url=fanartFile, listitem=li) except Exception as e: - utils.logMsg("EMBY", "Error getting extrafanart: %s" % e, 1) + utils.logMsg("EMBY", "Error getting extrafanart: %s" % e, 0) # Always do endofdirectory to prevent errors in the logs xbmcplugin.endOfDirectory(int(sys.argv[1])) \ No newline at end of file diff --git a/resources/lib/musicutils.py b/resources/lib/musicutils.py index 92fbaf66..c58cb245 100644 --- a/resources/lib/musicutils.py +++ b/resources/lib/musicutils.py @@ -214,7 +214,7 @@ def getSongTags(file): except Exception as e: #file in use ? - logMsg("Exception in getSongTags %s" %e,0) + utils.logMsg("Exception in getSongTags", str(e),0) rating = None #remove tempfile if needed.... From 36007a1e7d46ad2358bd47f2dd1812cba9b45370 Mon Sep 17 00:00:00 2001 From: marcelveldt Date: Fri, 4 Mar 2016 22:00:24 +0100 Subject: [PATCH 06/10] preparation of videoextras --- default.py | 8 ++++++-- resources/lib/entrypoint.py | 26 ++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/default.py b/default.py index 24e845cc..40c4edf4 100644 --- a/default.py +++ b/default.py @@ -50,7 +50,6 @@ class Main: 'reset': utils.reset, 'resetauth': entrypoint.resetAuth, - 'extrafanart': entrypoint.getExtraFanArt, 'play': entrypoint.doPlayback, 'passwords': utils.passwordsXML, 'adduser': entrypoint.addUser, @@ -66,10 +65,15 @@ class Main: 'deviceid': entrypoint.resetDeviceId } - if "extrafanart" in sys.argv[0]: + if "/extrafanart" in sys.argv[0]: embypath = sys.argv[2][1:] embyid = params.get('id',[""])[0] entrypoint.getExtraFanArt(embyid,embypath) + + if "/Extras" in sys.argv[0] or "/VideoFiles" in sys.argv[0]: + embypath = sys.argv[2][1:] + embyid = params.get('id',[""])[0] + entrypoint.getVideoFiles(embyid,embypath) if modes.get(mode): # Simple functions diff --git a/resources/lib/entrypoint.py b/resources/lib/entrypoint.py index e3307543..8e8e252c 100644 --- a/resources/lib/entrypoint.py +++ b/resources/lib/entrypoint.py @@ -951,6 +951,32 @@ def getRecentEpisodes(tagname, limit): xbmcplugin.endOfDirectory(handle=int(sys.argv[1])) +##### GET VIDEO EXTRAS FOR LISTITEM ##### +def getVideoFiles(embyId,embyPath): + #returns the video files for the item as plugin listing, can be used for browsing the actual files or videoextras etc. + emby = embyserver.Read_EmbyServer() + if not embyId: + if "plugin.video.emby" in embyPath: + embyId = embyPath.split("/")[-2] + if embyId: + item = emby.getItem(embyId) + putils = playutils.PlayUtils(item) + if putils.isDirectPlay(): + #only proceed if we can access the files directly. TODO: copy local on the fly if accessed outside + filelocation = putils.directPlay() + if not filelocation.endswith("/"): + filelocation = filelocation.rpartition("/")[0] + dirs, files = xbmcvfs.listdir(filelocation) + for file in files: + file = filelocation + file + li = xbmcgui.ListItem(file, path=file) + xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=file, listitem=li) + for dir in dirs: + dir = filelocation + dir + li = xbmcgui.ListItem(dir, path=dir) + xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=dir, listitem=li, isFolder=True) + xbmcplugin.endOfDirectory(int(sys.argv[1])) + ##### GET EXTRAFANART FOR LISTITEM ##### def getExtraFanArt(embyId,embyPath): From 04acfb32003d5e8f080e7deb8f6161ce17e3054a Mon Sep 17 00:00:00 2001 From: angelblue05 Date: Fri, 4 Mar 2016 17:20:24 -0600 Subject: [PATCH 07/10] Fix type folders in photos If "photo album" has no pictures in it, it's returned as type "Folder" --- resources/lib/entrypoint.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/lib/entrypoint.py b/resources/lib/entrypoint.py index d6d03cab..6a1cf19e 100644 --- a/resources/lib/entrypoint.py +++ b/resources/lib/entrypoint.py @@ -468,7 +468,7 @@ def BrowseContent(viewname, type="", folderid=""): itemtype = "Video,Folder,PhotoAlbum" elif type.lower() == "photos": xbmcplugin.setContent(int(sys.argv[1]), 'files') - itemtype = "Photo,PhotoAlbum" + itemtype = "Photo,PhotoAlbum,Folder" else: itemtype = "" From ad0f33a09ba17f3de3f0e8e578875f6e297f373b Mon Sep 17 00:00:00 2001 From: angelblue05 Date: Fri, 4 Mar 2016 17:23:07 -0600 Subject: [PATCH 08/10] Removed the verification for mixed content Since OriginalCollectionType is now implemented server side. --- resources/lib/read_embyserver.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/lib/read_embyserver.py b/resources/lib/read_embyserver.py index c277d79c..962c464e 100644 --- a/resources/lib/read_embyserver.py +++ b/resources/lib/read_embyserver.py @@ -332,18 +332,18 @@ class Read_EmbyServer(): # Filter view types continue - # 11/10/2015 Review key, when it's added to server. Currently unavailable. - itemtype = item.get('OriginalCollectionType', item.get('CollectionType')) + # 3/4/2016 OriginalCollectionType is added + itemtype = item.get('OriginalCollectionType', item.get('CollectionType', "mixed")) # 11/29/2015 Remove this once OriginalCollectionType is added to stable server. # Assumed missing is mixed then. - if itemtype is None: + '''if itemtype is None: url = "{server}/emby/Library/MediaFolders?format=json" result = doUtils(url) for folder in result['Items']: if itemId == folder['Id']: - itemtype = folder.get('CollectionType', "mixed") + itemtype = folder.get('CollectionType', "mixed")''' if name not in ('Collections', 'Trailers'): From 0f2f6dbcafb668932418c8d8844ab764fca976f7 Mon Sep 17 00:00:00 2001 From: angelblue05 Date: Fri, 4 Mar 2016 17:47:37 -0600 Subject: [PATCH 09/10] Version bump 2.2.8 --- addon.xml | 2 +- changelog.txt | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/addon.xml b/addon.xml index 5fd8a5a3..f87c512d 100644 --- a/addon.xml +++ b/addon.xml @@ -1,7 +1,7 @@ diff --git a/changelog.txt b/changelog.txt index 03f8f2c7..baa14c63 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,7 @@ +version 2.2.8 +- Fix to photos not displaying directories without picutres. +- Fix to grouped views causing crash + version 2.2.7 - Prevent Kodi screensaver during the initial sync From 948015d43368052fbe9894a4b6e6e4e2370cdb57 Mon Sep 17 00:00:00 2001 From: angelblue05 Date: Sun, 6 Mar 2016 17:21:29 -0600 Subject: [PATCH 10/10] Fix potential error due to timeout --- resources/lib/read_embyserver.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/lib/read_embyserver.py b/resources/lib/read_embyserver.py index 962c464e..5c61b969 100644 --- a/resources/lib/read_embyserver.py +++ b/resources/lib/read_embyserver.py @@ -273,14 +273,14 @@ class Read_EmbyServer(): retry = 0 while utils.window('emby_online') != "true": # Wait server to come back online - if retry == 3: + if retry == 5: log("Unable to reconnect to server. Abort process.", 1) - return + return items retry += 1 if xbmc.Monitor().waitForAbort(1): # Abort was requested while waiting. - return + return items else: # Request succeeded index += jump