def display_list(items, content_type, pins=False): "display jen list in kodi" logging.warning('DISPLAY LIST') logging.warning(pins) if ADDON.getSetting("enable_cache") == "true" and pins: Items = fetch_from_db(pins) if Items: import xbmcplugin import sys display_code(items, content_type) elif not Items: import xbmcplugin import sys hook_result = run_hook("display_list", items, content_type, pins) if hook_result: return pins = pins.lower() save_to_db(items, pins) display_code(items, content_type) else: import xbmcplugin logging.warning('Else in') import sys hook_result = run_hook("display_list", items, content_type, pins) if hook_result: return display_code(items, content_type) logging.warning('DISPLAY LIST') if not pins: display_data(Items)
def clear_cache(): import xbmcgui skip_prompt = xbmcaddon.Addon().getSetting("quiet_cache") dialog = xbmcgui.Dialog() if skip_prompt == 'false': if dialog.yesno(addon_name, _("Clear Metadata?")): koding.Remove_Table("meta") koding.Remove_Table("episode_meta") if dialog.yesno(addon_name, _("Clear Scraper Cache?")): import universalscrapers universalscrapers.clear_cache() if dialog.yesno(addon_name, _("Clear GIF Cache?")): dest_folder = os.path.join( xbmc.translatePath(xbmcaddon.Addon().getSetting("cache_folder")), "artcache") koding.Delete_Folders(dest_folder) else: koding.Remove_Table("meta") koding.Remove_Table("episode_meta") import universalscrapers universalscrapers.clear_cache() dest_folder = os.path.join( xbmc.translatePath(xbmcaddon.Addon().getSetting("cache_folder")), "artcache") koding.Delete_Folders(dest_folder) xbmc.log("running hook: clear cache", xbmc.LOGNOTICE) run_hook("clear_cache") xbmcgui.Dialog().notification('Clear Cache', 'Cache has been cleared',xbmcaddon.Addon().getAddonInfo("icon"), 4000)
def clear_cache(): import xbmcgui skip_prompt = xbmcaddon.Addon().getSetting("quiet_cache") dialog = xbmcgui.Dialog() if skip_prompt == 'false': if dialog.yesno(addon_name, _("Clear Metadata?")): koding.Remove_Table("meta") koding.Remove_Table("episode_meta") if dialog.yesno(addon_name, _("Clear GIF Cache?")): dest_folder = os.path.join( xbmc.translatePath( xbmcaddon.Addon().getSetting("cache_folder")), "artcache") koding.Delete_Folders(dest_folder) if dialog.yesno(addon_name, _("Clear Main Cache?")): res = koding.Get_All_From_Table("Table_names") for results in res: table_nm = results['name'] print table_nm koding.Remove_Table(table_nm) if dialog.yesno(addon_name, _("Clear Plugin Cache?")): res = koding.Get_All_From_Table("Plugin_table_names") for results in res: table_nm = results['name'] print table_nm koding.Remove_Table(table_nm) else: koding.Remove_Table("meta") koding.Remove_Table("episode_meta") dest_folder = os.path.join( xbmc.translatePath(xbmcaddon.Addon().getSetting("cache_folder")), "artcache") koding.Delete_Folders(dest_folder) res = koding.Get_All_From_Table("Table_names") for results in res: table_nm = results['name'] print table_nm koding.Remove_Table(table_nm) res = koding.Get_All_From_Table("Plugin_table_names") for results in res: table_nm = results['name'] print table_nm koding.Remove_Table(table_nm) db = sqlite3.connect('%s' % (database_loc)) cursor = db.cursor() db.execute("vacuum") db.commit() db.close() xbmc.log("running hook: clear cache", xbmc.LOGNOTICE) run_hook("clear_cache") xbmcgui.Dialog().notification('Clear Cache', 'Cache has been cleared', xbmcaddon.Addon().getAddonInfo("icon"), 4000)
def clear_cache(): import xbmcgui dialog = xbmcgui.Dialog() if dialog.yesno(addon_name, _("Clear Metadata?")): koding.Remove_Table("meta") koding.Remove_Table("episode_meta") if dialog.yesno(addon_name, _("Clear Scraper Cache?")): import nanscrapers nanscrapers.clear_cache() if dialog.yesno(addon_name, _("Clear GIF Cache?")): dest_folder = os.path.join( xbmc.translatePath(xbmcaddon.Addon().getSetting("cache_folder")), "artcache") koding.Delete_Folders(dest_folder) run_hook("clear_cache")
def clear_cache(): import xbmcgui dialog = xbmcgui.Dialog() if dialog.yesno(addon_name, _("Clear Metadata?")): koding.Remove_Table("meta") koding.Remove_Table("episode_meta") if dialog.yesno(addon_name, _("Clear Scraper Cache?")): import universalscrapers universalscrapers.clear_cache() if dialog.yesno(addon_name, _("Clear GIF Cache?")): dest_folder = os.path.join( xbmc.translatePath(xbmcaddon.Addon().getSetting("cache_folder")), "artcache") koding.Delete_Folders(dest_folder) xbmc.log("running hook: clear cache", xbmc.LOGNOTICE) run_hook("clear_cache")
def display_list(items, content_type): "display jen list in kodi" import xbmcplugin import sys hook_result = run_hook("display_list", items, content_type) if hook_result: return for item in items: context_items = [] if ADDON.getSetting("settings_context") == "true": context_items.append((_("Settings"), "RunPlugin({0})".format( get_addon_url("Settings")))) context_items.extend(item["context"]) koding.Add_Dir( name=item["label"], url=item["url"], mode=item["mode"], folder=item["folder"], icon=item["icon"], fanart=item["fanart"], context_items=context_items, content_type="video", info_labels=item["info"], set_property=item.get("properties", {}), set_art={"poster": item["icon"]}) # xbmcgui.Dialog().textviewer('info',str(item["info"])) xbmcplugin.setContent(int(sys.argv[1]), content_type)
def display_list(items, content_type): "display jen list in kodi" import xbmcplugin import sys hook_result = run_hook("display_list", items, content_type) if hook_result: return for item in items: context_items = [] if ADDON.getSetting("settings_context") == "true": context_items.append( (_("Settings"), "RunPlugin({0})".format(get_addon_url("Settings")))) context_items.extend(item["context"]) koding.Add_Dir(name=item["label"], url=item["url"], mode=item["mode"], folder=item["folder"], icon=item["icon"], fanart=item["fanart"], context_items=context_items, content_type="video", info_labels=item["info"], set_property=item.get("properties", {}), set_art={"poster": item["icon"]}) xbmcplugin.setContent(int(sys.argv[1]), content_type)
def clear_scraper_cache(): import xbmcgui dialog = xbmcgui.Dialog() try: import universalscrapers universalscrapers.clear_cache() except: pass db = sqlite3.connect('%s' % (database_loc)) cursor = db.cursor() db.execute("vacuum") db.commit() db.close() xbmc.log("running hook: clear cache", xbmc.LOGNOTICE) run_hook("clear_cache") xbmcgui.Dialog().notification('Clear Scraper Cache', 'Scraper Cache has been cleared', xbmcaddon.Addon().getAddonInfo("icon"), 4000)
def __init__(self, url, cached=True): if cached: xml = run_hook("get_xml", url) else: xml = run_hook("get_xml_uncached", url) if not xml: if url.endswith(".xml") or url.startswith("http"): try: xml = requests.get(url).content except Exception as e: xml = None koding.dolog("error: " + repr(e)) koding.dolog("url: " + repr(url)) koding.dolog("#####################") else: xml = url if xml: self.xml = xml self.content = "" self.list = JenList.list_pattern.findall(xml) info = JenItem(xml.split('<item>')[0].split('<dir>')[0]) intro = info.get("intro", "") if intro: import resources.lib.sources as sources sources.get_sources(intro) self.playlister = info.get('poster', '0') self.list_image = replace_url(info.get("animated_thumbnail", "")) if not self.list_image: self.list_image = replace_url( info.get('thumbnail', ADDON.getAddonInfo('icon'))) self.list_fanart = replace_url(info.get("animated_fanart", "")) if not self.list_fanart: self.list_fanart = replace_url(info.get('fanart', "0")) if self.list_fanart == "0": theme = xbmcaddon.Addon().getSetting('theme') if theme and theme != 'DEFAULT' and theme != 'none': self.list_fanart = self.set_theme(theme) else: self.list_fanart = xbmcaddon.Addon().getAddonInfo('fanart') self.metadata = {} else: self.list = []
def get_info(items, dialog=None): from resources.lib.util.xml import JenItem result = run_hook("get_info", items, dialog) if result: return result koding.reset_db() info = [] num_items = len(items) for index, item_xml in enumerate(items): if dialog: if dialog.iscanceled(): dialog.close() break percent = ((index + 1) * 100) / num_items dialog.update( percent, _("[COLORred]processing list, please be patient.....[/COLOR]"), "%s of %s" % (index + 1, num_items)) if type(item_xml) == dict: item = item_xml else: item = JenItem(item_xml) item_info = {} content = item.get("content", "") try: if content == "movie": item_info = get_movie_metadata(item["imdb"]) elif content in ["tvshow", "season"]: item_info = get_show_metadata(item["imdb"]) elif content == "episode": item_info = get_episode_metadata(item["imdb"], item["season"], item["episode"]) if type(item_info) == list: item_info = {} if not item_info.get("plotoutline", None): item_info["plotoutline"] = item_info.get("plot", "") except Exception as e: koding.dolog("info error: " + repr(e)) summary = item.get("summary", False) if summary: if not item_info or type(item_info) != dict: item_info = {} item_info["plot"] = summary item_info["manual"] = True info.append(item_info) if dialog: dialog.close() tvdb.clear_cache() return info
def display_list(items, content_type, pins): "display jen list in kodi" if ADDON.getSetting("enable_cache") == "true": Items = fetch_from_db(pins) if Items: import xbmcplugin import sys display_code(Items, content_type) elif not Items: import xbmcplugin import sys hook_result = run_hook("display_list", items, content_type, pins) if hook_result: return save_to_db(items, pins) display_code(items, content_type) else: import xbmcplugin import sys hook_result = run_hook("display_list", items, content_type, pins) if hook_result: return display_code(items, content_type)
def get_link_message(): """ helper function to get a random message when selecting links """ import random messages = run_hook("get_link_message") if not messages: messages = [{'HD': '', 'SD': ''}] if xbmcaddon.Addon().getSetting('disable_messages') == 'true': message = {'HD': '', 'SD': ''} else: message = random.choice(messages) return message
def replace_url(url, replace_gif=True): """ replace url with correct one replace url to point to correct jen server Keyword Arguments: url -- url to replace replace_gif -- whether to place gifs into cache to enable motion (default True) """ result = run_hook("replace_url", url) if result: url = result enable_gifs = xbmcaddon.Addon().getSetting('enable_gifs') == "true" if enable_gifs and replace_gif: return __replace_gif(url) return url
def get_info(items, dialog=None): from resources.lib.util.xml import JenItem result = run_hook("get_info", items, dialog) if result: return result koding.reset_db() info = [] num_items = len(items) for index, item_xml in enumerate(items): if dialog: if dialog.iscanceled(): dialog.close() break percent = ((index + 1) * 100) / num_items dialog.update(percent, _("processing metadata"), "%s of %s" % (index + 1, num_items)) if type(item_xml) == dict: item = item_xml else: item = JenItem(item_xml) item_info = {} content = item.get("content", "") try: if content == "movie": item_info = get_movie_metadata(item["imdb"]) elif content in ["tvshow", "season"]: item_info = get_show_metadata(item["imdb"]) elif content == "episode": item_info = get_episode_metadata(item["imdb"], item["season"], item["episode"]) if type(item_info) == list: item_info = {} if not item_info.get("plotoutline", None): item_info["plotoutline"] = item_info.get("plot", "") except Exception as e: koding.dolog("info error: " + repr(e)) summary = item.get("summary", False) if summary: if not item_info or type(item_info) != dict: item_info = {} item_info["plot"] = summary item_info["manual"] = True info.append(item_info) if dialog: dialog.close() tvdb.clear_cache() return info
def get_searching_message(preset): """ helper function to select a message for video items Args: preset: search quality preset ("HD", "SD" or None) Returns: random message for video items """ messages = run_hook("get_searching_message", preset) if not messages: if xbmcaddon.Addon().getSetting('disable_messages') == "true": return ' ' messages = [ '', ] return random.choice(messages)
def set_theme(theme): """set jen theme""" import random theme_list = run_hook("get_theme_list") if theme.lower() == "user": user_theme_folder = os.path.join( xbmc.translatePath( xbmcaddon.Addon().getSetting("cache_folder")), "theme") if os.path.isdir(user_theme_folder): user_files = [] for ufile in os.listdir(user_theme_folder): if os.path.isfile(os.path.join(user_theme_folder, ufile)): user_files.append( os.path.join(user_theme_folder, ufile)) theme_list["user"] = user_files else: koding.dolog("huh?: " + repr(theme)) return xbmcaddon.Addon().getAddonInfo('fanart') return replace_url(random.choice(theme_list[theme.lower()]))
def get_link_message(): """ helper function to get a random message when selecting links """ import random messages = run_hook("get_link_message") if not messages: messages = [ { 'HD': '', 'SD': '' } ] if xbmcaddon.Addon().getSetting('disable_messages') == 'true': message = { 'HD': '', 'SD': '' } else: message = random.choice(messages) return message
def do_search(term=None): import os import xbmc import xbmcgui import time import datetime import urllib2 import shutil search_term = term.lower() result = run_hook("do_search", search_term) if result: display_list(result, "videos") return jenlist = JenList("") jenlist.list_image = xbmcaddon.Addon().getAddonInfo('icon') theme = xbmcaddon.Addon().getSetting('theme') if theme and theme != 'DEFAULT' and theme != 'none': jenlist.list_fanart = jenlist.set_theme(theme) else: jenlist.list_fanart = xbmcaddon.Addon().getAddonInfo('fanart') result_list = [] exact_result_list = [] item_xml_result_list = [] exact_item_xml_result_list = [] dest_file = os.path.join( xbmc.translatePath(xbmcaddon.Addon().getSetting("cache_folder")), "search.db") url = __builtin__.search_db_location request = urllib2.Request(url) response = urllib2.urlopen(request) try: changed = response.headers["Last-Modified"] changed_struct = time.strptime(changed, "%a, %d %b %Y %H:%M:%S GMT") epoch_changed = int(time.mktime(changed_struct)) if not os.path.exists(dest_file) or \ int(os.path.getmtime(dest_file)) < epoch_changed: dp = xbmcgui.DialogProgress() dp.create(_('Loading database file'), _('Please Wait')) if response.getcode() == 200: with open(dest_file, 'wb') as out_file: shutil.copyfileobj(response, out_file) if os.path.getsize(dest_file) == 0: koding.dolog("0 size db: " + repr(dest_file)) os.remove(dest_file) dp.close() except: # server down if not os.path.exists(dest_file): import xbmcgui addon_name = xbmcaddon.Addon().getAddonInfo('name') xbmcgui.Dialog().ok( addon_name, _("no local file found, and server seems down")) dp.close() response.close() results = koding.DB_Query( dest_file, 'SELECT * from search where item like "%%%s%%"' % search_term) for result in results: item = jenlist.process_item(result["item"]) playlister = result["poster"] title = item["label"].lower() if search_term in title: item["info"] = {} try: item['label'] = '{0} - {1}'.format(playlister, item["label"]) except: import xbmc koding.dolog("playlister: " + repr(playlister)) koding.dolog("label:" + repr(item["lable"])) koding.dolog("item: " + repr(item)) raise Exception() if title.startswith(search_term + " "): exact_result_list.append(item) exact_item_xml_result_list.append(result["item"]) continue result_list.append(item) item_xml_result_list.append(result["item"]) meta = xbmcaddon.Addon().getSetting("metadata") == "true" if meta: # TODO find way to get it all in single cal info = get_info(exact_item_xml_result_list) if info: for index, item in enumerate(exact_result_list): item["info"].update(info[index]) info = get_info(item_xml_result_list) if info: for index, item in enumerate(result_list): item["info"].update(info[index]) exact_result_list = sorted(exact_result_list, key=lambda item: title) exact_result_list.extend(sorted(result_list, key=lambda item: title)) display_list(exact_result_list, "videos")
# -*- coding: utf-8 -*-
def get_context_items(item): """generate context menu for item Keyword Arguments: item -- JenItem to generate menu for """ context = [] content = item["content"] # cache if content == "": context.append((_("Try Uncached"), "Container.Update({0})".format( get_addon_url("get_list_uncached", item["link"])))) # information context.append((xbmcaddon.Addon().getLocalizedString(30708), "XBMC.Action(Info)")) # view modes if content == "movie": context.append((_("Set Movie View"), "RunPlugin({0})".format( get_addon_url("save_view_mode", "movies")))) elif content == "tvshow": context.append((_("Set TV Show View"), "RunPlugin({0})".format( get_addon_url("save_view_mode", "tvshows")))) elif content == "season": context.append((_("Set Season View"), "RunPlugin({0})".format( get_addon_url("save_view_mode", "seasons")))) elif content == "episode": context.append((_("Set Episode View"), "RunPlugin({0})".format( get_addon_url("save_view_mode", "episodes")))) else: context.append((_("Set View"), "RunPlugin({0})".format( get_addon_url("save_view_mode", "other")))) # extended info mod/qlickplay if xbmc.getCondVisibility("system.hasaddon(script.qlickplay)") or \ xbmc.getCondVisibility("system.hasaddon(script.extendedinfo)"): if content == "movie": context.append((_("Extended info"), "RunPlugin({0})".format( get_addon_url("movie_extended_info", item["imdb"])))) elif content == "tvshow": context.append((_("Extended info"), "RunPlugin({0})".format( get_addon_url("tvshow_extended_info", item["imdb"])))) elif content == "season": url = "{'imdb': '%s', 'season': %s}" %\ (item["imdb"], item["season"]) context.append((_("Extended info"), "RunPlugin({0})".format( get_addon_url("season_extended_info", url)))) elif content == "episode": url = "{'imdb': '%s', 'season': %s, 'episode': %s}" %\ (item["imdb"], item["season"], item["episode"]) context.append((_("Extended info"), "RunPlugin({0})".format( get_addon_url("episode_extended_info", url)))) # queue playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO) if playlist.size() > 0: context.append((_("Play Queue"), "RunPlugin({0})".format( get_addon_url("play_queue")))) context.append((_('Show Queue'), 'Action("Playlist")')) context.append((_("Clear Queue"), "RunPlugin({0})".format( get_addon_url("clear_queue")))) try: if content == "movie": context.append((_("Queue Movie"), "RunPlugin({0})".format( get_addon_url("queue", item.item_string)))) elif content == "tvshow": context.append((_("Queue TV Show"), "RunPlugin({0})".format( get_addon_url("queue", item.item_string)))) elif content == "season": context.append((_("Queue Season"), "RunPlugin({0})".format( get_addon_url("queue", item.item_string)))) elif content == "episode": context.append((_("Queue Episode"), "RunPlugin({0})".format( get_addon_url("queue", item.item_string)))) else: context.append((_("Queue Item"), "RunPlugin({0})".format( get_addon_url("queue", item.item_string)))) except: pass hook_result = run_hook("get_context_items", item, context) if hook_result: return hook_result return context
def get_sources(item): """ get video_link and try to play it Keyword Arguments: item -- JenItem to try playing """ result = run_hook("get_sources", item) if result: return if item.startswith("<plugin>"): # link to plugin link = JenItem(item)["link"] sublinks = JenItem(link).getAll("sublink") if sublinks: if len(sublinks) > 1: link = choose_quality(link) else: link = sublinks[0] link = link.replace("&", "&") xbmc.executebuiltin("Container.update(" + link + ")") return item = JenItem(item) link = item["link"] if not link or link.replace("\t", "") == "": return meta = JenItem(item["meta"]) title = meta["title"] year = meta.get("year", "").split("-")[0].strip() imdb = meta.get("imdb", "") tvdb = meta.get("tvdb", "") season = meta.get("season", "") episode = meta.get("episode", "") tvshowtitle = meta.get("tvshowtitle", None) premiered = meta.get("premiered", "") try: premiered = premiered.split("-")[0].strip() except: if len(premiered) == 4: pass elif not premiered: pass else: koding.dolog("wrong premiered format") busy_dialog = xbmcgui.DialogProgress() dialog = xbmcgui.Dialog() icon = ADDON.getAddonInfo("icon") jenplayer = JenPlayer(resume=False) try: spec = {"identifier": imdb, "season": season or "0", "episode": episode or "0"} match = koding.Get_From_Table("watched", spec) if match: match = match[0] if match["currentTime"] and not match["currentTime"] == "0": if dialog.yesno( ADDON.getAddonInfo("name"), _("Previous playback detected"), yeslabel=_("Resume"), nolabel=_("Restart"), ): jenplayer = JenPlayer(resume=True) except: pass jenplayer.setItem(item) busy_dialog.create(xbmcaddon.Addon().getAddonInfo("name"), _("Processing Link")) preset = choose_quality(link) message = get_searching_message(preset) played = False infolabels = {} if preset: preset = preset.replace("&", "&") busy_dialog.update(0, message) listitem = None fetch_meta = ADDON.getSetting("metadata") == "true" listitem = xbmcgui.ListItem( path=link, iconImage=item.get("thumbnail", icon), thumbnailImage=item.get("thumbnail", icon), ) infolabels = {} if fetch_meta and imdb != "0": # only try valid items with imdb try: info, created = get_info([item.item_string]) if info and type(info) == dict: infolabels = info except: pass else: infolabels["title"] = title infolabels["name"] = title if "plotoutline" not in infolabels: infolabels["plotoutline"] = infolabels.get("plot", "") if item.get("content", "") == "song": listitem.setInfo( type="Music", infoLabels={ "title": meta.get("title", ""), "artist": meta.get("artist", ""), }, ) else: listitem.setInfo(type="video", infoLabels=infolabels) listitem.setLabel(item.get("title", item.get("name", ""))) if "search" in preset: exclude_scrapers_content = item.get("exclude_scrapers", "") if exclude_scrapers_content: exclude_scrapers = exclude_scrapers_content.split(";") else: exclude_scrapers = None # nanscraper link if item.get("content", "") == "song": artist = item.get("artist", "") played = Sources.get_music_sources( title, artist, preset=preset, dialog=busy_dialog, exclude=exclude_scrapers, listitem=listitem, player=jenplayer, ) else: played = Sources.get_sources( title, year, imdb, tvdb, season, episode, tvshowtitle, premiered, preset=preset, dialog=busy_dialog, listitem=listitem, exclude=exclude_scrapers, player=jenplayer, ) elif preset.startswith("http") or preset.startswith("plugin") or preset.endswith('.torrent') or preset.startswith('magnet'): # direct link if "/playlist" in preset and "youtube" in preset: busy_dialog.close() xbmc.executebuiltin("Container.update(" + preset + ")") return elif "plugin://plugin.video.youtube/play/?video_id=" in preset: xbmc.executebuiltin("PlayMedia(%s)" % preset) played = True elif item["content"] == "image": busy_dialog.close() xbmc.executebuiltin("ShowPicture(%s)" % preset) played = True else: played = koding.Play_Video( preset, showbusy=False, ignore_dp=True, item=listitem, player=jenplayer, resolver=resolveurl, ) else: # who knows busy_dialog.close() koding.dolog("unknown link type: " + repr(preset)) raise Exception() busy_dialog.close() if played: jenplayer.keep_alive()
def process_item(self, item_xml): hook_result = run_hook("process_item", item_xml) if hook_result: if hook_result.get("content", ""): self.content = hook_result["content"] return hook_result try: is_widget = __builtin__.JEN_WIDGET except: is_widget = False item = JenItem(item_xml) enable_gifs = xbmcaddon.Addon().getSetting('enable_gifs') == "true" if item.item_string.startswith("<item>"): title = item["title"] if title == "": title = item["name"] koding.dolog("depricated: <name>") koding.dolog("name: " + repr(title)) koding.dolog("Use <title> instead of <name> in your xml") koding.dolog("#####################") try: title = xbmcaddon.Addon().getLocalizedString(int(title)) except ValueError: pass is_playable = True mode = "get_sources" link = item_xml elif item.item_string.startswith("<dir>"): title = item["name"] if title == "": title = item["title"] try: title = xbmcaddon.Addon().getLocalizedString(int(title)) except ValueError: pass if item["link"].startswith("message"): is_playable = True mode = "message" link = item["link"].replace("message(", "")[:-1] if link.startswith("http"): text = requests.request("GET", replace_url(link), verify=False).content link = text else: is_playable = False mode = "get_list" link = item["link"] elif item.item_string.startswith("<plugin>"): link = item["link"] title = item["name"] if title == "": title = item["title"] try: title = xbmcaddon.Addon().getLocalizedString(int(title)) except ValueError: pass if link.endswith("openSettings"): is_playable = True link = "" mode = "Settings" elif link.endswith("developer"): import os is_playable = False link = '{"file_name":"testings.xml"}' mode = "Testings" path = xbmcaddon.Addon().getAddonInfo('profile') profile_path = xbmc.translatePath(path).decode('utf-8') test_file = os.path.join(profile_path, "testings.xml") if not os.path.exists(test_file): return elif link.endswith("search"): is_playable = False link = "" mode = "Search" else: if "youtube" in link and ("user" in link or "playlist" in link): is_playable = True mode = 'get_sources' link = item_xml else: is_playable = True mode = 'get_sources' link = item_xml else: koding.dolog("other: " + repr(item), xbmc.LOGDEBUG) raise Exception() # filter out "unreleased" if title == "" or " /title" in title or "/ title" in title: return if is_widget: if mode == "message": return context = get_context_items(item) content = item["content"] if content == "boxset": content = "set" if content != '': self.content = content imdb = item["imdb"] season = item["season"] or '0' episode = item["episode"] or '0' year = item["year"] or '0' fanart = None if enable_gifs: fan_url = item.get("animated_fanart", "") if fan_url and fan_url != "0": fanart = replace_url(fan_url) if not fanart: fanart = replace_url( item.get("fanart", self.list_fanart), replace_gif=False) thumbnail = None if enable_gifs: thumb_url = item.get("animated_thumbnail", "") if thumb_url and thumb_url != "0": thumbnail = replace_url(thumb_url) if not thumbnail: thumbnail = replace_url( item.get("thumbnail", self.list_image), replace_gif=False) premiered = item.get("premiered", "") if premiered: try: today_tt = datetime.date.today().timetuple() premiered_tt = time.strptime(premiered, "%Y-%m-%d") if today_tt < premiered_tt: title = "[COLORyellow]" + title + "[/COLOR]" except: koding.dolog("wrong premiered format") pass result_item = { 'label': title, 'icon': thumbnail, 'fanart': fanart, 'mode': mode, 'url': link, 'folder': not is_playable, 'imdb': imdb, 'content': content, 'season': season, 'episode': episode, 'info': {}, 'year': year, 'context': context, 'plot': item.get("summary", None), "summary": item.get("summary", None) } if fanart: result_item["properties"] = {'fanart_image': fanart} result_item['fanart_small'] = fanart if content in ['movie', 'episode']: # only add watched data for applicable items result_item['info']['watched'] = 0 return result_item
def process_item(self, item_xml): hook_result = run_hook("process_item", item_xml) if hook_result: if hook_result.get("content", ""): self.content = hook_result["content"] return hook_result try: is_widget = __builtin__.JEN_WIDGET except: is_widget = False item = JenItem(item_xml) enable_gifs = xbmcaddon.Addon().getSetting('enable_gifs') == "true" if item.item_string.startswith("<item>"): title = item["title"] if title == "": title = item["name"] try: title = xbmcaddon.Addon().getLocalizedString(int(title)) except ValueError: pass is_playable = True mode = "get_sources" link = item_xml elif item.item_string.startswith("<dir>"): title = item["name"] if title == "": title = item["title"] try: title = xbmcaddon.Addon().getLocalizedString(int(title)) except ValueError: pass if item["link"].startswith("message"): is_playable = True mode = "message" link = item["link"].replace("message(", "")[:-1] if link.startswith("http"): text = requests.request("GET", replace_url(link), verify=False).content link = text else: is_playable = False mode = "get_list" link = item["link"] elif item.item_string.startswith("<plugin>"): link = item["link"] title = item["name"] if title == "": title = item["title"] try: title = xbmcaddon.Addon().getLocalizedString(int(title)) except ValueError: pass if link.endswith("openSettings"): is_playable = True link = "" mode = "Settings" elif link.endswith("developer"): import os is_playable = False link = '{"file_name":"testings.xml"}' mode = "Testings" path = xbmcaddon.Addon().getAddonInfo('profile') profile_path = xbmc.translatePath(path).decode('utf-8') test_file = os.path.join(profile_path, "testings.xml") if not os.path.exists(test_file): return elif link.endswith("search"): is_playable = False link = "" mode = "Search" else: if "youtube" in link and ("user" in link or "playlist" in link): is_playable = True mode = 'get_sources' link = item_xml else: is_playable = True mode = 'get_sources' link = item_xml else: koding.dolog("other: " + repr(item), xbmc.LOGDEBUG) raise Exception() # filter out "unreleased" if title == "" or " /title" in title or "/ title" in title: return if is_widget: if mode == "message": return context = get_context_items(item) content = item["content"] if content == "boxset": content = "set" if content != '': self.content = content imdb = item["imdb"] season = item["season"] or '0' episode = item["episode"] or '0' year = item["year"] or '0' fanart = None if enable_gifs: fan_url = item.get("animated_fanart", "") if fan_url and fan_url != "0": fanart = replace_url(fan_url) if not fanart: fanart = replace_url(item.get("fanart", self.list_fanart), replace_gif=False) thumbnail = None if enable_gifs: thumb_url = item.get("animated_thumbnail", "") if thumb_url and thumb_url != "0": thumbnail = replace_url(thumb_url) if not thumbnail: thumbnail = replace_url(item.get("thumbnail", self.list_image), replace_gif=False) premiered = item.get("premiered", "") if premiered: try: today_tt = datetime.date.today().timetuple() premiered_tt = time.strptime(premiered, "%Y-%m-%d") if today_tt < premiered_tt: title = "[COLORyellow]" + title + "[/COLOR]" except: koding.dolog("wrong premiered format") pass result_item = { 'label': title, 'icon': thumbnail, 'fanart': fanart, 'mode': mode, 'url': link, 'folder': not is_playable, 'imdb': imdb, 'content': content, 'season': season, 'episode': episode, 'info': {}, 'year': year, 'context': context, "summary": item.get("summary", None) } if fanart: result_item["properties"] = {'fanart_image': fanart} result_item['fanart_small'] = fanart if content in ['movie', 'episode']: # only add watched data for applicable items result_item['info']['watched'] = 0 return result_item
def first_run_wizard(): result = run_hook("first_run_wizard") if result: return
def get_sources(item): """ get video_link and try to play it Keyword Arguments: item -- JenItem to try playing """ result = run_hook("get_sources", item) if result: return if item.startswith("<plugin>"): # link to plugin link = JenItem(item)["link"] sublinks = JenItem(link).getAll("sublink") if sublinks: if len(sublinks) > 1: link = choose_quality(link) else: link = sublinks[0] link = link.replace("&", "&") xbmc.executebuiltin('Container.update(' + link + ')') return item = JenItem(item) link = item["link"] if not link or link.replace("\t", "") == "": return meta = JenItem(item["meta"]) title = meta["title"] year = meta.get("year", '').split("-")[0].strip() imdb = meta.get("imdb", "") tvdb = meta.get("tvdb", "") season = meta.get("season", "") episode = meta.get("episode", "") tvshowtitle = meta.get("tvshowtitle", None) premiered = meta.get("premiered", "") try: premiered = premiered.split("-")[0].strip() except: if len(premiered) == 4: pass elif not premiered: pass else: koding.dolog("wrong premiered format") busy_dialog = xbmcgui.DialogProgress() dialog = xbmcgui.Dialog() icon = ADDON.getAddonInfo('icon') jenplayer = JenPlayer(resume=False) try: spec = { "identifier": imdb, "season": season or "0", "episode": episode or "0" } match = koding.Get_From_Table("watched", spec) if match: match = match[0] if match["currentTime"] and not match["currentTime"] == "0": if dialog.yesno(ADDON.getAddonInfo("name"), _("Previous playback detected"), yeslabel=_("Resume"), nolabel=_("Restart")): jenplayer = JenPlayer(resume=True) except: pass jenplayer.setItem(item) busy_dialog.create(xbmcaddon.Addon().getAddonInfo('name'), _("Processing Link")) preset = choose_quality(link) message = get_searching_message(preset) played = False infolabels = {} if preset: preset = preset.replace("&", "&") busy_dialog.update(0, message) listitem = None fetch_meta = ADDON.getSetting("metadata") == "true" listitem = xbmcgui.ListItem( path=link, iconImage=item.get("thumbnail", icon), thumbnailImage=item.get("thumbnail", icon)) infolabels = {} if fetch_meta and imdb != "0": # only try valid items with imdb try: info, created = get_info([item.item_string]) if info and type(info) == dict: infolabels = info except: pass else: infolabels["title"] = title infolabels["name"] = title if "plotoutline" not in infolabels: infolabels["plotoutline"] = infolabels.get("plot", "") if item.get("content", "") == "song": listitem.setInfo(type='Music', infoLabels={'title': meta.get("title", ""), 'artist': meta.get("artist", "")}) else: listitem.setInfo(type="video", infoLabels=infolabels) listitem.setLabel(item.get("title", item.get("name", ""))) if "search" in preset: exclude_scrapers_content = item.get("exclude_scrapers", "") if exclude_scrapers_content: exclude_scrapers = exclude_scrapers_content.split(";") else: exclude_scrapers = None # nanscraper link if item.get("content", "") == "song": artist = item.get("artist", "") played = Sources.get_music_sources(title, artist, preset=preset, dialog=busy_dialog, exclude=exclude_scrapers, listitem=listitem, player=jenplayer) else: played = Sources.get_sources( title, year, imdb, tvdb, season, episode, tvshowtitle, premiered, preset=preset, dialog=busy_dialog, listitem=listitem, exclude=exclude_scrapers, player=jenplayer) elif preset.startswith("http") or preset.startswith("plugin"): # direct link if "/playlist" in preset and "youtube" in preset: busy_dialog.close() xbmc.executebuiltin('Container.update(' + preset + ')') return elif "plugin://plugin.video.youtube/play/?video_id=" in preset: xbmc.executebuiltin("PlayMedia(%s)" % preset) played = True elif item["content"] == "image": busy_dialog.close() xbmc.executebuiltin("ShowPicture(%s)" % preset) played = True else: played = koding.Play_Video( preset, showbusy=False, ignore_dp=True, item=listitem, player=jenplayer, resolver=resolveurl) else: # who knows busy_dialog.close() koding.dolog("unknown link type: " + repr(preset)) raise Exception() busy_dialog.close() if played: jenplayer.keep_alive()
def do_search(term=None): import os import xbmc import xbmcgui import time import datetime import urllib2 import shutil search_term = term.lower() result = run_hook("do_search", search_term) if result: display_list(result, "videos") return jenlist = JenList("") jenlist.list_image = xbmcaddon.Addon().getAddonInfo('icon') theme = xbmcaddon.Addon().getSetting('theme') if theme and theme != 'DEFAULT' and theme != 'none': jenlist.list_fanart = jenlist.set_theme(theme) else: jenlist.list_fanart = xbmcaddon.Addon().getAddonInfo('fanart') result_list = [] exact_result_list = [] item_xml_result_list = [] exact_item_xml_result_list = [] dest_file = os.path.join(xbmc.translatePath( xbmcaddon.Addon().getSetting("cache_folder")), "search.db") url = __builtin__.search_db_location request = urllib2.Request(url) response = urllib2.urlopen(request) try: changed = response.headers["Last-Modified"] changed_struct = time.strptime(changed, "%a, %d %b %Y %H:%M:%S GMT") epoch_changed = int(time.mktime(changed_struct)) if not os.path.exists(dest_file) or \ int(os.path.getmtime(dest_file)) < epoch_changed: dp = xbmcgui.DialogProgress() dp.create(_('Loading database file'), _('Please Wait')) if response.getcode() == 200: with open(dest_file, 'wb') as out_file: shutil.copyfileobj(response, out_file) if os.path.getsize(dest_file) == 0: koding.dolog("0 size db: " + repr(dest_file)) os.remove(dest_file) dp.close() except: # server down if not os.path.exists(dest_file): import xbmcgui addon_name = xbmcaddon.Addon().getAddonInfo('name') xbmcgui.Dialog().ok(addon_name, _("no local file found, and server seems down")) dp.close() response.close() results = koding.DB_Query(dest_file, 'SELECT * from search where item like "%%%s%%"' % search_term) for result in results: item = jenlist.process_item(result["item"]) playlister = result["poster"] title = item["label"].lower() if search_term in title: item["info"] = {} try: item['label'] = '{0} - {1}'.format(playlister, item["label"]) except: import xbmc koding.dolog("playlister: " + repr(playlister)) koding.dolog("label:" + repr(item["lable"])) koding.dolog("item: " + repr(item)) raise Exception() if title.startswith(search_term + " "): exact_result_list.append(item) exact_item_xml_result_list.append(result["item"]) continue result_list.append(item) item_xml_result_list.append(result["item"]) meta = xbmcaddon.Addon().getSetting("metadata") == "true" if meta: # TODO find way to get it all in single cal info = get_info(exact_item_xml_result_list) if info: for index, item in enumerate(exact_result_list): item["info"].update(info[index]) info = get_info(item_xml_result_list) if info: for index, item in enumerate(result_list): item["info"].update(info[index]) exact_result_list = sorted(exact_result_list, key=lambda item: title) exact_result_list.extend(sorted(result_list, key=lambda item: title)) display_list(exact_result_list, "videos")
def get_context_items(item): """generate context menu for item Keyword Arguments: item -- JenItem to generate menu for """ context = [] content = item["content"] # cache if content == "": context.append((_("Try Uncached"), "Container.Update({0})".format( get_addon_url("get_list_uncached", item["link"])))) # information context.append( (xbmcaddon.Addon().getLocalizedString(30708), "XBMC.Action(Info)")) # view modes if content == "movie": context.append( (_("Set Movie View"), "RunPlugin({0})".format(get_addon_url("save_view_mode", "movies")))) elif content == "tvshow": context.append( (_("Set TV Show View"), "RunPlugin({0})".format(get_addon_url("save_view_mode", "tvshows")))) elif content == "season": context.append( (_("Set Season View"), "RunPlugin({0})".format(get_addon_url("save_view_mode", "seasons")))) elif content == "episode": context.append((_("Set Episode View"), "RunPlugin({0})".format( get_addon_url("save_view_mode", "episodes")))) else: context.append( (_("Set View"), "RunPlugin({0})".format(get_addon_url("save_view_mode", "other")))) # extended info mod/qlickplay if xbmc.getCondVisibility("system.hasaddon(script.qlickplay)") or \ xbmc.getCondVisibility("system.hasaddon(script.extendedinfo)"): if content == "movie": context.append((_("Extended info"), "RunPlugin({0})".format( get_addon_url("movie_extended_info", item["imdb"])))) elif content == "tvshow": context.append((_("Extended info"), "RunPlugin({0})".format( get_addon_url("tvshow_extended_info", item["imdb"])))) elif content == "season": url = "{'imdb': '%s', 'season': %s}" %\ (item["imdb"], item["season"]) context.append((_("Extended info"), "RunPlugin({0})".format( get_addon_url("season_extended_info", url)))) elif content == "episode": url = "{'imdb': '%s', 'season': %s, 'episode': %s}" %\ (item["imdb"], item["season"], item["episode"]) context.append((_("Extended info"), "RunPlugin({0})".format( get_addon_url("episode_extended_info", url)))) # queue playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO) if playlist.size() > 0: context.append((_("Play Queue"), "RunPlugin({0})".format(get_addon_url("play_queue")))) context.append((_('Show Queue'), 'Action("Playlist")')) context.append((_("Clear Queue"), "RunPlugin({0})".format(get_addon_url("clear_queue")))) try: if content == "movie": context.append((_("Queue Movie"), "RunPlugin({0})".format( get_addon_url("queue", item.item_string)))) elif content == "tvshow": context.append((_("Queue TV Show"), "RunPlugin({0})".format( get_addon_url("queue", item.item_string)))) elif content == "season": context.append((_("Queue Season"), "RunPlugin({0})".format( get_addon_url("queue", item.item_string)))) elif content == "episode": context.append((_("Queue Episode"), "RunPlugin({0})".format( get_addon_url("queue", item.item_string)))) else: context.append((_("Queue Item"), "RunPlugin({0})".format( get_addon_url("queue", item.item_string)))) except: pass hook_result = run_hook("get_context_items", item, context) if hook_result: return hook_result return context