From 72ca06e41727fdd982dc668b82bb8845371b31db Mon Sep 17 00:00:00 2001 From: Marcel van der Veldt Date: Sun, 3 May 2015 17:39:12 +0200 Subject: [PATCH 1/4] add support for native extrafanart --- default.py | 55 +++++++++++++++++++++++++++++++++++- resources/lib/WriteKodiDB.py | 8 +++--- 2 files changed, 58 insertions(+), 5 deletions(-) diff --git a/default.py b/default.py index 0fd50f31..cc6bc0bd 100644 --- a/default.py +++ b/default.py @@ -2,6 +2,7 @@ import xbmcaddon import xbmcplugin import xbmc import xbmcgui +import xbmcvfs import os import threading import json @@ -12,11 +13,14 @@ cwd = addonSettings.getAddonInfo('path') BASE_RESOURCE_PATH = xbmc.translatePath( os.path.join( cwd, 'resources', 'lib' ) ) sys.path.append(BASE_RESOURCE_PATH) + WINDOW = xbmcgui.Window(10000) import Utils as utils from PlaybackUtils import PlaybackUtils from DownloadUtils import DownloadUtils +from ReadEmbyDB import ReadEmbyDB +from API import API try: params = utils.get_params(sys.argv[2]) @@ -32,8 +36,57 @@ if mode == "play": result = DownloadUtils().downloadUrl(url) item = PlaybackUtils().PLAY(result, setup="default") + +#get extrafanart for listitem - this will only be used for skins that actually call the listitem's path + fanart dir... +elif "extrafanart" in sys.argv[0]: + itemPath = "" + embyId = "" + + try: + #only do this if the listitem has actually changed + itemPath = xbmc.getInfoLabel("ListItem.FileNameAndPath") + + if not itemPath: + itemPath = xbmc.getInfoLabel("ListItem.Path") + + if ("/tvshows/" in itemPath or "/musicvideos/" in itemPath or "/movies/" in itemPath): + embyId = itemPath.split("/")[-2] + + #we need to store the images locally for this to work because of the caching system in xbmc + fanartDir = xbmc.translatePath("special://thumbnails/emby/" + embyId + "/") + + if not xbmcvfs.exists(fanartDir): + #download the images to the cache directory + xbmcvfs.mkdir(fanartDir) + item = ReadEmbyDB().getFullItem(embyId) + if item != None: + if item.has_key("BackdropImageTags"): + if(len(item["BackdropImageTags"]) > 1): + totalbackdrops = len(item["BackdropImageTags"]) + for index in range(1,totalbackdrops): + backgroundUrl = API().getArtwork(item, "Backdrop",str(index)) + fanartFile = os.path.join(fanartDir,"fanart" + str(index) + ".jpg") + li = xbmcgui.ListItem(str(index), path=fanartFile) + xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=fanartFile, listitem=li) + xbmcvfs.copy(backgroundUrl,fanartFile) + + else: + #use existing cached images + dirs, files = xbmcvfs.listdir(fanartDir) + count = 1 + for file in files: + count +=1 + li = xbmcgui.ListItem(file, path=os.path.join(fanartDir,file)) + xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=os.path.join(fanartDir,file), listitem=li) + except: + pass + + #always do endofdirectory to prevent errors in the logs + xbmcplugin.endOfDirectory(int(sys.argv[1])) + + elif sys.argv[1] == "reset": utils.reset() -else: +else: xbmc.executebuiltin('Addon.OpenSettings(plugin.video.emby)') diff --git a/resources/lib/WriteKodiDB.py b/resources/lib/WriteKodiDB.py index 96c42b2d..825e23af 100644 --- a/resources/lib/WriteKodiDB.py +++ b/resources/lib/WriteKodiDB.py @@ -114,8 +114,8 @@ class WriteKodiDB(): #### ADD OR UPDATE THE FILE AND PATH ########### #### NOTE THAT LASTPLAYED AND PLAYCOUNT ARE STORED AT THE FILE ENTRY - path = "plugin://plugin.video.emby/movies/" - filename = "plugin://plugin.video.emby/movies/?id=%s&mode=play" % MBitem["Id"] + path = "plugin://plugin.video.emby/movies/%s/" % MBitem["Id"] + filename = "plugin://plugin.video.emby/movies/%s/?id=%s&mode=play" % (MBitem["Id"],MBitem["Id"]) #create the path cursor.execute("SELECT idPath as pathid FROM path WHERE strPath = ?",(path,)) @@ -257,8 +257,8 @@ class WriteKodiDB(): #### ADD OR UPDATE THE FILE AND PATH ########### #### NOTE THAT LASTPLAYED AND PLAYCOUNT ARE STORED AT THE FILE ENTRY - path = "plugin://plugin.video.emby/musicvideos/" - filename = "plugin://plugin.video.emby/musicvideos/?id=%s&mode=play" % MBitem["Id"] + path = "plugin://plugin.video.emby/musicvideos/%s/" % MBitem["Id"] + filename = "plugin://plugin.video.emby/musicvideos/%s/?id=%s&mode=play" % (MBitem["Id"], MBitem["Id"]) #create the path cursor.execute("SELECT idPath as pathid FROM path WHERE strPath = ?",(path,)) From c8e43125718b2b918000721201aa9766f9f6e7a5 Mon Sep 17 00:00:00 2001 From: xnappo Date: Sun, 3 May 2015 10:39:30 -0500 Subject: [PATCH 2/4] More fixes to make 'getViewCollections' work --- resources/lib/ReadEmbyDB.py | 56 ++++++++++++++++++++++--------------- 1 file changed, 33 insertions(+), 23 deletions(-) diff --git a/resources/lib/ReadEmbyDB.py b/resources/lib/ReadEmbyDB.py index edd24e2f..20577e20 100644 --- a/resources/lib/ReadEmbyDB.py +++ b/resources/lib/ReadEmbyDB.py @@ -226,33 +226,43 @@ class ReadEmbyDB(): doUtils = DownloadUtils() viewsUrl = "{server}/mediabrowser/Users/{UserId}/Views?format=json&ImageTypeLimit=1" - jsonData = doUtils.downloadUrl(viewsUrl) + result = doUtils.downloadUrl(viewsUrl) collections=[] - if (jsonData != ""): - views = views[u'Items'] + if (result == ""): + return [] + + result = result[u'Items'] - for view in views: - if (view[u'Type'] == 'UserView'): # Need to grab the real main node - newViewsUrl = "{server}/mediabrowser/Users/{UserId}/items?ParentId=%s&SortBy=SortName&SortOrder=Ascending&format=json&ImageTypeLimit=1" % view[u'Id'] - jsonData = doUtils.downloadUrl(newViewsUrl) - if (jsonData != ""): - newViews = newViews[u'Items'] - for newView in newViews: - # There are multiple nodes in here like 'Latest', 'NextUp' - below we grab the full node. - if newView[u'CollectionType'] == "MovieMovies" or newView[u'CollectionType'] == "TvShowSeries": - view=newView - if (view[u'ChildCount'] != 0): - Name = view[u'Name'] - - total = str(view[u'ChildCount']) + for view in result: + if (view[u'Type'] == 'UserView'): # Need to grab the real main node + newViewsUrl = "{server}/mediabrowser/Users/{UserId}/items?ParentId=%s&SortBy=SortName&SortOrder=Ascending&format=json&ImageTypeLimit=1" % view[u'Id'] + newViews = doUtils.downloadUrl(newViewsUrl) + if (result == ""): + return [] + newViews = newViews[u'Items'] + print str(newViews) + for newView in newViews: + # There are multiple nodes in here like 'Latest', 'NextUp' - below we grab the full node. + if newView[u'CollectionType'] != None: + if newView[u'CollectionType'] == "MovieMovies" or newView[u'CollectionType'] == "TvShowSeries": + view=newView + if (view[u'ChildCount'] != 0): + Name = view[u'Name'] + + total = str(view[u'ChildCount']) + try: itemtype = view[u'CollectionType'] - if itemtype == None: - itemtype = "movies" # User may not have declared the type - if itemtype == type: - collections.append( {'title' : Name, - 'type' : type, - 'id' : view[u'Id']}) + except: + itemtype = "movies" + if itemtype == "MovieMovies": + itemtype = "movies" + if itemtype == "TvShowSeries": + itemtype = "tvshows" + if itemtype == type: + collections.append( {'title' : Name, + 'type' : type, + 'id' : view[u'Id']}) return collections def getBoxSets(self): From cef2b67eba1d88fce35b83b8e0e137fcd2c1f9d1 Mon Sep 17 00:00:00 2001 From: Marcel van der Veldt Date: Sun, 3 May 2015 18:02:53 +0200 Subject: [PATCH 3/4] only use the additional play when launched from widget (home active) --- resources/lib/PlaybackUtils.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/lib/PlaybackUtils.py b/resources/lib/PlaybackUtils.py index 103c4f4f..8c179949 100644 --- a/resources/lib/PlaybackUtils.py +++ b/resources/lib/PlaybackUtils.py @@ -117,7 +117,8 @@ class PlaybackUtils(): elif setup == "default": xbmcplugin.setResolvedUrl(int(sys.argv[1]), True, listItem) #artwork only works from widgets with both resolvedurl and player command - xbmc.Player().play(playurl,listItem) + if xbmc.getCondVisibility("Window.IsActive(home)"): + xbmc.Player().play(playurl,listItem) def setArt(self, list,name,path): if name=='thumb' or name=='fanart_image' or name=='small_poster' or name=='tiny_poster' or name == "medium_landscape" or name=='medium_poster' or name=='small_fanartimage' or name=='medium_fanartimage' or name=='fanart_noindicators': From 4d9c845fd30a4d59832a0d74caa60bc43489f93d Mon Sep 17 00:00:00 2001 From: Marcel van der Veldt Date: Sun, 3 May 2015 18:08:07 +0200 Subject: [PATCH 4/4] show the additional resume dialog if launched from a widget --- resources/lib/PlaybackUtils.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/resources/lib/PlaybackUtils.py b/resources/lib/PlaybackUtils.py index 8c179949..b6851ddf 100644 --- a/resources/lib/PlaybackUtils.py +++ b/resources/lib/PlaybackUtils.py @@ -76,17 +76,19 @@ class PlaybackUtils(): WINDOW.setProperty(playurl+"deleteurl", "") WINDOW.setProperty(playurl+"deleteurl", deleteurl) - '''if seekTime != 0: - displayTime = str(datetime.timedelta(seconds=seekTime)) - display_list = [ self.language(30106) + ' ' + displayTime, self.language(30107)] - resumeScreen = xbmcgui.Dialog() - resume_result = resumeScreen.select(self.language(30105), display_list) - if resume_result == 0: - WINDOW.setProperty(playurl+"seektime", str(seekTime)) + #show the additional resume dialog if launched from a widget + if xbmc.getCondVisibility("Window.IsActive(home)"): + if seekTime != 0: + displayTime = str(datetime.timedelta(seconds=seekTime)) + display_list = [ self.language(30106) + ' ' + displayTime, self.language(30107)] + resumeScreen = xbmcgui.Dialog() + resume_result = resumeScreen.select(self.language(30105), display_list) + if resume_result == 0: + WINDOW.setProperty(playurl+"seektime", str(seekTime)) + else: + WINDOW.clearProperty(playurl+"seektime") else: WINDOW.clearProperty(playurl+"seektime") - else: - WINDOW.clearProperty(playurl+"seektime")''' if result.get("Type")=="Episode": WINDOW.setProperty(playurl+"refresh_id", result.get("SeriesId"))