172 lines
8.6 KiB
Python
172 lines
8.6 KiB
Python
import xbmcaddon
|
|
import xbmcplugin
|
|
import xbmc
|
|
import xbmcgui
|
|
import xbmcvfs
|
|
import os
|
|
import threading
|
|
import json
|
|
import urllib
|
|
|
|
addonSettings = xbmcaddon.Addon(id='plugin.video.emby')
|
|
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
|
|
|
|
from PluginFunctions import PluginFunctions
|
|
|
|
|
|
try:
|
|
params = utils.get_params(sys.argv[2])
|
|
mode = params['mode']
|
|
id = params.get('id', None)
|
|
except:
|
|
params = {}
|
|
mode = None
|
|
|
|
if mode == "play" or mode == "playfromaddon":
|
|
# Play items via plugin://plugin.video.emby/
|
|
url = "{server}/mediabrowser/Users/{UserId}/Items/%s?format=json&ImageTypeLimit=1" % id
|
|
result = DownloadUtils().downloadUrl(url)
|
|
#from from addon needed if the palyback is launched from the addon itself
|
|
if mode == "playfromaddon":
|
|
item = PlaybackUtils().PLAY(result, setup="service")
|
|
else:
|
|
item = PlaybackUtils().PLAY(result, setup="default")
|
|
|
|
elif mode == "reset":
|
|
# User reset local Kodi db
|
|
utils.reset()
|
|
|
|
elif mode == "resetauth":
|
|
# User tried login and failed too many times
|
|
resp = xbmcgui.Dialog().yesno("Warning", "Emby might lock your account if you fail to log in too many times. Proceed anyway?")
|
|
if resp == 1:
|
|
xbmc.log("Reset login attempts.")
|
|
WINDOW.setProperty("Server_status", "Auth")
|
|
else:
|
|
xbmc.executebuiltin('Addon.OpenSettings(plugin.video.emby)')
|
|
|
|
|
|
elif mode == "nextup":
|
|
#if the addon is called with nextup parameter, we return the nextepisodes list of the given tagname
|
|
tagname = params['id']
|
|
limit = int(params['limit'])
|
|
xbmcplugin.setContent(int(sys.argv[1]), 'episodes')
|
|
# First we get a list of all the in-progress TV shows - filtered by tag
|
|
json_query_string = xbmc.executeJSONRPC('{"jsonrpc": "2.0", "method": "VideoLibrary.GetTVShows", "params": { "sort": { "order": "descending", "method": "lastplayed" }, "filter": {"and": [{"operator":"true", "field":"inprogress", "value":""}, {"operator": "contains", "field": "tag", "value": "%s"}]}, "properties": [ "title", "studio", "mpaa", "file", "art" ] }, "id": "libTvShows"}' %tagname)
|
|
print json_query_string
|
|
|
|
json_result = json.loads(json_query_string)
|
|
# If we found any, find the oldest unwatched show for each one.
|
|
if json_result.has_key('result') and json_result['result'].has_key('tvshows'):
|
|
for item in json_result['result']['tvshows']:
|
|
json_query2 = xbmc.executeJSONRPC('{"jsonrpc": "2.0", "method": "VideoLibrary.GetEpisodes", "params": { "tvshowid": %d, "sort": {"method":"episode"}, "filter": {"field": "playcount", "operator": "lessthan", "value":"1"}, "properties": [ "title", "playcount", "season", "episode", "showtitle", "plot", "file", "rating", "resume", "tvshowid", "art", "streamdetails", "firstaired", "runtime", "writer", "dateadded", "lastplayed" ], "limits":{"end":1}}, "id": "1"}' %item['tvshowid'])
|
|
|
|
if json_query2:
|
|
json_query2 = json.loads(json_query2)
|
|
if json_query2.has_key('result') and json_query2['result'].has_key('episodes'):
|
|
count = 0
|
|
for item in json_query2['result']['episodes']:
|
|
episode = "%.2d" % float(item['episode'])
|
|
season = "%.2d" % float(item['season'])
|
|
episodeno = "s%se%s" %(season,episode)
|
|
watched = False
|
|
if item['playcount'] >= 1:
|
|
watched = True
|
|
plot = item['plot']
|
|
liz = xbmcgui.ListItem(item['title'])
|
|
liz.setInfo( type="Video", infoLabels={ "Title": item['title'] })
|
|
liz.setInfo( type="Video", infoLabels={ "duration": str(item['runtime']/60) })
|
|
liz.setInfo( type="Video", infoLabels={ "Episode": item['episode'] })
|
|
liz.setInfo( type="Video", infoLabels={ "Season": item['season'] })
|
|
liz.setInfo( type="Video", infoLabels={ "Premiered": item['firstaired'] })
|
|
liz.setInfo( type="Video", infoLabels={ "Plot": plot })
|
|
liz.setInfo( type="Video", infoLabels={ "TVshowTitle": item['showtitle'] })
|
|
liz.setInfo( type="Video", infoLabels={ "Rating": str(round(float(item['rating']),1)) })
|
|
liz.setInfo( type="Video", infoLabels={ "Playcount": item['playcount'] })
|
|
if "director" in item:
|
|
liz.setInfo( type="Video", infoLabels={ "Director": " / ".join(item['director']) })
|
|
if "writer" in item:
|
|
liz.setInfo( type="Video", infoLabels={ "Writer": " / ".join(item['writer']) })
|
|
if "cast" in item:
|
|
liz.setInfo( type="Video", infoLabels={ "Cast": cast[0] })
|
|
liz.setInfo( type="Video", infoLabels={ "CastAndRole": cast[1] })
|
|
liz.setProperty("episodeno", episodeno)
|
|
liz.setProperty("resumetime", str(item['resume']['position']))
|
|
liz.setProperty("totaltime", str(item['resume']['total']))
|
|
liz.setArt(item['art'])
|
|
liz.setThumbnailImage(item['art'].get('thumb',''))
|
|
liz.setIconImage('DefaultTVShows.png')
|
|
liz.setProperty("dbid", str(item['episodeid']))
|
|
liz.setProperty("fanart_image", item['art'].get('tvshow.fanart',''))
|
|
for key, value in item['streamdetails'].iteritems():
|
|
for stream in value:
|
|
liz.addStreamInfo( key, stream )
|
|
file = item['file'].replace("mode=play","mode=playfromaddon")
|
|
xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=file, listitem=liz)
|
|
count +=1
|
|
if count == limit:
|
|
break
|
|
xbmcplugin.endOfDirectory(handle=int(sys.argv[1]))
|
|
|
|
|
|
#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]))
|
|
|
|
else:
|
|
xbmc.executebuiltin('Addon.OpenSettings(plugin.video.emby)')
|
|
|