Fix nodes - forgot the encoding

Also replace none with empty dictionary for getItem
This commit is contained in:
angelblue05 2015-08-03 04:45:23 -05:00
parent d548ab6e27
commit 3aa2598c79
2 changed files with 128 additions and 284 deletions

View file

@ -1,354 +1,230 @@
# -*- coding: utf-8 -*-
################################################################################################# #################################################################################################
# ReadEmbyDB # ReadEmbyDB
################################################################################################# #################################################################################################
import xbmc
import xbmcgui
import xbmcaddon
from DownloadUtils import DownloadUtils from DownloadUtils import DownloadUtils
addon = xbmcaddon.Addon(id='plugin.video.emby')
class ReadEmbyDB(): class ReadEmbyDB():
def getMovies(self, id, itemList = []):
result = []
doUtils = DownloadUtils() doUtils = DownloadUtils()
#only get basic info for our sync-compares def getMovies(self, parentId, itemList = []):
sortstring = "&SortBy=SortName"
url = "{server}/mediabrowser/Users/{UserId}/items?ParentId=%s%s&Fields=CumulativeRunTimeTicks,Etag&Recursive=true&SortOrder=Descending&IncludeItemTypes=Movie&CollapseBoxSetItems=false&format=json&ImageTypeLimit=1" % (id, sortstring) # Only get basic info for our sync-compares
if itemList != [] and len(itemList) < 50: result = []
if len(itemList) == 1: url = "{server}/mediabrowser/Users/{UserId}/Items?ParentId=%s&SortBy=SortName&Fields=CumulativeRunTimeTicks,Etag&Recursive=true&SortOrder=Descending&IncludeItemTypes=Movie&CollapseBoxSetItems=false&ImageTypeLimit=1&format=json" % parentId
Ids=itemList[0] # Process itemList if any
else: if itemList:
Ids=",".join(itemList) url = "%s&Ids=%s" % (url, ",".join(itemList))
url = url + "&Ids=" + Ids
jsonData = doUtils.downloadUrl(url) jsondata = self.doUtils.downloadUrl(url)
if (jsonData == ""): if jsondata:
return result result = jsondata['Items']
if (jsonData[u'Items'] != ""):
result = jsonData[u'Items']
# Work around to only return items from the given list
if (result != None and len(result) > 0 and len(itemList) > 0 and len(itemList) >= 50):
newResult = []
for item in result:
if (item[u'Id'] in itemList):
newResult.append(item)
result = newResult
return result return result
def getMusicVideos(self, itemList = []): def getMusicVideos(self, itemList = []):
# Only get basic info for our sync-compares
result = [] result = []
doUtils = DownloadUtils() url = "{server}/mediabrowser/Users/{UserId}/items?&SortBy=SortName&Fields=CumulativeRunTimeTicks,Etag&Recursive=true&SortOrder=Descending&IncludeItemTypes=MusicVideo&CollapseBoxSetItems=false&ImageTypeLimit=1&format=json"
# Process itemList if any
if itemList:
url = "%s&Ids=%s" % (url, ",".join(itemList))
#only get basic info for our sync-compares jsondata = self.doUtils.downloadUrl(url)
sortstring = "&SortBy=SortName" if jsondata:
url = "{server}/mediabrowser/Users/{UserId}/items?%s&Fields=CumulativeRunTimeTicks,Etag&Recursive=true&SortOrder=Descending&IncludeItemTypes=MusicVideo&CollapseBoxSetItems=false&format=json&ImageTypeLimit=1" % sortstring result = jsondata['Items']
if itemList != [] and len(itemList) < 50:
if len(itemList) == 1:
Ids=itemList[0]
else:
Ids=",".join(itemList)
url = url + "&Ids=" + Ids
jsonData = doUtils.downloadUrl(url)
if (jsonData == ""):
return result
if (jsonData[u'Items'] != ""):
result = jsonData[u'Items']
# Work around to only return items from the given list
if (result != None and len(result) > 0 and len(itemList) > 0 and len(itemList) >= 50):
newResult = []
for item in result:
if (item[u'Id'] in itemList):
newResult.append(item)
result = newResult
return result return result
def getMusicArtists(self, itemList = []): def getMusicArtists(self, itemList = []):
# Only get basic info for our sync-compares
result = [] result = []
doUtils = DownloadUtils()
#only get basic info for our sync-compares
url = "{server}/Artists?Recursive=true&Fields=Etag,Path,Genres,SortName,Studios,Writer,ProductionYear,Taglines,CommunityRating,OfficialRating,CumulativeRunTimeTicks,Metascore,AirTime,DateCreated,MediaStreams,People,Overview&UserId={UserId}&format=json" url = "{server}/Artists?Recursive=true&Fields=Etag,Path,Genres,SortName,Studios,Writer,ProductionYear,Taglines,CommunityRating,OfficialRating,CumulativeRunTimeTicks,Metascore,AirTime,DateCreated,MediaStreams,People,Overview&UserId={UserId}&format=json"
if itemList != [] and len(itemList) < 50: # Process itemList if any
if len(itemList) == 1: if itemList:
Ids=itemList[0] url = "%s&Ids=%s" % (url, ",".join(itemList))
else:
Ids=",".join(itemList)
url = url + "&Ids=" + Ids
jsonData = doUtils.downloadUrl(url) jsondata = self.doUtils.downloadUrl(url)
if (jsonData == ""): if jsondata:
return result result = jsondata['Items']
if (jsonData[u'Items'] != ""):
result = jsonData[u'Items']
# Work around to only return items from the given list
if (result != None and len(result) > 0 and len(itemList) > 0 and len(itemList) >= 50):
newResult = []
for item in result:
if (item[u'Id'] in itemList):
newResult.append(item)
result = newResult
return result return result
def getMusicSongs(self, itemList = []): def getMusicSongs(self, itemList = []):
# Only get basic info for our sync-compares
result = [] result = []
doUtils = DownloadUtils()
#only get basic info for our sync-compares
url = "{server}/mediabrowser/Users/{UserId}/Items?Fields=Etag,Path,Genres,SortName,Studios,Writer,ProductionYear,Taglines,CommunityRating,OfficialRating,CumulativeRunTimeTicks,Metascore,AirTime,DateCreated,MediaStreams,People,Overview&Recursive=true&IncludeItemTypes=Audio&format=json" url = "{server}/mediabrowser/Users/{UserId}/Items?Fields=Etag,Path,Genres,SortName,Studios,Writer,ProductionYear,Taglines,CommunityRating,OfficialRating,CumulativeRunTimeTicks,Metascore,AirTime,DateCreated,MediaStreams,People,Overview&Recursive=true&IncludeItemTypes=Audio&format=json"
if itemList != [] and len(itemList) < 50: if itemList:
if len(itemList) == 1: url = "%s&Ids=%s" % (url, ",".join(itemList))
Ids=itemList[0]
else:
Ids=",".join(itemList)
url = url + "&Ids=" + Ids
jsondata = self.doUtils.downloadUrl(url)
jsonData = doUtils.downloadUrl(url) if jsondata:
if (jsonData == ""): result = jsondata['Items']
return result
if (jsonData[u'Items'] != ""):
result = jsonData[u'Items']
# Work around to only return items from the given list
if (result != None and len(result) > 0 and len(itemList) > 0 and len(itemList) >= 50):
newResult = []
for item in result:
if (item[u'Id'] in itemList):
newResult.append(item)
result = newResult
return result return result
def getMusicAlbums(self, itemList = []): def getMusicAlbums(self, itemList = []):
# Only get basic info for our sync-compares
result = [] result = []
doUtils = DownloadUtils()
#only get basic info for our sync-compares
url = "{server}/mediabrowser/Users/{UserId}/Items?Fields=Etag,Path,Genres,SortName,Studios,Writer,ProductionYear,Taglines,CommunityRating,OfficialRating,CumulativeRunTimeTicks,Metascore,AirTime,DateCreated,MediaStreams,People,Overview&Recursive=true&IncludeItemTypes=MusicAlbum&format=json" url = "{server}/mediabrowser/Users/{UserId}/Items?Fields=Etag,Path,Genres,SortName,Studios,Writer,ProductionYear,Taglines,CommunityRating,OfficialRating,CumulativeRunTimeTicks,Metascore,AirTime,DateCreated,MediaStreams,People,Overview&Recursive=true&IncludeItemTypes=MusicAlbum&format=json"
if itemList != [] and len(itemList) < 50: if itemList:
if len(itemList) == 1: url = "%s&Ids=%s" % (url, ",".join(itemList))
Ids=itemList[0]
jsondata = self.doUtils.downloadUrl(url)
try:
result = jsondata['Items']
except: pass
else: else:
Ids=",".join(itemList)
url = url + "&Ids=" + Ids
jsonData = doUtils.downloadUrl(url)
if (jsonData == ""):
return result
if (jsonData[u'Items'] != ""):
result = jsonData[u'Items']
#only return valid albums - which have artists
tempresult = [] tempresult = []
# Only return valid albums - which have artists
for item in result: for item in result:
if item["AlbumArtists"]: if item['AlbumArtists']:
tempresult.append(item) tempresult.append(item)
result = tempresult result = tempresult
# Work around to only return items from the given list
if (result != None and len(result) > 0 and len(itemList) > 0 and len(itemList) >= 50):
newResult = []
for item in result:
if (item[u'Id'] in itemList):
newResult.append(item)
result = newResult
return result return result
def getItem(self, id): def getItem(self, id):
result = None result = {}
doUtils = DownloadUtils()
url = "{server}/mediabrowser/Users/{UserId}/Items/%s?format=json&ImageTypeLimit=1&Fields=Etag" % id url = "{server}/mediabrowser/Users/{UserId}/Items/%s?format=json&ImageTypeLimit=1&Fields=Etag" % id
jsonData = doUtils.downloadUrl(url) jsondata = self.doUtils.downloadUrl(url)
if (jsonData != ""): if jsondata:
result = jsonData result = jsondata
return result return result
def getFullItem(self, id): def getFullItem(self, id):
result = None result = {}
doUtils = DownloadUtils()
url = "{server}/mediabrowser/Users/{UserId}/Items/%s?format=json&Fields=Path,Genres,SortName,Studios,Writer,ProductionYear,Taglines,CommunityRating,OfficialRating,CumulativeRunTimeTicks,Metascore,AirTime,DateCreated,MediaStreams,People,Overview" % id url = "{server}/mediabrowser/Users/{UserId}/Items/%s?format=json&Fields=Path,Genres,SortName,Studios,Writer,ProductionYear,Taglines,CommunityRating,OfficialRating,CumulativeRunTimeTicks,Metascore,AirTime,DateCreated,MediaStreams,People,Overview" % id
jsonData = doUtils.downloadUrl(url) jsondata = self.doUtils.downloadUrl(url)
if (jsonData != ""): if jsondata:
result = jsonData result = jsondata
return result return result
def getTvShows(self, id, itemList = []): def getTvShows(self, parentId, itemList = []):
# Only get basic info for our sync-compares
result = [] result = []
doUtils = DownloadUtils()
#only get basic info for our sync-compares url = "{server}/mediabrowser/Users/{UserId}/Items?ParentId=%s&SortBy=SortName&Fields=CumulativeRunTimeTicks,Etag&Recursive=true&SortOrder=Descending&IncludeItemTypes=Series&format=json&ImageTypeLimit=1" % parentId
sortstring = "&SortBy=SortName" if itemList:
url = "{server}/mediabrowser/Users/{UserId}/Items?ParentId=%s%s&Fields=CumulativeRunTimeTicks,Etag&Recursive=true&SortOrder=Descending&IncludeItemTypes=Series&format=json&ImageTypeLimit=1" % (id, sortstring) url = "%s&Ids=%s" % (url, ",".join(itemList))
if itemList != [] and len(itemList) < 50:
if len(itemList) == 1:
Ids=itemList[0]
else:
Ids=",".join(itemList)
url = url + "&Ids=" + Ids
jsonData = doUtils.downloadUrl(url) jsondata = self.doUtils.downloadUrl(url)
if (jsonData == ""): if jsondata:
return result result = jsondata['Items']
if (jsonData[u'Items'] != ""):
result = jsonData[u'Items']
# Work around to only return items from the given list
if (result != None and len(result) > 0 and len(itemList) > 0 and len(itemList) >= 50):
newResult = []
for item in result:
if (item[u'Id'] in itemList):
newResult.append(item)
result = newResult
return result return result
def getTVShowSeasons(self, tvShowId): def getTVShowSeasons(self, tvShowId):
result = [] result = []
doUtils = DownloadUtils()
url = "{server}/Shows/%s/Seasons?UserId={UserId}&format=json&ImageTypeLimit=1" % tvShowId url = "{server}/Shows/%s/Seasons?UserId={UserId}&format=json&ImageTypeLimit=1" % tvShowId
jsonData = doUtils.downloadUrl(url) jsondata = self.doUtils.downloadUrl(url)
if (jsonData == ""): if jsondata:
return result result = jsondata['Items']
if (jsonData[u'Items'] != ""):
result = jsonData[u'Items']
return result return result
def getEpisodes(self, showId, itemList = []): def getEpisodes(self, showId, itemList = []):
result = [] result = []
doUtils = DownloadUtils()
url = "{server}/mediabrowser/Users/{UserId}/Items?ParentId=%s&IsVirtualUnaired=false&IsMissing=False&SortBy=SortName&Fields=Name,SortName,CumulativeRunTimeTicks,Etag&Recursive=true&SortOrder=Ascending&IncludeItemTypes=Episode&format=json&ImageTypeLimit=1" % showId url = "{server}/mediabrowser/Users/{UserId}/Items?ParentId=%s&IsVirtualUnaired=false&IsMissing=False&SortBy=SortName&Fields=Name,SortName,CumulativeRunTimeTicks,Etag&Recursive=true&SortOrder=Ascending&IncludeItemTypes=Episode&format=json&ImageTypeLimit=1" % showId
if itemList != [] and len(itemList) < 50: if itemList:
if len(itemList) == 1: url = "%s&Ids=%s" % (url, ",".join(itemList))
Ids=itemList[0]
else:
Ids=",".join(itemList)
url = url + "&Ids=" + Ids
jsonData = doUtils.downloadUrl(url) jsondata = self.doUtils.downloadUrl(url)
if (jsonData == ""): if jsondata:
return result result = jsondata['Items']
if (jsonData[u'Items'] != ""):
result = jsonData[u'Items']
# Work around to only return items from the given list
if (result != None and len(result) > 0 and len(itemList) > 0 and len(itemList) >= 50):
newResult = []
for item in result:
if (item[u'Id'] in itemList):
newResult.append(item)
result = newResult
return result return result
def getLatestEpisodes(self, fullinfo = False, itemList = []): def getLatestEpisodes(self, fullinfo = False, itemList = []):
result = [] result = []
doUtils = DownloadUtils()
limitString = "Limit=20&SortBy=DateCreated&" limitString = "Limit=20&SortBy=DateCreated&"
if(len(itemList) > 0): # if we want a certain list specify it if itemList: # if we want a certain list specify it
limitString = "Ids=" + ",".join(itemList) + "&" limitString = "Ids=%s&" % ",".join(itemList)
if fullinfo: if fullinfo:
url = "{server}/mediabrowser/Users/{UserId}/Items?%sIsVirtualUnaired=false&IsMissing=False&Fields=ParentId,Path,Genres,SortName,Studios,Writer,ProductionYear,Taglines,CommunityRating,OfficialRating,CumulativeRunTimeTicks,Metascore,AirTime,DateCreated,MediaStreams,People,Overview,Etag&Recursive=true&SortOrder=Descending&IncludeItemTypes=Episode&format=json&ImageTypeLimit=1" % limitString url = "{server}/mediabrowser/Users/{UserId}/Items?%sIsVirtualUnaired=false&IsMissing=False&Fields=ParentId,Path,Genres,SortName,Studios,Writer,ProductionYear,Taglines,CommunityRating,OfficialRating,CumulativeRunTimeTicks,Metascore,AirTime,DateCreated,MediaStreams,People,Overview,Etag&Recursive=true&SortOrder=Descending&IncludeItemTypes=Episode&format=json&ImageTypeLimit=1" % limitString
else: else:
url = "{server}/mediabrowser/Users/{UserId}/Items?%sIsVirtualUnaired=false&IsMissing=False&Fields=ParentId,Name,SortName,CumulativeRunTimeTicks,Etag&Recursive=true&SortOrder=Descending&IncludeItemTypes=Episode&format=json&ImageTypeLimit=1" % limitString url = "{server}/mediabrowser/Users/{UserId}/Items?%sIsVirtualUnaired=false&IsMissing=False&Fields=ParentId,Name,SortName,CumulativeRunTimeTicks,Etag&Recursive=true&SortOrder=Descending&IncludeItemTypes=Episode&format=json&ImageTypeLimit=1" % limitString
jsonData = doUtils.downloadUrl(url) jsondata = self.doUtils.downloadUrl(url)
if (jsonData == ""): if jsondata:
return result result = jsondata['Items']
if (jsonData[u'Items'] != ""):
result = jsonData[u'Items']
return result return result
def getCollections(self, type): def getCollections(self, type):
#Build a list of the user views # Build a list of the user views
doUtils = DownloadUtils() doUtils = self.doUtils
collections = []
url = "{server}/mediabrowser/Users/{UserId}/Items?Sortby=SortName&format=json"
jsondata = doUtils.downloadUrl(url)
try: try:
url = "{server}/mediabrowser/Users/{UserId}/Items/Root?format=json" result = jsondata['Items']
result = doUtils.downloadUrl(url) except: pass
except Exception, msg:
error = "Can't connect: %s" % msg
xbmc.log(error)
return []
if (result == ""):
return []
parentid = result[u'Id']
url = "{server}/mediabrowser/Users/{UserId}/items?ParentId=%s&Sortby=SortName&format=json" % parentid
result = doUtils.downloadUrl(url)
collections=[]
if (result == ""):
return []
result = result[u'Items']
for item in result:
if (item[u'RecursiveItemCount'] != 0):
Name = item[u'Name']
if u'CollectionType' not in item:
itemtype = "movies" # User may not have declared the type
else: else:
itemtype = item[u'CollectionType'] for item in result:
if item['RecursiveItemCount']:
name = item['Name']
itemtype = item.get('CollectionType', "movies")
if itemtype == type and name != "Collections":
collections.append({
'title': name,
'type': itemtype,
'id': item['Id']
})
if itemtype == type and Name != "Collections":
collections.append({'title': Name,
'type' : itemtype,
'id' : item[u'Id']})
return collections return collections
def getBoxSets(self):
result = []
url = "{server}/mediabrowser/Users/{UserId}/Items?SortBy=SortName&IsVirtualUnaired=false&IsMissing=False&Fields=Name,SortName,CumulativeRunTimeTicks,Etag&Recursive=true&SortOrder=Ascending&IncludeItemTypes=BoxSet&format=json&ImageTypeLimit=1"
jsondata = self.doUtils.downloadUrl(url)
if jsondata:
result = jsondata['Items']
return result
def getMoviesInBoxSet(self, boxsetId):
result = []
url = "{server}/mediabrowser/Users/{UserId}/Items?ParentId=%s&Fields=ItemCounts,Etag&format=json&ImageTypeLimit=1" % boxsetId
jsondata = self.doUtils.downloadUrl(url)
if jsondata:
result = jsondata['Items']
return result
# This is not being used.
# To be removed?
def getViewCollections(self, type): def getViewCollections(self, type):
#Build a list of the user views #Build a list of the user views
doUtils = DownloadUtils() doUtils = DownloadUtils()
@ -391,35 +267,3 @@ class ReadEmbyDB():
'type' : type, 'type' : type,
'id' : view[u'Id']}) 'id' : view[u'Id']})
return collections return collections
def getBoxSets(self):
result = []
doUtils = DownloadUtils()
url = "{server}/mediabrowser/Users/{UserId}/Items?SortBy=SortName&IsVirtualUnaired=false&IsMissing=False&Fields=Name,SortName,CumulativeRunTimeTicks,Etag&Recursive=true&SortOrder=Ascending&IncludeItemTypes=BoxSet&format=json&ImageTypeLimit=1"
jsonData = doUtils.downloadUrl(url)
if (jsonData == ""):
return result
if (jsonData[u'Items'] != ""):
result = jsonData[u'Items']
return result
def getMoviesInBoxSet(self,boxsetId):
result = []
doUtils = DownloadUtils()
url = "{server}/mediabrowser/Users/{UserId}/Items?ParentId=%s&Fields=ItemCounts,Etag&format=json&ImageTypeLimit=1" % boxsetId
jsonData = doUtils.downloadUrl(url)
if (jsonData == ""):
return result
if (jsonData[u'Items'] != ""):
result = jsonData[u'Items']
return result

View file

@ -27,7 +27,7 @@ class VideoNodes():
def buildVideoNodeForView(self, tagname, type, windowPropId): def buildVideoNodeForView(self, tagname, type, windowPropId):
#this method will build a video node for a particular Emby view (= tag in kodi) #this method will build a video node for a particular Emby view (= tag in kodi)
#we set some window props here to for easy future reference and to be used in skins (for easy access only) #we set some window props here to for easy future reference and to be used in skins (for easy access only)
tagname_normalized = utils.normalize_nodes(tagname) tagname_normalized = utils.normalize_nodes(tagname.encode('utf-8'))
libraryPath = xbmc.translatePath("special://profile/library/video/Emby - %s/" %tagname_normalized) libraryPath = xbmc.translatePath("special://profile/library/video/Emby - %s/" %tagname_normalized)
kodiVersion = 14 kodiVersion = 14