def set_library_window_values(force=False): log.debug("set_library_window_values Called forced={0}", force) home_window = HomeWindow() already_set = home_window.getProperty("view_item.0.name") if not force and already_set: return for index in range(0, 20): home_window.clearProperty("view_item.%i.name" % index) home_window.clearProperty("view_item.%i.id" % index) home_window.clearProperty("view_item.%i.type" % index) home_window.clearProperty("view_item.%i.thumb" % index) data_manager = DataManager() url = "{server}/emby/Users/{userid}/Views" result = data_manager.GetContent(url) if result is None: return result = result.get("Items") server = downloadUtils.getServer() index = 0 for item in result: type = item.get("CollectionType") if type in ["movies", "boxsets", "music", "tvshows"]: name = item.get("Name") id = item.get("Id") # plugin.video.jellyfincon- prop_name = "view_item.%i.name" % index home_window.setProperty(prop_name, name) log.debug( "set_library_window_values: plugin.video.jellyfincon-{0}={1}", prop_name, name) prop_name = "view_item.%i.id" % index home_window.setProperty(prop_name, id) log.debug( "set_library_window_values: plugin.video.jellyfincon-{0}={1}", prop_name, id) prop_name = "view_item.%i.type" % index home_window.setProperty(prop_name, type) log.debug( "set_library_window_values: plugin.video.jellyfincon-{0}={1}", prop_name, type) thumb = downloadUtils.getArtwork(item, "Primary", server=server) prop_name = "view_item.%i.thumb" % index home_window.setProperty(prop_name, thumb) log.debug( "set_library_window_values: plugin.video.jellyfincon-{0}={1}", prop_name, thumb) index += 1
def playListOfItems(id_list, monitor): log.debug("Loading all items in the list") data_manager = DataManager() items = [] for id in id_list: url = "{server}/emby/Users/{userid}/Items/" + id + "?format=json" result = data_manager.GetContent(url) if result is None: log.debug("Playfile item was None, so can not play!") return items.append(result) return playAllFiles(items, monitor)
def toggle_watched(params): log.debug("toggle_watched: {0}", params) item_id = params.get("item_id", None) if item_id is None: return url = "{server}/emby/Users/{userid}/Items/" + item_id + "?format=json" data_manager = DataManager() result = data_manager.GetContent(url) log.debug("toggle_watched item info: {0}", result) user_data = result.get("UserData", None) if user_data is None: return if user_data.get("Played", False) is False: markWatched(item_id) else: markUnwatched(item_id)
def get_next_episode(item): if item.get("Type", "na") != "Episode": log.debug("Not an episode, can not get next") return None parendId = item.get("ParentId", "na") item_index = item.get("IndexNumber", -1) if parendId == "na": log.debug("No parent id, can not get next") return None if item_index == -1: log.debug("No episode number, can not get next") return None url = ( '{server}/emby/Users/{userid}/Items?' + '?Recursive=true' + '&ParentId=' + parendId + '&IsVirtualUnaired=false' + '&IsMissing=False' + '&IncludeItemTypes=Episode' + '&ImageTypeLimit=1' + '&format=json') data_manager = DataManager() items_result = data_manager.GetContent(url) log.debug("get_next_episode, sibling list: {0}", items_result) if items_result is None: log.debug("get_next_episode no results") return None item_list = items_result.get("Items", []) for item in item_list: index = item.get("IndexNumber", -1) # find the very next episode in the season if index == item_index + 1: log.debug("get_next_episode, found next episode: {0}", item) return item return None
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 showMenu(params): log.debug("showMenu(): {0}", params) item_id = params["item_id"] url = "{server}/emby/Users/{userid}/Items/" + item_id + "?format=json" data_manager = DataManager() result = data_manager.GetContent(url) log.debug("Playfile item info: {0}", result) if result is None: return action_items = [] if result["Type"] in ["Episode", "Movie", "Music"]: li = xbmcgui.ListItem(i18n('play')) li.setProperty('menu_id', 'play') action_items.append(li) if result["Type"] in ["Season", "MusicAlbum"]: li = xbmcgui.ListItem(i18n('play_all')) li.setProperty('menu_id', 'play_all') action_items.append(li) if result["Type"] in ["Episode", "Movie"]: li = xbmcgui.ListItem(i18n('emby_force_transcode')) li.setProperty('menu_id', 'transcode') action_items.append(li) if result["Type"] == "Movie": li = xbmcgui.ListItem(i18n('play_trailer')) li.setProperty('menu_id', 'play_trailer') action_items.append(li) if result["Type"] == "Episode" and result["ParentId"] is not None: li = xbmcgui.ListItem(i18n('view_season')) li.setProperty('menu_id', 'view_season') action_items.append(li) user_data = result["UserData"] if user_data.get("Played", False) is False: li = xbmcgui.ListItem(i18n('emby_mark_watched')) li.setProperty('menu_id', 'mark_watched') action_items.append(li) else: li = xbmcgui.ListItem(i18n('emby_mark_unwatched')) li.setProperty('menu_id', 'mark_unwatched') action_items.append(li) if user_data["IsFavorite"] == False: li = xbmcgui.ListItem(i18n('emby_set_favorite')) li.setProperty('menu_id', 'emby_set_favorite') action_items.append(li) else: li = xbmcgui.ListItem(i18n('emby_unset_favorite')) li.setProperty('menu_id', 'emby_unset_favorite') action_items.append(li) li = xbmcgui.ListItem(i18n('emby_delete')) li.setProperty('menu_id', 'delete') action_items.append(li) #xbmcplugin.endOfDirectory(int(sys.argv[1]), cacheToDisc=False) action_menu = ActionMenu("ActionMenu.xml", PLUGINPATH, "default", "720p") action_menu.setActionItems(action_items) action_menu.doModal() selected_action_item = action_menu.getActionItem() selected_action = "" if selected_action_item is not None: selected_action = selected_action_item.getProperty('menu_id') log.debug("Menu Action Selected: {0}", selected_action_item) del action_menu if selected_action == "play": log.debug("Play Item") #list_item = populate_listitem(params["item_id"]) #result = xbmcgui.Dialog().info(list_item) #log.debug("xbmcgui.Dialog().info: {0}", result) PLAY(params) elif selected_action == "play_all": PLAY(params) elif selected_action == "play_trailer": playTrailer(item_id) elif selected_action == "transcode": params['force_transcode'] = 'true' PLAY(params) elif selected_action == "emby_set_favorite": markFavorite(item_id) elif selected_action == "emby_unset_favorite": unmarkFavorite(item_id) elif selected_action == "mark_watched": markWatched(item_id) elif selected_action == "mark_unwatched": markUnwatched(item_id) elif selected_action == "delete": delete(result) elif selected_action == "view_season": parent_id = result["ParentId"] xbmc.executebuiltin( 'ActivateWindow(Videos, plugin://plugin.video.embycon/?mode=PARENT_CONTENT&ParentId={0}&media_type=episodes, return)'.format(parent_id))
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 getWidgetContentCast(handle, params): log.debug("getWigetContentCast Called: {0}", params) server = downloadUtils.getServer() id = params["id"] data_manager = DataManager() result = data_manager.GetContent("{server}/emby/Users/{userid}/Items/" + id + "?format=json") log.debug("ItemInfo: {0}", result) listItems = [] if result is not None: people = result.get("People") else: people = None if people is not None: for person in people: #if (person.get("Type") == "Director"): # director = director + person.get("Name") + ' ' #if (person.get("Type") == "Writing"): # writer = person.get("Name") #if (person.get("Type") == "Writer"): # writer = person.get("Name") if (person.get("Type") == "Actor"): person_name = person.get("Name") person_role = person.get("Role") person_id = person.get("Id") person_tag = person.get("PrimaryImageTag") person_thumbnail = None if person_tag: person_thumbnail = downloadUtils.imageUrl(person_id, "Primary", 0, 400, 400, person_tag, server=server) if kodi_version > 17: list_item = xbmcgui.ListItem(label=person_name, iconImage=person_thumbnail, offscreen=True) else: list_item = xbmcgui.ListItem(label=person_name, iconImage=person_thumbnail) if person_thumbnail: artLinks = {} artLinks["thumb"] = person_thumbnail artLinks["poster"] = person_thumbnail list_item.setArt(artLinks) labels = {} labels["mediatype"] = "artist" list_item.setInfo(type="music", infoLabels=labels) if person_role: list_item.setLabel2(person_role) itemTupple = ("", list_item, False) listItems.append(itemTupple) xbmcplugin.setContent(handle, 'artists') xbmcplugin.addDirectoryItems(handle, listItems) xbmcplugin.endOfDirectory(handle, cacheToDisc=False)
def playFile(play_info, monitor): id = play_info.get("item_id") # if this is a list of items them add them all to the play list if isinstance(id, list): return playListOfItems(id, monitor) auto_resume = play_info.get("auto_resume", "-1") force_transcode = play_info.get("force_transcode", False) media_source_id = play_info.get("media_source_id", "") use_default = play_info.get("use_default", False) log.debug("playFile id({0}) resume({1}) force_transcode({2})", id, auto_resume, force_transcode) settings = xbmcaddon.Addon() addon_path = settings.getAddonInfo('path') force_auto_resume = settings.getSetting('forceAutoResume') == 'true' jump_back_amount = int(settings.getSetting("jump_back_amount")) server = download_utils.getServer() url = "{server}/emby/Users/{userid}/Items/" + id + "?format=json" data_manager = DataManager() result = data_manager.GetContent(url) log.debug("Playfile item: {0}", result) if result is None: log.debug("Playfile item was None, so can not play!") return # if this is a season, tv show or album then play all items in that parent if result.get("Type") == "Season" or result.get("Type") == "MusicAlbum": log.debug("PlayAllFiles for parent item id: {0}", id) url = ('{server}/emby/Users/{userid}/items' + '?ParentId=' + id + '&Fields=MediaSources' + '&format=json') result = data_manager.GetContent(url) log.debug("PlayAllFiles items: {0}", result) # process each item items = result["Items"] if items is None: items = [] return playAllFiles(items, monitor) # select the media source to use media_sources = result.get('MediaSources') selected_media_source = None if media_sources is None or len(media_sources) == 0: log.debug("Play Failed! There is no MediaSources data!") return elif len(media_sources) == 1: selected_media_source = media_sources[0] elif media_source_id != "": for source in media_sources: if source.get("Id", "na") == media_source_id: selected_media_source = source break elif len(media_sources) > 1: sourceNames = [] for source in media_sources: sourceNames.append(source.get("Name", "na")) dialog = xbmcgui.Dialog() resp = dialog.select(i18n('select_source'), sourceNames) if resp > -1: selected_media_source = media_sources[resp] else: log.debug("Play Aborted, user did not select a MediaSource") return if selected_media_source is None: log.debug("Play Aborted, MediaSource was None") return seekTime = 0 auto_resume = int(auto_resume) # process user data for resume points if auto_resume != -1: seekTime = (auto_resume / 1000) / 10000 elif force_auto_resume: userData = result.get("UserData") reasonableTicks = int(userData.get("PlaybackPositionTicks")) / 1000 seekTime = reasonableTicks / 10000 else: userData = result.get("UserData") if userData.get("PlaybackPositionTicks") != 0: reasonableTicks = int(userData.get("PlaybackPositionTicks")) / 1000 seekTime = reasonableTicks / 10000 displayTime = str(timedelta(seconds=seekTime)) resumeDialog = ResumeDialog("ResumeDialog.xml", addon_path, "default", "720p") resumeDialog.setResumeTime("Resume from " + displayTime) resumeDialog.doModal() resume_result = resumeDialog.getResumeAction() del resumeDialog log.debug("Resume Dialog Result: {0}", resume_result) # check system settings for play action # if prompt is set ask to set it to auto resume params = {"setting": "myvideos.selectaction"} setting_result = json_rpc('Settings.getSettingValue').execute(params) log.debug("Current Setting (myvideos.selectaction): {0}", setting_result) current_value = setting_result.get("result", None) if current_value is not None: current_value = current_value.get("value", -1) if current_value not in (2,3): return_value = xbmcgui.Dialog().yesno(i18n('extra_prompt'), i18n('turn_on_auto_resume?')) if return_value: params = {"setting": "myvideos.selectaction", "value": 2} json_rpc_result = json_rpc('Settings.setSettingValue').execute(params) log.debug("Save Setting (myvideos.selectaction): {0}", json_rpc_result) if resume_result == 1: seekTime = 0 elif resume_result == -1: return listitem_props = [] playback_type = "0" playurl = None play_session_id = id_generator() log.debug("play_session_id: {0}", play_session_id) # check if strm file, path will contain contain strm contents if selected_media_source.get('Container') == 'strm': playurl, listitem_props = PlayUtils().getStrmDetails(selected_media_source) if playurl is None: return if not playurl: playurl, playback_type = PlayUtils().getPlayUrl(id, selected_media_source, force_transcode, play_session_id) log.debug("Play URL: {0} ListItem Properties: {1}", playurl, listitem_props) playback_type_string = "DirectPlay" if playback_type == "2": playback_type_string = "Transcode" elif playback_type == "1": playback_type_string = "DirectStream" # add the playback type into the overview if result.get("Overview", None) is not None: result["Overview"] = playback_type_string + "\n" + result.get("Overview") else: result["Overview"] = playback_type_string # add title decoration is needed item_title = result.get("Name", i18n('missing_title')) list_item = xbmcgui.ListItem(label=item_title) if playback_type == "2": # if transcoding then prompt for audio and subtitle playurl = audioSubsPref(playurl, list_item, selected_media_source, id, use_default) log.debug("New playurl for transcoding: {0}", playurl) elif playback_type == "1": # for direct stream add any streamable subtitles externalSubs(selected_media_source, list_item, id) # add playurl and data to the monitor data = {} data["item_id"] = id data["playback_type"] = playback_type_string data["play_session_id"] = play_session_id data["play_action_type"] = "play" monitor.played_information[playurl] = data log.debug("Add to played_information: {0}", monitor.played_information) list_item.setPath(playurl) list_item = setListItemProps(id, list_item, result, server, listitem_props, item_title) playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO) playlist.clear() playlist.add(playurl, list_item) xbmc.Player().play(playlist) send_next_episode_details(result) if seekTime == 0: return count = 0 while not xbmc.Player().isPlaying(): log.debug("Not playing yet...sleep for 1 sec") count = count + 1 if count >= 10: return else: xbmc.Monitor().waitForAbort(1) seekTime = seekTime - jump_back_amount target_seek = (seekTime - 5) current_position = 0 while current_position < target_seek: # xbmc.Player().pause() xbmc.sleep(100) xbmc.Player().seekTime(seekTime) xbmc.sleep(100) # xbmc.Player().play() current_position = xbmc.Player().getTime() log.debug("Playback_Start_Seek target:{0} current:{1}", target_seek, current_position)
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 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}/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) log.debug("CollectionType: {0}", collection_type) log.debug("Title: {0}", item_name) if collection_type == "music": item_data = {} item_data['title'] = item_name + i18n('_all_albums') item_data['thumbnail'] = downloadUtils.getArtwork(item, "Primary", server=server) 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' + '&format=json') collections.append(item_data) item_data = {} item_data['title'] = item_name + i18n('_all_artists') item_data['thumbnail'] = downloadUtils.getArtwork(item, "Primary", server=server) 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' + '&format=json') collections.append(item_data) if collection_type in ["movies", "boxsets"]: collections.append({ 'title': item_name, 'thumbnail': downloadUtils.getArtwork(item, "Primary", server=server), 'path': ('{server}/emby/Users/{userid}/Items' + '?ParentId=' + item.get("Id") + '&IsVirtualUnaired=false' + '&CollapseBoxSetItems=true' + '&Recursive=true' + '&IsMissing=False' + '&Fields={field_filters}' + '&ImageTypeLimit=1' + '&format=json'), 'media_type': collection_type }) if collection_type == "tvshows": collections.append({ 'title': item_name, 'thumbnail': downloadUtils.getArtwork(item, "Primary", server=server), 'path': ('{server}/emby/Users/{userid}/Items' + '?ParentId=' + item.get("Id") + '&IsVirtualUnaired=false' + '&IsMissing=False' + '&Fields={field_filters}' + '&ImageTypeLimit=1' + '&format=json'), 'media_type': collection_type }) collections.append({ 'title': item_name + i18n('_unwatched'), 'thumbnail': downloadUtils.getArtwork(item, "Primary", server=server), 'path': ('{server}/emby/Users/{userid}/Items' + '?ParentId=' + item.get("Id") + '&IsVirtualUnaired=false' + '&IsMissing=False' + '&Fields={field_filters}' + '&Filters=IsUnplayed' + '&Recursive=true' + '&IncludeItemTypes=Series' + '&ImageTypeLimit=1' + '&format=json'), 'media_type': 'tvshows' }) collections.append({ 'title': item_name + i18n('_in_progress'), 'thumbnail': downloadUtils.getArtwork(item, "Primary", server=server), 'path': ('{server}/emby/Users/{userid}/Items' + '?ParentId=' + item.get("Id") + '&Limit={ItemLimit}' + '&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'), 'thumbnail': downloadUtils.getArtwork(item, "Primary", server=server), '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'), 'thumbnail': downloadUtils.getArtwork(item, "Primary", server=server), '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'), 'thumbnail': downloadUtils.getArtwork(item, "Primary", server=server), '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', 'thumbnail': downloadUtils.getArtwork(item, "Primary", server=server), 'path': 'plugin://plugin.video.embycon/?mode=GENRES&item_type=tvshow&parent_id=' + item.get("Id"), 'media_type': 'tvshows' }) if collection_type == "movies": collections.append({ 'title': item_name + i18n('_unwatched'), 'thumbnail': downloadUtils.getArtwork(item, "Primary", server=server), 'path': ('{server}/emby/Users/{userid}/Items' + '?ParentId=' + item.get("Id") + '&IsVirtualUnaired=false' + '&IsMissing=False' + '&Fields={field_filters}' + '&Filters=IsUnplayed' + '&ImageTypeLimit=1' + '&format=json'), 'media_type': collection_type }) collections.append({ 'title': item_name + i18n('_in_progress'), 'thumbnail': downloadUtils.getArtwork(item, "Primary", server=server), 'path': ('{server}/emby/Users/{userid}/Items' + '?ParentId=' + item.get("Id") + '&Limit={ItemLimit}' + '&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'), 'thumbnail': downloadUtils.getArtwork(item, "Primary", server=server), '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', 'thumbnail': downloadUtils.getArtwork(item, "Primary", server=server), 'path': 'plugin://plugin.video.embycon/?mode=GENRES&item_type=movie&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' + '&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' + '&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}' + '&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' + '&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' + '&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' + '&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' + '&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' + '&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}' + '&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' + '&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' + '&format=json') collections.append(item_data) return collections
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=SortName" + "&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: item_data = {} item_data['title'] = genre.get("Name") item_data['media_type'] = kodi_type item_data['thumbnail'] = downloadUtils.getArtwork(genre, "Primary", server=server) 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("thumbnail")) addMenuDirectoryItem(collection.get('title', i18n('unknown')), url, thumbnail=collection.get("thumbnail")) xbmcplugin.endOfDirectory(int(sys.argv[1]))
def cache_artwork(): log.debug("cache_artwork") 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(i18n('notice'), i18n('http_control')) 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'] # ask to delete all textures question_result = xbmcgui.Dialog().yesno(i18n('delete'), i18n('delete_existing')) if question_result: pdialog = xbmcgui.DialogProgress() pdialog.create(i18n('deleting_textures'), "") 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_result = 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(i18n('cache_all_textures_title'), i18n('cache_all_textures')) if not question_result: return params = {"properties": ["url"]} json_result = json_rpc('Textures.GetTextures').execute(params) textures = json_result.get("result", {}).get("textures", []) 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 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() image_types = ["thumb", "poster", "banner", "clearlogo", "tvshow.poster", "tvshow.banner", "tvshow.landscape"] for item in results: art = getArt(item, server) for image_type in image_types: 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) 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)} pdialog = xbmcgui.DialogProgress() pdialog.create(i18n('caching_textures'), "") 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) pdialog.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 pdialog.iscanceled(): break pdialog.close() del pdialog report_text = i18n('existing_textures') + str(len(texture_urls)) + "\n" report_text += i18n('missing_textures') + str(len(missing_texture_urls)) + "\n" report_text += i18n('loaded_textures') + str(count_done) xbmcgui.Dialog().ok(i18n('done'), report_text)
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 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]))