def populate_listitem(item_id): log.debug("populate_listitem: {0}", item_id) url = "{server}/emby/Users/{userid}/Items/" + item_id + "?format=json" jsonData = downloadUtils.downloadUrl(url) result = json.loads(jsonData) log.debug("populate_listitem item info: {0}", result) ''' server = downloadUtils.getServer() gui_options = {} gui_options["server"] = server gui_options["name_format"] = None gui_options["name_format_type"] = None details, extraData = extract_item_info(result,gui_options ) u, list_item, folder = add_gui_item(result["Id"], details, extraData, {}, folder=False) log.debug("list_item path: {0}", u) #list_item.setProperty('IsPlayable', 'false') #list_item.setPath(u) ''' item_title = result.get("Name", i18n('missing_title')) list_item = xbmcgui.ListItem(label=item_title) server = downloadUtils.getServer() art = getArt(result, server=server) list_item.setIconImage(art['thumb']) # back compat 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') list_item.setProperty('IsFolder', 'false') list_item.setProperty('id', result.get("Id")) # play info details = { 'title': item_title, 'plot': result.get("Overview") } list_item.setInfo("Video", infoLabels=details) return list_item
def populate_listitem(item_id): log.debug("populate_listitem: {0}", item_id) url = "{server}/emby/Users/{userid}/Items/" + item_id + "?format=json" jsonData = downloadUtils.downloadUrl(url) result = json.loads(jsonData) log.debug("populate_listitem item info: {0}", result) ''' server = downloadUtils.getServer() gui_options = {} gui_options["server"] = server gui_options["name_format"] = None gui_options["name_format_type"] = None details, extraData = extract_item_info(result,gui_options ) u, list_item, folder = add_gui_item(result["Id"], details, extraData, {}, folder=False) log.debug("list_item path: {0}", u) #list_item.setProperty('IsPlayable', 'false') #list_item.setPath(u) ''' item_title = result.get("Name", i18n('missing_title')) list_item = xbmcgui.ListItem(label=item_title) server = downloadUtils.getServer() art = getArt(result, server=server) list_item.setIconImage(art['thumb']) # back compat 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') list_item.setProperty('IsFolder', 'false') list_item.setProperty('id', result.get("Id")) # play info details = { 'title': item_title, 'plot': result.get("Overview") } list_item.setInfo("Video", infoLabels=details) return list_item
def cache_artwork(self, progress): log.debug("cache_artwork") # is the web server enabled web_query = {"setting": "services.webserver"} result = json_rpc('Settings.GetSettingValue').execute(web_query) xbmc_webserver_enabled = result['result']['value'] if not xbmc_webserver_enabled: log.debug("Kodi web server not enabled, can not cache images") return # get the port web_port = {"setting": "services.webserverport"} result = json_rpc('Settings.GetSettingValue').execute(web_port) xbmc_port = result['result']['value'] log.debug("xbmc_port: {0}", xbmc_port) # get the user web_user = {"setting": "services.webserverusername"} result = json_rpc('Settings.GetSettingValue').execute(web_user) xbmc_username = result['result']['value'] log.debug("xbmc_username: {0}", xbmc_username) # get the password web_pass = {"setting": "services.webserverpassword"} result = json_rpc('Settings.GetSettingValue').execute(web_pass) xbmc_password = result['result']['value'] params = {"properties": ["url"]} json_result = json_rpc('Textures.GetTextures').execute(params) textures = json_result.get("result", {}).get("textures", []) if self.stop_all_activity: return texture_urls = set() for texture in textures: url = texture.get("url") url = urllib.unquote(url) url = url.replace("image://", "") url = url[0:-1] texture_urls.add(url) del textures del json_result if self.stop_all_activity: return url = ('{server}/emby/Users/{userid}/Items?' + '&Recursive=true' + '&IncludeItemTypes=Movie,Series,Episode,BoxSet' + '&ImageTypeLimit=1' + '&format=json') data_manager = DataManager() results = data_manager.GetContent(url) if results is None: results = [] if isinstance(results, dict): results = results.get("Items") server = downloadUtils.getServer() missing_texture_urls = set() if self.stop_all_activity: return image_types = [ "thumb", "poster", "banner", "clearlogo", "tvshow.poster", "tvshow.banner", "tvshow.landscape" ] for item in results: art = getArt(item, server) for image_type in art: image_url = art[image_type] if image_url not in texture_urls and not image_url.endswith( "&Tag=") and len(image_url) > 0: missing_texture_urls.add(image_url) if self.stop_all_activity: return log.debug("texture_urls: {0}", texture_urls) log.debug("missing_texture_urls: {0}", missing_texture_urls) log.debug("Number of existing textures: {0}", len(texture_urls)) log.debug("Number of missing textures: {0}", len(missing_texture_urls)) kodi_http_server = "localhost:" + str(xbmc_port) headers = {} if xbmc_password: auth = "%s:%s" % (xbmc_username, xbmc_password) headers = {'Authorization': 'Basic %s' % base64.b64encode(auth)} total = len(missing_texture_urls) index = 1 count_done = 0 for get_url in missing_texture_urls: log.debug("texture_url: {0}", get_url) url = double_urlencode(get_url) kodi_texture_url = ("/image/image://%s" % url) log.debug("kodi_texture_url: {0}", kodi_texture_url) percentage = int((float(index) / float(total)) * 100) message = "%s of %s" % (index, total) progress.update(percentage, "%s" % (message)) conn = httplib.HTTPConnection(kodi_http_server, timeout=20) conn.request(method="GET", url=kodi_texture_url, headers=headers) data = conn.getresponse() if data.status == 200: count_done += 1 log.debug("Get Image Result: {0}", data.status) index += 1 if "iscanceled" in dir(progress) and progress.iscanceled(): break if self.stop_all_activity: break result_report = [] result_report.append( i18n('existing_textures') + str(len(texture_urls))) result_report.append( i18n('missing_textures') + str(len(missing_texture_urls))) result_report.append(i18n('loaded_textures') + str(count_done)) return result_report
def processDirectory(results, progress, params): log.debug("== ENTER: processDirectory ==") settings = xbmcaddon.Addon() server = downloadUtils.getServer() name_format = params.get("name_format", None) name_format_type = None if name_format is not None: name_format = urllib.unquote(name_format) tokens = name_format.split("|") if len(tokens) == 2: name_format_type = tokens[0] name_format = settings.getSetting(tokens[1]) else: name_format_type = None name_format = None dirItems = [] if results is None: results = [] baseline_name = None if isinstance(results, dict) and results.get("Items") is not None: baseline_name = results.get("BaselineItemName") results = results.get("Items", []) elif isinstance(results, list) and len(results) > 0 and results[0].get("Items") is not None: baseline_name = results[0].get("BaselineItemName") results = results[0].get("Items") # flatten single season # if there is only one result and it is a season and you have flatten signle season turned on then # build a new url, set the content media type and call get content again flatten_single_season = settings.getSetting("flatten_single_season") == "true" if flatten_single_season and len(results) == 1 and results[0].get("Type", "") == "Season": season_id = results[0].get("Id") season_url = ('{server}/emby/Users/{userid}/items' + '?ParentId=' + season_id + '&IsVirtualUnAired=false' + '&IsMissing=false' + '&Fields={field_filters}' + '&format=json') if progress is not None: progress.close() params["media_type"] = "Episodes" getContent(season_url, params) return None, None hide_unwatched_details = settings.getSetting('hide_unwatched_details') == 'true' display_options = {} display_options["addCounts"] = settings.getSetting("addCounts") == 'true' display_options["addResumePercent"] = settings.getSetting("addResumePercent") == 'true' display_options["addSubtitleAvailable"] = settings.getSetting("addSubtitleAvailable") == 'true' show_empty_folders = settings.getSetting("show_empty_folders") == 'true' item_count = len(results) current_item = 1 first_season_item = None total_unwatched = 0 total_episodes = 0 total_watched = 0 gui_options = {} gui_options["server"] = server gui_options["name_format"] = name_format gui_options["name_format_type"] = name_format_type detected_type = None for item in results: if progress is not None: percent_done = (float(current_item) / float(item_count)) * 100 progress.update(int(percent_done), i18n('processing_item:') + str(current_item)) current_item = current_item + 1 # get the infofrom the item item_details = extract_item_info(item, gui_options) item_details.baseline_itemname = baseline_name if detected_type is not None: if item_details.item_type != detected_type: detected_type = "mixed" else: detected_type = item_details.item_type if item_details.item_type == "Season" and first_season_item is None: first_season_item = item total_unwatched += item_details.unwatched_episodes total_episodes += item_details.total_episodes total_watched += item_details.watched_episodes # if set, for unwatched episodes dont show some of the info if hide_unwatched_details and item_details.item_type == "Episode" and item_details.play_count == 0: item_details.plot = "[Spoiler Alert]" item_details.art["poster"] = item_details.art["tvshow.poster"] item_details.art["thumb"] = item_details.art["tvshow.poster"] if item["IsFolder"] is True: if item_details.item_type == "Series": u = ('{server}/emby/Shows/' + item_details.id + '/Seasons' '?userId={userid}' + '&Fields={field_filters}' + '&format=json') else: u = ('{server}/emby/Users/{userid}/items' + '?ParentId=' + item_details.id + '&IsVirtualUnAired=false' + '&IsMissing=false' + '&Fields={field_filters}' + '&format=json') if show_empty_folders or item["RecursiveItemCount"] != 0: dirItems.append(add_gui_item(u, item_details, display_options)) elif item_details.item_type == "MusicArtist": u = ('{server}/emby/Users/{userid}/items' + '?ArtistIds=' + item_details.id + '&IncludeItemTypes=MusicAlbum' + '&CollapseBoxSetItems=false' + '&Recursive=true' + '&format=json') dirItems.append(add_gui_item(u, item_details, display_options)) else: u = item_details.id dirItems.append(add_gui_item(u, item_details, display_options, folder=False)) # add the all episodes item show_all_episodes = settings.getSetting('show_all_episodes') == 'true' if (show_all_episodes and first_season_item is not None and len(dirItems) > 1 and first_season_item.get("SeriesId") is not None): series_url = ('{server}/emby/Users/{userid}/items' + '?ParentId=' + first_season_item.get("SeriesId") + '&IsVirtualUnAired=false' + '&IsMissing=false' + '&Fields={field_filters}' + '&Recursive=true' + '&IncludeItemTypes=Episode' + '&format=json') played = 0 overlay = "7" if total_unwatched == 0: played = 1 overlay = "6" item_details = ItemDetails() item_details.id = first_season_item.get("Id") item_details.name = i18n('all') item_details.art = getArt(first_season_item, server) item_details.play_count = played item_details.overlay = overlay item_details.name_format = "Episode|episode_name_format" item_details.series_name = first_season_item.get("SeriesName") item_details.item_type = "Season" item_details.unwatched_episodes = total_unwatched item_details.total_episodes = total_episodes item_details.watched_episodes = total_watched item_details.mode = "GET_CONTENT" dirItems.append(add_gui_item(series_url, item_details, display_options, folder=True)) return dirItems, detected_type
def populateWidgetItems(itemsUrl, 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_DATE_URL: {0}", itemsUrl) home_window = HomeWindow() # get the items data_manager = DataManager() result = data_manager.GetContent(itemsUrl) if result is not None and isinstance( result, dict) and result.get("Items") is not None: simmilarTo = result.get("BaselineItemName", None) result = result.get("Items") elif result is not None and isinstance(result, list) and len(result) > 0: simmilarTo = result[0].get("BaselineItemName", None) result = result[0].get("Items") else: result = [] itemCount = 1 listItems = [] for item in result: item_id = item["Id"] name = item["Name"] episodeDetails = "" log.debug("WIDGET_DATE_NAME: {0}", name) title = name tvshowtitle = "" item_type = item["Type"] series_name = item["SeriesName"] 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 art = getArt(item, server, widget=True) 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) # add count #list_item.setProperty("item_index", str(itemCount)) #itemCount = itemCount + 1 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 simmilarTo is not None: list_item.setProperty('suggested_from_watching', simmilarTo) session_id = "&session_id=" + home_window.getProperty("session_id") if 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 itemTupple = (playurl, list_item, False) listItems.append(itemTupple) return listItems
def showGenreList(params): log.debug("showGenreList: {0}", params) server = downloadUtils.getServer() if server is None: return parent_id = params.get("parent_id") item_type = params.get("item_type") kodi_type = "Movies" emby_type = "Movie" if item_type is not None and item_type == "tvshow": emby_type = "Series" kodi_type = "tvshows" url = ("{server}/emby/Genres?" + "SortBy=Name" + "&SortOrder=Ascending" + "&IncludeItemTypes=" + emby_type + "&Recursive=true" + "&UserId={userid}") if parent_id is not None: url += "&parentid=" + parent_id data_manager = DataManager() result = data_manager.GetContent(url) if result is not None: result = result.get("Items") else: result = [] collections = [] xbmcplugin.setContent(int(sys.argv[1]), 'genres') for genre in result: art = getArt(item=genre, server=server) item_data = {} item_data['title'] = genre.get("Name") item_data['media_type'] = kodi_type item_data['art'] = art url = ("{server}/emby/Users/{userid}/Items" + "?Fields={field_filters}" + "&Recursive=true" + "&GenreIds=" + genre.get("Id") + "&IncludeItemTypes=" + emby_type + "&ImageTypeLimit=1") if parent_id is not None: url += "&parentid=" + parent_id item_data['path'] = url collections.append(item_data) for collection in collections: url = sys.argv[0] + ("?url=" + urllib.quote(collection['path']) + "&mode=GET_CONTENT" + "&media_type=" + collection["media_type"]) log.debug("addMenuDirectoryItem: {0} - {1} - {2}", collection.get('title'), url, collection.get("art")) addMenuDirectoryItem(collection.get('title', i18n('unknown')), url, art=collection.get("art")) xbmcplugin.endOfDirectory(int(sys.argv[1]))
def processDirectory(results, progress, params): log.debug("== ENTER: processDirectory ==") settings = xbmcaddon.Addon() server = downloadUtils.getServer() name_format = params.get("name_format", None) name_format_type = None if name_format is not None: name_format = urllib.unquote(name_format) tokens = name_format.split("|") if len(tokens) == 2: name_format_type = tokens[0] name_format = settings.getSetting(tokens[1]) else: name_format_type = None name_format = None dirItems = [] if results is None: results = [] baseline_name = None if isinstance(results, dict) and results.get("Items") is not None: baseline_name = results.get("BaselineItemName") results = results.get("Items", []) elif isinstance(results, list) and len(results) > 0 and results[0].get("Items") is not None: baseline_name = results[0].get("BaselineItemName") results = results[0].get("Items") # flatten single season # if there is only one result and it is a season and you have flatten signle season turned on then # build a new url, set the content media type and call get content again flatten_single_season = settings.getSetting("flatten_single_season") == "true" if flatten_single_season and len(results) == 1 and results[0].get("Type", "") == "Season": season_id = results[0].get("Id") season_url = ('{server}/emby/Users/{userid}/items' + '?ParentId=' + season_id + '&IsVirtualUnAired=false' + '&IsMissing=false' + '&Fields={field_filters}' + '&format=json') if progress is not None: progress.close() params["media_type"] = "Episodes" getContent(season_url, params) return None, None hide_unwatched_details = settings.getSetting('hide_unwatched_details') == 'true' display_options = {} display_options["addCounts"] = settings.getSetting("addCounts") == 'true' display_options["addResumePercent"] = settings.getSetting("addResumePercent") == 'true' display_options["addSubtitleAvailable"] = settings.getSetting("addSubtitleAvailable") == 'true' show_empty_folders = settings.getSetting("show_empty_folders") == 'true' item_count = len(results) current_item = 1 first_season_item = None total_unwatched = 0 total_episodes = 0 total_watched = 0 gui_options = {} gui_options["server"] = server gui_options["name_format"] = name_format gui_options["name_format_type"] = name_format_type detected_type = None for item in results: if progress is not None: percent_done = (float(current_item) / float(item_count)) * 100 progress.update(int(percent_done), i18n('processing_item:') + str(current_item)) current_item = current_item + 1 # get the infofrom the item item_details = extract_item_info(item, gui_options) item_details.baseline_itemname = baseline_name if detected_type is not None: if item_details.item_type != detected_type: detected_type = "mixed" else: detected_type = item_details.item_type if item_details.item_type == "Season" and first_season_item is None: first_season_item = item total_unwatched += item_details.unwatched_episodes total_episodes += item_details.total_episodes total_watched += item_details.watched_episodes # if set, for unwatched episodes dont show some of the info if hide_unwatched_details and item_details.item_type == "Episode" and item_details.play_count == 0: item_details.plot = "[Spoiler Alert]" item_details.art["poster"] = item_details.art["tvshow.poster"] item_details.art["thumb"] = item_details.art["tvshow.poster"] if item["IsFolder"] is True: if item_details.item_type == "Series": u = ('{server}/emby/Shows/' + item_details.id + '/Seasons' '?userId={userid}' + '&Fields={field_filters}' + '&format=json') else: u = ('{server}/emby/Users/{userid}/items' + '?ParentId=' + item_details.id + '&IsVirtualUnAired=false' + '&IsMissing=false' + '&Fields={field_filters}' + '&format=json') if show_empty_folders or item["RecursiveItemCount"] != 0: dirItems.append(add_gui_item(u, item_details, display_options)) elif item_details.item_type == "MusicArtist": u = ('{server}/emby/Users/{userid}/items' + '?ArtistIds=' + item_details.id + '&IncludeItemTypes=MusicAlbum' + '&CollapseBoxSetItems=false' + '&Recursive=true' + '&format=json') dirItems.append(add_gui_item(u, item_details, display_options)) else: u = item_details.id dirItems.append(add_gui_item(u, item_details, display_options, folder=False)) # add the all episodes item show_all_episodes = settings.getSetting('show_all_episodes') == 'true' if (show_all_episodes and first_season_item is not None and len(dirItems) > 1 and first_season_item.get("SeriesId") is not None): series_url = ('{server}/emby/Users/{userid}/items' + '?ParentId=' + first_season_item.get("SeriesId") + '&IsVirtualUnAired=false' + '&IsMissing=false' + '&Fields={field_filters}' + '&Recursive=true' + '&IncludeItemTypes=Episode' + '&format=json') played = 0 overlay = "7" if total_unwatched == 0: played = 1 overlay = "6" item_details = ItemDetails() item_details.id = first_season_item.get("Id") item_details.name = i18n('all') item_details.art = getArt(first_season_item, server) item_details.play_count = played item_details.overlay = overlay item_details.name_format = "Episode|episode_name_format" item_details.series_name = first_season_item.get("SeriesName") item_details.item_type = "Season" item_details.unwatched_episodes = total_unwatched item_details.total_episodes = total_episodes item_details.watched_episodes = total_watched item_details.mode = "GET_CONTENT" dirItems.append(add_gui_item(series_url, item_details, display_options, folder=True)) return dirItems, detected_type
def cache_artwork(self, progress): log.debug("cache_artwork") # is the web server enabled web_query = {"setting": "services.webserver"} result = json_rpc('Settings.GetSettingValue').execute(web_query) xbmc_webserver_enabled = result['result']['value'] if not xbmc_webserver_enabled: log.debug("Kodi web server not enabled, can not cache images") return # get the port web_port = {"setting": "services.webserverport"} result = json_rpc('Settings.GetSettingValue').execute(web_port) xbmc_port = result['result']['value'] log.debug("xbmc_port: {0}", xbmc_port) # get the user web_user = {"setting": "services.webserverusername"} result = json_rpc('Settings.GetSettingValue').execute(web_user) xbmc_username = result['result']['value'] log.debug("xbmc_username: {0}", xbmc_username) # get the password web_pass = {"setting": "services.webserverpassword"} result = json_rpc('Settings.GetSettingValue').execute(web_pass) xbmc_password = result['result']['value'] params = {"properties": ["url"]} json_result = json_rpc('Textures.GetTextures').execute(params) textures = json_result.get("result", {}).get("textures", []) if self.stop_all_activity: return texture_urls = set() for texture in textures: url = texture.get("url") url = urllib.unquote(url) url = url.replace("image://", "") url = url[0:-1] texture_urls.add(url) del textures del json_result if self.stop_all_activity: return url = ('{server}/emby/Users/{userid}/Items?' + '&Recursive=true' + '&IncludeItemTypes=Movie,Series,Episode,BoxSet' + '&ImageTypeLimit=1' + '&format=json') data_manager = DataManager() results = data_manager.GetContent(url) if results is None: results = [] if isinstance(results, dict): results = results.get("Items") server = downloadUtils.getServer() missing_texture_urls = set() if self.stop_all_activity: return image_types = ["thumb", "poster", "banner", "clearlogo", "tvshow.poster", "tvshow.banner", "tvshow.landscape"] for item in results: art = getArt(item, server) for image_type in art: image_url = art[image_type] if image_url not in texture_urls and not image_url.endswith("&Tag=") and len(image_url) > 0: missing_texture_urls.add(image_url) if self.stop_all_activity: return log.debug("texture_urls: {0}", texture_urls) log.debug("missing_texture_urls: {0}", missing_texture_urls) log.debug("Number of existing textures: {0}", len(texture_urls)) log.debug("Number of missing textures: {0}", len(missing_texture_urls)) kodi_http_server = "localhost:" + str(xbmc_port) headers = {} if xbmc_password: auth = "%s:%s" % (xbmc_username, xbmc_password) headers = {'Authorization': 'Basic %s' % base64.b64encode(auth)} total = len(missing_texture_urls) index = 1 count_done = 0 for get_url in missing_texture_urls: log.debug("texture_url: {0}", get_url) url = double_urlencode(get_url) kodi_texture_url = ("/image/image://%s" % url) log.debug("kodi_texture_url: {0}", kodi_texture_url) percentage = int((float(index) / float(total)) * 100) message = "%s of %s" % (index, total) progress.update(percentage, "%s" % (message)) conn = httplib.HTTPConnection(kodi_http_server, timeout=20) conn.request(method="GET", url=kodi_texture_url, headers=headers) data = conn.getresponse() if data.status == 200: count_done += 1 log.debug("Get Image Result: {0}", data.status) index += 1 if "iscanceled" in dir(progress) and progress.iscanceled(): break if self.stop_all_activity: break result_report = [] result_report.append(i18n('existing_textures') + str(len(texture_urls))) result_report.append(i18n('missing_textures') + str(len(missing_texture_urls))) result_report.append(i18n('loaded_textures') + str(count_done)) return result_report
def showServerSessions(): log.debug("showServerSessions Called") handle = int(sys.argv[1]) downloadUtils = DownloadUtils() data_manager = DataManager() url = "{server}/emby/Users/{userid}" results = data_manager.GetContent(url) is_admin = results.get("Policy", {}).get("IsAdministrator", False) if not is_admin: xbmcplugin.endOfDirectory(handle, cacheToDisc=False) return url = "{server}/emby/Sessions" results = data_manager.GetContent(url) log.debug("session_info: {0}", results) if results is None: return list_items = [] for session in results: device_name = session.get("DeviceName", "na") user_name = session.get("UserName", "na") client_name = session.get("Client", "na") client_version = session.get("ApplicationVersion", "na") play_state = session.get("PlayState", None) now_playing = session.get("NowPlayingItem", None) transcoding_info = session.get("TranscodingInfo", None) session_info = user_name + " - " + client_name user_session_details = "" percenatge_played = 0 position_ticks = 0 runtime = 0 play_method = "na" if play_state is not None: position_ticks = play_state.get("PositionTicks", 0) play_method = play_state.get("PlayMethod", "na") art = {} if now_playing: server = downloadUtils.getServer() art = getArt(now_playing, server) runtime = now_playing.get("RunTimeTicks", 0) if position_ticks > 0 and runtime > 0: percenatge_played = (position_ticks / float(runtime)) * 100.0 percenatge_played = int(percenatge_played) session_info += " (" + now_playing.get( "Name", "na") + " " + str(percenatge_played) + "%)" user_session_details += now_playing.get( "Name", "na") + " " + str(percenatge_played) + "%" + "\n" else: session_info += " (idle)" user_session_details += "Idle" + "\n" transcoding_details = "" if transcoding_info: if not transcoding_info.get("IsVideoDirect", None): transcoding_details += "Video:" + transcoding_info.get( "VideoCodec", "") + ":" + str( transcoding_info.get("Width", 0)) + "x" + str( transcoding_info.get("Height", 0)) + "\n" else: transcoding_details += "Video:direct\n" if not transcoding_info.get("IsAudioDirect", None): transcoding_details += "Audio:" + transcoding_info.get( "AudioCodec", "") + ":" + str( transcoding_info.get("AudioChannels", 0)) + "\n" else: transcoding_details += "Audio:direct\n" transcoding_details += "Bitrate:" + str( transcoding_info.get("Bitrate", 0)) + "\n" list_item = xbmcgui.ListItem(label=session_info) list_item.setArt(art) user_session_details += device_name + "(" + client_version + ")\n" user_session_details += client_name + "\n" user_session_details += play_method + "\n" user_session_details += transcoding_details + "\n" info_labels = {} info_labels["duration"] = str(runtime / 10000000) info_labels["mediatype"] = "movie" info_labels["plot"] = user_session_details list_item.setInfo('video', info_labels) list_item.setProperty('TotalTime', str(runtime / 10000000)) list_item.setProperty('ResumeTime', str(position_ticks / 10000000)) list_item.setProperty("complete_percentage", str(percenatge_played)) item_tuple = ("", list_item, False) list_items.append(item_tuple) xbmcplugin.setContent(handle, "movies") xbmcplugin.addDirectoryItems(handle, list_items) xbmcplugin.endOfDirectory(handle, cacheToDisc=False)
def showGenreList(params): log.debug("showGenreList: {0}", params) server = downloadUtils.getServer() if server is None: return parent_id = params.get("parent_id") item_type = params.get("item_type") kodi_type = "Movies" emby_type = "Movie" if item_type is not None and item_type == "tvshow": emby_type = "Series" kodi_type = "tvshows" url = ("{server}/emby/Genres?" + "SortBy=Name" + "&SortOrder=Ascending" + "&IncludeItemTypes=" + emby_type + "&Recursive=true" + "&UserId={userid}") if parent_id is not None: url += "&parentid=" + parent_id data_manager = DataManager() result = data_manager.GetContent(url) if result is not None: result = result.get("Items") else: result = [] settings = xbmcaddon.Addon() group_movies = settings.getSetting('group_movies') == "true" collections = [] xbmcplugin.setContent(int(sys.argv[1]), 'genres') for genre in result: art = getArt(item=genre, server=server) item_data = {} item_data['title'] = genre.get("Name") item_data['media_type'] = kodi_type item_data['art'] = art url = ("{server}/emby/Users/{userid}/Items" + "?Fields={field_filters}" + "&Recursive=true" + '&CollapseBoxSetItems=' + str(group_movies) + '&GroupItemsIntoCollections=' + str(group_movies) + "&GenreIds=" + genre.get("Id") + "&IncludeItemTypes=" + emby_type + "&ImageTypeLimit=1") if parent_id is not None: url += "&parentid=" + parent_id item_data['path'] = url collections.append(item_data) for collection in collections: url = sys.argv[0] + ("?url=" + urllib.quote(collection['path']) + "&mode=GET_CONTENT" + "&media_type=" + collection["media_type"]) log.debug("addMenuDirectoryItem: {0} - {1} - {2}", collection.get('title'), url, collection.get("art")) addMenuDirectoryItem(collection.get('title', string_load(30250)), url, art=collection.get("art")) xbmcplugin.endOfDirectory(int(sys.argv[1]))
def getCollections(): log.debug("== ENTER: getCollections ==") server = downloadUtils.getServer() if server is None: return [] userid = downloadUtils.getUserId() if userid is None or len(userid) == 0: log.debug("No userid so returning []") return [] data_manager = DataManager() result = data_manager.GetContent("{server}/emby/Users/{userid}/Items/Root?format=json") if result is None: return [] parentid = result.get("Id") log.debug("parentid: {0}", parentid) htmlpath = "{server}/emby/Users/{userid}/Views?format=json" # htmlpath = "{server}/emby/Users/{userid}/items?ParentId=" + parentid + "&Sortby=SortName&format=json" result = data_manager.GetContent(htmlpath) if result is not None: result = result.get("Items") else: result = [] collections = [] settings = xbmcaddon.Addon() group_movies = settings.getSetting('group_movies') == "true" show_x_filtered_items = settings.getSetting("show_x_filtered_items") for item in result: item_name = item.get("Name") collection_type = item.get('CollectionType', None) type = item.get('Type', None) log.debug("CollectionType: {0}", collection_type) log.debug("Title: {0}", item_name) art = getArt(item=item, server=server) art['landscape'] = downloadUtils.getArtwork(item, "Primary", server=server) if collection_type == "music": item_data = {} item_data['title'] = item_name + string_load(30320) item_data['art'] = art item_data['media_type'] = 'MusicAlbums' item_data['path'] = ('{server}/emby/Users/{userid}/Items' + '?Recursive=true' + '&ParentId=' + item.get("Id") + '&IncludeItemTypes=MusicAlbum' + '&ImageTypeLimit=1' + '&EnableImageTypes=Primary,Backdrop,Banner,Thumb' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json') collections.append(item_data) item_data = {} item_data['title'] = item_name + string_load(30268) + " (" + show_x_filtered_items + ")" item_data['art'] = art item_data['media_type'] = 'MusicAlbums' item_data['path'] = ('{server}/emby/Users/{userid}/Items/Latest' + '?IncludeItemTypes=Audio' + '&ParentId=' + item.get("Id") + '&ImageTypeLimit=1' + '&Limit={ItemLimit}' + '&EnableImageTypes=Primary,Backdrop,Banner,Thumb' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json') collections.append(item_data) item_data = {} item_data['title'] = item_name + string_load(30349) + " (" + show_x_filtered_items + ")" item_data['art'] = art item_data['media_type'] = 'MusicAlbum' item_data['path'] = ('{server}/emby/Users/{userid}/Items' + '?SortBy=DatePlayed' + '&SortOrder=Descending' + '&IncludeItemTypes=Audio' + '&Limit={ItemLimit}' + '&Recursive=true' + '&ParentId=' + item.get("Id") + '&ImageTypeLimit=1' + '&EnableImageTypes=Primary,Backdrop,Banner,Thumb' + '&Filters=IsPlayed' + '&format=json') collections.append(item_data) item_data = {} item_data['title'] = item_name + string_load(30353) + " (" + show_x_filtered_items + ")" item_data['art'] = art item_data['media_type'] = 'MusicAlbum' item_data['path'] = ('{server}/emby/Users/{userid}/Items' + '?SortBy=PlayCount' + '&SortOrder=Descending' + '&IncludeItemTypes=Audio' + '&Limit={ItemLimit}' + '&Recursive=true' + '&ParentId=' + item.get("Id") + '&ImageTypeLimit=1' + '&EnableImageTypes=Primary,Backdrop,Banner,Thumb' + '&Filters=IsPlayed' + '&format=json') collections.append(item_data) item_data = {} item_data['title'] = item_name + string_load(30321) item_data['art'] = art item_data['media_type'] = 'MusicArtists' item_data['path'] = ('{server}/emby/Artists/AlbumArtists' + '?Recursive=true' + '&ParentId=' + item.get("Id") + '&ImageTypeLimit=1' + '&EnableImageTypes=Primary,Backdrop,Banner,Thumb' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json') collections.append(item_data) if collection_type in ["livetv"]: collections.append({ 'title': item_name + string_load(30360), 'art': art, 'path': ('{server}/emby/LiveTv/Channels' + '?UserId={userid}' + '&Recursive=false' + '&Fields={field_filters}' + '&ImageTypeLimit=1' + '&EnableTotalRecordCount=false' + '&format=json'), 'media_type': collection_type}) collections.append({ 'title': item_name + string_load(30361), 'art': art, 'path': ('{server}/emby/LiveTv/Programs/Recommended' + '?UserId={userid}' + '&IsAiring=true' + '&Fields=ChannelInfo,{field_filters}' + '&ImageTypeLimit=1' + '&EnableTotalRecordCount=false' + '&format=json'), 'media_type': collection_type}) collections.append({ 'title': item_name + string_load(30362), 'art': art, 'path': ('{server}/emby/LiveTv/Recordings' + '?UserId={userid}' + '&Recursive=false' + '&Fields={field_filters}' + '&ImageTypeLimit=1' + '&EnableTotalRecordCount=false' + '&format=json'), 'media_type': collection_type}) if collection_type in ["homevideos"]: collections.append({ 'title': item_name, 'art': art, 'path': ('{server}/emby/Users/{userid}/Items' + '?ParentId=' + item.get("Id") + '&IsVirtualUnaired=false' + '&Recursive=false' + '&IsMissing=False' + '&Fields={field_filters}' + '&ImageTypeLimit=1' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json'), 'media_type': collection_type}) collections.append({ 'title': item_name + string_load(30267) + " (" + show_x_filtered_items + ")", 'art': art, 'use_cache': False, 'path': ('{server}/emby/Users/{userid}/Items' + '?ParentId=' + item.get("Id") + '&Limit={ItemLimit}' + '&SortBy=DatePlayed' + '&SortOrder=Descending' + '&IsVirtualUnaired=false' + '&IsMissing=False' + '&Fields={field_filters}' + '&Filters=IsResumable' + '&Recursive=true' + '&ImageTypeLimit=1' + '&format=json'), 'media_type': collection_type}) collections.append({ 'title': item_name + string_load(30268) + " (" + show_x_filtered_items + ")", 'art': art, 'use_cache': False, 'path': ('{server}/emby/Users/{userid}/Items' + '?ParentId=' + item.get("Id") + '&CollapseBoxSetItems=false' + '&GroupItemsIntoCollections=false' + '&Recursive=true' + '&Limit={ItemLimit}' + '&IsVirtualUnaired=false' + '&IsMissing=False' + '&Fields={field_filters}' + '&SortBy=DateCreated' + '&SortOrder=Descending' + '&Filters=IsUnplayed,IsNotFolder' + '&IsPlayed=false' + '&ImageTypeLimit=1' + '&format=json'), 'media_type': collection_type}) if collection_type in ["boxsets"]: collections.append({ 'title': item_name, 'art': art, 'path': ('{server}/emby/Users/{userid}/Items' + '?ParentId=' + item.get("Id") + '&IsVirtualUnaired=false' + '&IncludeItemTypes=Boxset' + '&CollapseBoxSetItems=' + str(group_movies) + '&GroupItemsIntoCollections=' + str(group_movies) + '&Recursive=true' + '&IsMissing=False' + '&Fields={field_filters}' + '&ImageTypeLimit=1' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json'), 'media_type': collection_type}) if collection_type in ["movies"]: collections.append({ 'title': item_name, 'art': art, 'path': ('{server}/emby/Users/{userid}/Items' + '?ParentId=' + item.get("Id") + '&IsVirtualUnaired=false' + '&IncludeItemTypes=Movie' + '&CollapseBoxSetItems=' + str(group_movies) + '&GroupItemsIntoCollections=' + str(group_movies) + '&Recursive=true' + '&IsMissing=False' + '&Fields={field_filters}' + '&ImageTypeLimit=1' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json'), 'media_type': collection_type}) if collection_type == "tvshows": collections.append({ 'title': item_name, 'art': art, 'path': ('{server}/emby/Users/{userid}/Items' + '?ParentId=' + item.get("Id") + '&IsVirtualUnaired=false' + '&IsMissing=False' + '&Fields={field_filters}' + '&ImageTypeLimit=1' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json'), 'media_type': collection_type}) collections.append({ 'title': item_name + string_load(30285), 'art': art, 'path': ('{server}/emby/Users/{userid}/Items' + '?ParentId=' + item.get("Id") + '&IsVirtualUnaired=false' + '&IsMissing=False' + '&Fields={field_filters}' + '&Filters=IsUnplayed' + '&IsPlayed=false' + '&Recursive=true' + '&IncludeItemTypes=Series' + '&SortBy=Name' + '&SortOrder=Ascending' + '&ImageTypeLimit=1' + '&format=json'), 'media_type': 'tvshows'}) collections.append({ 'title': item_name + string_load(30267) + " (" + show_x_filtered_items + ")", 'art': art, 'use_cache': False, 'path': ('{server}/emby/Users/{userid}/Items' + '?ParentId=' + item.get("Id") + '&Limit={ItemLimit}' + '&SortBy=DatePlayed' + '&SortOrder=Descending' + '&IsVirtualUnaired=false' + '&IsMissing=False' + '&Fields={field_filters}' + '&Filters=IsResumable' + '&Recursive=true' + '&IncludeItemTypes=Episode' + '&ImageTypeLimit=1' + '&format=json'), 'media_type': 'Episodes', 'name_format': 'Episode|episode_name_format'}) collections.append({ 'title': item_name + string_load(30288) + " (" + show_x_filtered_items + ")", 'art': art, 'use_cache': False, 'path': ('{server}/emby/Users/{userid}/Items/Latest' + '?ParentId=' + item.get("Id") + '&Limit={ItemLimit}' + '&IsVirtualUnaired=false' + '&IsMissing=False' + '&Fields={field_filters}' + '&SortBy=DateCreated' + '&SortOrder=Descending' + '&Filters=IsUnplayed' + '&IsPlayed=false' + '&Recursive=true' + '&IncludeItemTypes=Episode' + '&ImageTypeLimit=1' + '&format=json'), 'media_type': 'Episodes', 'name_format': 'Episode|episode_name_format'}) collections.append({ 'title': item_name + string_load(30268) + " (" + show_x_filtered_items + ")", 'art': art, 'use_cache': False, 'path': ('{server}/emby/Users/{userid}/Items' + '?ParentId=' + item.get("Id") + '&Limit={ItemLimit}' + '&IsVirtualUnaired=false' + '&IsMissing=False' + '&Fields={field_filters}' + '&SortBy=DateCreated' + '&SortOrder=Descending' + '&Filters=IsUnplayed,IsNotFolder' + '&IsPlayed=false' + '&Recursive=true' + '&IncludeItemTypes=Episode' + '&ImageTypeLimit=1' + '&format=json'), 'media_type': 'Episodes', 'name_format': 'Episode|episode_name_format'}) collections.append({ 'title': item_name + string_load(30278) + " (" + show_x_filtered_items + ")", 'art': art, 'use_cache': False, 'path': ('{server}/emby/Shows/NextUp/?Userid={userid}' + '&ParentId=' + item.get("Id") + '&Limit={ItemLimit}' + '&Recursive=true' + '&Fields={field_filters}' + '&Filters=IsUnplayed,IsNotFolder' + '&IsPlayed=false' + '&IsVirtualUnaired=false' + '&IsMissing=False' + '&IncludeItemTypes=Episode' + '&ImageTypeLimit=1' + '&format=json'), 'media_type': 'Episodes', 'name_format': 'Episode|episode_name_format'}) collections.append({ 'title': item_name + string_load(30325), 'item_type': 'plugin_link', 'art': art, 'path': 'plugin://plugin.video.embycon/?mode=GENRES&item_type=tvshow&parent_id=' + item.get("Id"), 'media_type': 'tvshows'}) if type == "Channel": collections.append({ 'title': item_name, 'art': art, 'path': ('{server}/emby/Users/{userid}/Items' + '?ParentId=' + item.get("Id") + '&IsVirtualUnaired=false' + '&IsMissing=False' + '&Fields={field_filters}' + '&ImageTypeLimit=1' + '&format=json'), 'media_type': 'files', 'name_format': 'Episode|episode_name_format'}) if collection_type == "movies": collections.append({ 'title': item_name + string_load(30285), 'art': art, 'path': ('{server}/emby/Users/{userid}/Items' + '?ParentId=' + item.get("Id") + '&IncludeItemTypes=Movie' + '&CollapseBoxSetItems=false' + '&GroupItemsIntoCollections=false' + '&Recursive=true' + '&IsVirtualUnaired=false' + '&IsMissing=False' + '&Fields={field_filters}' + '&Filters=IsUnplayed' + '&IsPlayed=false' + '&ImageTypeLimit=1' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json'), 'media_type': collection_type}) collections.append({ 'title': item_name + string_load(30267) + " (" + show_x_filtered_items + ")", 'art': art, 'use_cache': False, 'path': ('{server}/emby/Users/{userid}/Items' + '?ParentId=' + item.get("Id") + '&IncludeItemTypes=Movie' + '&CollapseBoxSetItems=false' + '&GroupItemsIntoCollections=false' + '&Recursive=true' + '&Limit={ItemLimit}' + '&SortBy=DatePlayed' + '&SortOrder=Descending' + '&IsVirtualUnaired=false' + '&IsMissing=False' + '&Fields={field_filters}' + '&Filters=IsResumable' + '&ImageTypeLimit=1' + '&format=json'), 'media_type': collection_type}) collections.append({ 'title': item_name + string_load(30268) + " (" + show_x_filtered_items + ")", 'art': art, 'use_cache': False, 'path': ('{server}/emby/Users/{userid}/Items' + '?ParentId=' + item.get("Id") + '&IncludeItemTypes=Movie' + '&CollapseBoxSetItems=false' + '&GroupItemsIntoCollections=false' + '&Recursive=true' + '&Limit={ItemLimit}' + '&IsVirtualUnaired=false' + '&IsMissing=False' + '&Fields={field_filters}' + '&SortBy=DateCreated' + '&SortOrder=Descending' + '&Filters=IsUnplayed,IsNotFolder' + '&IsPlayed=false' + '&ImageTypeLimit=1' + '&format=json'), 'media_type': collection_type}) collections.append({ 'title': item_name + string_load(30325), 'item_type': 'plugin_link', 'art': art, 'path': 'plugin://plugin.video.embycon/?mode=GENRES&item_type=movie&parent_id=' + item.get("Id"), 'media_type': collection_type}) collections.append({ 'title': item_name + ' - Pages', 'item_type': 'plugin_link', 'art': art, 'path': 'plugin://plugin.video.embycon/?mode=MOVIE_PAGES&parent_id=' + item.get("Id"), 'media_type': collection_type}) # Add standard nodes item_data = {} item_data['title'] = string_load(30256) item_data['media_type'] = 'Movies' item_data['path'] = ('{server}/emby/Users/{userid}/Items' + '?Fields={field_filters}' + '&CollapseBoxSetItems=' + str(group_movies) + '&GroupItemsIntoCollections=' + str(group_movies) + '&Recursive=true' + '&IncludeItemTypes=Movie' + '&ImageTypeLimit=1' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json') collections.append(item_data) item_data = {} item_data['title'] = string_load(30286) item_data['media_type'] = 'Movies' item_data['path'] = ('{server}/emby/Users/{userid}/Items' + '?Recursive=true' + '&CollapseBoxSetItems=false' + '&GroupItemsIntoCollections=false' + '&Fields={field_filters}' + '&Filters=IsUnplayed' + '&IsPlayed=false' + '&IncludeItemTypes=Movie' + '&ImageTypeLimit=1' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json') collections.append(item_data) item_data = {} item_data['title'] = string_load(30258) + " (" + show_x_filtered_items + ")" item_data['media_type'] = 'Movies' item_data['use_cache'] = False item_data['path'] = ('{server}/emby/Users/{userid}/Items' + '?CollapseBoxSetItems=false' + '&Limit={ItemLimit}' + '&GroupItemsIntoCollections=false' + '&Recursive=true' + '&Fields={field_filters}' + '&SortBy=DatePlayed' + '&SortOrder=Descending' + '&Filters=IsResumable' + '&IncludeItemTypes=Movie' + '&ImageTypeLimit=1' + '&format=json') collections.append(item_data) item_data = {} item_data['title'] = string_load(30257) + " (" + show_x_filtered_items + ")" item_data['media_type'] = 'Movies' item_data['use_cache'] = False item_data['path'] = ('{server}/emby/Users/{userid}/Items' + '?CollapseBoxSetItems=false' + '&Limit={ItemLimit}' + '&GroupItemsIntoCollections=false' + '&Recursive=true' + '&SortBy=DateCreated' + '&Fields={field_filters}' + '&SortOrder=Descending' + '&Filters=IsUnplayed,IsNotFolder' + '&IsPlayed=false' + '&IncludeItemTypes=Movie' + '&ImageTypeLimit=1' + '&format=json') collections.append(item_data) item_data = {} item_data['title'] = string_load(30259) item_data['media_type'] = 'Movies' item_data['path'] = ('{server}/emby/Users/{userid}/Items' + '?Fields={field_filters}' + '&CollapseBoxSetItems=false' + '&GroupItemsIntoCollections=false' + '&Recursive=true' + '&Filters=IsFavorite' + '&IncludeItemTypes=Movie' + '&ImageTypeLimit=1' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json') collections.append(item_data) item_data = {} item_data['title'] = string_load(30260) item_data['media_type'] = 'BoxSets' item_data['path'] = ('{server}/emby/Users/{userid}/Items' + '?Recursive=true' + '&Fields={field_filters}' + '&IncludeItemTypes=BoxSet' + '&ImageTypeLimit=1' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json') collections.append(item_data) item_data = {} item_data['title'] = string_load(30261) item_data['media_type'] = 'tvshows' item_data['path'] = ('{server}/emby/Users/{userid}/Items' + '?Fields={field_filters}' + '&Recursive=true' + '&IncludeItemTypes=Series' + '&ImageTypeLimit=1' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json') collections.append(item_data) item_data = {} item_data['title'] = string_load(30279) item_data['media_type'] = 'tvshows' item_data['path'] = ('{server}/emby/Users/{userid}/Items' + '?Fields={field_filters}' + '&Recursive=true' + '&Filters=IsUnplayed' + '&IsPlayed=false' + '&IncludeItemTypes=Series' + '&ImageTypeLimit=1' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json') collections.append(item_data) item_data = {} item_data['title'] = string_load(30262) item_data['media_type'] = 'tvshows' item_data['path'] = ('{server}/emby/Users/{userid}/Items' + '?Fields={field_filters}' + '&Recursive=true' + '&Filters=IsFavorite' + '&IncludeItemTypes=Series' + '&ImageTypeLimit=1' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json') collections.append(item_data) item_data = {} item_data['title'] = string_load(30287) + " (" + show_x_filtered_items + ")" item_data['media_type'] = 'Episodes' item_data['use_cache'] = False item_data['path'] = ('{server}/emby/Users/{userid}/Items/Latest' + '?GroupItems=true' + '&Limit={ItemLimit}' + '&Recursive=true' + '&SortBy=DateCreated' + '&Fields={field_filters}' + '&SortOrder=Descending' + '&Filters=IsUnplayed' + '&IsPlayed=false' + '&IsVirtualUnaired=false' + '&IsMissing=False' + '&IncludeItemTypes=Episode' + '&ImageTypeLimit=1' + '&format=json') item_data['name_format'] = 'Episode|episode_name_format' collections.append(item_data) item_data = {} item_data['title'] = string_load(30264) + " (" + show_x_filtered_items + ")" item_data['media_type'] = 'Episodes' item_data['use_cache'] = False item_data['path'] = ('{server}/emby/Users/{userid}/Items' + '?SortBy=DatePlayed' + '&Limit={ItemLimit}' + '&SortOrder=Descending' + '&Recursive=true' + '&Fields={field_filters}' + '&Filters=IsResumable' + '&IncludeItemTypes=Episode' + '&ImageTypeLimit=1' + '&format=json') item_data['name_format'] = 'Episode|episode_name_format' collections.append(item_data) item_data = {} item_data['title'] = string_load(30263) + " (" + show_x_filtered_items + ")" item_data['media_type'] = 'Episodes' item_data['use_cache'] = False item_data['path'] = ('{server}/emby/Users/{userid}/Items' + '?SortBy=DateCreated' + '&Limit={ItemLimit}' + '&Recursive=true' + '&Fields={field_filters}' + '&SortOrder=Descending' + '&Filters=IsUnplayed,IsNotFolder' + '&IsPlayed=false' + '&IsVirtualUnaired=false' + '&IsMissing=False' + '&IncludeItemTypes=Episode' + '&ImageTypeLimit=1' + '&format=json') item_data['name_format'] = 'Episode|episode_name_format' collections.append(item_data) item_data = {} item_data['title'] = string_load(30265) + " (" + show_x_filtered_items + ")" item_data['media_type'] = 'Episodes' item_data['use_cache'] = False item_data['path'] = ('{server}/emby/Shows/NextUp/?Userid={userid}' + '&Limit={ItemLimit}' + '&Recursive=true' + '&Fields={field_filters}' + '&Filters=IsUnplayed,IsNotFolder' + '&IsPlayed=false' + '&IsVirtualUnaired=false' + '&IsMissing=False' + '&IncludeItemTypes=Episode' + '&ImageTypeLimit=1' + '&format=json') item_data['name_format'] = 'Episode|episode_name_format' collections.append(item_data) item_data = {} item_data['title'] = string_load(30318) item_data['media_type'] = 'MusicAlbums' item_data['path'] = ('{server}/emby/Users/{userid}/Items' + '?Recursive=true' + '&IncludeItemTypes=MusicAlbum' + '&ImageTypeLimit=1' + '&EnableImageTypes=Primary,Backdrop,Banner,Thumb' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json') collections.append(item_data) item_data = {} item_data['title'] = string_load(30350) + " (" + show_x_filtered_items + ")" item_data['art'] = art item_data['media_type'] = 'MusicAlbums' item_data['path'] = ('{server}/emby/Users/{userid}/Items/Latest' + '?IncludeItemTypes=Audio' + '&ImageTypeLimit=1' + '&Limit={ItemLimit}' + '&EnableImageTypes=Primary,Backdrop,Banner,Thumb' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json') collections.append(item_data) item_data = {} item_data['title'] = string_load(30351) + " (" + show_x_filtered_items + ")" item_data['art'] = art item_data['media_type'] = 'MusicAlbum' item_data['path'] = ('{server}/emby/Users/{userid}/Items' + '?SortBy=DatePlayed' + '&SortOrder=Descending' + '&IncludeItemTypes=Audio' + '&Limit={ItemLimit}' + '&Recursive=true' + '&ImageTypeLimit=1' + '&EnableImageTypes=Primary,Backdrop,Banner,Thumb' + '&Filters=IsPlayed' + '&format=json') collections.append(item_data) item_data = {} item_data['title'] = string_load(30352) + " (" + show_x_filtered_items + ")" item_data['art'] = art item_data['media_type'] = 'MusicAlbum' item_data['path'] = ('{server}/emby/Users/{userid}/Items' + '?SortBy=PlayCount' + '&SortOrder=Descending' + '&IncludeItemTypes=Audio' + '&Limit={ItemLimit}' + '&Recursive=true' + '&ImageTypeLimit=1' + '&EnableImageTypes=Primary,Backdrop,Banner,Thumb' + '&Filters=IsPlayed' + '&format=json') collections.append(item_data) item_data = {} item_data['title'] = string_load(30319) item_data['media_type'] = 'MusicArtists' item_data['path'] = ('{server}/emby/Artists/AlbumArtists' + '?Recursive=true' + '&ImageTypeLimit=1' + '&EnableImageTypes=Primary,Backdrop,Banner,Thumb' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json') collections.append(item_data) return collections
def populateWidgetItems(itemsUrl, 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_DATE_URL: {0}", itemsUrl) home_window = HomeWindow() # get the items data_manager = DataManager() result = data_manager.GetContent(itemsUrl) if result is not None and isinstance(result, dict) and result.get("Items") is not None: simmilarTo = result.get("BaselineItemName", None) result = result.get("Items") elif result is not None and isinstance(result, list) and len(result) > 0: simmilarTo = result[0].get("BaselineItemName", None) result = result[0].get("Items") else: result = [] itemCount = 1 listItems = [] for item in result: item_id = item["Id"] name = item["Name"] episodeDetails = "" log.debug("WIDGET_DATE_NAME: {0}", name) title = name tvshowtitle = "" item_type = item["Type"] series_name = item["SeriesName"] 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 art = getArt(item, server) 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) # add count #list_item.setProperty("item_index", str(itemCount)) #itemCount = itemCount + 1 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 simmilarTo is not None: list_item.setProperty('suggested_from_watching', simmilarTo) session_id = "&session_id=" + home_window.getProperty("session_id") if 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 itemTupple = (playurl, list_item, False) listItems.append(itemTupple) return listItems
def getCollections(): log.debug("== ENTER: getCollections ==") server = downloadUtils.getServer() if server is None: return [] userid = downloadUtils.getUserId() if userid == None or len(userid) == 0: log.debug("No userid so returning []") return [] data_manager = DataManager() result = data_manager.GetContent( "{server}/emby/Users/{userid}/Items/Root?format=json") if result is None: return [] parentid = result.get("Id") log.debug("parentid: {0}", parentid) htmlpath = "{server}/emby/Users/{userid}/Views?format=json" #htmlpath = "{server}/emby/Users/{userid}/items?ParentId=" + parentid + "&Sortby=SortName&format=json" result = data_manager.GetContent(htmlpath) if result is not None: result = result.get("Items") else: result = [] collections = [] for item in result: item_name = item.get("Name") collection_type = item.get('CollectionType', None) type = item.get('Type', None) log.debug("CollectionType: {0}", collection_type) log.debug("Title: {0}", item_name) art = getArt(item=item, server=server) art['landscape'] = downloadUtils.getArtwork(item, "Primary", server=server) if collection_type == "music": item_data = {} item_data['title'] = item_name + i18n('_all_albums') item_data['art'] = art item_data['media_type'] = 'MusicAlbums' item_data['path'] = ( '{server}/emby/Users/{userid}/Items' + '?Recursive=true' + '&ParentId=' + item.get("Id") + '&IncludeItemTypes=MusicAlbum' + '&ImageTypeLimit=1' + '&EnableImageTypes=Primary,Backdrop,Banner,Thumb' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json') collections.append(item_data) item_data = {} item_data['title'] = item_name + i18n('_all_artists') item_data['art'] = art item_data['media_type'] = 'MusicArtists' item_data['path'] = ( '{server}/emby/Artists/AlbumArtists' + '?Recursive=true' + '&ParentId=' + item.get("Id") + '&ImageTypeLimit=1' + '&EnableImageTypes=Primary,Backdrop,Banner,Thumb' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json') collections.append(item_data) if collection_type in ["movies", "boxsets"]: collections.append({ 'title': item_name, 'art': art, 'path': ('{server}/emby/Users/{userid}/Items' + '?ParentId=' + item.get("Id") + '&IsVirtualUnaired=false' + '&CollapseBoxSetItems=true' + '&Recursive=true' + '&IsMissing=False' + '&Fields={field_filters}' + '&ImageTypeLimit=1' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json'), 'media_type': collection_type }) if collection_type == "tvshows": collections.append({ 'title': item_name, 'art': art, 'path': ('{server}/emby/Users/{userid}/Items' + '?ParentId=' + item.get("Id") + '&IsVirtualUnaired=false' + '&IsMissing=False' + '&Fields={field_filters}' + '&ImageTypeLimit=1' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json'), 'media_type': collection_type }) collections.append({ 'title': item_name + i18n('_unwatched'), 'art': art, 'path': ('{server}/emby/Users/{userid}/Items' + '?ParentId=' + item.get("Id") + '&IsVirtualUnaired=false' + '&IsMissing=False' + '&Fields={field_filters}' + '&Filters=IsUnplayed' + '&Recursive=true' + '&IncludeItemTypes=Series' + '&SortBy=Name' + '&SortOrder=Ascending' + '&ImageTypeLimit=1' + '&format=json'), 'media_type': 'tvshows' }) collections.append({ 'title': item_name + i18n('_in_progress'), 'art': art, 'path': ('{server}/emby/Users/{userid}/Items' + '?ParentId=' + item.get("Id") + '&Limit={ItemLimit}' + '&SortBy=DatePlayed' + '&SortOrder=Descending' + '&IsVirtualUnaired=false' + '&IsMissing=False' + '&Fields={field_filters}' + '&Filters=IsResumable' + '&Recursive=true' + '&IncludeItemTypes=Episode' + '&ImageTypeLimit=1' + '&format=json'), 'media_type': 'Episodes', 'name_format': 'Episode|episode_name_format' }) collections.append({ 'title': item_name + i18n('_latest'), 'art': art, 'path': ('{server}/emby/Users/{userid}/Items/Latest' + '?ParentId=' + item.get("Id") + '&Limit={ItemLimit}' + '&IsVirtualUnaired=false' + '&IsMissing=False' + '&Fields={field_filters}' + '&SortBy=DateCreated' + '&SortOrder=Descending' + '&Filters=IsUnplayed' + '&Recursive=true' + '&IncludeItemTypes=Episode' + '&ImageTypeLimit=1' + '&format=json'), 'media_type': 'Episodes', 'name_format': 'Episode|episode_name_format' }) collections.append({ 'title': item_name + i18n('_recently_added'), 'art': art, 'path': ('{server}/emby/Users/{userid}/Items' + '?ParentId=' + item.get("Id") + '&Limit={ItemLimit}' + '&IsVirtualUnaired=false' + '&IsMissing=False' + '&Fields={field_filters}' + '&SortBy=DateCreated' + '&SortOrder=Descending' + '&Filters={IsUnplayed,}IsNotFolder' + '&Recursive=true' + '&IncludeItemTypes=Episode' + '&ImageTypeLimit=1' + '&format=json'), 'media_type': 'Episodes', 'name_format': 'Episode|episode_name_format' }) collections.append({ 'title': item_name + i18n('_next_up'), 'art': art, 'path': ('{server}/emby/Shows/NextUp/?Userid={userid}' + '&ParentId=' + item.get("Id") + '&Limit={ItemLimit}' + '&Recursive=true' + '&Fields={field_filters}' + '&Filters=IsUnplayed,IsNotFolder' + '&IsVirtualUnaired=false' + '&IsMissing=False' + '&IncludeItemTypes=Episode' + '&ImageTypeLimit=1' + '&format=json'), 'media_type': 'Episodes', 'name_format': 'Episode|episode_name_format' }) collections.append({ 'title': item_name + i18n('_genres'), 'item_type': 'plugin_link', 'art': art, 'path': 'plugin://plugin.video.embycon/?mode=GENRES&item_type=tvshow&parent_id=' + item.get("Id"), 'media_type': 'tvshows' }) if type == "Channel": collections.append({ 'title': item_name, 'art': art, 'path': ('{server}/emby/Users/{userid}/Items' + '?ParentId=' + item.get("Id") + '&IsVirtualUnaired=false' + '&IsMissing=False' + '&Fields={field_filters}' + '&ImageTypeLimit=1' + '&format=json'), 'media_type': 'files', 'name_format': 'Episode|episode_name_format' }) if collection_type == "movies": collections.append({ 'title': item_name + i18n('_unwatched'), 'art': art, 'path': ('{server}/emby/Users/{userid}/Items' + '?ParentId=' + item.get("Id") + '&IsVirtualUnaired=false' + '&IsMissing=False' + '&Fields={field_filters}' + '&Filters=IsUnplayed' + '&ImageTypeLimit=1' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json'), 'media_type': collection_type }) collections.append({ 'title': item_name + i18n('_in_progress'), 'art': art, 'path': ('{server}/emby/Users/{userid}/Items' + '?ParentId=' + item.get("Id") + '&Limit={ItemLimit}' + '&SortBy=DatePlayed' + '&SortOrder=Descending' + '&IsVirtualUnaired=false' + '&IsMissing=False' + '&Fields={field_filters}' + '&Filters=IsResumable' + '&ImageTypeLimit=1' + '&format=json'), 'media_type': collection_type }) collections.append({ 'title': item_name + i18n('_recently_added'), 'art': art, 'path': ('{server}/emby/Users/{userid}/Items' + '?ParentId=' + item.get("Id") + '&Limit={ItemLimit}' + '&IsVirtualUnaired=false' + '&IsMissing=False' + '&Fields={field_filters}' + '&SortBy=DateCreated' + '&SortOrder=Descending' + '&Filters={IsUnplayed,}IsNotFolder' + '&ImageTypeLimit=1' + '&format=json'), 'media_type': collection_type }) collections.append({ 'title': item_name + i18n('_genres'), 'item_type': 'plugin_link', 'art': art, 'path': 'plugin://plugin.video.embycon/?mode=GENRES&item_type=movie&parent_id=' + item.get("Id"), 'media_type': collection_type }) collections.append({ 'title': item_name + ' - Pages', 'item_type': 'plugin_link', 'art': art, 'path': 'plugin://plugin.video.embycon/?mode=MOVIE_PAGES&parent_id=' + item.get("Id"), 'media_type': collection_type }) # Add standard nodes item_data = {} item_data['title'] = i18n('movies_all') item_data['media_type'] = 'Movies' item_data['path'] = ('{server}/emby/Users/{userid}/Items' + '?Fields={field_filters}' + '&Recursive=true' + '&IncludeItemTypes=Movie' + '&ImageTypeLimit=1' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json') collections.append(item_data) item_data = {} item_data['title'] = i18n('movies_unwatched') item_data['media_type'] = 'Movies' item_data['path'] = ('{server}/emby/Users/{userid}/Items' + '?Recursive=true' + '&Fields={field_filters}' + '&Filters=IsUnplayed' + '&IncludeItemTypes=Movie' + '&ImageTypeLimit=1' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json') collections.append(item_data) item_data = {} item_data['title'] = i18n('movies_in_progress') item_data['media_type'] = 'Movies' item_data['path'] = ('{server}/emby/Users/{userid}/Items' + '?Limit={ItemLimit}' + '&Recursive=true' + '&Fields={field_filters}' + '&SortBy=DatePlayed' + '&SortOrder=Descending' + '&Filters=IsResumable' + '&IncludeItemTypes=Movie' + '&ImageTypeLimit=1' + '&format=json') collections.append(item_data) item_data = {} item_data['title'] = i18n('movies_recently_added') item_data['media_type'] = 'Movies' item_data['path'] = ('{server}/emby/Users/{userid}/Items' + '?Limit={ItemLimit}' + '&Recursive=true' + '&SortBy=DateCreated' + '&Fields={field_filters}' + '&SortOrder=Descending' + '&Filters={IsUnplayed,}IsNotFolder' + '&IncludeItemTypes=Movie' + '&ImageTypeLimit=1' + '&format=json') collections.append(item_data) item_data = {} item_data['title'] = i18n('movies_favorites') item_data['media_type'] = 'Movies' item_data['path'] = ('{server}/emby/Users/{userid}/Items' + '?Fields={field_filters}' + '&Recursive=true' + '&Filters=IsFavorite' + '&IncludeItemTypes=Movie' + '&ImageTypeLimit=1' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json') collections.append(item_data) item_data = {} item_data['title'] = i18n('movies_boxsets') item_data['media_type'] = 'BoxSets' item_data['path'] = ('{server}/emby/Users/{userid}/Items' + '?Recursive=true' + '&Fields={field_filters}' + '&IncludeItemTypes=BoxSet' + '&ImageTypeLimit=1' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json') collections.append(item_data) item_data = {} item_data['title'] = i18n('tvshows_all') item_data['media_type'] = 'tvshows' item_data['path'] = ('{server}/emby/Users/{userid}/Items' + '?Fields={field_filters}' + '&Recursive=true' + '&IncludeItemTypes=Series' + '&ImageTypeLimit=1' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json') collections.append(item_data) item_data = {} item_data['title'] = i18n('tvshows_unwatched') item_data['media_type'] = 'tvshows' item_data['path'] = ('{server}/emby/Users/{userid}/Items' + '?Fields={field_filters}' + '&Recursive=true' + '&Filters=IsUnplayed' + '&IncludeItemTypes=Series' + '&ImageTypeLimit=1' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json') collections.append(item_data) item_data = {} item_data['title'] = i18n('tvshows_favorites') item_data['media_type'] = 'tvshows' item_data['path'] = ('{server}/emby/Users/{userid}/Items' + '?Fields={field_filters}' + '&Recursive=true' + '&Filters=IsFavorite' + '&IncludeItemTypes=Series' + '&ImageTypeLimit=1' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json') collections.append(item_data) item_data = {} item_data['title'] = i18n('tvshows_latest') item_data['media_type'] = 'Episodes' item_data['path'] = ('{server}/emby/Users/{userid}/Items/Latest' + '?Limit={ItemLimit}' + '&Recursive=true' + '&GroupItems=true' + '&SortBy=DateCreated' + '&Fields={field_filters}' + '&SortOrder=Descending' + '&Filters={IsUnplayed}' + '&IsVirtualUnaired=false' + '&IsMissing=False' + '&IncludeItemTypes=Episode' + '&ImageTypeLimit=1' + '&format=json') item_data['name_format'] = 'Episode|episode_name_format' collections.append(item_data) item_data = {} item_data['title'] = i18n('episodes_in_progress') item_data['media_type'] = 'Episodes' item_data['path'] = ('{server}/emby/Users/{userid}/Items' + '?Limit={ItemLimit}' + '&SortBy=DatePlayed' + '&SortOrder=Descending' + '&Recursive=true' + '&Fields={field_filters}' + '&Filters=IsResumable' + '&IncludeItemTypes=Episode' + '&ImageTypeLimit=1' + '&format=json') item_data['name_format'] = 'Episode|episode_name_format' collections.append(item_data) item_data = {} item_data['title'] = i18n('episodes_recently_added') item_data['media_type'] = 'Episodes' item_data['path'] = ('{server}/emby/Users/{userid}/Items' + '?Limit={ItemLimit}' + '&Recursive=true' + '&SortBy=DateCreated' + '&Fields={field_filters}' + '&SortOrder=Descending' + '&Filters={IsUnplayed,}IsNotFolder' + '&IsVirtualUnaired=false' + '&IsMissing=False' + '&IncludeItemTypes=Episode' + '&ImageTypeLimit=1' + '&format=json') item_data['name_format'] = 'Episode|episode_name_format' collections.append(item_data) item_data = {} item_data['title'] = i18n('episodes_up_next') item_data['media_type'] = 'Episodes' item_data['path'] = ('{server}/emby/Shows/NextUp/?Userid={userid}' + '&Limit={ItemLimit}' + '&Recursive=true' + '&Fields={field_filters}' + '&Filters=IsUnplayed,IsNotFolder' + '&IsVirtualUnaired=false' + '&IsMissing=False' + '&IncludeItemTypes=Episode' + '&ImageTypeLimit=1' + '&format=json') item_data['name_format'] = 'Episode|episode_name_format' collections.append(item_data) item_data = {} item_data['title'] = i18n('upcoming_tv') item_data['media_type'] = 'Episodes' item_data['path'] = ('{server}/emby/Users/{userid}/Items' + '?Recursive=true' + '&SortBy=PremiereDate' + '&Fields={field_filters}' + '&SortOrder=Ascending' + '&IsVirtualUnaired=true' + '&IsNotFolder' + '&IncludeItemTypes=Episode' + '&ImageTypeLimit=1' + '&format=json') collections.append(item_data) item_data = {} item_data['title'] = i18n('music_all_albums') item_data['media_type'] = 'MusicAlbums' item_data['path'] = ('{server}/emby/Users/{userid}/Items' + '?Recursive=true' + '&IncludeItemTypes=MusicAlbum' + '&ImageTypeLimit=1' + '&EnableImageTypes=Primary,Backdrop,Banner,Thumb' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json') collections.append(item_data) item_data = {} item_data['title'] = i18n('music_all_artists') item_data['media_type'] = 'MusicArtists' item_data['path'] = ('{server}/emby/Artists/AlbumArtists' + '?Recursive=true' + '&ImageTypeLimit=1' + '&EnableImageTypes=Primary,Backdrop,Banner,Thumb' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json') collections.append(item_data) return collections
def getCollections(): log.debug("== ENTER: getCollections ==") server = downloadUtils.getServer() if server is None: return [] userid = downloadUtils.getUserId() if userid == None or len(userid) == 0: log.debug("No userid so returning []") return [] data_manager = DataManager() result = data_manager.GetContent("{server}/emby/Users/{userid}/Items/Root?format=json") if result is None: return [] parentid = result.get("Id") log.debug("parentid: {0}", parentid) htmlpath = "{server}/emby/Users/{userid}/Views?format=json" #htmlpath = "{server}/emby/Users/{userid}/items?ParentId=" + parentid + "&Sortby=SortName&format=json" result = data_manager.GetContent(htmlpath) if result is not None: result = result.get("Items") else: result = [] collections = [] for item in result: item_name = item.get("Name") collection_type = item.get('CollectionType', None) type = item.get('Type', None) log.debug("CollectionType: {0}", collection_type) log.debug("Title: {0}", item_name) art = getArt(item=item, server=server) art['landscape'] = downloadUtils.getArtwork(item, "Primary", server=server) if collection_type == "music": item_data = {} item_data['title'] = item_name + i18n('_all_albums') item_data['art'] = art item_data['media_type'] = 'MusicAlbums' item_data['path'] = ('{server}/emby/Users/{userid}/Items' + '?Recursive=true' + '&ParentId=' + item.get("Id") + '&IncludeItemTypes=MusicAlbum' + '&ImageTypeLimit=1' + '&EnableImageTypes=Primary,Backdrop,Banner,Thumb' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json') collections.append(item_data) item_data = {} item_data['title'] = item_name + i18n('_all_artists') item_data['art'] = art item_data['media_type'] = 'MusicArtists' item_data['path'] = ('{server}/emby/Artists/AlbumArtists' + '?Recursive=true' + '&ParentId=' + item.get("Id") + '&ImageTypeLimit=1' + '&EnableImageTypes=Primary,Backdrop,Banner,Thumb' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json') collections.append(item_data) if collection_type in ["movies", "boxsets"]: collections.append({ 'title': item_name, 'art': art, 'path': ('{server}/emby/Users/{userid}/Items' + '?ParentId=' + item.get("Id") + '&IsVirtualUnaired=false' + '&CollapseBoxSetItems=true' + '&Recursive=true' + '&IsMissing=False' + '&Fields={field_filters}' + '&ImageTypeLimit=1' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json'), 'media_type': collection_type}) if collection_type == "tvshows": collections.append({ 'title': item_name, 'art': art, 'path': ('{server}/emby/Users/{userid}/Items' + '?ParentId=' + item.get("Id") + '&IsVirtualUnaired=false' + '&IsMissing=False' + '&Fields={field_filters}' + '&ImageTypeLimit=1' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json'), 'media_type': collection_type}) collections.append({ 'title': item_name + i18n('_unwatched'), 'art': art, 'path': ('{server}/emby/Users/{userid}/Items' + '?ParentId=' + item.get("Id") + '&IsVirtualUnaired=false' + '&IsMissing=False' + '&Fields={field_filters}' + '&Filters=IsUnplayed' + '&Recursive=true' + '&IncludeItemTypes=Series' + '&SortBy=Name' + '&SortOrder=Ascending' + '&ImageTypeLimit=1' + '&format=json'), 'media_type': 'tvshows'}) collections.append({ 'title': item_name + i18n('_in_progress'), 'art': art, 'path': ('{server}/emby/Users/{userid}/Items' + '?ParentId=' + item.get("Id") + '&Limit={ItemLimit}' + '&SortBy=DatePlayed' + '&SortOrder=Descending' + '&IsVirtualUnaired=false' + '&IsMissing=False' + '&Fields={field_filters}' + '&Filters=IsResumable' + '&Recursive=true' + '&IncludeItemTypes=Episode' + '&ImageTypeLimit=1' + '&format=json'), 'media_type': 'Episodes', 'name_format': 'Episode|episode_name_format'}) collections.append({ 'title': item_name + i18n('_latest'), 'art': art, 'path': ('{server}/emby/Users/{userid}/Items/Latest' + '?ParentId=' + item.get("Id") + '&Limit={ItemLimit}' + '&IsVirtualUnaired=false' + '&IsMissing=False' + '&Fields={field_filters}' + '&SortBy=DateCreated' + '&SortOrder=Descending' + '&Filters=IsUnplayed' + '&Recursive=true' + '&IncludeItemTypes=Episode' + '&ImageTypeLimit=1' + '&format=json'), 'media_type': 'Episodes', 'name_format': 'Episode|episode_name_format'}) collections.append({ 'title': item_name + i18n('_recently_added'), 'art': art, 'path': ('{server}/emby/Users/{userid}/Items' + '?ParentId=' + item.get("Id") + '&Limit={ItemLimit}' + '&IsVirtualUnaired=false' + '&IsMissing=False' + '&Fields={field_filters}' + '&SortBy=DateCreated' + '&SortOrder=Descending' + '&Filters={IsUnplayed,}IsNotFolder' + '&Recursive=true' + '&IncludeItemTypes=Episode' + '&ImageTypeLimit=1' + '&format=json'), 'media_type': 'Episodes', 'name_format': 'Episode|episode_name_format'}) collections.append({ 'title': item_name + i18n('_next_up'), 'art': art, 'path': ('{server}/emby/Shows/NextUp/?Userid={userid}' + '&ParentId=' + item.get("Id") + '&Limit={ItemLimit}' + '&Recursive=true' + '&Fields={field_filters}' + '&Filters=IsUnplayed,IsNotFolder' + '&IsVirtualUnaired=false' + '&IsMissing=False' + '&IncludeItemTypes=Episode' + '&ImageTypeLimit=1' + '&format=json'), 'media_type': 'Episodes', 'name_format': 'Episode|episode_name_format'}) collections.append({ 'title': item_name + i18n('_genres'), 'item_type': 'plugin_link', 'art': art, 'path': 'plugin://plugin.video.embycon/?mode=GENRES&item_type=tvshow&parent_id=' + item.get("Id"), 'media_type': 'tvshows'}) if type == "Channel": collections.append({ 'title': item_name, 'art': art, 'path': ('{server}/emby/Users/{userid}/Items' + '?ParentId=' + item.get("Id") + '&IsVirtualUnaired=false' + '&IsMissing=False' + '&Fields={field_filters}' + '&ImageTypeLimit=1' + '&format=json'), 'media_type': 'files', 'name_format': 'Episode|episode_name_format'}) if collection_type == "movies": collections.append({ 'title': item_name + i18n('_unwatched'), 'art': art, 'path': ('{server}/emby/Users/{userid}/Items' + '?ParentId=' + item.get("Id") + '&IsVirtualUnaired=false' + '&IsMissing=False' + '&Fields={field_filters}' + '&Filters=IsUnplayed' + '&ImageTypeLimit=1' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json'), 'media_type': collection_type}) collections.append({ 'title': item_name + i18n('_in_progress'), 'art': art, 'path': ('{server}/emby/Users/{userid}/Items' + '?ParentId=' + item.get("Id") + '&Limit={ItemLimit}' + '&SortBy=DatePlayed' + '&SortOrder=Descending' + '&IsVirtualUnaired=false' + '&IsMissing=False' + '&Fields={field_filters}' + '&Filters=IsResumable' + '&ImageTypeLimit=1' + '&format=json'), 'media_type': collection_type}) collections.append({ 'title': item_name + i18n('_recently_added'), 'art': art, 'path': ('{server}/emby/Users/{userid}/Items' + '?ParentId=' + item.get("Id") + '&Limit={ItemLimit}' + '&IsVirtualUnaired=false' + '&IsMissing=False' + '&Fields={field_filters}' + '&SortBy=DateCreated' + '&SortOrder=Descending' + '&Filters={IsUnplayed,}IsNotFolder' + '&ImageTypeLimit=1' + '&format=json'), 'media_type': collection_type}) collections.append({ 'title': item_name + i18n('_genres'), 'item_type': 'plugin_link', 'art': art, 'path': 'plugin://plugin.video.embycon/?mode=GENRES&item_type=movie&parent_id=' + item.get("Id"), 'media_type': collection_type}) collections.append({ 'title': item_name + ' - Pages', 'item_type': 'plugin_link', 'art': art, 'path': 'plugin://plugin.video.embycon/?mode=MOVIE_PAGES&parent_id=' + item.get("Id"), 'media_type': collection_type}) # Add standard nodes item_data = {} item_data['title'] = i18n('movies_all') item_data['media_type'] = 'Movies' item_data['path'] = ('{server}/emby/Users/{userid}/Items' + '?Fields={field_filters}' + '&Recursive=true' + '&IncludeItemTypes=Movie' + '&ImageTypeLimit=1' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json') collections.append(item_data) item_data = {} item_data['title'] = i18n('movies_unwatched') item_data['media_type'] = 'Movies' item_data['path'] = ('{server}/emby/Users/{userid}/Items' + '?Recursive=true' + '&Fields={field_filters}' + '&Filters=IsUnplayed' + '&IncludeItemTypes=Movie' + '&ImageTypeLimit=1' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json') collections.append(item_data) item_data = {} item_data['title'] = i18n('movies_in_progress') item_data['media_type'] = 'Movies' item_data['path'] = ('{server}/emby/Users/{userid}/Items' + '?Limit={ItemLimit}' + '&Recursive=true' + '&Fields={field_filters}' + '&SortBy=DatePlayed' + '&SortOrder=Descending' + '&Filters=IsResumable' + '&IncludeItemTypes=Movie' + '&ImageTypeLimit=1' + '&format=json') collections.append(item_data) item_data = {} item_data['title'] = i18n('movies_recently_added') item_data['media_type'] = 'Movies' item_data['path'] = ('{server}/emby/Users/{userid}/Items' + '?Limit={ItemLimit}' + '&Recursive=true' + '&SortBy=DateCreated' + '&Fields={field_filters}' + '&SortOrder=Descending' + '&Filters={IsUnplayed,}IsNotFolder' + '&IncludeItemTypes=Movie' + '&ImageTypeLimit=1' + '&format=json') collections.append(item_data) item_data = {} item_data['title'] = i18n('movies_favorites') item_data['media_type'] = 'Movies' item_data['path'] = ('{server}/emby/Users/{userid}/Items' + '?Fields={field_filters}' + '&Recursive=true' + '&Filters=IsFavorite' + '&IncludeItemTypes=Movie' + '&ImageTypeLimit=1' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json') collections.append(item_data) item_data = {} item_data['title'] = i18n('movies_boxsets') item_data['media_type'] = 'BoxSets' item_data['path'] = ('{server}/emby/Users/{userid}/Items' + '?Recursive=true' + '&Fields={field_filters}' + '&IncludeItemTypes=BoxSet' + '&ImageTypeLimit=1' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json') collections.append(item_data) item_data = {} item_data['title'] = i18n('tvshows_all') item_data['media_type'] = 'tvshows' item_data['path'] = ('{server}/emby/Users/{userid}/Items' + '?Fields={field_filters}' + '&Recursive=true' + '&IncludeItemTypes=Series' + '&ImageTypeLimit=1' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json') collections.append(item_data) item_data = {} item_data['title'] = i18n('tvshows_unwatched') item_data['media_type'] = 'tvshows' item_data['path'] = ('{server}/emby/Users/{userid}/Items' + '?Fields={field_filters}' + '&Recursive=true' + '&Filters=IsUnplayed' + '&IncludeItemTypes=Series' + '&ImageTypeLimit=1' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json') collections.append(item_data) item_data = {} item_data['title'] = i18n('tvshows_favorites') item_data['media_type'] = 'tvshows' item_data['path'] = ('{server}/emby/Users/{userid}/Items' + '?Fields={field_filters}' + '&Recursive=true' + '&Filters=IsFavorite' + '&IncludeItemTypes=Series' + '&ImageTypeLimit=1' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json') collections.append(item_data) item_data = {} item_data['title'] = i18n('tvshows_latest') item_data['media_type'] = 'Episodes' item_data['path'] = ('{server}/emby/Users/{userid}/Items/Latest' + '?Limit={ItemLimit}' + '&Recursive=true' + '&GroupItems=true' + '&SortBy=DateCreated' + '&Fields={field_filters}' + '&SortOrder=Descending' + '&Filters={IsUnplayed}' + '&IsVirtualUnaired=false' + '&IsMissing=False' + '&IncludeItemTypes=Episode' + '&ImageTypeLimit=1' + '&format=json') item_data['name_format'] = 'Episode|episode_name_format' collections.append(item_data) item_data = {} item_data['title'] = i18n('episodes_in_progress') item_data['media_type'] = 'Episodes' item_data['path'] = ('{server}/emby/Users/{userid}/Items' + '?Limit={ItemLimit}' + '&SortBy=DatePlayed' + '&SortOrder=Descending' + '&Recursive=true' + '&Fields={field_filters}' + '&Filters=IsResumable' + '&IncludeItemTypes=Episode' + '&ImageTypeLimit=1' + '&format=json') item_data['name_format'] = 'Episode|episode_name_format' collections.append(item_data) item_data = {} item_data['title'] = i18n('episodes_recently_added') item_data['media_type'] = 'Episodes' item_data['path'] = ('{server}/emby/Users/{userid}/Items' + '?Limit={ItemLimit}' + '&Recursive=true' + '&SortBy=DateCreated' + '&Fields={field_filters}' + '&SortOrder=Descending' + '&Filters={IsUnplayed,}IsNotFolder' + '&IsVirtualUnaired=false' + '&IsMissing=False' + '&IncludeItemTypes=Episode' + '&ImageTypeLimit=1' + '&format=json') item_data['name_format'] = 'Episode|episode_name_format' collections.append(item_data) item_data = {} item_data['title'] = i18n('episodes_up_next') item_data['media_type'] = 'Episodes' item_data['path'] = ('{server}/emby/Shows/NextUp/?Userid={userid}' + '&Limit={ItemLimit}' + '&Recursive=true' + '&Fields={field_filters}' + '&Filters=IsUnplayed,IsNotFolder' + '&IsVirtualUnaired=false' + '&IsMissing=False' + '&IncludeItemTypes=Episode' + '&ImageTypeLimit=1' + '&format=json') item_data['name_format'] = 'Episode|episode_name_format' collections.append(item_data) item_data = {} item_data['title'] = i18n('upcoming_tv') item_data['media_type'] = 'Episodes' item_data['path'] = ('{server}/emby/Users/{userid}/Items' + '?Recursive=true' + '&SortBy=PremiereDate' + '&Fields={field_filters}' + '&SortOrder=Ascending' + '&IsVirtualUnaired=true' + '&IsNotFolder' + '&IncludeItemTypes=Episode' + '&ImageTypeLimit=1' + '&format=json') collections.append(item_data) item_data = {} item_data['title'] = i18n('music_all_albums') item_data['media_type'] = 'MusicAlbums' item_data['path'] = ('{server}/emby/Users/{userid}/Items' + '?Recursive=true' + '&IncludeItemTypes=MusicAlbum' + '&ImageTypeLimit=1' + '&EnableImageTypes=Primary,Backdrop,Banner,Thumb' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json') collections.append(item_data) item_data = {} item_data['title'] = i18n('music_all_artists') item_data['media_type'] = 'MusicArtists' item_data['path'] = ('{server}/emby/Artists/AlbumArtists' + '?Recursive=true' + '&ImageTypeLimit=1' + '&EnableImageTypes=Primary,Backdrop,Banner,Thumb' + '&SortBy=Name' + '&SortOrder=Ascending' + '&format=json') collections.append(item_data) return collections
def extract_item_info(item, gui_options): item_details = ItemDetails() item_details.id = item["Id"] item_details.is_folder = item["IsFolder"] item_details.item_type = item["Type"] item_details.location_type = item["LocationType"] item_details.name = item["Name"] item_details.original_title = item_details.name if item_details.item_type == "Episode": item_details.episode_number = item["IndexNumber"] if item_details.item_type == "Episode": item_details.season_number = item["ParentIndexNumber"] elif item_details.item_type == "Season": item_details.season_number = item["IndexNumber"] if item_details.season_number is None: item_details.season_number = 0 if item_details.episode_number is None: item_details.episode_number = 0 if item["Taglines"] is not None and len(item["Taglines"]) > 0: item_details.tagline = item["Taglines"][0] if item_details.item_type == "Audio": item_details.track_number = item["IndexNumber"] item_details.album_name = item["Album"] artists = item["Artists"] if artists is not None and len(artists) > 0: item_details.song_artist = artists[0] # get first artist if item_details.item_type == "MusicAlbum": item_details.album_artist = item["AlbumArtist"] item_details.album_name = item_details.name # set the item name # override with name format string from request name_format = gui_options["name_format"] name_format_type = gui_options["name_format_type"] if name_format is not None and item_details.item_type == name_format_type: nameInfo = {} nameInfo["ItemName"] = item["Name"] season_name = item["SeriesName"] if season_name: nameInfo["SeriesName"] = season_name else: nameInfo["SeriesName"] = "" nameInfo["SeasonIndex"] = u"%02d" % item_details.season_number nameInfo["EpisodeIndex"] = u"%02d" % item_details.episode_number log.debug("FormatName: {0} | {1}", name_format, nameInfo) item_details.name = unicode(name_format).format(**nameInfo).strip() year = item["ProductionYear"] prem_date = item["PremiereDate"] if year is not None: item_details.year = year elif item_details.year is None and prem_date is not None: item_details.year = int(prem_date[:4]) if prem_date is not None: tokens = prem_date.split("T") item_details.premiere_date = tokens[0] create_date = item["DateCreated"] if create_date is not None: item_details.date_added = create_date.split('.')[0].replace('T', " ") # add the premiered date for Upcoming TV if item_details.location_type == "Virtual": airtime = item["AirTime"] item_details.name = item_details.name + ' - ' + item_details.premiere_date + ' - ' + str(airtime) # Process MediaStreams mediaStreams = item["MediaStreams"] if mediaStreams is not None: for mediaStream in mediaStreams: stream_type = mediaStream["Type"] if stream_type == "Video": item_details.video_codec = mediaStream["Codec"] item_details.height = mediaStream["Height"] item_details.width = mediaStream["Width"] aspect = mediaStream["AspectRatio"] if aspect is not None and len(aspect) >= 3: try: aspect_width, aspect_height = aspect.split(':') item_details.aspect_ratio = float(aspect_width) / float(aspect_height) except: item_details.aspect_ratio = 1.85 if stream_type == "Audio": item_details.audio_codec = mediaStream["Codec"] item_details.channels = mediaStream["Channels"] if stream_type == "Subtitle": item_details.subtitle_available = True sub_lang = mediaStream["Language"] if sub_lang is not None: item_details.subtitle_lang = sub_lang # Process People people = item["People"] if people is not None: cast = [] for person in people: person_type = person["Type"] if person_type == "Director": item_details.director = item_details.director + person["Name"] + ' ' elif person_type == "Writing": item_details.writer = person["Name"] elif person_type == "Actor": log.debug("Person: {0}", person) person_name = person["Name"] person_role = person["Role"] person_id = person["Id"] person_tag = person["PrimaryImageTag"] if person_tag is not None: person_thumbnail = download_utils.imageUrl(person_id, "Primary", 0, 400, 400, person_tag, server = gui_options["server"]) else: person_thumbnail = "" person = {"name": person_name, "role": person_role, "thumbnail": person_thumbnail} cast.append(person) item_details.cast = cast # Process Studios studios = item["Studios"] if studios is not None: for studio in studios: if item_details.studio == "": # Just take the first one studio_name = studio["Name"] item_details.studio = studio_name break # Process Genres genres = item["Genres"] if genres is not None and len(genres) > 0: item_details.genre = " / ".join(genres) # Process UserData userData = item["UserData"] if userData is None: userData = defaultdict(lambda: None, {}) if userData["Played"] == True: item_details.overlay = "6" item_details.play_count = 1 else: item_details.overlay = "7" item_details.play_count = 0 if userData["IsFavorite"] == True: item_details.overlay = "5" item_details.favorite = "true" else: item_details.favorite = "false" reasonableTicks = userData["PlaybackPositionTicks"] if reasonableTicks is not None: reasonableTicks = int(reasonableTicks) / 1000 item_details.resume_time = int(reasonableTicks / 10000) item_details.series_name = item["SeriesName"] item_details.plot = item["Overview"] runtime = item["RunTimeTicks"] if item_details.is_folder == False and runtime is not None: item_details.duration = long(runtime) / 10000000 child_count = item["ChildCount"] if child_count is not None: item_details.total_seasons = child_count recursive_item_count = item["RecursiveItemCount"] if recursive_item_count is not None: item_details.total_episodes = recursive_item_count unplayed_item_count = userData["UnplayedItemCount"] if unplayed_item_count is not None: item_details.unwatched_episodes = unplayed_item_count item_details.watched_episodes = item_details.total_episodes - unplayed_item_count item_details.number_episodes = item_details.total_episodes item_details.art = getArt(item, gui_options["server"]) item_details.rating = item["OfficialRating"] item_details.mpaa = item["OfficialRating"] item_details.critic_rating = item["CommunityRating"] if item_details.critic_rating is None: item_details.critic_rating = 0.0 item_details.location_type = item["LocationType"] item_details.recursive_item_count = item["RecursiveItemCount"] item_details.recursive_unplayed_items_count = userData["UnplayedItemCount"] item_details.mode = "GET_CONTENT" return item_details
def setListItemProps(id, listItem, result, server, extra_props, title): # set up item and item info art = getArt(result, server=server) listItem.setIconImage(art['thumb']) # back compat listItem.setProperty('fanart_image', art['fanart']) # back compat listItem.setProperty('discart', art['discart']) # not avail to setArt listItem.setArt(art) listItem.setProperty('IsPlayable', 'false') listItem.setProperty('IsFolder', 'false') listItem.setProperty('id', result.get("Id")) for prop in extra_props: listItem.setProperty(prop[0], prop[1]) item_type = result.get("Type", "").lower() mediatype = 'video' if item_type == 'movie' or item_type == 'boxset': mediatype = 'movie' elif item_type == 'series': mediatype = 'tvshow' elif item_type == 'season': mediatype = 'season' elif item_type == 'episode': mediatype = 'episode' elif item_type == 'audio': mediatype = 'song' if item_type == "audio": details = { 'title': title, 'mediatype': mediatype } listItem.setInfo("Music", infoLabels=details) else: details = { 'title': title, 'plot': result.get("Overview"), 'mediatype': mediatype } if item_type == 'movie': year = result.get("ProductionYear") prem_date = result.get("PremiereDate") if year is not None: details['year'] = year elif details['year'] is None and prem_date is not None: details['year'] = int(prem_date[:4]) tv_show_name = result.get("SeriesName") if tv_show_name is not None: details['tvshowtitle'] = tv_show_name if item_type == "episode": episode_number = result.get("IndexNumber", -1) details["episode"] = str(episode_number) season_number = result.get("ParentIndexNumber", -1) details["season"] = str(season_number) elif item_type == "season": season_number = result.get("IndexNumber", -1) details["season"] = str(season_number) details["plotoutline"] = "emby_id:" + id #listItem.setUniqueIDs({'emby': id}) listItem.setInfo("Video", infoLabels=details) return listItem
def extract_item_info(item, gui_options): item_details = ItemDetails() item_details.id = item["Id"] item_details.is_folder = item["IsFolder"] item_details.item_type = item["Type"] item_details.location_type = item["LocationType"] item_details.name = item["Name"] item_details.original_title = item_details.name if item_details.item_type == "Episode": item_details.episode_number = item["IndexNumber"] if item_details.item_type == "Episode": item_details.season_number = item["ParentIndexNumber"] elif item_details.item_type == "Season": item_details.season_number = item["IndexNumber"] if item_details.season_number is None: item_details.season_number = 0 if item_details.episode_number is None: item_details.episode_number = 0 if item["Taglines"] is not None and len(item["Taglines"]) > 0: item_details.tagline = item["Taglines"][0] if item_details.item_type == "Audio": item_details.track_number = item["IndexNumber"] item_details.album_name = item["Album"] artists = item["Artists"] if artists is not None and len(artists) > 0: item_details.song_artist = artists[0] # get first artist if item_details.item_type == "MusicAlbum": item_details.album_artist = item["AlbumArtist"] item_details.album_name = item_details.name # set the item name # override with name format string from request name_format = gui_options["name_format"] name_format_type = gui_options["name_format_type"] if name_format is not None and item_details.item_type == name_format_type: nameInfo = {} nameInfo["ItemName"] = item["Name"] season_name = item["SeriesName"] if season_name: nameInfo["SeriesName"] = season_name else: nameInfo["SeriesName"] = "" nameInfo["SeasonIndex"] = u"%02d" % item_details.season_number nameInfo["EpisodeIndex"] = u"%02d" % item_details.episode_number log.debug("FormatName: {0} | {1}", name_format, nameInfo) item_details.name = unicode(name_format).format(**nameInfo).strip() year = item["ProductionYear"] prem_date = item["PremiereDate"] if year is not None: item_details.year = year elif item_details.year is None and prem_date is not None: item_details.year = int(prem_date[:4]) if prem_date is not None: tokens = prem_date.split("T") item_details.premiere_date = tokens[0] create_date = item["DateCreated"] if create_date is not None: item_details.date_added = create_date.split('.')[0].replace('T', " ") # add the premiered date for Upcoming TV if item_details.location_type == "Virtual": airtime = item["AirTime"] item_details.name = item_details.name + ' - ' + item_details.premiere_date + ' - ' + str( airtime) # Process MediaStreams mediaStreams = item["MediaStreams"] if mediaStreams is not None: for mediaStream in mediaStreams: stream_type = mediaStream["Type"] if stream_type == "Video": item_details.video_codec = mediaStream["Codec"] item_details.height = mediaStream["Height"] item_details.width = mediaStream["Width"] aspect = mediaStream["AspectRatio"] if aspect is not None and len(aspect) >= 3: try: aspect_width, aspect_height = aspect.split(':') item_details.aspect_ratio = float( aspect_width) / float(aspect_height) except: item_details.aspect_ratio = 1.85 if stream_type == "Audio": item_details.audio_codec = mediaStream["Codec"] item_details.channels = mediaStream["Channels"] if stream_type == "Subtitle": item_details.subtitle_available = True sub_lang = mediaStream["Language"] if sub_lang is not None: item_details.subtitle_lang = sub_lang # Process People people = item["People"] if people is not None: cast = [] for person in people: person_type = person["Type"] if person_type == "Director": item_details.director = item_details.director + person[ "Name"] + ' ' elif person_type == "Writing": item_details.writer = person["Name"] elif person_type == "Actor": log.debug("Person: {0}", person) person_name = person["Name"] person_role = person["Role"] person_id = person["Id"] person_tag = person["PrimaryImageTag"] if person_tag is not None: person_thumbnail = download_utils.imageUrl( person_id, "Primary", 0, 400, 400, person_tag, server=gui_options["server"]) else: person_thumbnail = "" person = { "name": person_name, "role": person_role, "thumbnail": person_thumbnail } cast.append(person) item_details.cast = cast # Process Studios studios = item["Studios"] if studios is not None: for studio in studios: if item_details.studio == "": # Just take the first one studio_name = studio["Name"] item_details.studio = studio_name break # Process Genres genres = item["Genres"] if genres is not None and len(genres) > 0: item_details.genre = " / ".join(genres) # Process UserData userData = item["UserData"] if userData is None: userData = defaultdict(lambda: None, {}) if userData["Played"] == True: item_details.overlay = "6" item_details.play_count = 1 else: item_details.overlay = "7" item_details.play_count = 0 if userData["IsFavorite"] == True: item_details.overlay = "5" item_details.favorite = "true" else: item_details.favorite = "false" reasonableTicks = userData["PlaybackPositionTicks"] if reasonableTicks is not None: reasonableTicks = int(reasonableTicks) / 1000 item_details.resume_time = int(reasonableTicks / 10000) item_details.series_name = item["SeriesName"] item_details.plot = item["Overview"] runtime = item["RunTimeTicks"] if item_details.is_folder == False and runtime is not None: item_details.duration = long(runtime) / 10000000 child_count = item["ChildCount"] if child_count is not None: item_details.total_seasons = child_count recursive_item_count = item["RecursiveItemCount"] if recursive_item_count is not None: item_details.total_episodes = recursive_item_count unplayed_item_count = userData["UnplayedItemCount"] if unplayed_item_count is not None: item_details.unwatched_episodes = unplayed_item_count item_details.watched_episodes = item_details.total_episodes - unplayed_item_count item_details.number_episodes = item_details.total_episodes item_details.art = getArt(item, gui_options["server"]) item_details.rating = item["OfficialRating"] item_details.mpaa = item["OfficialRating"] item_details.critic_rating = item["CommunityRating"] if item_details.critic_rating is None: item_details.critic_rating = 0.0 item_details.location_type = item["LocationType"] item_details.recursive_item_count = item["RecursiveItemCount"] item_details.recursive_unplayed_items_count = userData["UnplayedItemCount"] item_details.mode = "GET_CONTENT" return item_details
def setListItemProps(id, listItem, result, server, extra_props, title): # set up item and item info art = getArt(result, server=server) listItem.setIconImage(art['thumb']) # back compat listItem.setProperty('fanart_image', art['fanart']) # back compat listItem.setProperty('discart', art['discart']) # not avail to setArt listItem.setArt(art) listItem.setProperty('IsPlayable', 'false') listItem.setProperty('IsFolder', 'false') listItem.setProperty('id', result.get("Id")) for prop in extra_props: listItem.setProperty(prop[0], prop[1]) item_type = result.get("Type", "").lower() mediatype = 'video' if item_type == 'movie' or item_type == 'boxset': mediatype = 'movie' elif item_type == 'series': mediatype = 'tvshow' elif item_type == 'season': mediatype = 'season' elif item_type == 'episode': mediatype = 'episode' elif item_type == 'audio': mediatype = 'song' if item_type == "audio": details = { 'title': title, 'mediatype': mediatype } listItem.setInfo("Music", infoLabels=details) else: details = { 'title': title, 'plot': result.get("Overview"), 'mediatype': mediatype } tv_show_name = result.get("SeriesName") if tv_show_name is not None: details['tvshowtitle'] = tv_show_name if item_type == "episode": episode_number = result.get("IndexNumber", -1) details["episode"] = str(episode_number) season_number = result.get("ParentIndexNumber", -1) details["season"] = str(season_number) elif item_type == "season": season_number = result.get("IndexNumber", -1) details["season"] = str(season_number) details["plotoutline"] = "emby_id:" + id #listItem.setUniqueIDs({'emby': id}) listItem.setInfo("Video", infoLabels=details) return listItem