Files
jellycon/resources/lib/widgets.py
2019-01-11 10:24:42 +11:00

475 lines
17 KiB
Python

import xbmcaddon
import xbmcplugin
import xbmcgui
import xbmc
import json
import urllib
import hashlib
import time
import random
import sys
from .downloadutils import DownloadUtils
from .utils import getArt
from .datamanager import DataManager
from .simple_logging import SimpleLogging
from .kodi_utils import HomeWindow
from .dir_functions import processDirectory
log = SimpleLogging(__name__)
downloadUtils = DownloadUtils()
dataManager = DataManager()
kodi_version = int(xbmc.getInfoLabel('System.BuildVersion')[:2])
background_items = []
background_current_item = 0
def set_random_movies():
log.debug("set_random_movies Called")
url = ('{server}/emby/Users/{userid}/Items' +
'?Recursive=true' +
'&limit=20' +
'&Filters=IsUnplayed' +
'&IsPlayed=false' +
'&SortBy=Random' +
'&IncludeItemTypes=Movie' +
'&ImageTypeLimit=0')
results = downloadUtils.downloadUrl(url, suppress=True)
results = json.loads(results)
randon_movies_list = []
if results is not None:
items = results.get("Items", [])
for item in items:
randon_movies_list.append(item.get("Id"))
random.shuffle(randon_movies_list)
movies_list_string = ",".join(randon_movies_list)
home_window = HomeWindow()
m = hashlib.md5()
m.update(movies_list_string)
new_widget_hash = m.hexdigest()
log.debug("set_random_movies : {0}", movies_list_string)
log.debug("set_random_movies : {0}", new_widget_hash)
home_window.setProperty("random-movies", movies_list_string)
home_window.setProperty("random-movies-changed", new_widget_hash)
def set_background_image(force=False):
log.debug("set_background_image Called forced={0}", force)
global background_current_item
global background_items
if force:
background_current_item = 0
background_items = []
if len(background_items) == 0 or background_current_item >= len(background_items):
log.debug("set_background_image: Need to load more backgrounds {0} - {1}",
len(background_items), background_current_item)
url = ('{server}/emby/Users/{userid}/Items' +
'?Recursive=true' +
'&limit=60' +
'&SortBy=Random' +
'&IncludeItemTypes=Movie,Series' +
'&ImageTypeLimit=1')
server = downloadUtils.getServer()
results = downloadUtils.downloadUrl(url, suppress=True)
results = json.loads(results)
if results is not None:
items = results.get("Items", [])
background_current_item = 0
background_items = []
for item in items:
bg_image = downloadUtils.getArtwork(item, "Backdrop", server=server)
label = item.get("Name")
item_background = {}
item_background["image"] = bg_image
item_background["name"] = label
background_items.append(item_background)
log.debug("set_background_image: Loaded {0} more backgrounds", len(background_items))
if len(background_items) > 0 and background_current_item < len(background_items):
bg_image = background_items[background_current_item].get("image")
label = background_items[background_current_item].get("name")
log.debug("set_background_image: {0} - {1} - {2}", background_current_item, label, bg_image)
background_current_item += 1
home_window = HomeWindow()
home_window.setProperty("random-gb", bg_image)
home_window.setProperty("random-gb-label", label)
def checkForNewContent():
log.debug("checkForNewContent Called")
added_url = ('{server}/emby/Users/{userid}/Items' +
'?Recursive=true' +
'&limit=1' +
'&Fields=DateCreated,Etag' +
'&SortBy=DateCreated' +
'&SortOrder=Descending' +
'&IncludeItemTypes=Movie,Episode' +
'&ImageTypeLimit=0' +
'&format=json')
added_result = downloadUtils.downloadUrl(added_url, suppress=True)
result = json.loads(added_result)
log.debug("LATEST_ADDED_ITEM: {0}", result)
last_added_date = ""
if result is not None:
items = result.get("Items", [])
if len(items) > 0:
item = items[0]
last_added_date = item.get("Etag", "")
log.debug("last_added_date: {0}", last_added_date)
played_url = ('{server}/emby/Users/{userid}/Items' +
'?Recursive=true' +
'&limit=1' +
'&Fields=DateCreated,Etag' +
'&SortBy=DatePlayed' +
'&SortOrder=Descending' +
'&IncludeItemTypes=Movie,Episode' +
'&ImageTypeLimit=0' +
'&format=json')
played_result = downloadUtils.downloadUrl(played_url, suppress=True)
result = json.loads(played_result)
log.debug("LATEST_PLAYED_ITEM: {0}", result)
last_played_date = ""
if result is not None:
items = result.get("Items", [])
if len(items) > 0:
item = items[0]
last_played_date = item.get("Etag", "")
log.debug("last_played_date: {0}", last_played_date)
home_window = HomeWindow()
current_widget_hash = home_window.getProperty("embycon_widget_reload")
log.debug("Current Widget Hash: {0}", current_widget_hash)
m = hashlib.md5()
m.update(last_played_date + last_added_date)
new_widget_hash = m.hexdigest()
log.debug("New Widget Hash: {0}", new_widget_hash)
if current_widget_hash != new_widget_hash:
home_window.setProperty("embycon_widget_reload", new_widget_hash)
log.debug("Setting New Widget Hash: {0}", new_widget_hash)
def get_widget_content_cast(handle, params):
log.debug("getWigetContentCast Called: {0}", params)
server = downloadUtils.getServer()
item_id = params["id"]
data_manager = DataManager()
result = data_manager.GetContent("{server}/emby/Users/{userid}/Items/" + item_id + "?format=json")
log.debug("ItemInfo: {0}", result)
if not result:
return
if result.get("Type", "") in ["Episode", "Season"] and params.get("auto", "true") == "true":
series_id = result.get("SeriesId")
if series_id:
params["id"] = series_id
return get_widget_content_cast(handle, params)
list_items = []
if result is not None:
people = result.get("People", [])
else:
people = []
for person in people:
# if (person.get("Type") == "Director"):
# director = director + person.get("Name") + ' '
# if (person.get("Type") == "Writing"):
# writer = person.get("Name")
# if (person.get("Type") == "Writer"):
# writer = person.get("Name")
if person.get("Type") == "Actor":
person_name = person.get("Name")
person_role = person.get("Role")
person_id = person.get("Id")
person_tag = person.get("PrimaryImageTag")
person_thumbnail = None
if person_tag:
person_thumbnail = downloadUtils.imageUrl(person_id, "Primary", 0, 400, 400, person_tag, server=server)
if kodi_version > 17:
list_item = xbmcgui.ListItem(label=person_name, offscreen=True)
else:
list_item = xbmcgui.ListItem(label=person_name)
list_item.setProperty("id", person_id)
if person_thumbnail:
art_links = {}
art_links["thumb"] = person_thumbnail
art_links["poster"] = person_thumbnail
list_item.setArt(art_links)
labels = {}
labels["mediatype"] = "artist"
list_item.setInfo(type="music", infoLabels=labels)
if person_role:
list_item.setLabel2(person_role)
item_tupple = ("", list_item, False)
list_items.append(item_tupple)
xbmcplugin.setContent(handle, 'artists')
xbmcplugin.addDirectoryItems(handle, list_items)
xbmcplugin.endOfDirectory(handle, cacheToDisc=False)
'''
def populateWidgetItems(items_url, widget_type, override_select_action=None):
server = downloadUtils.getServer()
if server is None:
return []
settings = xbmcaddon.Addon()
select_action = settings.getSetting("widget_select_action")
if override_select_action is not None:
select_action = str(override_select_action)
log.debug("WIDGET_DATA_URL: {0}", items_url)
home_window = HomeWindow()
# get the items
data_manager = DataManager()
result = data_manager.GetContent(items_url)
log.debug("WIDGET_DATA: {0}", result)
if result is None:
return []
simmilar_to = None
if result is not None and isinstance(result, dict) and result.get("Items") is not None:
simmilar_to = result.get("BaselineItemName", None)
result = result.get("Items")
elif result is not None and isinstance(result, list) and len(result) > 0 and result[0].get("Items") is not None:
simmilar_to = result[0].get("BaselineItemName", None)
result = result[0].get("Items")
list_items = []
for item in result:
item_id = item["Id"]
name = item["Name"]
log.debug("name: {0}", name)
title = name
tvshowtitle = ""
item_type = item["Type"]
series_name = item["SeriesName"]
art = getArt(item, server)
if item_type == "Episode" and series_name is not None:
episode_number = item["IndexNumber"]
if episode_number is None:
episode_number = 0
season_number = item["ParentIndexNumber"]
if season_number is None:
season_number = 0
# name = series_name + " " + episodeDetails
name = "%s S%02dE%02d" % (series_name, season_number, episode_number)
tvshowtitle = "S%02dE%02d" % (season_number, episode_number)
title = series_name
elif item_type == "Series":
user_data = item["UserData"]
unplayed = user_data["UnplayedItemCount"]
title = item["Name"]
tvshowtitle = str(unplayed) + " Episodes"
art["poster"] = art["landscape"]
if kodi_version > 17:
list_item = xbmcgui.ListItem(label=name, iconImage=art['thumb'], offscreen=True)
else:
list_item = xbmcgui.ListItem(label=name, iconImage=art['thumb'])
# list_item.setLabel2(episodeDetails)
production_year = item["ProductionYear"]
prem_year = item["PremiereDate"]
if production_year is None and prem_year is not None:
production_year = int(prem_year[:4])
# add progress percent
userData = item["UserData"]
if userData["Played"] == True:
playCount = "1"
overlay = "5"
else:
playCount = "0"
overlay = "6"
runtime = item["RunTimeTicks"]
playBackTicks = userData["PlaybackPositionTicks"]
if playBackTicks is not None and runtime is not None and runtime > 0:
runtime = float(runtime)
playBackTicks = float(playBackTicks)
playBackPos = int(((playBackTicks / 1000) / 10000) / 60)
list_item.setProperty('ResumeTime', str(playBackPos))
percentage = int((playBackTicks / runtime) * 100.0)
list_item.setProperty("complete_percentage", str(percentage))
video_info_label = {"title": title,
"tvshowtitle": tvshowtitle,
"year": production_year,
"Overlay": overlay,
"playcount": playCount}
list_item.setInfo(type="Video", infoLabels=video_info_label)
list_item.setProperty('fanart_image', art['fanart']) # back compat
list_item.setProperty('discart', art['discart']) # not avail to setArt
list_item.setArt(art)
list_item.setProperty('IsPlayable', 'false')
if runtime is not None:
totalTime = str(int(float(runtime) / (10000000 * 60)))
list_item.setProperty('TotalTime', str(totalTime))
list_item.setContentLookup(False)
list_item.setProperty('id', item_id)
if simmilar_to is not None:
list_item.setProperty('suggested_from_watching', simmilar_to)
session_id = "&session_id=" + home_window.getProperty("session_id")
if item_type == "Series":
playurl = "plugin://plugin.video.embycon/?item_id=" + item_id + '&mode=SHOW_MENU' + session_id
elif select_action == "1":
playurl = "plugin://plugin.video.embycon/?item_id=" + item_id + '&mode=PLAY' + session_id
elif select_action == "0":
playurl = "plugin://plugin.video.embycon/?item_id=" + item_id + '&mode=SHOW_MENU' + session_id
item_tupple = (playurl, list_item, False)
list_items.append(item_tupple)
return list_items
'''
def getWidgetContent(handle, params):
log.debug("getWigetContent Called: {0}", params)
widget_type = params.get("type")
if widget_type is None:
log.error("getWigetContent type not set")
return
log.debug("widget_type: {0}", widget_type)
items_url = ("{server}/emby/Users/{userid}/Items" +
"?Limit={ItemLimit}" +
"&format=json" +
'&Fields={field_filters}' +
"&ImageTypeLimit=1" +
"&IsMissing=False")
if widget_type == "recent_movies":
xbmcplugin.setContent(handle, 'movies')
items_url += ("&Recursive=true" +
"&SortBy=DateCreated" +
"&SortOrder=Descending" +
"&Filters=IsUnplayed,IsNotFolder" +
"&IsPlayed=false" +
"&IsVirtualUnaired=false" +
"&IsMissing=False" +
"&IncludeItemTypes=Movie")
elif widget_type == "inprogress_movies":
xbmcplugin.setContent(handle, 'movies')
items_url += ("&Recursive=true" +
"&SortBy=DatePlayed" +
"&SortOrder=Descending" +
"&Filters=IsResumable" +
"&IsVirtualUnaired=false" +
"&IsMissing=False" +
"&IncludeItemTypes=Movie")
elif widget_type == "random_movies":
xbmcplugin.setContent(handle, 'movies')
items_url += "&Ids={random_movies}"
elif widget_type == "recent_tvshows":
xbmcplugin.setContent(handle, 'episodes')
items_url = ('{server}/emby/Users/{userid}/Items/Latest' +
'?GroupItems=true' +
'&Limit={ItemLimit}' +
'&Recursive=true' +
'&SortBy=DateCreated' +
'&SortOrder=Descending' +
'&Filters=IsUnplayed' +
'&Fields={field_filters}' +
'&IsPlayed=false' +
'&IsVirtualUnaired=false' +
'&IsMissing=False' +
'&IncludeItemTypes=Episode' +
'&ImageTypeLimit=1' +
'&format=json')
elif widget_type == "recent_episodes":
xbmcplugin.setContent(handle, 'episodes')
items_url += ("&Recursive=true" +
"&SortBy=DateCreated" +
"&SortOrder=Descending" +
"&Filters=IsUnplayed,IsNotFolder" +
"&IsPlayed=false" +
"&IsVirtualUnaired=false" +
"&IsMissing=False" +
"&IncludeItemTypes=Episode")
elif widget_type == "inprogress_episodes":
xbmcplugin.setContent(handle, 'episodes')
items_url += ("&Recursive=true" +
"&SortBy=DatePlayed" +
"&SortOrder=Descending" +
"&Filters=IsResumable" +
"&IsVirtualUnaired=false" +
"&IsMissing=False" +
"&IncludeItemTypes=Episode")
elif widget_type == "nextup_episodes":
xbmcplugin.setContent(handle, 'episodes')
items_url = ("{server}/emby/Shows/NextUp" +
"?Limit={ItemLimit}"
"&userid={userid}" +
"&Recursive=true" +
'&Fields={field_filters}' +
"&format=json" +
"&ImageTypeLimit=1")
list_items, detected_type = processDirectory(items_url, None, params, False)
#list_items = populateWidgetItems(items_url, widget_type)
xbmcplugin.addDirectoryItems(handle, list_items)
xbmcplugin.endOfDirectory(handle, cacheToDisc=False)