jellyfin-kodi/resources/lib/ItemInfo.py

527 lines
22 KiB
Python
Raw Normal View History

import sys
import xbmc
import xbmcgui
import xbmcaddon
import json as json
import urllib
from DownloadUtils import DownloadUtils
from API import API
_MODE_BASICPLAY=12
_MODE_CAST_LIST=14
_MODE_PERSON_DETAILS=15
CP_ADD_URL = 'plugin://plugin.video.couchpotato_manager/movies/add?title='
CP_ADD_VIA_IMDB = 'plugin://plugin.video.couchpotato_manager/movies/add?imdb_id='
class ItemInfo(xbmcgui.WindowXMLDialog):
id = ""
playUrl = ""
trailerUrl = ""
couchPotatoUrl = ""
userid = ""
server = ""
downloadUtils = DownloadUtils()
item= []
isTrailer = False
def __init__(self, *args, **kwargs):
xbmcgui.WindowXMLDialog.__init__(self, *args, **kwargs)
xbmc.log("WINDOW INITIALISED")
def onInit(self):
self.action_exitkeys_id = [10, 13]
url = "{server}/mediabrowser/Users/{UserId}/Items/" + self.id + "?Fields=SeriesGenres,AirTime&format=json"
item = self.downloadUtils.downloadUrl(url)
self.item = item
id = item.get("Id")
WINDOW = xbmcgui.Window( 10025 )
WINDOW.setProperty('ItemGUID', id)
name = item.get("Name")
image = API().getArtwork(item, "poster")
fanArt = API().getArtwork(item, "BackdropNoIndicators")
self.getControl(3001).setImage(fanArt)
discart = API().getArtwork(item ,"Disc")
logo = API().getArtwork(item ,"Logo")
# calculate the percentage complete
userData = item.get("UserData")
cappedPercentage = 0
if(userData != None):
playBackTicks = float(userData.get("PlaybackPositionTicks"))
if(playBackTicks != None and playBackTicks > 0):
runTimeTicks = float(item.get("RunTimeTicks", "0"))
if(runTimeTicks > 0):
percentage = int((playBackTicks / runTimeTicks) * 100.0)
cappedPercentage = percentage - (percentage % 10)
if(cappedPercentage == 0):
cappedPercentage = 10
if(cappedPercentage == 100):
cappedPercentage = 90
try:
watchedButton = self.getControl(3192)
except:
watchedButton = None
if(watchedButton != None):
if userData.get("Played") == True:
watchedButton.setSelected(True)
else:
watchedButton.setSelected(False)
try:
dislikeButton = self.getControl(3193)
except:
dislikeButton = None
if(dislikeButton != None):
if userData.get("Likes") != None and userData.get("Likes") == False:
dislikeButton.setSelected(True)
else:
dislikeButton.setSelected(False)
try:
likeButton = self.getControl(3194)
except:
likeButton = None
if(likeButton != None):
if userData.get("Likes") != None and userData.get("Likes") == True:
likeButton.setSelected(True)
else:
likeButton.setSelected(False)
try:
favouriteButton = self.getControl(3195)
except:
favouriteButton = None
if(favouriteButton != None):
if userData.get("IsFavorite") == True:
favouriteButton.setSelected(True)
else:
favouriteButton.setSelected(False)
episodeInfo = ""
type = item.get("Type")
WINDOW.setProperty('ItemType', type)
if(type == "Episode" or type == "Season"):
WINDOW.setProperty('ItemGUID', item.get("SeriesId"))
name = item.get("SeriesName") + ": " + name
season = str(item.get("ParentIndexNumber")).zfill(2)
episodeNum = str(item.get("IndexNumber")).zfill(2)
episodeInfo = "S" + season + "xE" + episodeNum
elif type == "Movie":
if item.get("Taglines") != None and item.get("Taglines") != [] and item.get("Taglines")[0] != None:
episodeInfo = item.get("Taglines")[0]
elif type == "ChannelVideoItem":
if item.get("ExtraType") != None:
if item.get('ExtraType') == "Trailer":
self.isTrailer = True
self.playUrl = "plugin://plugin.video.emby/?id=%s&mode=play" % id
try:
trailerButton = self.getControl(3102)
if(trailerButton != None):
if not self.isTrailer and item.get("LocalTrailerCount") != None and item.get("LocalTrailerCount") > 0:
itemTrailerUrl = "{server}/mediabrowser/Users/{UserId}/Items/" + id + "/LocalTrailers?format=json"
jsonData = self.downloadUtils.downloadUrl(itemTrailerUrl)
if(jsonData != ""):
trailerItem = jsonData
self.trailerUrl = "plugin://plugin.video.emby/trailer/?id=%s&mode=play" % trailerItem[0][u'Id']
else:
trailerButton.setEnabled(False)
except:
pass
try:
couchPotatoButton = self.getControl(3103)
if(couchPotatoButton != None):
if self.isTrailer and item.get("ProviderIds") != None and item.get("ProviderIds").get("Imdb") != None:
self.couchPotatoUrl = CP_ADD_VIA_IMDB + item.get("ProviderIds").get("Imdb")
elif self.isTrailer:
self.couchPotatoUrl = CP_ADD_URL + name
elif not self.isTrailer:
couchPotatoButton.setEnabled(False)
except:
pass
# all the media stream info
mediaList = self.getControl(3220)
mediaStreams = item.get("MediaStreams")
if(mediaStreams != None):
for mediaStream in mediaStreams:
if(mediaStream.get("Type") == "Video"):
videocodec = mediaStream.get("Codec")
if(videocodec == "mpeg2video"):
videocodec = "mpeg2"
height = str(mediaStream.get("Height"))
width = str(mediaStream.get("Width"))
aspectratio = mediaStream.get("AspectRatio")
fr = mediaStream.get("RealFrameRate")
videoInfo = width + "x" + height + " " + videocodec + " " + str(round(fr, 2))
listItem = xbmcgui.ListItem("Video:", videoInfo)
mediaList.addItem(listItem)
if(mediaStream.get("Type") == "Audio"):
audiocodec = mediaStream.get("Codec")
channels = mediaStream.get("Channels")
lang = mediaStream.get("Language")
audioInfo = audiocodec + " " + str(channels)
if(lang != None and len(lang) > 0 and lang != "und"):
audioInfo = audioInfo + " " + lang
listItem = xbmcgui.ListItem("Audio:", audioInfo)
mediaList.addItem(listItem)
if(mediaStream.get("Type") == "Subtitle"):
lang = mediaStream.get("Language")
codec = mediaStream.get("Codec")
subInfo = codec
if(lang != None and len(lang) > 0 and lang != "und"):
subInfo = subInfo + " " + lang
listItem = xbmcgui.ListItem("Sub:", subInfo)
mediaList.addItem(listItem)
#for x in range(0, 10):
# listItem = xbmcgui.ListItem("Test:", "Test 02 " + str(x))
# mediaList.addItem(listItem)
# add overview
overview = item.get("Overview")
self.getControl(3223).setText(overview)
# add people
peopleList = self.getControl(3230)
people = item.get("People")
director=''
writer=''
for person in people:
displayName = person.get("Name")
if person.get("Role") != None and person.get("Role") != '':
role = "as " + person.get("Role")
else:
role = ''
id = person.get("Id")
tag = person.get("PrimaryImageTag")
baseName = person.get("Name")
baseName = baseName.replace(" ", "+")
baseName = baseName.replace("&", "_")
baseName = baseName.replace("?", "_")
baseName = baseName.replace("=", "_")
actionUrl = "plugin://plugin.video.emby?mode=person&name=" + baseName
if(tag != None and len(tag) > 0):
thumbPath = self.downloadUtils.imageUrl(id, "Primary", 0, 400, 400)
listItem = xbmcgui.ListItem(label=displayName, label2=role, iconImage=thumbPath, thumbnailImage=thumbPath)
else:
listItem = xbmcgui.ListItem(label=displayName, label2=role)
listItem.setProperty("ActionUrl", actionUrl)
peopleList.addItem(listItem)
if(person.get("Type") == "Director") and director =='':
director = displayName
if(tag != None and len(tag) > 0):
thumbPath = self.downloadUtils.imageUrl(id, "Primary", 0, 580, 860)
directorlistItem = xbmcgui.ListItem("Director:", label2=displayName, iconImage=thumbPath, thumbnailImage=thumbPath)
else:
directorlistItem = xbmcgui.ListItem("Director:", label2=displayName)
directorlistItem.setProperty("ActionUrl", actionUrl)
if(person.get("Type") == "Writing") and writer == '':
writer = person.get("Name")
if(tag != None and len(tag) > 0):
thumbPath = self.downloadUtils.imageUrl(id, "Primary", 0, 580, 860)
writerlistItem = xbmcgui.ListItem("Writer:", label2=displayName, iconImage=thumbPath, thumbnailImage=thumbPath)
else:
writerlistItem = xbmcgui.ListItem("Writer:", label2=displayName)
writerlistItem.setProperty("ActionUrl", actionUrl)
if(person.get("Type") == "Writer") and writer == '':
writer = person.get("Name")
if(tag != None and len(tag) > 0):
thumbPath = self.downloadUtils.imageUrl(id, "Primary", 0, 580, 860)
writerlistItem = xbmcgui.ListItem("Writer:", label2=displayName, iconImage=thumbPath, thumbnailImage=thumbPath)
else:
writerlistItem = xbmcgui.ListItem("Writer:", label2=displayName)
writerlistItem.setProperty("ActionUrl", actionUrl)
# add general info
infoList = self.getControl(3226)
listItem = xbmcgui.ListItem("Year:", str(item.get("ProductionYear")))
infoList.addItem(listItem)
listItem = xbmcgui.ListItem("Rating:", str(item.get("CommunityRating")))
infoList.addItem(listItem)
listItem = xbmcgui.ListItem("MPAA:", str(item.get("OfficialRating")))
infoList.addItem(listItem)
duration = str(int(item.get("RunTimeTicks", "0"))/(10000000*60))
listItem = xbmcgui.ListItem("RunTime:", str(duration) + " Minutes")
infoList.addItem(listItem)
genre = ""
genres = item.get("Genres")
if genres != None and genres != []:
for genre_string in genres:
if genre == "": #Just take the first genre
genre = genre_string
else:
genre = genre + " / " + genre_string
elif item.get("SeriesGenres") != None and item.get("SeriesGenres") != '':
genres = item.get("SeriesGenres")
if genres != None and genres != []:
for genre_string in genres:
if genre == "": #Just take the first genre
genre = genre_string
else:
genre = genre + " / " + genre_string
genrelistItem = xbmcgui.ListItem("Genre:", genre)
genrelistItem2 = xbmcgui.ListItem("Genre:", genre)
infoList.addItem(genrelistItem)
path = item.get('Path')
pathlistItem = xbmcgui.ListItem("Path:", path)
pathlistItem2 = xbmcgui.ListItem("Path:", path)
infoList.addItem(pathlistItem)
if item.get("CriticRating") != None:
listItem = xbmcgui.ListItem("CriticRating:", str(item.get("CriticRating")))
infoList.addItem(listItem)
# Process Studio
studio = ""
if item.get("SeriesStudio") != None and item.get("SeriesStudio") != '':
studio = item.get("SeriesStudio")
if studio == "":
studios = item.get("Studios")
if(studios != None):
for studio_string in studios:
if studio=="": #Just take the first one
temp=studio_string.get("Name")
studio=temp.encode('utf-8')
if studio != "":
listItem = xbmcgui.ListItem("Studio:", studio)
infoList.addItem(listItem)
if item.get("Metascore") != None:
listItem = xbmcgui.ListItem("Metascore:", str(item.get("Metascore")))
infoList.addItem(listItem)
playCount = 0
if(userData != None and userData.get("Played") == True):
playCount = 1
listItem = xbmcgui.ListItem("PlayedCount:", str(playCount))
infoList.addItem(listItem)
if item.get("ProviderIds") != None and item.get("ProviderIds").get("Imdb") != None and type == "Movie":
listItem = xbmcgui.ListItem("ID:", item.get("ProviderIds").get("Imdb"))
infoList.addItem(listItem)
elif item.get("ProviderIds") != None and item.get("ProviderIds").get("Tvdb") != None and type == "Series":
listItem = xbmcgui.ListItem("ID:", item.get("ProviderIds").get("Tvdb"))
infoList.addItem(listItem)
elif (type == "Episode" or type == "Season"):
url = "{server}/mediabrowser/Users/{UserId}/Items/" + item.get("SeriesId") + "?Fields=SeriesGenres,AirTime&format=json"
seriesitem = self.downloadUtils.downloadUrl(url)
if seriesitem.get("ProviderIds") != None and seriesitem.get("ProviderIds").get("Tvdb") != None:
listItem = xbmcgui.ListItem("ID:", seriesitem.get("ProviderIds").get("Tvdb"))
infoList.addItem(listItem)
# alternate list
try:
alternateList = self.getControl(3291)
if alternateList != None:
if directorlistItem != None:
alternateList.addItem(directorlistItem)
if writerlistItem != None:
alternateList.addItem(writerlistItem)
alternateList.addItem(genrelistItem2)
if item.get("ProductionLocations") !=None and item.get("ProductionLocations") != []:
listItem = xbmcgui.ListItem("Country:", item.get("ProductionLocations")[0])
alternateList.addItem(listItem)
elif item.get("AirTime") !=None:
listItem = xbmcgui.ListItem("Air Time:", item.get("AirTime"))
alternateList.addItem(listItem)
if(item.get("PremiereDate") != None):
premieredatelist = (item.get("PremiereDate")).split("T")
premieredate = premieredatelist[0]
listItem = xbmcgui.ListItem("Premiered Date:", premieredate)
alternateList.addItem(listItem)
alternateList.addItem(pathlistItem2)
except:
pass
self.getControl(3000).setLabel(name)
self.getControl(3003).setLabel(episodeInfo)
try:
discartImageControl = self.getControl(3091)
artImageControl = self.getControl(3092)
thumbImageControl = self.getControl(3093)
logoImageControl = self.getControl(3094)
if discartImageControl != None and artImageControl != None and thumbImageControl != None and logoImageControl != None:
if logo != "":
self.getControl(3094).setImage(logo)
else:
self.getControl(3000).setVisible(True)
if discart != '':
self.getControl(3091).setImage(discart)
self.getControl(3092).setVisible(False)
self.getControl(3093).setVisible(False)
else:
self.getControl(3091).setVisible(False)
art = API().getArtwork(item,"Art")
if (artImageControl != None):
if art != '':
self.getControl(3092).setImage(art)
self.getControl(3093).setVisible(False)
else:
self.getControl(3092).setVisible(False)
if (type == "Episode"):
thumb = API().getArtwork(item,"Thumb3")
else:
thumb = API().getArtwork(item,"Thumb")
if (thumbImageControl != None):
if thumb != '':
self.getControl(3093).setImage(thumb)
else:
self.getControl(3093).setVisible(False)
except:
pass
if(type == "Episode"):
# null_pointer - I have removed this in favor of letting the user chose from the setting and using the "poster" type in the above image url create
#image = API().getArtwork(seriesitem, "Primary")
seriesimage = API().getArtwork(item, "SeriesPrimary")
try:
self.getControl(3099).setImage(seriesimage)
except:
pass
self.getControl(3009).setImage(image)
if(cappedPercentage != None):
self.getControl(3010).setImage("Progress\progress_" + str(cappedPercentage) + ".png")
else:
self.getControl(3011).setImage(image)
if(cappedPercentage != None):
self.getControl(3012).setImage("Progress\progress_" + str(cappedPercentage) + ".png")
# disable play button
if(type == "Season" or type == "Series"):
self.setFocusId(3226)
self.getControl(3002).setEnabled(False)
def setId(self, id):
self.id = id
def onFocus(self, controlId):
pass
def doAction(self):
pass
def closeDialog(self):
self.close()
def onClick(self, controlID):
if(controlID == 3002):
# close all dialogs when playing an item
xbmc.executebuiltin("Dialog.Close(all,true)")
xbmc.executebuiltin("RunPlugin(" + self.playUrl + ")")
self.close()
elif(controlID == 3102):
# close all dialogs when playing an item
xbmc.executebuiltin("Dialog.Close(all,true)")
xbmc.executebuiltin("RunPlugin(" + self.trailerUrl + ")")
self.close()
elif(controlID == 3103):
# close all dialogs when playing an item
xbmc.executebuiltin("Dialog.Close(all,true)")
xbmc.executebuiltin("RunPlugin(" + self.couchPotatoUrl + ")")
elif(controlID == 3230):
peopleList = self.getControl(3230)
item = peopleList.getSelectedItem()
action = item.getProperty("ActionUrl")
xbmc.log(action)
xbmc.executebuiltin("RunPlugin(" + action + ")")
elif(controlID == 3291):
list = self.getControl(3291)
item = list.getSelectedItem()
action = item.getProperty("ActionUrl")
xbmc.log(action)
xbmc.executebuiltin("RunPlugin(" + action + ")")
elif(controlID == 3192):
url = '{server}/mediabrowser/Users/{UserId}/PlayedItems/' + self.id
button = self.getControl(3192)
watched = button.isSelected()
if watched == True:
self.postUrl(url)
else:
self.deleteUrl(url)
self.onInit()
elif(controlID == 3193):
url = '{server}/mediabrowser/Users/{UserId}/Items/' + self.id + '/Rating'
dislikebutton = self.getControl(3193)
dislike = dislikebutton.isSelected()
if dislike == True:
url = url + '?likes=false'
self.postUrl(url)
else:
self.deleteUrl(url)
self.onInit()
elif(controlID == 3194):
url = '{server}/mediabrowser/Users/{UserId}/Items/' + self.id + '/Rating'
likebutton = self.getControl(3194)
like = likebutton.isSelected()
if like == True:
url = url + '?likes=true'
self.postUrl(url)
else:
self.deleteUrl(url)
self.onInit()
elif(controlID == 3195):
url = '{server}/mediabrowser/Users/{UserId}/FavoriteItems/' + self.id
button = self.getControl(3195)
favourite = button.isSelected()
if favourite == True:
self.postUrl(url)
else:
self.deleteUrl(url)
self.onInit()
elif(controlID == 3006):
url = "{server}/mediabrowser/Users/{UserId}/PlayingItems/" + self.id + "/Progress?PositionTicks=0"
self.postUrl(url)
self.onInit()
pass
def postUrl (self,url):
self.downloadUtils.downloadUrl(url, postBody="", type="POST")
def deleteUrl (self,url):
self.downloadUtils.downloadUrl(url, type="DELETE")