def cache_artwork_interactive(self): log.debug("cache_artwork_interactive") xbmcplugin.endOfDirectory(int(sys.argv[1]), cacheToDisc=False) # 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: xbmcgui.Dialog().ok(string_load(30294), string_load(30295), string_load(30355)) xbmc.executebuiltin('ActivateWindow(servicesettings)') return # ask to delete all textures question_result = xbmcgui.Dialog().yesno(string_load(30296), string_load(30297)) if question_result: pdialog = xbmcgui.DialogProgress() pdialog.create(string_load(30298), "") index = 0 json_result = json_rpc('Textures.GetTextures').execute() textures = json_result.get("result", {}).get("textures", []) log.debug("texture ids: {0}", textures) total = len(textures) for texture in textures: texture_id = texture["textureid"] params = {"textureid": int(texture_id)} json_rpc('Textures.RemoveTexture').execute(params) percentage = int((float(index) / float(total)) * 100) message = "%s of %s" % (index, total) pdialog.update(percentage, "%s" % (message)) index += 1 if pdialog.iscanceled(): break del textures del pdialog question_result = xbmcgui.Dialog().yesno(string_load(30299), string_load(30300)) if not question_result: return pdialog = xbmcgui.DialogProgress() pdialog.create(string_load(30301), "") result_report = self.cache_artwork(pdialog) pdialog.close() del pdialog if result_report: xbmcgui.Dialog().ok(string_load(30125), *result_report)
def showWidgets(): settings = xbmcaddon.Addon() show_x_filtered_items = settings.getSetting("show_x_filtered_items") url = ("{server}/emby/Movies/Recommendations" + "?userId={userid}" + "&categoryLimit=1" + "&ItemLimit={ItemLimit}" + "&format=json" + "&ImageTypeLimit=1" + "&Fields={field_filters}" + "&Filters=IsUnplayed" + "&IsPlayed=false" + "&IsMissing=False") addMenuDirectoryItem( string_load(30324) + " (" + show_x_filtered_items + ")", "plugin://plugin.video.jellyfincon/?mode=GET_CONTENT&use_cache=false&media_type=Movies&url=" + urllib.quote(url)) url = ("{server}/emby/Users/{userid}/Items" + "?Limit={ItemLimit}" + "&Ids={random_movies}" + "&Fields={field_filters}" + "&ImageTypeLimit=1") addMenuDirectoryItem( string_load(30269) + " (" + show_x_filtered_items + ")", "plugin://plugin.video.jellyfincon/?mode=GET_CONTENT&use_cache=false&media_type=Movies&url=" + urllib.quote(url)) addMenuDirectoryItem( " - " + string_load(30257) + " (" + show_x_filtered_items + ")", 'plugin://plugin.video.jellyfincon/?mode=WIDGET_CONTENT&type=recent_movies' ) addMenuDirectoryItem( " - " + string_load(30258) + " (" + show_x_filtered_items + ")", 'plugin://plugin.video.jellyfincon/?mode=WIDGET_CONTENT&type=inprogress_movies' ) addMenuDirectoryItem( " - " + string_load(30269) + " (" + show_x_filtered_items + ")", 'plugin://plugin.video.jellyfincon/?mode=WIDGET_CONTENT&type=random_movies' ) addMenuDirectoryItem( " - " + string_load(30287) + " (" + show_x_filtered_items + ")", 'plugin://plugin.video.jellyfincon/?mode=WIDGET_CONTENT&type=recent_tvshows' ) addMenuDirectoryItem( " - " + string_load(30263) + " (" + show_x_filtered_items + ")", 'plugin://plugin.video.jellyfincon/?mode=WIDGET_CONTENT&type=recent_episodes' ) addMenuDirectoryItem( " - " + string_load(30264) + " (" + show_x_filtered_items + ")", 'plugin://plugin.video.jellyfincon/?mode=WIDGET_CONTENT&type=inprogress_episodes' ) addMenuDirectoryItem( " - " + string_load(30265) + " (" + show_x_filtered_items + ")", 'plugin://plugin.video.jellyfincon/?mode=WIDGET_CONTENT&type=nextup_episodes' ) xbmcplugin.endOfDirectory(int(sys.argv[1]))
def cache_artwork_background(self): log.debug("cache_artwork_background") dp = xbmcgui.DialogProgressBG() dp.create(string_load(30301), "") result_text = self.cache_artwork(dp) dp.close() del dp if result_text: log.debug("Cache Images reuslt : {0}", " - ".join(result_text))
def cache_artwork_background(self): log.debug("cache_artwork_background") dp = xbmcgui.DialogProgressBG() dp.create(string_load(30301), "") try: result_text = self.cache_artwork(dp) except Exception as err: log.error("Cache Images Failed : {0}", err) dp.close() del dp if result_text: log.debug("Cache Images reuslt : {0}", " - ".join(result_text))
def show_search(): addMenuDirectoryItem(string_load(30231), 'plugin://plugin.video.embycon/?mode=NEW_SEARCH&item_type=Movie') addMenuDirectoryItem(string_load(30229), 'plugin://plugin.video.embycon/?mode=NEW_SEARCH&item_type=Series') addMenuDirectoryItem(string_load(30235), 'plugin://plugin.video.embycon/?mode=NEW_SEARCH&item_type=Episode') addMenuDirectoryItem(string_load(30337), 'plugin://plugin.video.embycon/?mode=NEW_SEARCH&item_type=Audio') addMenuDirectoryItem(string_load(30338), 'plugin://plugin.video.embycon/?mode=NEW_SEARCH&item_type=MusicAlbum') addMenuDirectoryItem(string_load(30339), 'plugin://plugin.video.embycon/?mode=NEW_SEARCH&item_type=Person') xbmcplugin.endOfDirectory(int(sys.argv[1]))
def showMovieAlphaList(): log.debug("== ENTER: showMovieAlphaList() ==") settings = xbmcaddon.Addon() server = downloadUtils.getServer() if server is None: return collections = [] item_data = {} item_data['title'] = "#" item_data['media_type'] = "Movies" item_data['path'] = ('{server}/emby/Users/{userid}/Items' + '?Fields={field_filters}' + '&Recursive=true' + '&NameLessThan=A' + '&IncludeItemTypes=Movie' + '&ImageTypeLimit=1' + '&format=json') collections.append(item_data) group_movies = settings.getSetting('group_movies') == "true" alphaList = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "Y", "Z"] for alphaName in alphaList: item_data = {} item_data['title'] = alphaName 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' + '&NameStartsWith=' + alphaName + '&IncludeItemTypes=Movie' + "&SortBy=Name" + "&SortOrder=Ascending" + '&ImageTypeLimit=1&format=json') 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})", collection.get('title'), url) addMenuDirectoryItem(collection.get('title', string_load(30250)), url) xbmcplugin.endOfDirectory(int(sys.argv[1]))
def showWidgets(): settings = xbmcaddon.Addon() show_x_filtered_items = settings.getSetting("show_x_filtered_items") url = ("{server}/emby/Movies/Recommendations" + "?userId={userid}" + "&categoryLimit=1" + "&ItemLimit={ItemLimit}" + "&format=json" + "&ImageTypeLimit=1" + '&Fields={field_filters}' + "&Filters={IsUnplayed}" + "&IsMissing=False") addMenuDirectoryItem(string_load(30324) + " (" + show_x_filtered_items + ")", "plugin://plugin.video.embycon/?mode=GET_CONTENT&use_cache=false&media_type=Movies&url=" + urllib.quote(url)) url = ("{server}/emby/Users/{userid}/Items" + "?SortBy=Random" + "&Limit={ItemLimit}" + '&CollapseBoxSetItems=false' + '&GroupItemsIntoCollections=false' + "&format=json" + '&Fields={field_filters}' + "&ImageTypeLimit=1" + "&IsMissing=False" + "&Filters={IsUnplayed,}IsNotFolder" + "&Recursive=true" + "&SortBy=Random" + #"&SortOrder=Descending" + "&IsVirtualUnaired=false" + "&IsMissing=False" + "&IncludeItemTypes=Movie") addMenuDirectoryItem(string_load(30269) + " (" + show_x_filtered_items + ")", "plugin://plugin.video.embycon/?mode=GET_CONTENT&use_cache=false&media_type=Movies&url=" + urllib.quote(url)) addMenuDirectoryItem(string_load(30257) + " (" + show_x_filtered_items + ")", 'plugin://plugin.video.embycon/?mode=WIDGET_CONTENT&type=recent_movies') addMenuDirectoryItem(string_load(30258) + " (" + show_x_filtered_items + ")", 'plugin://plugin.video.embycon/?mode=WIDGET_CONTENT&type=inprogress_movies') addMenuDirectoryItem(string_load(30287) + " (" + show_x_filtered_items + ")", 'plugin://plugin.video.embycon/?mode=WIDGET_CONTENT&type=recent_tvshows') addMenuDirectoryItem(string_load(30263) + " (" + show_x_filtered_items + ")", 'plugin://plugin.video.embycon/?mode=WIDGET_CONTENT&type=recent_episodes') addMenuDirectoryItem(string_load(30264) + " (" + show_x_filtered_items + ")", 'plugin://plugin.video.embycon/?mode=WIDGET_CONTENT&type=inprogress_episodes') addMenuDirectoryItem(string_load(30265) + " (" + show_x_filtered_items + ")", 'plugin://plugin.video.embycon/?mode=WIDGET_CONTENT&type=nextup_episodes') xbmcplugin.endOfDirectory(int(sys.argv[1]))
def delete_cached_images(self, item_id): log.debug("cache_delete_for_links") progress = xbmcgui.DialogProgress() progress.create(string_load(30281)) progress.update(30, string_load(30347)) item_image_url_part = "emby/Items/%s/Images/" % item_id item_image_url_part = item_image_url_part.replace("/", "%2f") log.debug("texture ids: {0}", item_image_url_part) # 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: xbmcgui.Dialog().ok(string_load(30294), string_load(30295)) return params = {"properties": ["url"]} json_result = json_rpc('Textures.GetTextures').execute(params) textures = json_result.get("result", {}).get("textures", []) log.debug("texture ids: {0}", textures) progress.update(70, string_load(30346)) delete_count = 0 for texture in textures: texture_id = texture["textureid"] texture_url = texture["url"] if item_image_url_part in texture_url: delete_count += 1 log.debug("removing texture id: {0}", texture_id) params = {"textureid": int(texture_id)} json_rpc('Textures.RemoveTexture').execute(params) del textures progress.update(100, string_load(30125)) progress.close() xbmcgui.Dialog().ok(string_load(30281), string_load(30344) % delete_count)
def displaySections(): log.debug("== ENTER: displaySections() ==") xbmcplugin.setContent(int(sys.argv[1]), 'files') server = downloadUtils.getServer() if server is None: return # Add collections collections = getCollections() if collections: for collection in collections: if collection.get("item_type") == "plugin_link": plugin_path = collection['path'] addMenuDirectoryItem(collection.get('title', string_load(30250)), plugin_path, art=collection.get("art")) else: url = (sys.argv[0] + "?url=" + urllib.quote(collection['path']) + "&mode=GET_CONTENT&media_type=" + collection["media_type"]) if collection.get("name_format") is not None: url += "&name_format=" + urllib.quote(collection.get("name_format")) if not collection.get("use_cache", True): url += "&use_cache=false" log.debug("addMenuDirectoryItem: {0} ({1})", collection.get('title'), url) addMenuDirectoryItem(collection.get('title', string_load(30250)), url, art=collection.get("art")) addMenuDirectoryItem(string_load(30251), "plugin://plugin.video.embycon/?mode=GENRES&item_type=movie") addMenuDirectoryItem(string_load(30252), "plugin://plugin.video.embycon/?mode=MOVIE_ALPHA") addMenuDirectoryItem("Movie (Pages)", "plugin://plugin.video.embycon/?mode=MOVIE_PAGES") addMenuDirectoryItem(string_load(30289), "plugin://plugin.video.embycon/?mode=GENRES&item_type=tvshow") addMenuDirectoryItem(string_load(30246), "plugin://plugin.video.embycon/?mode=SEARCH") addMenuDirectoryItem(string_load(30017), "plugin://plugin.video.embycon/?mode=SHOW_SERVER_SESSIONS") addMenuDirectoryItem(string_load(30253), "plugin://plugin.video.embycon/?mode=CHANGE_USER") addMenuDirectoryItem(string_load(30011), "plugin://plugin.video.embycon/?mode=DETECT_SERVER_USER") addMenuDirectoryItem(string_load(30254), "plugin://plugin.video.embycon/?mode=SHOW_SETTINGS") # only add these if we have other collection which means we have a valid server conn if collections: addMenuDirectoryItem(string_load(30293), "plugin://plugin.video.embycon/?mode=CACHE_ARTWORK") addMenuDirectoryItem(string_load(30247), "plugin://plugin.video.embycon/?mode=WIDGETS") xbmcplugin.endOfDirectory(int(sys.argv[1]))
def playback_starting(content_string): xbmcgui.Dialog().notification('EmbyCon', string_load(30306) % content_string, icon=icon, sound=False)
def not_found(content_string): xbmcgui.Dialog().notification('EmbyCon', string_load(30305) % content_string, icon=icon, sound=False)
def checkServer(force=False, change_user=False, notify=False): log.debug("checkServer Called") settings = xbmcaddon.Addon() serverUrl = "" something_changed = False if force is False: # if not forcing use server details from settings svr = downloadUtils.getServer() if svr is not None: serverUrl = svr # if the server is not set then try to detect it if serverUrl == "": serverInfo = getServerDetails() serverNames = [] for server in serverInfo: serverNames.append(server.get("Name", string_load(30063))) if serverNames: return_index = xbmcgui.Dialog().select(string_load(30166), serverNames) else: xbmcgui.Dialog().ok(__addon_name__, string_load(30282)) return_index = -1 if (return_index == -1): xbmc.executebuiltin("ActivateWindow(Home)") return serverUrl = serverInfo[return_index]["Address"] log.debug("Selected server: {0}", serverUrl) # parse the url url_bits = urlparse(serverUrl) server_address = url_bits.hostname server_port = str(url_bits.port) server_protocol = url_bits.scheme log.debug("Detected server info {0} - {1} - {2}", server_protocol, server_address, server_port) # save the server info settings.setSetting("port", server_port) settings.setSetting("ipaddress", server_address) if server_protocol == "https": settings.setSetting("use_https", "true") else: settings.setSetting("use_https", "false") something_changed = True if notify: xbmcgui.Dialog().ok(string_load(30167), string_load(30168), string_load(30169) + server_address, string_load(30001) + server_port) # we need to change the user current_username = settings.getSetting("username") current_username = unicode(current_username, "utf-8") # if asked or we have no current user then show user selection screen if change_user or len(current_username) == 0: # stop playback when switching users xbmc.Player().stop() # get a list of users log.debug("Getting user list") jsonData = downloadUtils.downloadUrl(serverUrl + "/emby/Users/Public?format=json", authenticate=False) # TODO: add a setting to enable this show_manual = False log.debug("jsonData: {0}", jsonData) try: result = json.loads(jsonData) except: result = None if result is None: xbmcgui.Dialog().ok(string_load(30135), string_load(30201), string_load(30169) + serverUrl) else: selected_id = -1 names = [] user_list = [] secured = [] for user in result: config = user.get("Configuration") if config is not None: if config.get("IsHidden", False) is False: name = user.get("Name") user_list.append(name) if current_username == name: selected_id = len(user_list) - 1 if (user.get("HasPassword") is True): secured.append(True) name = string_load(30060) % name else: secured.append(False) names.append(name) if (len(current_username) > 0) and (not any(n == current_username for n in user_list)): names.insert(0, string_load(30061) % current_username) user_list.insert(0, current_username) secured.insert(0, True) if show_manual: names.append(string_load(30062)) user_list.append('') secured.append(True) log.debug("User List: {0}", names) log.debug("User List: {0}", user_list) if current_username: selection_title = string_load( 30180) + " (" + current_username + ")" else: selection_title = string_load(30180) return_value = xbmcgui.Dialog().select(selection_title, names, preselect=selected_id, autoclose=20000) if return_value > -1 and return_value != selected_id: log.debug("Selected User Index: {0}", return_value) if show_manual and return_value == (len(user_list) - 1): kb = xbmc.Keyboard() kb.setHeading(string_load(30005)) kb.doModal() if kb.isConfirmed(): selected_user = kb.getText() else: selected_user = None else: selected_user = user_list[return_value] log.debug("Selected User Name: {0}", selected_user) if selected_user: something_changed = True # we have a user so save it if secured[return_value] is True: # we need a password, check the settings first m = hashlib.md5() m.update(selected_user) hashed_username = m.hexdigest() saved_password = settings.getSetting( "saved_user_password_" + hashed_username) if saved_password: log.debug("Saving username and password: {0}", selected_user) log.debug("Using stored password for user: {0}", hashed_username) settings.setSetting("username", selected_user) settings.setSetting('password', saved_password) else: kb = xbmc.Keyboard() kb.setHeading(string_load(30006)) kb.setHiddenInput(True) kb.doModal() if kb.isConfirmed(): log.debug("Saving username and password: {0}", selected_user) settings.setSetting("username", selected_user) settings.setSetting('password', kb.getText()) # should we save the password save_password = xbmcgui.Dialog().yesno( "Save Password?", "Do you want to save the password?") if save_password: log.debug( "Saving password for fast user switching: {0}", hashed_username) settings.setSetting( "saved_user_password_" + hashed_username, kb.getText()) else: log.debug("Saving username is no password: {0}", selected_user) settings.setSetting("username", selected_user) settings.setSetting('password', '') if something_changed: home_window = HomeWindow() home_window.clearProperty("userid") home_window.clearProperty("AccessToken") home_window.clearProperty("userimage") home_window.setProperty("embycon_widget_reload", str(time.time())) download_utils = DownloadUtils() download_utils.authenticate() download_utils.getUserId() xbmc.executebuiltin("ActivateWindow(Home)") xbmc.executebuiltin("ReloadSkin()")
def downloadUrl(self, url, suppress=False, postBody=None, method="GET", authenticate=True, headers=None): log.debug("downloadUrl") return_data = "null" settings = xbmcaddon.Addon() username = settings.getSetting("username") if settings.getSetting("suppressErrors") == "true": suppress = True log.debug("Before: {0}", url) if url.find("{server}") != -1: server = self.getServer() if server is None: return return_data url = url.replace("{server}", server) if url.find("{userid}") != -1: userid = self.getUserId() url = url.replace("{userid}", userid) if url.find("{ItemLimit}") != -1: show_x_filtered_items = settings.getSetting("show_x_filtered_items") url = url.replace("{ItemLimit}", show_x_filtered_items) if url.find("{IsUnplayed}") != -1 or url.find("{,IsUnplayed}") != -1 or url.find("{IsUnplayed,}") != -1 \ or url.find("{,IsUnplayed,}") != -1: show_latest_unplayed = settings.getSetting("show_latest_unplayed") == "true" if show_latest_unplayed: url = url.replace("{IsUnplayed}", "") url = url.replace("{,IsUnplayed}", "") url = url.replace("{IsUnplayed,}", "") url = url.replace("{,IsUnplayed,}", "") elif url.find("{IsUnplayed}") != -1: url = url.replace("{IsUnplayed}", "IsUnplayed") elif url.find("{,IsUnplayed}") != -1: url = url.replace("{,IsUnplayed}", ",IsUnplayed") elif url.find("{IsUnplayed,}") != -1: url = url.replace("{IsUnplayed,}", "IsUnplayed,") elif url.find("{,IsUnplayed,}") != -1: url = url.replace("{,IsUnplayed,}", ",IsUnplayed,") if url.find("{field_filters}") != -1: filter_string = getDetailsString() url = url.replace("{field_filters}", filter_string) log.debug("After: {0}", url) try: if url.startswith('http'): serversplit = 2 urlsplit = 3 else: serversplit = 0 urlsplit = 1 server = url.split('/')[serversplit] urlPath = "/" + "/".join(url.split('/')[urlsplit:]) log.debug("DOWNLOAD_URL: {0}", url) log.debug("server: {0}", server) log.debug("urlPath: {0}", urlPath) # check the server details tokens = server.split(':') host = tokens[0] port = tokens[1] if host == "<none>" or host == "" or port == "": return return_data if authenticate and username == "": return return_data use_https = settings.getSetting('use_https') == 'true' verify_cert = settings.getSetting('verify_cert') == 'true' if use_https and verify_cert: log.debug("Connection: HTTPS, Cert checked") conn = httplib.HTTPSConnection(server, timeout=40) elif use_https and not verify_cert: log.debug("Connection: HTTPS, Cert NOT checked") conn = httplib.HTTPSConnection(server, timeout=40, context=ssl._create_unverified_context()) else: log.debug("Connection: HTTP") conn = httplib.HTTPConnection(server, timeout=40) head = self.getAuthHeader(authenticate) log.debug("HEADERS: {0}", head) if (postBody != None): if isinstance(postBody, dict): content_type = "application/json" postBody = json.dumps(postBody) else: content_type = "application/x-www-form-urlencoded" head["Content-Type"] = content_type log.debug("Content-Type: {0}", content_type) log.debug("POST DATA: {0}", postBody) conn.request(method=method, url=urlPath, body=postBody, headers=head) else: conn.request(method=method, url=urlPath, headers=head) data = conn.getresponse() log.debug("GET URL HEADERS: {0}", data.getheaders()) if int(data.status) == 200: retData = data.read() contentType = data.getheader('content-encoding') log.debug("Data Len Before: {0}", len(retData)) if (contentType == "gzip"): retData = StringIO.StringIO(retData) gzipper = gzip.GzipFile(fileobj=retData) return_data = gzipper.read() else: return_data = retData if headers is not None and isinstance(headers, dict): headers.update(data.getheaders()) log.debug("Data Len After: {0}", len(return_data)) log.debug("====== 200 returned =======") log.debug("Content-Type: {0}", contentType) log.debug("{0}", return_data) log.debug("====== 200 finished ======") elif int(data.status) >= 400: if int(data.status) == 401: # remove any saved password m = hashlib.md5() m.update(username) hashed_username = m.hexdigest() log.error("HTTP response error 401 auth error, removing any saved passwords for user: {0}", hashed_username) settings.setSetting("saved_user_password_" + hashed_username, "") settings.setSetting("username", "") settings.setSetting("password", "") log.error("HTTP response error: {0} {1}", data.status, data.reason) if suppress is False: xbmcgui.Dialog().notification(string_load(30316), string_load(30200) % str(data.reason), icon="special://home/addons/plugin.video.embycon/icon.png") except Exception, msg: log.error("Unable to connect to {0} : {1}", server, msg) if suppress is False: xbmcgui.Dialog().notification(string_load(30316), str(msg), icon="special://home/addons/plugin.video.embycon/icon.png")
secure = False for user in result: if (user.get("Name") == unicode(userName, "utf-8")): userid = user.get("Id") userImage = self.get_user_artwork(user, 'Primary') log.debug("Username Found: {0}", user.get("Name")) if (user.get("HasPassword") == True): secure = True log.debug("Username Is Secure (HasPassword=True)") break if secure or not userid: authOk = self.authenticate() if authOk == "": xbmcgui.Dialog().notification(string_load(30316), string_load(30044), icon="special://home/addons/plugin.video.embycon/icon.png") return "" if not userid: userid = WINDOW.getProperty("userid") if userid and not userImage: userImage = 'DefaultUser.png' if userid == "": xbmcgui.Dialog().notification(string_load(30316), string_load(30045), icon="special://home/addons/plugin.video.embycon/icon.png") log.debug("userid: {0}", userid)
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'] progress.update(0, string_load(30356)) params = {"properties": ["url"]} json_result = json_rpc('Textures.GetTextures').execute(params) textures = json_result.get("result", {}).get("textures", []) log.debug("Textures.GetTextures Count: {0}", len(textures)) if self.stop_all_activity: return progress.update(0, string_load(30357)) 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 log.debug("texture_urls Count: {0}", len(texture_urls)) if self.stop_all_activity: return progress.update(0, string_load(30358)) 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() log.debug("Emby Item Count Count: {0}", len(results)) if self.stop_all_activity: return progress.update(0, string_load(30359)) 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(string_load(30302) + str(len(texture_urls))) result_report.append(string_load(30303) + str(len(missing_texture_urls))) result_report.append(string_load(30304) + str(count_done)) return result_report
def showMoviePages(params): log.debug("showMoviePages: {0}", params) parent_id = params.get("parent_id") settings = xbmcaddon.Addon() group_movies = settings.getSetting('group_movies') == "true" url = ('{server}/emby/Users/{userid}/Items' + '?IsVirtualUnaired=false' + '&CollapseBoxSetItems=' + str(group_movies) + '&GroupItemsIntoCollections=' + str(group_movies) + '&Recursive=true' + "&IncludeItemTypes=Movie" '&IsMissing=False' + '&ImageTypeLimit=0' + '&format=json') if parent_id: url += "&ParentId=" + parent_id data_manager = DataManager() result = data_manager.GetContent(url) if result is None: return total_results = result.get("TotalRecordCount", 0) log.debug("showMoviePages TotalRecordCount {0}", total_results) if result == 0: return page_limit = int(settings.getSetting('moviePageSize')) if page_limit == 0: page_limit = 20 start_index = 0 collections = [] while start_index < total_results: item_url = ("{server}/emby/Users/{userid}/Items" + "?IsVirtualUnaired=false" + '&CollapseBoxSetItems=' + str(group_movies) + '&GroupItemsIntoCollections=' + str(group_movies) + "&Recursive=true" + "&IsMissing=False" + "&IncludeItemTypes=Movie" "&Fields={field_filters}" + "&ImageTypeLimit=1" + "&SortBy=Name" + "&SortOrder=Ascending" + "&format=json") if parent_id: item_url += "&ParentId=" + parent_id item_url += "&StartIndex=" + str(start_index) + "&Limit=" + str(page_limit) page_upper = start_index + page_limit if page_upper > total_results: page_upper = total_results item_data = {} item_data['title'] = "Page (" + str(start_index + 1) + " - " + str(page_upper) + ")" item_data['path'] = item_url item_data['media_type'] = 'movies' collections.append(item_data) start_index = start_index + page_limit for collection in collections: content_url = urllib.quote(collection['path']) url = sys.argv[0] + ("?url=" + content_url + "&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 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 onInit(self): self.action_exitkeys_id = [10, 13] self.getControl(3010).setLabel(self.resumeTimeStamp) self.getControl(3011).setLabel(string_load(30237))