def SkipRecentlyAddedMissing(randomize=None): task = scheduler.task("SearchAllRecentlyAddedMissing") task.last_run = datetime.datetime.now() return AdvancedMenu(randomize=timestamp(), header=_("Success"), message=_("SearchAllRecentlyAddedMissing skipped"))
def ManageBlacklistMenu(**kwargs): oc = SubFolderObjectContainer(title2=unicode(kwargs["title"]), replace_parent=True) rating_key = kwargs["rating_key"] part_id = kwargs["part_id"] language = kwargs["language"] remove_sub_key = kwargs.pop("remove_sub_key", None) current_data = unicode(kwargs["current_data"]) current_sub, stored_subs, storage = get_current_sub( rating_key, part_id, language) current_bl, subs = stored_subs.get_blacklist(part_id, language) if remove_sub_key: remove_sub_key = tuple(remove_sub_key.split("__")) stored_subs.blacklist(part_id, language, remove_sub_key, add=False) storage.save(stored_subs) Log.Info("Removed %s from blacklist", remove_sub_key) kwargs.pop("randomize") oc.add( DirectoryObject(key=Callback(ItemDetailsMenu, rating_key=kwargs["rating_key"], item_title=kwargs["item_title"], title=kwargs["title"], randomize=timestamp()), title=_(u"< Back to %s", kwargs["title"]), summary=current_data, thumb=default_thumb)) def sorter(pair): # thanks RestrictedModule parser for messing with lambda (x, y) return pair[1]["date_added"] for sub_key, data in sorted(current_bl.iteritems(), key=sorter, reverse=True): provider_name, subtitle_id = sub_key title = _( u"%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, " u"Score: %(score)i, Storage: %(storage_type)s", provider_name=provider_name, subtitle_id=subtitle_id, date_added=df(data["date_added"]), mode=current_sub.get_mode_verbose(data["mode"]), language=display_language(Language.fromietf(language)), score=data["score"], storage_type=data["storage_type"]) oc.add( DirectoryObject(key=Callback(ManageBlacklistMenu, remove_sub_key="__".join(sub_key), randomize=timestamp(), **kwargs), title=title, summary=_(u"Remove subtitle from blacklist"))) storage.destroy() return oc
def SelectStoredSubForItemMenu(**kwargs): rating_key = kwargs["rating_key"] part_id = kwargs["part_id"] language = Language.fromietf(kwargs["language"]) item_type = kwargs["item_type"] sub_key = tuple(kwargs.pop("sub_key").split("__")) plex_item = get_item(rating_key) storage = get_subtitle_storage() stored_subs = storage.load(plex_item.rating_key) subtitles = stored_subs.get_all(part_id, language) subtitle = subtitles[sub_key] subtitles["current"] = sub_key save_stored_sub(subtitle, rating_key, part_id, language, item_type, plex_item=plex_item, storage=storage, stored_subs=stored_subs) storage.destroy() kwargs.pop("randomize") kwargs["header"] = _("Success") kwargs["message"] = _("Subtitle saved to disk") return SubtitleOptionsMenu(randomize=timestamp(), **kwargs)
def PinMenu(pin="", randomize=None, success_go_to="channel"): oc = ObjectContainer(title2=_("Enter PIN number ") + str(len(pin) + 1), no_cache=True, no_history=True, skip_pin_lock=True) if pin == config.pin: Dict["pin_correct_time"] = datetime.datetime.now() config.locked = False if success_go_to == "channel": return fatality(force_title=_("PIN correct"), header=_("PIN correct"), no_history=True) elif success_go_to == "advanced": return AdvancedMenu(randomize=timestamp()) for i in range(10): oc.add( DirectoryObject( key=Callback(PinMenu, randomize=timestamp(), pin=pin + str(i), success_go_to=success_go_to), title=pad_title(str(i)), )) oc.add( DirectoryObject( key=Callback(PinMenu, randomize=timestamp(), success_go_to=success_go_to), title=pad_title(_("Reset")), )) return oc
def HistoryMenu(): from support.history import get_history history = get_history() oc = SubFolderObjectContainer(title2=_("History"), replace_parent=True) for item in history.items[:100]: possible_language = item.language language_display = item.lang_name if not possible_language else display_language( possible_language) oc.add( DirectoryObject(key=Callback(ItemDetailsMenu, title=item.title, item_title=item.item_title, rating_key=item.rating_key), title=u"%s (%s)" % (item.item_title, _(item.mode_verbose)), summary=_(u"%s in %s (%s, score: %s), %s", language_display, item.section_title, _(item.provider_name), item.score, df(item.time)), thumb=item.thumb or default_thumb)) history.destroy() return oc
def ResetStorage(key, randomize=None, sure=False): if not sure: oc = SubFolderObjectContainer( no_history=True, title1=_("Reset subtitle storage"), title2=_("Are you sure?")) oc.add(DirectoryObject( key=Callback( ResetStorage, key=key, sure=True, randomize=timestamp()), title=pad_title(_("Are you really sure?")), )) return oc reset_storage(key) if key == "tasks": # reinitialize the scheduler scheduler.init_storage() scheduler.setup_tasks() return AdvancedMenu( randomize=timestamp(), header=_("Success"), message=_("Information Storage (%s) reset", key) )
def TriggerCacheMaintenance(randomize=None): scheduler.dispatch_task("CacheMaintenance") return AdvancedMenu( randomize=timestamp(), header=_("Success"), message=_("TriggerCacheMaintenance triggered") )
def ReApplyMods(randomize=None): Thread.CreateTimer(1.0, apply_default_mods, reapply_current=True) return AdvancedMenu( randomize=timestamp(), header=_("Success"), message=_("This may take some time ...") )
def TriggerBetterSubtitles(randomize=None): scheduler.dispatch_task("FindBetterSubtitles") return AdvancedMenu( randomize=timestamp(), header=_("Success"), message=_("FindBetterSubtitles triggered") )
def TriggerStorageMigration(randomize=None): scheduler.dispatch_task("MigrateSubtitleStorage") return AdvancedMenu( randomize=timestamp(), header=_("Success"), message=_("MigrateSubtitleStorage triggered") )
def OnDeckMenu(message=None): """ displays the items on deck :param message: :return: """ return mergedItemsMenu(title=_("Items On Deck"), base_title=_("Items On Deck"), itemGetter=get_on_deck_items)
def LogStorage(key, randomize=None): log_storage(key) return AdvancedMenu( randomize=timestamp(), header=_("Success"), message=_("Information Storage (%s) logged", key) )
def PinMenu(pin="", randomize=None, success_go_to="channel"): oc = ObjectContainer( title2=_("Enter PIN number ") + str(len(pin) + 1), no_cache=True, no_history=True, skip_pin_lock=True) if pin == config.pin: Dict["pin_correct_time"] = datetime.datetime.now() config.locked = False if success_go_to == "channel": return fatality( force_title=_("PIN correct"), header=_("PIN correct"), no_history=True) elif success_go_to == "advanced": return AdvancedMenu(randomize=timestamp()) for i in range(10): oc.add(DirectoryObject( key=Callback( PinMenu, randomize=timestamp(), pin=pin + str(i), success_go_to=success_go_to), title=pad_title(str(i)), )) oc.add(DirectoryObject( key=Callback( PinMenu, randomize=timestamp(), success_go_to=success_go_to), title=pad_title(_("Reset")), )) return oc
def SelectStoredSubForItemMenu(**kwargs): rating_key = kwargs["rating_key"] part_id = kwargs["part_id"] language = Language.fromietf(kwargs["language"]) item_type = kwargs["item_type"] sub_key = tuple(kwargs.pop("sub_key").split("__")) plex_item = get_item(rating_key) storage = get_subtitle_storage() stored_subs = storage.load(plex_item.rating_key) subtitles = stored_subs.get_all(part_id, language) subtitle = subtitles[sub_key] save_stored_sub(subtitle, rating_key, part_id, language, item_type, plex_item=plex_item, storage=storage, stored_subs=stored_subs) stored_subs.set_current(part_id, language, sub_key) storage.save(stored_subs) storage.destroy() kwa = { "header": _("Success"), "message": _("Subtitle saved to disk"), "title": kwargs["title"], "item_title": kwargs["item_title"], "base_title": kwargs.get("base_title") } # fixme: return to SubtitleOptionsMenu properly? (needs recomputation of current_data return ItemDetailsMenu(rating_key, randomize=timestamp(), **kwa)
def SkipFindBetterSubtitles(randomize=None): task = scheduler.task("FindBetterSubtitles") task.last_run = datetime.datetime.now() return AdvancedMenu(randomize=timestamp(), header=_("Success"), message=_("FindBetterSubtitles skipped"))
def ResetStorage(key, randomize=None, sure=False): if not sure: oc = SubFolderObjectContainer(no_history=True, title1=_("Reset subtitle storage"), title2=_("Are you sure?")) oc.add( DirectoryObject( key=Callback(ResetStorage, key=key, sure=True, randomize=timestamp()), title=pad_title(_("Are you really sure?")), )) return oc reset_storage(key) if key == "tasks": # reinitialize the scheduler scheduler.init_storage() scheduler.setup_tasks() return AdvancedMenu(randomize=timestamp(), header=_("Success"), message=_("Information Storage (%s) reset", key))
def ResetProviderThrottle(randomize=None): Dict["provider_throttle"] = {} Dict.Save() return AdvancedMenu( randomize=timestamp(), header=_("Success"), message=_("Provider throttles reset") )
def SkipRecentlyAddedMissing(randomize=None): task = scheduler.task("SearchAllRecentlyAddedMissing") task.last_run = datetime.datetime.now() return AdvancedMenu( randomize=timestamp(), header=_("Success"), message=_("SearchAllRecentlyAddedMissing skipped") )
def SkipFindBetterSubtitles(randomize=None): task = scheduler.task("FindBetterSubtitles") task.last_run = datetime.datetime.now() return AdvancedMenu( randomize=timestamp(), header=_("Success"), message=_("FindBetterSubtitles skipped") )
def InvalidateCache(randomize=None): from subliminal.cache import region if config.new_style_cache: region.backend.clear() else: region.invalidate() return AdvancedMenu(randomize=timestamp(), header=_("Success"), message=_("Cache invalidated"))
def TriggerRestart(randomize=None): set_refresh_menu_state(_("Restarting the plugin")) DispatchRestart() return fatality(header=_("Restart triggered, please wait about 5 seconds"), force_title=" ", only_refresh=True, replace_parent=True, no_history=True, randomize=timestamp())
def OnDeckMenu(message=None): """ displays the items on deck :param message: :return: """ return mergedItemsMenu(title=_("Items On Deck"), base_title=_("Items On Deck"), itemGetter=get_on_deck_items)
def TriggerRestart(randomize=None): set_refresh_menu_state(_("Restarting the plugin")) DispatchRestart() return fatality( header=_("Restart triggered, please wait about 5 seconds"), force_title=" ", only_refresh=True, replace_parent=True, no_history=True, randomize=timestamp())
def InvalidateCache(randomize=None): from subliminal.cache import region if config.new_style_cache: region.backend.clear() else: region.invalidate() return AdvancedMenu( randomize=timestamp(), header=_("Success"), message=_("Cache invalidated") )
def SectionsMenu(base_title=_("Sections"), section_items_key="all", ignore_options=True): """ displays the menu for all sections :return: """ items = get_all_items("sections") return dig_tree(SubFolderObjectContainer(title2=_("Sections"), no_cache=True, no_history=True), items, None, menu_determination_callback=determine_section_display, pass_kwargs={"base_title": base_title, "section_items_key": section_items_key, "ignore_options": ignore_options}, fill_args={"title": "section_title"})
def __init__(self, *args, **kwargs): super(SubFolderObjectContainer, self).__init__(*args, **kwargs) from interface.menu import fatality from support.helpers import pad_title, timestamp self.add(DirectoryObject( key=Callback(fatality, force_title=" ", randomize=timestamp()), title=pad_title(_("<< Back to home")), summary=_("Current state: %s; Last state: %s", (Dict["current_refresh_state"] or _("Idle")) if "current_refresh_state" in Dict else _("Idle"), (Dict["last_refresh_state"] or _("None")) if "last_refresh_state" in Dict else _("None") ) ))
def __init__(self, *args, **kwargs): super(SubFolderObjectContainer, self).__init__(*args, **kwargs) from interface.menu import fatality from support.helpers import pad_title, timestamp self.add(DirectoryObject( key=Callback(fatality, force_title=" ", randomize=timestamp()), title=pad_title(_("<< Back to home")), summary=_("Current state: %s; Last state: %s", (Dict["current_refresh_state"] or _("Idle")) if "current_refresh_state" in Dict else _("Idle"), (Dict["last_refresh_state"] or _("None")) if "last_refresh_state" in Dict else _("None") ) ))
def SubtitleOptionsMenu(**kwargs): oc = SubFolderObjectContainer(title2=unicode(kwargs["title"]), replace_parent=True, header=kwargs.get("header"), message=kwargs.get("message")) rating_key = kwargs["rating_key"] part_id = kwargs["part_id"] language = kwargs["language"] current_data = unicode(kwargs["current_data"]) current_sub, stored_subs, storage = get_current_sub(rating_key, part_id, language) subs_count = stored_subs.count(part_id, language) kwargs.pop("randomize") oc.add(DirectoryObject( key=Callback(ItemDetailsMenu, rating_key=kwargs["rating_key"], item_title=kwargs["item_title"], title=kwargs["title"], randomize=timestamp()), title=_(u"< Back to %s", kwargs["title"]), summary=current_data, thumb=default_thumb )) if subs_count: oc.add(DirectoryObject( key=Callback(ListStoredSubsForItemMenu, randomize=timestamp(), **kwargs), title=_(u"Select active %(language)s subtitle", language=kwargs["language_name"]), summary=_(u"%(count)d subtitles in storage", count=subs_count) )) oc.add(DirectoryObject( key=Callback(ListAvailableSubsForItemMenu, randomize=timestamp(), **kwargs), title=_(u"List available %(language)s subtitles", language=kwargs["language_name"]), summary=current_data )) if current_sub: oc.add(DirectoryObject( key=Callback(SubtitleModificationsMenu, randomize=timestamp(), **kwargs), title=_(u"Modify current %(language)s subtitle", language=kwargs["language_name"]), summary=_(u"Currently applied mods: %(mod_list)s", mod_list=(", ".join(current_sub.mods) if current_sub.mods else "none")) )) if current_sub.provider_name != "embedded": oc.add(DirectoryObject( key=Callback(BlacklistSubtitleMenu, randomize=timestamp(), **kwargs), title=_(u"Blacklist current %(language)s subtitle and search for a new one", language=kwargs["language_name"]), summary=current_data )) current_bl, subs = stored_subs.get_blacklist(part_id, language) if current_bl: oc.add(DirectoryObject( key=Callback(ManageBlacklistMenu, randomize=timestamp(), **kwargs), title=_(u"Manage blacklist (%(amount)s contained)", amount=len(current_bl)), summary=_(u"Inspect currently blacklisted subtitles") )) storage.destroy() return oc
def ManageBlacklistMenu(**kwargs): oc = SubFolderObjectContainer(title2=unicode(kwargs["title"]), replace_parent=True) rating_key = kwargs["rating_key"] part_id = kwargs["part_id"] language = kwargs["language"] remove_sub_key = kwargs.pop("remove_sub_key", None) current_data = unicode(kwargs["current_data"]) current_sub, stored_subs, storage = get_current_sub(rating_key, part_id, language) current_bl, subs = stored_subs.get_blacklist(part_id, language) if remove_sub_key: remove_sub_key = tuple(remove_sub_key.split("__")) stored_subs.blacklist(part_id, language, remove_sub_key, add=False) storage.save(stored_subs) Log.Info("Removed %s from blacklist", remove_sub_key) kwargs.pop("randomize") oc.add(DirectoryObject( key=Callback(ItemDetailsMenu, rating_key=kwargs["rating_key"], item_title=kwargs["item_title"], title=kwargs["title"], randomize=timestamp()), title=_(u"< Back to %s", kwargs["title"]), summary=current_data, thumb=default_thumb )) def sorter(pair): # thanks RestrictedModule parser for messing with lambda (x, y) return pair[1]["date_added"] for sub_key, data in sorted(current_bl.iteritems(), key=sorter, reverse=True): provider_name, subtitle_id = sub_key title = _(u"%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, " u"Score: %(score)i, Storage: %(storage_type)s", provider_name=_(provider_name), subtitle_id=subtitle_id, date_added=df(data["date_added"]), mode=_(current_sub.get_mode_verbose(data["mode"])), language=display_language(Language.fromietf(language)), score=data["score"], storage_type=data["storage_type"]) oc.add(DirectoryObject( key=Callback(ManageBlacklistMenu, remove_sub_key="__".join(sub_key), randomize=timestamp(), **kwargs), title=title, summary=_(u"Remove subtitle from blacklist") )) storage.destroy() return oc
def SeasonExtractEmbedded(**kwargs): rating_key = kwargs.get("rating_key") requested_language = kwargs.pop("language") with_mods = kwargs.pop("with_mods") item_title = kwargs.pop("item_title") title = kwargs.pop("title") force = kwargs.pop("force", False) Thread.Create(season_extract_embedded, **{"rating_key": rating_key, "requested_language": requested_language, "with_mods": with_mods, "force": force}) kwargs["header"] = _("Success") kwargs["message"] = _(u"Extracting of embedded subtitles for %s triggered", title) kwargs.pop("randomize") return MetadataMenu(randomize=timestamp(), title=item_title, **kwargs)
def SubtitleShiftModMenu(unit=None, **kwargs): if unit not in POSSIBLE_UNITS_D: raise NotImplementedError kwargs.pop("randomize") oc = SubFolderObjectContainer(title2=kwargs["title"], replace_parent=True) oc.add(DirectoryObject( key=Callback(SubtitleShiftModUnitMenu, randomize=timestamp(), **kwargs), title=_("< Back to unit selection") )) rng = [] if unit == "h": rng = list(reversed(range(-10, 0))) + list(reversed(range(1, 11))) elif unit in ("m", "s"): rng = list(reversed(range(-15, 0))) + list(reversed(range(1, 16))) elif unit == "ms": rng = list(reversed(range(-900, 0, 100))) + list(reversed(range(100, 1000, 100))) for i in rng: if i == 0: continue mod_ident = SubtitleModifications.get_mod_signature("shift_offset", **{unit: i}) oc.add(DirectoryObject( key=Callback(SubtitleSetMods, mods=mod_ident, mode="add", randomize=timestamp(), **kwargs), title="%s %s" % (("%s" if i < 0 else "+%s") % i, unit) )) return oc
def add_ignore_options(oc, kind, callback_menu=None, title=None, rating_key=None, add_kind=True): """ :param oc: oc to add our options to :param kind: movie, show, episode ... - gets translated to the ignore key (sections, series, items) :param callback_menu: menu to inject :param title: :param rating_key: :return: """ # try to translate kind to the ignore key use_kind = kind if kind not in ignore_list: use_kind = ignore_list.translate_key(kind) if not use_kind or use_kind not in ignore_list: return in_list = rating_key in ignore_list[use_kind] t = u"Ignore %(kind)s \"%(title)s\"" if in_list: t = u"Un-ignore %(kind)s \"%(title)s\"" oc.add(DirectoryObject( key=Callback(callback_menu, kind=use_kind, sure=False, todo="not_set", rating_key=rating_key, title=title), title=_(t, kind=ignore_list.verbose(kind) if add_kind else "", title=unicode(title)) ) )
def SectionFirstLetterMenu(rating_key, title=None, base_title=None, section_title=None, ignore_options=True, section_items_key="all"): """ displays the contents of a section indexed by its first char (A-Z, 0-9...) :param ignore_options: ignored :param section_items_key: ignored :param rating_key: :param title: :param base_title: :param section_title: :return: """ from menu import FirstLetterMetadataMenu items = get_all_items(key="first_character", value=rating_key, base="library/sections") kind, deeper = get_items_info(items) title = unicode(title) oc = SubFolderObjectContainer(title2=section_title, no_cache=True, no_history=True) title = base_title + " > " + title add_incl_excl_options(oc, "sections", title=section_title, rating_key=rating_key, callback_menu=InclExclMenu) oc.add(DirectoryObject( key=Callback(SectionMenu, title=_("All"), base_title=title, rating_key=rating_key, ignore_options=False), title="All" ) ) return dig_tree(oc, items, FirstLetterMetadataMenu, force_rating_key=rating_key, fill_args={"key": "key"}, pass_kwargs={"base_title": title, "display_items": deeper, "previous_rating_key": rating_key})
def TriggerDownloadSubtitle(rating_key=None, subtitle_id=None, item_title=None, language=None, randomize=None): from interface.main import fatality set_refresh_menu_state( _("Downloading subtitle for %(title_or_id)s", title_or_id=item_title or rating_key)) search_results = get_item_task_data("AvailableSubsForItem", rating_key, language) download_subtitle = None for subtitle in search_results: if str(subtitle.id) == subtitle_id: download_subtitle = subtitle break if not download_subtitle: Log.Error(u"Something went horribly wrong") else: scheduler.dispatch_task("DownloadSubtitleForItem", rating_key=rating_key, subtitle=download_subtitle) scheduler.clear_task_data("AvailableSubsForItem") return fatality(randomize=timestamp(), header=" ", replace_parent=True)
def SeasonExtractEmbedded(**kwargs): rating_key = kwargs.get("rating_key") requested_language = kwargs.pop("language") with_mods = kwargs.pop("with_mods") item_title = kwargs.pop("item_title") title = kwargs.pop("title") force = kwargs.pop("force", False) Thread.Create(season_extract_embedded, **{"rating_key": rating_key, "requested_language": requested_language, "with_mods": with_mods, "force": force}) kwargs["header"] = _("Success") kwargs["message"] = _(u"Extracting of embedded subtitles for %s triggered", title) kwargs.pop("randomize") return MetadataMenu(randomize=timestamp(), title=item_title, **kwargs)
def RecentlyPlayedMenu(): base_title = _("Recently Played") oc = SubFolderObjectContainer(title2=base_title, replace_parent=True) for item in [ get_item(rating_key) for rating_key in Dict["last_played_items"] ]: if not item: continue if getattr(getattr(item, "__class__"), "__name__") not in ("Episode", "Movie"): continue item_title = get_item_title(item) oc.add( DirectoryObject(thumb=get_item_thumb(item) or default_thumb, title=item_title, key=Callback(ItemDetailsMenu, title=base_title + " > " + item.title, item_title=item.title, rating_key=item.rating_key))) return oc
def RecentlyAddedMenu(message=None): """ displays the items recently added per section :param message: :return: """ return SectionsMenu(base_title=_("Recently added"), section_items_key="recently_added", ignore_options=False)
def SubtitleShiftModUnitMenu(**kwargs): oc = SubFolderObjectContainer(title2=kwargs["title"], replace_parent=True) kwargs.pop("randomize") oc.add(DirectoryObject( key=Callback(SubtitleModificationsMenu, randomize=timestamp(), **kwargs), title=_("< Back to subtitle modifications") )) for unit, title in POSSIBLE_UNITS: oc.add(DirectoryObject( key=Callback(SubtitleShiftModMenu, unit=unit, randomize=timestamp(), **kwargs), title=_("Adjust by %(time_and_unit)s", time_and_unit=title) )) return oc
def ListStoredSubsForItemMenu(**kwargs): oc = SubFolderObjectContainer(title2=unicode(kwargs["title"]), replace_parent=True) rating_key = kwargs["rating_key"] part_id = kwargs["part_id"] language = Language.fromietf(kwargs["language"]) current_sub, stored_subs, storage = get_current_sub( rating_key, part_id, language) all_subs = stored_subs.get_all(part_id, language) kwargs.pop("randomize") for key, subtitle in sorted(filter( lambda x: x[0] not in ("current", "blacklist"), all_subs.items()), key=lambda x: x[1].date_added, reverse=True): is_current = key == all_subs["current"] summary = _( u"added: %(date_added)s, %(mode)s, Language: %(language)s, Score: %(score)i, Storage: " u"%(storage_type)s", date_added=df(subtitle.date_added), mode=subtitle.mode_verbose, language=display_language(language), score=subtitle.score, storage_type=subtitle.storage_type) sub_name = subtitle.provider_name if sub_name == "embedded": sub_name += " (%s)" % subtitle.id oc.add( DirectoryObject( key=Callback(SelectStoredSubForItemMenu, randomize=timestamp(), sub_key="__".join(key), **kwargs), title=_( u"%(current_state)s%(subtitle_name)s, Score: %(score)s", current_state=_("Current: ") if is_current else _("Stored: "), subtitle_name=sub_name, score=subtitle.score), summary=summary)) return oc
def set_refresh_menu_state(state_or_media, media_type="movies"): """ :param state_or_media: string, None, or Media argument from Agent.update() :param media_type: movies or series :return: """ if not state_or_media: # store it in last state and remove the current Dict["last_refresh_state"] = Dict["current_refresh_state"] Dict["current_refresh_state"] = None Dict.Save() return if isinstance(state_or_media, types.StringTypes) or is_localized_string(state_or_media): Dict["current_refresh_state"] = unicode(state_or_media) Dict.Save() return media = state_or_media media_id = media.id title = None if media_type == "series": for season in media.seasons: for episode in media.seasons[season].episodes: ep = media.seasons[season].episodes[episode] media_id = ep.id title = get_video_display_title(_("show"), ep.title, parent_title=media.title, season=int(season), episode=int(episode)) else: title = get_video_display_title(_("movie"), media.title) intent = get_intent() force_refresh = intent.get("force", media_id) t = u"Refreshing %(title)s" if force_refresh: t = u"Force-refreshing %(title)s" Dict["current_refresh_state"] = unicode(_(t, title=unicode(title))) Dict.Save()
def RecentlyAddedMenu(message=None): """ displays the items recently added per section :param message: :return: """ return SectionsMenu(base_title=_("Recently added"), section_items_key="recently_added", ignore_options=False)
def RecentMissingSubtitlesMenu(force=False, randomize=None): title = _("Items with missing subtitles") oc = SubFolderObjectContainer(title2=title, no_cache=True, no_history=True) running = scheduler.is_task_running("MissingSubtitles") task_data = scheduler.get_task_data("MissingSubtitles") missing_items = task_data["missing_subtitles"] if task_data else None if ((missing_items is None) or force) and not running: scheduler.dispatch_task("MissingSubtitles") running = True if not running: oc.add( DirectoryObject( key=Callback(RecentMissingSubtitlesMenu, force=True, randomize=timestamp()), title=_(u"Find recent items with missing subtitles"), thumb=default_thumb)) else: oc.add( DirectoryObject(key=Callback(RecentMissingSubtitlesMenu, force=False, randomize=timestamp()), title=_(u"Updating, refresh here ..."), thumb=default_thumb)) if missing_items is not None: for added_at, item_id, item_title, item, missing_languages in missing_items: oc.add( DirectoryObject(key=Callback(ItemDetailsMenu, title=title + " > " + item_title, item_title=item_title, rating_key=item_id), title=item_title, summary=_( "Missing: %s", ", ".join( display_language(l) for l in missing_languages)), thumb=get_item_thumb(item) or default_thumb)) return oc
def GetLogsLink(): if not config.plex_token: oc = ObjectContainer(title2=_("Download Logs"), no_cache=True, no_history=True, header=_("Sorry, feature unavailable"), message=_("Universal Plex token not available")) return oc # try getting the link base via the request in context, first, otherwise use the public ip req_headers = Core.sandbox.context.request.headers get_external_ip = True link_base = "" if "Origin" in req_headers: link_base = req_headers["Origin"] Log.Debug("Using origin-based link_base") get_external_ip = False elif "Referer" in req_headers: parsed = urlparse.urlparse(req_headers["Referer"]) link_base = "%s://%s%s" % (parsed.scheme, parsed.hostname, (":%s" % parsed.port) if parsed.port else "") Log.Debug("Using referer-based link_base") get_external_ip = False if get_external_ip or "plex.tv" in link_base: ip = Core.networking.http_request("http://www.plexapp.com/ip.php", cacheTime=7200).content.strip() link_base = "https://%s:32400" % ip Log.Debug("Using ip-based fallback link_base") logs_link = "%s%s?X-Plex-Token=%s" % (link_base, PREFIX + '/logs', config.plex_token) oc = ObjectContainer( title2=logs_link, no_cache=True, no_history=True, header=_("Copy this link and open this in your browser, please"), message=logs_link) return oc
def RefreshItem(rating_key=None, came_from="/recent", item_title=None, force=False, refresh_kind=None, previous_rating_key=None, timeout=8000, randomize=None, trigger=True): assert rating_key from interface.main import fatality header = " " if trigger: t = u"Triggering refresh for %(title)s" if force: u"Triggering forced refresh for %(title)s" set_refresh_menu_state(_(t, title=item_title)) Thread.Create(refresh_item, rating_key=rating_key, force=force, refresh_kind=refresh_kind, parent_rating_key=previous_rating_key, timeout=int(timeout)) t = u"Refresh of item %(item_id)s triggered" if force: t = u"Forced refresh of item %(item_id)s triggered" header = _(t, item_id=rating_key) return fatality(randomize=timestamp(), header=header, replace_parent=True)
def IgnoreListMenu(): ref_list = get_decision_list() include = ref_list.store == "include" list_title = _("Include list" if include else "Ignore list") oc = SubFolderObjectContainer(title2=list_title, replace_parent=True) for key in ref_list.key_order: values = ref_list[key] for value in values: add_incl_excl_options(oc, key, title=ref_list.get_title(key, value), rating_key=value, callback_menu=InclExclMenu) return oc
def set_refresh_menu_state(state_or_media, media_type="movies"): """ :param state_or_media: string, None, or Media argument from Agent.update() :param media_type: movies or series :return: """ if not state_or_media: # store it in last state and remove the current Dict["last_refresh_state"] = Dict["current_refresh_state"] Dict["current_refresh_state"] = None Dict.Save() return if isinstance(state_or_media, types.StringTypes) or is_localized_string(state_or_media): Dict["current_refresh_state"] = unicode(state_or_media) Dict.Save() return media = state_or_media media_id = media.id title = None if media_type == "series": for season in media.seasons: for episode in media.seasons[season].episodes: ep = media.seasons[season].episodes[episode] media_id = ep.id title = get_video_display_title(_("show"), ep.title, parent_title=media.title, season=int(season), episode=int(episode)) else: title = get_video_display_title(_("movie"), media.title) intent = get_intent() force_refresh = intent.get("force", media_id) t = u"Refreshing %(title)s" if force_refresh: t = u"Force-refreshing %(title)s" Dict["current_refresh_state"] = unicode(_(t, title=unicode(title))) Dict.Save()
def HistoryMenu(): from support.history import get_history history = get_history() oc = SubFolderObjectContainer(title2=_("History"), replace_parent=True) for item in history.items[:100]: possible_language = item.language language_display = item.lang_name if not possible_language else display_language(possible_language) oc.add(DirectoryObject( key=Callback(ItemDetailsMenu, title=item.title, item_title=item.item_title, rating_key=item.rating_key), title=u"%s (%s)" % (item.item_title, _(item.mode_verbose)), summary=_(u"%s in %s (%s, score: %s), %s", language_display, item.section_title, _(item.provider_name), item.score, df(item.time)), thumb=item.thumb or default_thumb )) history.destroy() return oc
def SectionsMenu( base_title=_("Sections"), section_items_key="all", ignore_options=True): """ displays the menu for all sections :return: """ items = get_all_items("sections") return dig_tree(SubFolderObjectContainer(title2=_("Sections"), no_cache=True, no_history=True), items, None, menu_determination_callback=determine_section_display, pass_kwargs={ "base_title": base_title, "section_items_key": section_items_key, "ignore_options": ignore_options }, fill_args={"title": "section_title"})
def GetLogsLink(): if not config.plex_token: oc = ObjectContainer( title2=_("Download Logs"), no_cache=True, no_history=True, header=_("Sorry, feature unavailable"), message=_("Universal Plex token not available")) return oc # try getting the link base via the request in context, first, otherwise use the public ip req_headers = Core.sandbox.context.request.headers get_external_ip = True link_base = "" if "Origin" in req_headers: link_base = req_headers["Origin"] Log.Debug("Using origin-based link_base") get_external_ip = False elif "Referer" in req_headers: parsed = urlparse.urlparse(req_headers["Referer"]) link_base = "%s://%s%s" % (parsed.scheme, parsed.hostname, (":%s" % parsed.port) if parsed.port else "") Log.Debug("Using referer-based link_base") get_external_ip = False if get_external_ip or "plex.tv" in link_base: ip = Core.networking.http_request("http://www.plexapp.com/ip.php", cacheTime=7200).content.strip() link_base = "https://%s:32400" % ip Log.Debug("Using ip-based fallback link_base") logs_link = "%s%s?X-Plex-Token=%s" % (link_base, PREFIX + '/logs', config.plex_token) oc = ObjectContainer( title2=logs_link, no_cache=True, no_history=True, header=_("Copy this link and open this in your browser, please"), message=logs_link) return oc
def SubtitleFPSModMenu(**kwargs): rating_key = kwargs["rating_key"] part_id = kwargs["part_id"] item_type = kwargs["item_type"] kwargs.pop("randomize") oc = SubFolderObjectContainer(title2=kwargs["title"], replace_parent=True) oc.add(DirectoryObject( key=Callback(SubtitleModificationsMenu, randomize=timestamp(), **kwargs), title=_("< Back to subtitle modification menu") )) metadata = get_plex_metadata(rating_key, part_id, item_type) scanned_parts = scan_videos([metadata], ignore_all=True, skip_hashing=True) video, plex_part = scanned_parts.items()[0] target_fps = plex_part.fps for fps in ["23.980", "23.976", "24.000", "25.000", "29.970", "30.000", "50.000", "59.940", "60.000"]: if float(fps) == float(target_fps): continue if float(fps) > float(target_fps): indicator = _("subs constantly getting faster") else: indicator = _("subs constantly getting slower") mod_ident = SubtitleModifications.get_mod_signature("change_FPS", **{"from": fps, "to": target_fps}) oc.add(DirectoryObject( key=Callback(SubtitleSetMods, mods=mod_ident, mode="add", randomize=timestamp(), **kwargs), title=_("%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)", from_fps=fps, to_fps=target_fps, slower_or_faster_indicator=indicator) )) return oc
def SectionFirstLetterMenu(rating_key, title=None, base_title=None, section_title=None, ignore_options=True, section_items_key="all"): """ displays the contents of a section indexed by its first char (A-Z, 0-9...) :param ignore_options: ignored :param section_items_key: ignored :param rating_key: :param title: :param base_title: :param section_title: :return: """ from menu import FirstLetterMetadataMenu items = get_all_items(key="first_character", value=rating_key, base="library/sections") kind, deeper = get_items_info(items) title = unicode(title) oc = SubFolderObjectContainer(title2=section_title, no_cache=True, no_history=True) title = base_title + " > " + title add_ignore_options(oc, "sections", title=section_title, rating_key=rating_key, callback_menu=IgnoreMenu) oc.add( DirectoryObject(key=Callback(SectionMenu, title=_("All"), base_title=title, rating_key=rating_key, ignore_options=False), title="All")) return dig_tree(oc, items, FirstLetterMetadataMenu, force_rating_key=rating_key, fill_args={"key": "key"}, pass_kwargs={ "base_title": title, "display_items": deeper, "previous_rating_key": rating_key })
def SelectStoredSubForItemMenu(**kwargs): rating_key = kwargs["rating_key"] part_id = kwargs["part_id"] language = Language.fromietf(kwargs["language"]) item_type = kwargs["item_type"] sub_key = tuple(kwargs.pop("sub_key").split("__")) plex_item = get_item(rating_key) storage = get_subtitle_storage() stored_subs = storage.load(plex_item.rating_key) subtitles = stored_subs.get_all(part_id, language) subtitle = subtitles[sub_key] save_stored_sub(subtitle, rating_key, part_id, language, item_type, plex_item=plex_item, storage=storage, stored_subs=stored_subs) stored_subs.set_current(part_id, language, sub_key) storage.save(stored_subs) storage.destroy() kwa = { "header": _("Success"), "message": _("Subtitle saved to disk"), "title": kwargs["title"], "item_title": kwargs["item_title"], "base_title": kwargs.get("base_title") } # fixme: return to SubtitleOptionsMenu properly? (needs recomputation of current_data return ItemDetailsMenu(rating_key, randomize=timestamp(), **kwa)
def IgnoreListMenu(): ref_list = get_decision_list() include = ref_list.store == "include" list_title = _("Include list" if include else "Ignore list") oc = SubFolderObjectContainer(title2=list_title, replace_parent=True) for key in ref_list.key_order: values = ref_list[key] for value in values: add_incl_excl_options(oc, key, title=ref_list.get_title(key, value), rating_key=value, callback_menu=InclExclMenu) return oc
def RecentMissingSubtitlesMenu(force=False, randomize=None): title = _("Items with missing subtitles") oc = SubFolderObjectContainer(title2=title, no_cache=True, no_history=True) running = scheduler.is_task_running("MissingSubtitles") task_data = scheduler.get_task_data("MissingSubtitles") missing_items = task_data["missing_subtitles"] if task_data else None if ((missing_items is None) or force) and not running: scheduler.dispatch_task("MissingSubtitles") running = True if not running: oc.add(DirectoryObject( key=Callback(RecentMissingSubtitlesMenu, force=True, randomize=timestamp()), title=_(u"Find recent items with missing subtitles"), thumb=default_thumb )) else: oc.add(DirectoryObject( key=Callback(RecentMissingSubtitlesMenu, force=False, randomize=timestamp()), title=_(u"Updating, refresh here ..."), thumb=default_thumb )) if missing_items is not None: for added_at, item_id, item_title, item, missing_languages in missing_items: oc.add(DirectoryObject( key=Callback(ItemDetailsMenu, title=title + " > " + item_title, item_title=item_title, rating_key=item_id), title=item_title, summary=_("Missing: %s", ", ".join(display_language(l) for l in missing_languages)), thumb=get_item_thumb(item) or default_thumb )) return oc
def SubtitleListMods(**kwargs): rating_key = kwargs["rating_key"] part_id = kwargs["part_id"] language = kwargs["language"] current_sub, stored_subs, storage = get_current_sub(rating_key, part_id, language) kwargs.pop("randomize") oc = SubFolderObjectContainer(title2=kwargs["title"], replace_parent=True) oc.add(DirectoryObject( key=Callback(SubtitleModificationsMenu, randomize=timestamp(), **kwargs), title=_("< Back to subtitle modifications") )) for identifier in current_sub.mods: oc.add(DirectoryObject( key=Callback(SubtitleSetMods, mods=identifier, mode="remove", randomize=timestamp(), **kwargs), title=_("Remove: %(mod_name)s", mod_name=identifier) )) storage.destroy() return oc
def add_incl_excl_options(oc, kind, callback_menu=None, title=None, rating_key=None, add_kind=True): """ :param oc: oc to add our options to :param kind: movie, show, episode ... - gets translated to the ignore key (sections, series, items) :param callback_menu: menu to inject :param title: :param rating_key: :return: """ # try to translate kind to the ignore key use_kind = kind ref_list = get_decision_list() if kind not in ref_list: use_kind = ref_list.translate_key(kind) if not use_kind or use_kind not in ref_list: return in_list = rating_key in ref_list[use_kind] include = ref_list.store == "include" if include: t = u"Enable Sub-Zero for %(kind)s \"%(title)s\"" if in_list: t = u"Disable Sub-Zero for %(kind)s \"%(title)s\"" else: t = u"Ignore %(kind)s \"%(title)s\"" if in_list: t = u"Un-ignore %(kind)s \"%(title)s\"" oc.add( DirectoryObject(key=Callback(callback_menu, kind=use_kind, sure=False, todo="not_set", rating_key=str(rating_key), title=title), title=_( t, kind=ref_list.verbose(kind) if add_kind else "", title=unicode(title))))