PlexKodiConnect/resources/lib/ReadEmbyDB.py

372 lines
15 KiB
Python
Raw Normal View History

# -*- coding: utf-8 -*-
2015-03-18 04:51:45 +11:00
#################################################################################################
# ReadEmbyDB
#################################################################################################
from DownloadUtils import DownloadUtils
class ReadEmbyDB():
doUtils = DownloadUtils()
2015-08-04 14:04:34 +10:00
urllimit = 50
def filterbyId(self, result, itemList = []):
newResult = []
for item in result:
if item['Id'] in itemList:
newResult.append(item)
return newResult
2015-04-22 09:12:09 +10:00
def getMovies(self, parentId, itemList = []):
2015-08-04 14:04:34 +10:00
2015-06-12 18:02:11 +10:00
result = []
2015-08-04 14:04:34 +10:00
lenlist = len(itemList) < self.urllimit
# 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=Movie&CollapseBoxSetItems=false&ImageTypeLimit=1&format=json" % parentId
2015-08-04 14:04:34 +10:00
if itemList and lenlist:
url = "%s&Ids=%s" % (url, ",".join(itemList))
jsondata = self.doUtils.downloadUrl(url)
2015-08-04 14:04:34 +10:00
try:
result = jsondata['Items']
2015-08-04 14:04:34 +10:00
except: pass
else: # If list was longer than 49 items, we pulled the entire list so we need to sort
if not lenlist:
result = self.filterbyId(result, itemList)
2015-03-18 04:51:45 +11:00
return result
2015-03-22 00:31:30 +11:00
2015-05-03 06:02:06 +10:00
def getMusicVideos(self, itemList = []):
2015-03-22 00:31:30 +11:00
2015-06-12 18:02:11 +10:00
result = []
2015-08-04 14:04:34 +10:00
lenlist = len(itemList) < self.urllimit
# Only get basic info for our sync-compares
url = "{server}/mediabrowser/Users/{UserId}/items?&SortBy=SortName&Fields=CumulativeRunTimeTicks,Etag&Recursive=true&SortOrder=Descending&IncludeItemTypes=MusicVideo&CollapseBoxSetItems=false&ImageTypeLimit=1&format=json"
2015-08-04 14:04:34 +10:00
if itemList and lenlist:
url = "%s&Ids=%s" % (url, ",".join(itemList))
2015-03-22 00:31:30 +11:00
jsondata = self.doUtils.downloadUrl(url)
2015-08-04 14:04:34 +10:00
try:
result = jsondata['Items']
2015-08-04 14:04:34 +10:00
except: pass
else: # If list was longer than 49 items, we pulled the entire list so we need to sort
if not lenlist:
result = self.filterbyId(result, itemList)
2015-03-22 00:31:30 +11:00
return result
def getMusicArtists(self, itemList = []):
2015-05-08 09:13:29 +10:00
result = []
2015-08-04 14:04:34 +10:00
lenlist = len(itemList) < self.urllimit
# Only get basic info for our sync-compares
2015-07-31 05:23:50 +10:00
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"
2015-08-04 14:04:34 +10:00
if itemList and lenlist:
url = "%s&Ids=%s" % (url, ",".join(itemList))
jsondata = self.doUtils.downloadUrl(url)
2015-08-04 14:04:34 +10:00
try:
result = jsondata['Items']
2015-08-04 14:04:34 +10:00
except: pass
else: # If list was longer than 49 items, we pulled the entire list so we need to sort
if not lenlist:
result = self.filterbyId(result, itemList)
return result
def getMusicArtistsTotal(self):
result = []
url = "{server}/Artists?Limit=1&Recursive=true&Fields=Etag,Path,Genres,SortName,Studios,Writer,ProductionYear,Taglines,CommunityRating,OfficialRating,CumulativeRunTimeTicks,Metascore,AirTime,DateCreated,MediaStreams,People,Overview&UserId={UserId}&format=json"
jsondata = self.doUtils.downloadUrl(url)
total = jsondata['TotalRecordCount']
index = 1
jump = 200
while index < total:
url = "{server}/Artists?StartIndex=%s&Limit=%s&Recursive=true&Fields=Etag,Path,Genres,SortName,Studios,Writer,ProductionYear,Taglines,CommunityRating,OfficialRating,CumulativeRunTimeTicks,Metascore,AirTime,DateCreated,MediaStreams,People,Overview&UserId={UserId}&format=json" % (index, jump)
jsondata = self.doUtils.downloadUrl(url)
result.extend(jsondata['Items'])
index += jump
return result
def getMusicSongs(self, itemList = []):
2015-06-12 18:02:11 +10:00
result = []
2015-08-04 14:04:34 +10:00
lenlist = len(itemList) < self.urllimit
# Only get basic info for our sync-compares
2015-07-31 05:23:50 +10:00
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"
2015-08-04 14:04:34 +10:00
if itemList and lenlist:
url = "%s&Ids=%s" % (url, ",".join(itemList))
jsondata = self.doUtils.downloadUrl(url)
2015-08-04 14:04:34 +10:00
try:
result = jsondata['Items']
2015-08-04 14:04:34 +10:00
except: pass
else: # If list was longer than 49 items, we pulled the entire list so we need to sort
if not lenlist:
result = self.filterbyId(result, itemList)
return result
def getMusicSongsTotal(self):
result = []
url = "{server}/mediabrowser/Users/{UserId}/Items?Index=1&Limit=1&Fields=Etag,Path,Genres,SortName,Studios,Writer,ProductionYear,Taglines,CommunityRating,OfficialRating,CumulativeRunTimeTicks,Metascore,AirTime,DateCreated,MediaStreams,People,Overview&Recursive=true&IncludeItemTypes=Audio&format=json"
jsondata = self.doUtils.downloadUrl(url)
total = jsondata['TotalRecordCount']
index = 1
jump = 200
while index < total:
url = "{server}/mediabrowser/Users/{UserId}/Items?StartIndex=%s&Limit=%s&Fields=Etag,Path,Genres,SortName,Studios,Writer,ProductionYear,Taglines,CommunityRating,OfficialRating,CumulativeRunTimeTicks,Metascore,AirTime,DateCreated,MediaStreams,People,Overview&Recursive=true&IncludeItemTypes=Audio&format=json" % (index, jump)
jsondata = self.doUtils.downloadUrl(url)
result.extend(jsondata['Items'])
index += jump
return result
def getMusicAlbums(self, itemList = []):
2015-03-22 00:31:30 +11:00
2015-06-12 18:02:11 +10:00
result = []
2015-08-04 14:04:34 +10:00
lenlist = len(itemList) < self.urllimit
# Only get basic info for our sync-compares
2015-07-31 05:23:50 +10:00
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"
2015-08-04 14:04:34 +10:00
if itemList and lenlist:
url = "%s&Ids=%s" % (url, ",".join(itemList))
jsondata = self.doUtils.downloadUrl(url)
try:
result = jsondata['Items']
except: pass
else:
2015-05-08 10:44:32 +10:00
tempresult = []
# Only return valid albums - which have artists
2015-05-08 10:44:32 +10:00
for item in result:
if item['AlbumArtists']:
2015-05-08 10:44:32 +10:00
tempresult.append(item)
result = tempresult
2015-08-04 14:04:34 +10:00
# If list was longer than 49 items, we pulled the entire list so we need to sort
if not lenlist:
result = self.filterbyId(result, itemList)
2015-03-26 01:00:08 +11:00
return result
def getMusicAlbumsTotal(self):
result = []
url = "{server}/mediabrowser/Users/{UserId}/Items?Limit=1&Fields=Etag,Path,Genres,SortName,Studios,Writer,ProductionYear,Taglines,CommunityRating,OfficialRating,CumulativeRunTimeTicks,Metascore,AirTime,DateCreated,MediaStreams,People,Overview&Recursive=true&IncludeItemTypes=MusicAlbum&format=json"
jsondata = self.doUtils.downloadUrl(url)
total = jsondata['TotalRecordCount']
index = 1
jump = 200
while index < total:
url = "{server}/mediabrowser/Users/{UserId}/Items?StartIndex=%s&Limit=%s&Fields=Etag,Path,Genres,SortName,Studios,Writer,ProductionYear,Taglines,CommunityRating,OfficialRating,CumulativeRunTimeTicks,Metascore,AirTime,DateCreated,MediaStreams,People,Overview&Recursive=true&IncludeItemTypes=MusicAlbum&format=json" % (index, jump)
jsondata = self.doUtils.downloadUrl(url)
tempresult = []
# Only return valid albums - which have artists
for item in jsondata['Items']:
if item['AlbumArtists']:
tempresult.append(item)
result.extend(tempresult)
index += jump
return result
def getTvShows(self, parentId, itemList = []):
2015-03-18 04:51:45 +11:00
2015-06-12 18:02:11 +10:00
result = []
2015-08-04 14:04:34 +10:00
lenlist = len(itemList) < self.urllimit
# 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
2015-08-04 14:04:34 +10:00
if itemList and lenlist:
url = "%s&Ids=%s" % (url, ",".join(itemList))
jsondata = self.doUtils.downloadUrl(url)
2015-08-04 14:04:34 +10:00
try:
result = jsondata['Items']
2015-08-04 14:04:34 +10:00
except: pass
else: # If list was longer than 49 items, we pulled the entire list so we need to sort
if not lenlist:
result = self.filterbyId(result, itemList)
2015-03-20 08:31:06 +11:00
return result
def getTVShowSeasons(self, tvShowId):
2015-06-12 18:02:11 +10:00
result = []
2015-04-22 09:12:09 +10:00
url = "{server}/Shows/%s/Seasons?UserId={UserId}&format=json&ImageTypeLimit=1" % tvShowId
2015-03-20 08:31:06 +11:00
jsondata = self.doUtils.downloadUrl(url)
if jsondata:
result = jsondata['Items']
2015-03-18 04:51:45 +11:00
return result
def getEpisodes(self, showId, itemList = []):
2015-03-18 04:51:45 +11:00
2015-06-12 18:02:11 +10:00
result = []
2015-08-04 14:04:34 +10:00
lenlist = len(itemList) < self.urllimit
2015-05-03 07:14:04 +10:00
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
2015-08-04 14:04:34 +10:00
if itemList and lenlist:
url = "%s&Ids=%s" % (url, ",".join(itemList))
jsondata = self.doUtils.downloadUrl(url)
2015-08-04 14:04:34 +10:00
try:
result = jsondata['Items']
2015-08-04 14:04:34 +10:00
except: pass
else: # If list was longer than 49 items, we pulled the entire list so we need to sort
if not lenlist:
result = self.filterbyId(result, itemList)
2015-04-22 09:12:09 +10:00
2015-03-18 04:51:45 +11:00
return result
def getLatestEpisodes(self, fullinfo = False, itemList = []):
2015-08-04 14:04:34 +10:00
result = []
limitString = "Limit=20&SortBy=DateCreated&"
if itemList: # if we want a certain list specify it
limitString = "Ids=%s&" % ",".join(itemList)
if fullinfo:
2015-05-03 07:14:04 +10:00
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:
2015-05-03 07:14:04 +10:00
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 = self.doUtils.downloadUrl(url)
if jsondata:
result = jsondata['Items']
2015-04-22 09:12:09 +10:00
return result
2015-08-04 14:04:34 +10:00
def getItem(self, id):
result = {}
url = "{server}/mediabrowser/Users/{UserId}/Items/%s?format=json&ImageTypeLimit=1&Fields=Etag" % id
jsondata = self.doUtils.downloadUrl(url)
if jsondata:
result = jsondata
return result
def getFullItem(self, id):
result = {}
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 = self.doUtils.downloadUrl(url)
if jsondata:
result = jsondata
return result
2015-03-18 04:51:45 +11:00
def getCollections(self, type):
# Build a list of the user views
collections = []
url = "{server}/mediabrowser/Users/{UserId}/Items?Sortby=SortName&format=json"
2015-08-04 14:04:34 +10:00
jsondata = self.doUtils.downloadUrl(url)
try:
result = jsondata['Items']
except: pass
else:
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']
})
2015-04-22 09:12:09 +10:00
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):
#Build a list of the user views
2015-04-22 09:12:09 +10:00
doUtils = DownloadUtils()
viewsUrl = "{server}/mediabrowser/Users/{UserId}/Views?format=json&ImageTypeLimit=1"
result = doUtils.downloadUrl(viewsUrl)
collections=[]
2015-03-18 04:51:45 +11:00
if (result == ""):
return []
result = result[u'Items']
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']
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']
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