def AdvancedMenu(randomize=None, header=None, message=None): oc = ObjectContainer(header=header or "Internal stuff, pay attention!", message=message, no_cache=True, no_history=True, title2="Advanced") oc.add( DirectoryObject(key=Callback(TriggerRestart), title=pad_title("Restart the plugin"))) oc.add( DirectoryObject( key=Callback(RefreshToken, randomize=timestamp()), title=pad_title("Re-request the API token from plex.tv"))) oc.add( DirectoryObject( key=Callback(ResetStorage, key="tasks", randomize=timestamp()), title=pad_title( "Reset the plugin's scheduled tasks state storage"))) oc.add( DirectoryObject( key=Callback(ResetStorage, key="subs", randomize=timestamp()), title=pad_title( "Reset the plugin's internal subtitle information storage"))) return oc
def PinMenu(pin="", randomize=None, success_go_to="channel"): oc = ObjectContainer(title2="Enter PIN number %s" % (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 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 fatality(randomize=None, header=None, message=None, only_refresh=False): """ subzero main menu """ oc = ObjectContainer(header=header, message=message, no_cache=True, no_history=True) if not config.plex_api_working: oc.add(DirectoryObject( key=Callback(fatality, randomize=timestamp()), title=pad_title("PMS API ERROR"), summary=lib_unaccessible_error )) return oc if not only_refresh: oc.add(DirectoryObject( key=Callback(OnDeckMenu), title=pad_title("Subtitles for 'On Deck' items"), summary="Shows the current on deck items and allows you to individually (force-) refresh their metadata/subtitles." )) oc.add(DirectoryObject( key=Callback(RecentlyAddedMenu), title="Subtitles for 'Recently Added' items (max-age: %s)" % Prefs["scheduler.item_is_recent_age"], summary="Shows the recently added items, honoring the configured 'Item age to be considered recent'-setting (%s) and allowing you to individually (force-) refresh their metadata/subtitles." % Prefs["scheduler.item_is_recent_age"] )) task_name = "searchAllRecentlyAddedMissing" task = scheduler.task(task_name) if task.ready_for_display: task_state = "Running: %s/%s (%s%%)" % (len(task.items_done), len(task.items_searching), task.percentage) else: task_state = "Last scheduler run: %s; Next scheduled run: %s; Last runtime: %s" % (scheduler.last_run(task_name) or "never", scheduler.next_run(task_name) or "never", str(task.last_run_time).split(".")[0]) oc.add(DirectoryObject( key=Callback(RefreshMissing, randomize=timestamp()), title="Search for missing subtitles (in recently-added items, max-age: %s)" % Prefs["scheduler.item_is_recent_age"], summary="Automatically run periodically by the scheduler, if configured. %s" % task_state )) oc.add(DirectoryObject( key=Callback(fatality, randomize=timestamp()), title=pad_title("Refresh"), summary="Refreshes the current view" )) if not only_refresh: oc.add(DirectoryObject( key=Callback(AdvancedMenu, randomize=timestamp()), title=pad_title("Advanced functions"), summary="Use at your own risk" )) 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 dig_tree(oc, items, menu_callback, menu_determination_callback=None, force_rating_key=None, fill_args=None, pass_kwargs=None, thumb=default_thumb): for kind, title, key, dig_deeper, item in items: thumb = get_item_thumb(item) or thumb add_kwargs = {} if fill_args: add_kwargs = dict((name, getattr(item, k)) for k, name in fill_args.iteritems() if item and hasattr(item, k)) if pass_kwargs: add_kwargs.update(pass_kwargs) # force details view for show/season summary = " " if kind in ("show", "season") else None oc.add( DirectoryObject( key=Callback(menu_callback or menu_determination_callback( kind, item, pass_kwargs=pass_kwargs), title=title, rating_key=force_rating_key or key, **add_kwargs), title=pad_title(title) if kind in ("show", "season") else title, thumb=thumb, summary=summary)) 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 AdvancedMenu(randomize=None, header=None, message=None): oc = ObjectContainer(header=header or "Internal stuff, pay attention!", message=message, no_cache=True, no_history=True, replace_parent=True, title2="Advanced") oc.add(DirectoryObject( key=Callback(TriggerRestart, randomize=timestamp()), title=pad_title("Restart the plugin"), )) oc.add(DirectoryObject( key=Callback(LogStorage, key="tasks", randomize=timestamp()), title=pad_title("Log the plugin's scheduled tasks state storage"), )) oc.add(DirectoryObject( key=Callback(LogStorage, key="subs", randomize=timestamp()), title=pad_title("Log the plugin's internal subtitle information storage"), )) oc.add(DirectoryObject( key=Callback(LogStorage, key="ignore", randomize=timestamp()), title=pad_title("Log the plugin's internal ignorelist storage"), )) oc.add(DirectoryObject( key=Callback(ResetStorage, key="tasks", randomize=timestamp()), title=pad_title("Reset the plugin's scheduled tasks state storage"), )) oc.add(DirectoryObject( key=Callback(ResetStorage, key="subs", randomize=timestamp()), title=pad_title("Reset the plugin's internal subtitle information storage"), )) oc.add(DirectoryObject( key=Callback(ResetStorage, key="ignore", randomize=timestamp()), title=pad_title("Reset the plugin's internal ignorelist storage"), )) return oc
def IgnoreMenu(kind, rating_key, title=None, sure=False, todo="not_set"): is_ignored = rating_key in ignore_list[kind] if not sure: oc = ObjectContainer( no_history=True, replace_parent=True, title1="%s %s %s %s the ignore list" % ( "Add" if not is_ignored else "Remove", ignore_list.verbose(kind), title, "to" if not is_ignored else "from", ), title2="Are you sure?", ) oc.add( DirectoryObject( key=Callback( IgnoreMenu, kind=kind, rating_key=rating_key, title=title, sure=True, todo="add" if not is_ignored else "remove", ), title=pad_title("Are you sure?"), ) ) return oc rel = ignore_list[kind] dont_change = False if todo == "remove": if not is_ignored: dont_change = True else: rel.remove(rating_key) Log.Info("Removed %s (%s) from the ignore list", title, rating_key) ignore_list.remove_title(kind, rating_key) ignore_list.save() state = "removed from" elif todo == "add": if is_ignored: dont_change = True else: rel.append(rating_key) Log.Info("Added %s (%s) to the ignore list", title, rating_key) ignore_list.add_title(kind, rating_key, title) ignore_list.save() state = "added to" else: dont_change = True if dont_change: return fatality(force_title=" ", header="Didn't change the ignore list", no_history=True) return fatality(force_title=" ", header="%s %s the ignore list" % (title, state), no_history=True)
def AdvancedMenu(randomize=None, header=None, message=None): oc = ObjectContainer(header=header or "Internal stuff, pay attention!", message=message, no_cache=True, no_history=True, title2="Advanced") oc.add(DirectoryObject( key=Callback(TriggerRestart), title=pad_title("Restart the plugin") )) oc.add(DirectoryObject( key=Callback(RefreshToken, randomize=timestamp()), title=pad_title("Re-request the API token from plex.tv") )) oc.add(DirectoryObject( key=Callback(ResetStorage, key="tasks", randomize=timestamp()), title=pad_title("Reset the plugin's scheduled tasks state storage") )) oc.add(DirectoryObject( key=Callback(ResetStorage, key="subs", randomize=timestamp()), title=pad_title("Reset the plugin's internal subtitle information storage") )) return oc
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 AdvancedMenu(randomize=None, header=None, message=None): oc = SubFolderObjectContainer(header=header or "Internal stuff, pay attention!", message=message, no_cache=True, no_history=True, replace_parent=False, title2="Advanced") if config.lock_advanced_menu and not config.pin_correct: oc.add( DirectoryObject( key=Callback(PinMenu, randomize=timestamp(), success_go_to="advanced"), title=pad_title("Enter PIN"), summary= "The owner has restricted the access to this menu. Please enter the correct pin", )) return oc oc.add( DirectoryObject( key=Callback(TriggerRestart, randomize=timestamp()), title=pad_title("Restart the plugin"), )) oc.add( DirectoryObject( key=Callback(TriggerBetterSubtitles, randomize=timestamp()), title=pad_title("Trigger find better subtitles"), )) oc.add( DirectoryObject( key=Callback(LogStorage, key="tasks", randomize=timestamp()), title=pad_title("Log the plugin's scheduled tasks state storage"), )) oc.add( DirectoryObject( key=Callback(LogStorage, key="ignore", randomize=timestamp()), title=pad_title("Log the plugin's internal ignorelist storage"), )) oc.add( DirectoryObject( key=Callback(ResetStorage, key="tasks", randomize=timestamp()), title=pad_title( "Reset the plugin's scheduled tasks state storage"), )) oc.add( DirectoryObject( key=Callback(ResetStorage, key="ignore", randomize=timestamp()), title=pad_title("Reset the plugin's internal ignorelist storage"), )) return oc
def IgnoreMenu(kind, rating_key, title=None, sure=False, todo="not_set"): """ displays the ignore options for a menu :param kind: :param rating_key: :param title: :param sure: :param todo: :return: """ is_ignored = rating_key in ignore_list[kind] if not sure: oc = SubFolderObjectContainer(no_history=True, replace_parent=True, title1="%s %s %s %s the ignore list" % ( "Add" if not is_ignored else "Remove", ignore_list.verbose(kind), title, "to" if not is_ignored else "from"), title2="Are you sure?") oc.add(DirectoryObject( key=Callback(IgnoreMenu, kind=kind, rating_key=rating_key, title=title, sure=True, todo="add" if not is_ignored else "remove"), title=pad_title("Are you sure?"), )) return oc rel = ignore_list[kind] dont_change = False if todo == "remove": if not is_ignored: dont_change = True else: rel.remove(rating_key) Log.Info("Removed %s (%s) from the ignore list", title, rating_key) ignore_list.remove_title(kind, rating_key) ignore_list.save() state = "removed from" elif todo == "add": if is_ignored: dont_change = True else: rel.append(rating_key) Log.Info("Added %s (%s) to the ignore list", title, rating_key) ignore_list.add_title(kind, rating_key, title) ignore_list.save() state = "added to" else: dont_change = True if dont_change: return fatality(force_title=" ", header="Didn't change the ignore list", no_history=True) return fatality(force_title=" ", header="%s %s the ignore list" % (title, state), no_history=True)
def ResetStorage(key, randomize=None, sure=False): if not sure: oc = ObjectContainer(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 resetStorage(key) return AdvancedMenu( randomize=timestamp(), header='Success', message='Subtitle Information Storage reset' )
def ResetStorage(key, randomize=None, sure=False): if not sure: oc = ObjectContainer(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 resetStorage(key) return AdvancedMenu(randomize=timestamp(), header='Success', message='Subtitle Information Storage reset')
def dig_tree(oc, items, menu_callback, menu_determination_callback=None, force_rating_key=None, fill_args=None, pass_kwargs=None, thumb=default_thumb): for kind, title, key, dig_deeper, item in items: thumb = get_item_thumb(item) or thumb add_kwargs = {} if fill_args: add_kwargs = dict((name, getattr(item, k)) for k, name in fill_args.iteritems() if item and hasattr(item, k)) if pass_kwargs: add_kwargs.update(pass_kwargs) # force details view for show/season summary = " " if kind in ("show", "season") else None oc.add(DirectoryObject( key=Callback(menu_callback or menu_determination_callback(kind, item, pass_kwargs=pass_kwargs), title=title, rating_key=force_rating_key or key, **add_kwargs), title=pad_title(title) if kind in ("show", "season") else title, thumb=thumb, summary=summary )) return oc
def fatality(randomize=None, force_title=None, header=None, message=None, only_refresh=False, no_history=False, replace_parent=False): """ subzero main menu """ from interface.advanced import PinMenu, ClearPin, AdvancedMenu from interface.menu import RefreshMissing, IgnoreListMenu, HistoryMenu title = config.full_version # force_title if force_title is not None else config.full_version oc = ObjectContainer(title1=title, title2=title, header=unicode(header) if header else title, message=message, no_history=no_history, replace_parent=replace_parent, no_cache=True) # always re-check permissions config.refresh_permissions_status() # always re-check enabled sections config.refresh_enabled_sections() if config.lock_menu and not config.pin_correct: oc.add( DirectoryObject( key=Callback(PinMenu, randomize=timestamp()), title=pad_title("Enter PIN"), summary= "The owner has restricted the access to this menu. Please enter the correct pin", )) return oc if not config.permissions_ok and config.missing_permissions: for title, path in config.missing_permissions: oc.add( DirectoryObject( key=Callback(fatality, randomize=timestamp()), title=pad_title("Insufficient permissions"), summary="Insufficient permissions on library %s, folder: %s" % (title, path), )) return oc if not config.enabled_sections: oc.add( DirectoryObject( key=Callback(fatality, randomize=timestamp()), title=pad_title("I'm not enabled!"), summary= "Please enable me for some of your libraries in your server settings; currently I do nothing", )) return oc if not only_refresh: if Dict["current_refresh_state"]: oc.add( DirectoryObject(key=Callback(fatality, force_title=" ", randomize=timestamp()), title=pad_title("Working ... refresh here"), 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"))) oc.add( DirectoryObject( key=Callback(OnDeckMenu), title="On-deck items", summary= "Shows the current on deck items and allows you to individually (force-) refresh their metadata/" "subtitles.", thumb=R("icon-ondeck.jpg"))) if "last_played_items" in Dict and Dict["last_played_items"]: oc.add( DirectoryObject( key=Callback(RecentlyPlayedMenu), title=pad_title("Recently played items"), summary= "Shows the %i recently played items and allows you to individually (force-) refresh their " "metadata/subtitles." % config.store_recently_played_amount, thumb=R("icon-played.jpg"))) oc.add( DirectoryObject( key=Callback(RecentlyAddedMenu), title="Recently-added items", summary="Shows the recently added items per section.", thumb=R("icon-added.jpg"))) oc.add( DirectoryObject( key=Callback(RecentMissingSubtitlesMenu, randomize=timestamp()), title="Show recently added items with missing subtitles", summary= "Lists items with missing subtitles. Click on \"Find recent items with missing subs\" " "to update list", thumb=R("icon-missing.jpg"))) oc.add( DirectoryObject( key=Callback(SectionsMenu), title="Browse all items", summary= "Go through your whole library and manage your ignore list. You can also " "(force-) refresh the metadata/subtitles of individual items.", thumb=R("icon-browse.jpg"))) task_name = "SearchAllRecentlyAddedMissing" task = scheduler.task(task_name) if task.ready_for_display: task_state = "Running: %s/%s (%s%%)" % ( task.items_done, task.items_searching, task.percentage) else: task_state = "Last scheduler run: %s; Next scheduled run: %s; Last runtime: %s" % ( df(scheduler.last_run(task_name)) or "never", df(scheduler.next_run(task_name)) or "never", str(task.last_run_time).split(".")[0]) oc.add( DirectoryObject( key=Callback(RefreshMissing, randomize=timestamp()), title= "Search for missing subtitles (in recently-added items, max-age: %s)" % Prefs["scheduler.item_is_recent_age"], summary= "Automatically run periodically by the scheduler, if configured. %s" % task_state, thumb=R("icon-search.jpg"))) oc.add( DirectoryObject( key=Callback(IgnoreListMenu), title="Display ignore list (%d)" % len(ignore_list), summary= "Show the current ignore list (mainly used for the automatic tasks)", thumb=R("icon-ignore.jpg"))) oc.add( DirectoryObject(key=Callback(HistoryMenu), title="History", summary="Show the last %i downloaded subtitles" % int(Prefs["history_size"]), thumb=R("icon-history.jpg"))) oc.add( DirectoryObject(key=Callback(fatality, force_title=" ", randomize=timestamp()), title=pad_title("Refresh"), 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"), thumb=R("icon-refresh.jpg"))) # add re-lock after pin unlock if config.pin: oc.add( DirectoryObject(key=Callback(ClearPin, randomize=timestamp()), title=pad_title("Re-lock menu(s)"), summary="Enabled the PIN again for menu(s)")) if not only_refresh: oc.add( DirectoryObject(key=Callback(AdvancedMenu), title=pad_title("Advanced functions"), summary="Use at your own risk", thumb=R("icon-advanced.jpg"))) return oc
def fatality(randomize=None, force_title=None, header=None, message=None, only_refresh=False, no_history=False, replace_parent=False): """ subzero main menu """ title = force_title if force_title is not None else config.full_version oc = ObjectContainer(title1=title, title2=None, header=unicode(header) if header else header, message=message, no_history=no_history, replace_parent=replace_parent) if not config.plex_api_working: oc.add(DirectoryObject( key=Callback(fatality, randomize=timestamp()), title=pad_title("PMS API ERROR"), summary=lib_unaccessible_error )) return oc if not only_refresh: oc.add(DirectoryObject( key=Callback(OnDeckMenu), title=pad_title("On Deck items"), summary="Shows the current on deck items and allows you to individually (force-) refresh their metadata/subtitles." )) oc.add(DirectoryObject( key=Callback(RecentlyAddedMenu), title="Items with missing subtitles", summary="Shows the items honoring the configured 'Item age to be considered recent'-setting (%s)" " and allowing you to individually (force-) refresh their metadata/subtitles. " % Prefs["scheduler.item_is_recent_age"] )) oc.add(DirectoryObject( key=Callback(SectionsMenu), title="Browse all items", summary="Go through your whole library and manage your ignore list. You can also " "(force-) refresh the metadata/subtitles of individual items." )) task_name = "searchAllRecentlyAddedMissing" task = scheduler.task(task_name) if task.ready_for_display: task_state = "Running: %s/%s (%s%%)" % (len(task.items_done), len(task.items_searching), task.percentage) else: task_state = "Last scheduler run: %s; Next scheduled run: %s; Last runtime: %s" % (scheduler.last_run(task_name) or "never", scheduler.next_run(task_name) or "never", str(task.last_run_time).split(".")[0]) oc.add(DirectoryObject( key=Callback(RefreshMissing), title="Search for missing subtitles (in recently-added items, max-age: %s)" % Prefs["scheduler.item_is_recent_age"], summary="Automatically run periodically by the scheduler, if configured. %s" % task_state )) oc.add(DirectoryObject( key=Callback(IgnoreListMenu), title="Display ignore list (%d)" % len(ignore_list), summary="Show the current ignore list (mainly used for the automatic tasks)" )) oc.add(DirectoryObject( key=Callback(fatality, force_title=" ", randomize=timestamp()), title=pad_title("Refresh"), 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" ) )) if not only_refresh: oc.add(DirectoryObject( key=Callback(AdvancedMenu), title=pad_title("Advanced functions"), summary="Use at your own risk" )) return oc
def fatality(randomize=None, header=None, message=None, only_refresh=False): """ subzero main menu """ oc = ObjectContainer(header=header, message=message, no_cache=True, no_history=True) if not config.plex_api_working: oc.add( DirectoryObject(key=Callback(fatality, randomize=timestamp()), title=pad_title("PMS API ERROR"), summary=lib_unaccessible_error)) return oc if not only_refresh: oc.add( DirectoryObject( key=Callback(OnDeckMenu), title=pad_title("Subtitles for 'On Deck' items"), summary= "Shows the current on deck items and allows you to individually (force-) refresh their metadata/subtitles." )) oc.add( DirectoryObject( key=Callback(RecentlyAddedMenu), title="Subtitles for 'Recently Added' items (max-age: %s)" % Prefs["scheduler.item_is_recent_age"], summary= "Shows the recently added items, honoring the configured 'Item age to be considered recent'-setting (%s) and allowing you to individually (force-) refresh their metadata/subtitles." % Prefs["scheduler.item_is_recent_age"])) task_name = "searchAllRecentlyAddedMissing" task = scheduler.task(task_name) if task.ready_for_display: task_state = "Running: %s/%s (%s%%)" % (len( task.items_done), len(task.items_searching), task.percentage) else: task_state = "Last scheduler run: %s; Next scheduled run: %s; Last runtime: %s" % ( scheduler.last_run(task_name) or "never", scheduler.next_run(task_name) or "never", str(task.last_run_time).split(".")[0]) oc.add( DirectoryObject( key=Callback(RefreshMissing, randomize=timestamp()), title= "Search for missing subtitles (in recently-added items, max-age: %s)" % Prefs["scheduler.item_is_recent_age"], summary= "Automatically run periodically by the scheduler, if configured. %s" % task_state)) oc.add( DirectoryObject(key=Callback(fatality, randomize=timestamp()), title=pad_title("Refresh"), summary="Refreshes the current view")) if not only_refresh: oc.add( DirectoryObject(key=Callback(AdvancedMenu, randomize=timestamp()), title=pad_title("Advanced functions"), summary="Use at your own risk")) return oc
def fatality(randomize=None, force_title=None, header=None, message=None, only_refresh=False, no_history=False, replace_parent=False): """ subzero main menu """ from interface.advanced import PinMenu, ClearPin, AdvancedMenu from interface.menu import RefreshMissing, IgnoreListMenu, HistoryMenu title = config.full_version # force_title if force_title is not None else config.full_version oc = ObjectContainer(title1=title, title2=title, header=unicode(header) if header else title, message=message, no_history=no_history, replace_parent=replace_parent, no_cache=True) # always re-check permissions config.refresh_permissions_status() # always re-check enabled sections config.refresh_enabled_sections() if config.lock_menu and not config.pin_correct: oc.add( DirectoryObject( key=Callback(PinMenu, randomize=timestamp()), title=pad_title(_("Enter PIN")), summary= _("The owner has restricted the access to this menu. Please enter the correct pin" ), )) return oc if not config.permissions_ok and config.missing_permissions: if not isinstance(config.missing_permissions, list): oc.add( DirectoryObject( key=Callback(fatality, randomize=timestamp()), title=pad_title(_("Insufficient permissions")), summary=config.missing_permissions, )) else: for title, path in config.missing_permissions: oc.add( DirectoryObject( key=Callback(fatality, randomize=timestamp()), title=pad_title(_("Insufficient permissions")), summary= _("Insufficient permissions on library %(title)s, folder: %(path)s", title=title, path=path), )) return oc if not config.enabled_sections: oc.add( DirectoryObject( key=Callback(fatality, randomize=timestamp()), title=pad_title(_("I'm not enabled!")), summary= _("Please enable me for some of your libraries in your server settings; currently I do nothing" ), )) return oc if not only_refresh: if Dict["current_refresh_state"]: oc.add( DirectoryObject( key=Callback(fatality, force_title=" ", randomize=timestamp()), title=pad_title(_("Working ... refresh here")), 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")))) oc.add( DirectoryObject( key=Callback(OnDeckMenu), title=_("On-deck items"), summary= _("Shows the current on deck items and allows you to individually (force-) refresh their metadata/subtitles." ), thumb=R("icon-ondeck.jpg"))) if "last_played_items" in Dict and Dict["last_played_items"]: oc.add( DirectoryObject( key=Callback(RecentlyPlayedMenu), title=pad_title(_("Recently played items")), summary=_( "Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.", config.store_recently_played_amount), thumb=R("icon-played.jpg"))) oc.add( DirectoryObject( key=Callback(RecentlyAddedMenu), title=_("Recently-added items"), summary=_("Shows the recently added items per section."), thumb=R("icon-added.jpg"))) oc.add( DirectoryObject( key=Callback(RecentMissingSubtitlesMenu, randomize=timestamp()), title=_("Show recently added items with missing subtitles"), summary= _("Lists items with missing subtitles. Click on \"Find recent items with missing subs\" to update list" ), thumb=R("icon-missing.jpg"))) oc.add( DirectoryObject( key=Callback(SectionsMenu), title=_("Browse all items"), summary= _("Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items." ), thumb=R("icon-browse.jpg"))) task_name = "SearchAllRecentlyAddedMissing" task = scheduler.task(task_name) if task.ready_for_display: task_state = _( "Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)", items_done=task.items_done, items_searching=task.items_searching, percentage=task.percentage) else: lr = scheduler.last_run(task_name) nr = scheduler.next_run(task_name) task_state = _( "Last run: %s; Next scheduled run: %s; Last runtime: %s", df(scheduler.last_run(task_name)) if lr else "never", df(scheduler.next_run(task_name)) if nr else "never", str(task.last_run_time).split(".")[0]) oc.add( DirectoryObject( key=Callback(RefreshMissing, randomize=timestamp()), title=_( "Search for missing subtitles (in recently-added items, max-age: %s)", Prefs["scheduler.item_is_recent_age"]), summary=_( "Automatically run periodically by the scheduler, if configured. %s", task_state), thumb=R("icon-search.jpg"))) ref_list = get_decision_list() incl_excl_ref = _( "include list") if ref_list.store == "include" else _( "ignore list") oc.add( DirectoryObject( key=Callback(IgnoreListMenu), title=_("Display %(incl_excl_list_name)s (%(count)d)", incl_excl_list_name=incl_excl_ref, count=len(ref_list)), summary= _("Show the current %(incl_excl_list_name)s (mainly used for the automatic tasks)", incl_excl_list_name=incl_excl_ref), thumb=R("icon-ignore.jpg"))) oc.add( DirectoryObject(key=Callback(HistoryMenu), title=_("History"), summary=_("Show the last %i downloaded subtitles", int(Prefs["history_size"])), thumb=R("icon-history.jpg"))) oc.add( DirectoryObject( key=Callback(fatality, force_title=" ", randomize=timestamp()), title=pad_title(_("Refresh")), 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")), thumb=R("icon-refresh.jpg"))) # add re-lock after pin unlock if config.pin: oc.add( DirectoryObject(key=Callback(ClearPin, randomize=timestamp()), title=pad_title(_("Re-lock menu(s)")), summary=_("Enabled the PIN again for menu(s)"))) if not only_refresh: if "provider_throttle" in Dict and Dict["provider_throttle"].keys(): summary_data = [] for provider, data in Dict["provider_throttle"].iteritems(): reason, until, desc = data summary_data.append( unicode( _("%(throttled_provider)s until %(until_date)s (%(reason)s)", throttled_provider=provider, until_date=until.strftime("%y/%m/%d %H:%M"), reason=reason))) oc.add( DirectoryObject( key=Callback(fatality, force_title=" ", randomize=timestamp()), title=pad_title( _("Throttled providers: %s", ", ".join(Dict["provider_throttle"].keys()))), summary=", ".join(summary_data), thumb=R("icon-throttled.jpg"))) oc.add( DirectoryObject(key=Callback(AdvancedMenu), title=pad_title(_("Advanced functions")), summary=_("Use at your own risk"), thumb=R("icon-advanced.jpg"))) return oc
def fatality( randomize=None, force_title=None, header=None, message=None, only_refresh=False, no_history=False, replace_parent=False, ): """ subzero main menu """ title = force_title if force_title is not None else config.full_version oc = ObjectContainer( title1=title, title2=None, header=unicode(header) if header else header, message=message, no_history=no_history, replace_parent=replace_parent, ) if not config.plex_api_working: oc.add( DirectoryObject( key=Callback(fatality, randomize=timestamp()), title=pad_title("PMS API ERROR"), summary=lib_unaccessible_error, ) ) return oc if not only_refresh: oc.add( DirectoryObject( key=Callback(OnDeckMenu), title=pad_title("On Deck items"), summary="Shows the current on deck items and allows you to individually (force-) refresh their metadata/subtitles.", ) ) oc.add( DirectoryObject( key=Callback(RecentlyAddedMenu), title="Items with missing subtitles", summary="Shows the items honoring the configured 'Item age to be considered recent'-setting (%s)" " and allowing you to individually (force-) refresh their metadata/subtitles. " % Prefs["scheduler.item_is_recent_age"], ) ) oc.add( DirectoryObject( key=Callback(SectionsMenu), title="Browse all items", summary="Go through your whole library and manage your ignore list. You can also " "(force-) refresh the metadata/subtitles of individual items.", ) ) task_name = "searchAllRecentlyAddedMissing" task = scheduler.task(task_name) if task.ready_for_display: task_state = "Running: %s/%s (%s%%)" % (len(task.items_done), len(task.items_searching), task.percentage) else: task_state = "Last scheduler run: %s; Next scheduled run: %s; Last runtime: %s" % ( scheduler.last_run(task_name) or "never", scheduler.next_run(task_name) or "never", str(task.last_run_time).split(".")[0], ) oc.add( DirectoryObject( key=Callback(RefreshMissing), title="Search for missing subtitles (in recently-added items, max-age: %s)" % Prefs["scheduler.item_is_recent_age"], summary="Automatically run periodically by the scheduler, if configured. %s" % task_state, ) ) oc.add( DirectoryObject( key=Callback(IgnoreListMenu), title="Display ignore list (%d)" % len(ignore_list), summary="Show the current ignore list (mainly used for the automatic tasks)", ) ) oc.add( DirectoryObject( key=Callback(fatality, force_title=" ", randomize=timestamp()), title=pad_title("Refresh"), 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", ), ) ) if not only_refresh: oc.add( DirectoryObject( key=Callback(AdvancedMenu), title=pad_title("Advanced functions"), summary="Use at your own risk" ) ) return oc
def SubtitleModificationsMenu(**kwargs): rating_key = kwargs["rating_key"] part_id = kwargs["part_id"] language = kwargs["language"] lang_instance = Language.fromietf(language) current_sub, stored_subs, storage = get_current_sub(rating_key, part_id, language) kwargs.pop("randomize") current_mods = current_sub.mods or [] oc = SubFolderObjectContainer(title2=kwargs["title"], replace_parent=True) from interface.item_details import SubtitleOptionsMenu oc.add(DirectoryObject( key=Callback(SubtitleOptionsMenu, randomize=timestamp(), **kwargs), title=_(u"< Back to subtitle options for: %s", kwargs["title"]), summary=unicode(kwargs["current_data"]), thumb=default_thumb )) for identifier, mod in mod_registry.mods.iteritems(): if mod.advanced: continue if mod.exclusive and identifier in current_mods: continue if mod.languages and lang_instance not in mod.languages: continue oc.add(DirectoryObject( key=Callback(SubtitleSetMods, mods=identifier, mode="add", randomize=timestamp(), **kwargs), title=pad_title(_(mod.description)), summary=_(mod.long_description) or "" )) fps_mod = SubtitleModifications.get_mod_class("change_FPS") oc.add(DirectoryObject( key=Callback(SubtitleFPSModMenu, randomize=timestamp(), **kwargs), title=pad_title(_(fps_mod.description)), summary=_(fps_mod.long_description) or "" )) shift_mod = SubtitleModifications.get_mod_class("shift_offset") oc.add(DirectoryObject( key=Callback(SubtitleShiftModUnitMenu, randomize=timestamp(), **kwargs), title=pad_title(_(shift_mod.description)), summary=_(shift_mod.long_description) or "" )) color_mod = SubtitleModifications.get_mod_class("color") oc.add(DirectoryObject( key=Callback(SubtitleColorModMenu, randomize=timestamp(), **kwargs), title=pad_title(_(color_mod.description)), summary=_(color_mod.long_description) or "" )) if current_mods: oc.add(DirectoryObject( key=Callback(SubtitleSetMods, mods=None, mode="remove_last", randomize=timestamp(), **kwargs), title=pad_title(_("Remove last applied mod (%s)", current_mods[-1])), summary=_(u"Currently applied mods: %(mod_list)s", mod_list=", ".join(current_mods) if current_mods else _("none")) )) oc.add(DirectoryObject( key=Callback(SubtitleListMods, randomize=timestamp(), **kwargs), title=pad_title(_("Manage applied mods")), summary=_(u"Currently applied mods: %(mod_list)s", mod_list=", ".join(current_mods)) )) oc.add(DirectoryObject( key=Callback(SubtitleReapplyMods, randomize=timestamp(), **kwargs), title=pad_title(_("Reapply applied mods")), summary=_(u"Currently applied mods: %(mod_list)s", mod_list=", ".join(current_mods) if current_mods else _("none")) )) oc.add(DirectoryObject( key=Callback(SubtitleSetMods, mods=None, mode="clear", randomize=timestamp(), **kwargs), title=pad_title(_("Restore original version")), summary=_(u"Currently applied mods: %(mod_list)s", mod_list=", ".join(current_mods) if current_mods else _("none")) )) storage.destroy() return oc
def InclExclMenu(kind, rating_key, title=None, sure=False, todo="not_set"): """ displays the ignore options for a menu :param kind: :param rating_key: :param title: :param sure: :param todo: :return: """ ref_list = get_decision_list() include = ref_list.store == "include" list_str_ref = "include" if include else "ignore" in_list = rating_key in ref_list[kind] if include: # shortcut sure = True todo = "add" if not in_list else "remove" if not sure: t = u"Add %(kind)s %(title)s to the ignore list" if in_list: t = u"Remove %(kind)s %(title)s from the ignore list" oc = SubFolderObjectContainer(no_history=True, replace_parent=True, title1=_(t, kind=ref_list.verbose(kind), title=title), title2=_("Are you sure?")) oc.add( DirectoryObject( key=Callback(InclExclMenu, kind=kind, rating_key=rating_key, title=title, sure=True, todo="add" if not in_list else "remove"), title=pad_title(_("Are you sure?")), )) return oc rel = ref_list[kind] dont_change = False state = None if todo == "remove": if not in_list: dont_change = True else: rel.remove(rating_key) Log.Info("Removed %s (%s) from the %s list", title, rating_key, list_str_ref) ref_list.remove_title(kind, rating_key) ref_list.save() elif todo == "add": if in_list: dont_change = True else: rel.append(rating_key) Log.Info("Added %s (%s) to the %s list", title, rating_key, list_str_ref) ref_list.add_title(kind, rating_key, title) ref_list.save() else: dont_change = True if dont_change: return fatality(force_title=" ", header=_("Didn't change the %(incl_excl_list_name)s", incl_excl_list_name=_(list_str_ref)), no_history=True) if include: t = "%(title)s added to the include list" if todo == "remove": t = "%(title)s removed from the include list" else: t = "%(title)s added to the ignore list" if todo == "remove": t = "%(title)s removed from the ignore list" return fatality(force_title=" ", header=_( t, title=title, ), no_history=True)
def AdvancedMenu(randomize=None, header=None, message=None): oc = SubFolderObjectContainer(header=header or "Internal stuff, pay attention!", message=message, no_cache=True, no_history=True, replace_parent=False, title2="Advanced") if config.lock_advanced_menu and not config.pin_correct: oc.add( DirectoryObject( key=Callback(PinMenu, randomize=timestamp(), success_go_to="advanced"), title=pad_title("Enter PIN"), summary= "The owner has restricted the access to this menu. Please enter the correct pin", )) return oc oc.add( DirectoryObject( key=Callback(TriggerRestart, randomize=timestamp()), title=pad_title("Restart the plugin"), )) oc.add( DirectoryObject( key=Callback(GetLogsLink), title= "Get my logs (copy the appearing link and open it in your browser, please)", summary= "Copy the appearing link and open it in your browser, please", )) oc.add( DirectoryObject( key=Callback(TriggerBetterSubtitles, randomize=timestamp()), title=pad_title("Trigger find better subtitles"), )) oc.add( DirectoryObject( key=Callback(SkipFindBetterSubtitles, randomize=timestamp()), title=pad_title( "Skip next find better subtitles (sets last run to now)"), )) oc.add( DirectoryObject( key=Callback(TriggerStorageMaintenance, randomize=timestamp()), title=pad_title("Trigger subtitle storage maintenance"), )) oc.add( DirectoryObject( key=Callback(TriggerStorageMigration, randomize=timestamp()), title=pad_title("Trigger subtitle storage migration (expensive)"), )) oc.add( DirectoryObject( key=Callback(TriggerCacheMaintenance, randomize=timestamp()), title=pad_title( "Trigger cache maintenance (refiners, providers and packs/archives)" ), )) oc.add( DirectoryObject( key=Callback(ApplyDefaultMods, randomize=timestamp()), title=pad_title( "Apply configured default subtitle mods to all (active) stored subtitles" ), )) oc.add( DirectoryObject( key=Callback(ReApplyMods, randomize=timestamp()), title=pad_title("Re-Apply mods of all stored subtitles"), )) oc.add( DirectoryObject( key=Callback(LogStorage, key="tasks", randomize=timestamp()), title=pad_title("Log the plugin's scheduled tasks state storage"), )) oc.add( DirectoryObject( key=Callback(LogStorage, key="ignore", randomize=timestamp()), title=pad_title("Log the plugin's internal ignorelist storage"), )) oc.add( DirectoryObject( key=Callback(LogStorage, key=None, randomize=timestamp()), title=pad_title("Log the plugin's complete state storage"), )) oc.add( DirectoryObject( key=Callback(ResetStorage, key="tasks", randomize=timestamp()), title=pad_title( "Reset the plugin's scheduled tasks state storage"), )) oc.add( DirectoryObject( key=Callback(ResetStorage, key="ignore", randomize=timestamp()), title=pad_title("Reset the plugin's internal ignorelist storage"), )) oc.add( DirectoryObject( key=Callback(ResetStorage, key="menu_history", randomize=timestamp()), title=pad_title("Reset the plugin's menu history storage"), )) oc.add( DirectoryObject( key=Callback(InvalidateCache, randomize=timestamp()), title=pad_title( "Invalidate Sub-Zero metadata caches (subliminal)"), )) oc.add( DirectoryObject( key=Callback(ResetProviderThrottle, randomize=timestamp()), title=pad_title("Reset provider throttle states"), )) return oc
def AdvancedMenu(randomize=None, header=None, message=None): oc = SubFolderObjectContainer( header=header or _("Internal stuff, pay attention!"), message=message, no_cache=True, no_history=True, replace_parent=False, title2=_("Advanced")) if config.lock_advanced_menu and not config.pin_correct: oc.add(DirectoryObject( key=Callback( PinMenu, randomize=timestamp(), success_go_to=_("advanced")), title=pad_title(_("Enter PIN")), summary=_("The owner has restricted the access to this menu. Please enter the correct pin"), )) return oc oc.add(DirectoryObject( key=Callback(TriggerRestart, randomize=timestamp()), title=pad_title(_("Restart the plugin")), )) oc.add(DirectoryObject( key=Callback(GetLogsLink), title=_("Get my logs (copy the appearing link and open it in your browser, please)"), summary=_("Copy the appearing link and open it in your browser, please"), )) oc.add(DirectoryObject( key=Callback(TriggerBetterSubtitles, randomize=timestamp()), title=pad_title(_("Trigger find better subtitles")), )) oc.add(DirectoryObject( key=Callback(SkipFindBetterSubtitles, randomize=timestamp()), title=pad_title(_("Skip next find better subtitles (sets last run to now)")), )) oc.add(DirectoryObject( key=Callback(SkipRecentlyAddedMissing, randomize=timestamp()), title=pad_title(_("Skip next find recently added with missing subtitles (sets last run to now)")), )) oc.add(DirectoryObject( key=Callback(TriggerStorageMaintenance, randomize=timestamp()), title=pad_title(_("Trigger subtitle storage maintenance")), )) oc.add(DirectoryObject( key=Callback(TriggerStorageMigration, randomize=timestamp()), title=pad_title(_("Trigger subtitle storage migration (expensive)")), )) oc.add(DirectoryObject( key=Callback(TriggerCacheMaintenance, randomize=timestamp()), title=pad_title(_("Trigger cache maintenance (refiners, providers and packs/archives)")), )) oc.add(DirectoryObject( key=Callback(ApplyDefaultMods, randomize=timestamp()), title=pad_title(_("Apply configured default subtitle mods to all (active) stored subtitles")), )) oc.add(DirectoryObject( key=Callback(ReApplyMods, randomize=timestamp()), title=pad_title(_("Re-Apply mods of all stored subtitles")), )) oc.add(DirectoryObject( key=Callback(LogStorage, key="tasks", randomize=timestamp()), title=pad_title(_("Log the plugin's scheduled tasks state storage")), )) oc.add(DirectoryObject( key=Callback(LogStorage, key="ignore", randomize=timestamp()), title=pad_title(_("Log the plugin's internal ignorelist storage")), )) oc.add(DirectoryObject( key=Callback(LogStorage, key=None, randomize=timestamp()), title=pad_title(_("Log the plugin's complete state storage")), )) oc.add(DirectoryObject( key=Callback(ResetStorage, key="tasks", randomize=timestamp()), title=pad_title(_("Reset the plugin's scheduled tasks state storage")), )) oc.add(DirectoryObject( key=Callback(ResetStorage, key="ignore", randomize=timestamp()), title=pad_title(_("Reset the plugin's internal ignorelist storage")), )) oc.add(DirectoryObject( key=Callback(ResetStorage, key="menu_history", randomize=timestamp()), title=pad_title(_("Reset the plugin's menu history storage")), )) oc.add(DirectoryObject( key=Callback(InvalidateCache, randomize=timestamp()), title=pad_title(_("Invalidate Sub-Zero metadata caches (subliminal)")), )) oc.add(DirectoryObject( key=Callback(ResetProviderThrottle, randomize=timestamp()), title=pad_title(_("Reset provider throttle states")), )) return oc
def SubtitleModificationsMenu(**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") current_mods = current_sub.mods or [] oc = SubFolderObjectContainer(title2=kwargs["title"], replace_parent=True) from interface.item_details import SubtitleOptionsMenu oc.add(DirectoryObject( key=Callback(SubtitleOptionsMenu, randomize=timestamp(), **kwargs), title=u"< Back to subtitle options for: %s" % kwargs["title"], summary=kwargs["current_data"], thumb=default_thumb )) for identifier, mod in mod_registry.mods.iteritems(): if mod.advanced: continue if mod.exclusive and identifier in current_mods: continue oc.add(DirectoryObject( key=Callback(SubtitleSetMods, mods=identifier, mode="add", randomize=timestamp(), **kwargs), title=pad_title(mod.description), summary=mod.long_description or "" )) fps_mod = SubtitleModifications.get_mod_class("change_FPS") oc.add(DirectoryObject( key=Callback(SubtitleFPSModMenu, randomize=timestamp(), **kwargs), title=pad_title(fps_mod.description), summary=fps_mod.long_description or "" )) shift_mod = SubtitleModifications.get_mod_class("shift_offset") oc.add(DirectoryObject( key=Callback(SubtitleShiftModUnitMenu, randomize=timestamp(), **kwargs), title=pad_title(shift_mod.description), summary=shift_mod.long_description or "" )) color_mod = SubtitleModifications.get_mod_class("color") oc.add(DirectoryObject( key=Callback(SubtitleColorModMenu, randomize=timestamp(), **kwargs), title=pad_title(color_mod.description), summary=color_mod.long_description or "" )) if current_mods: oc.add(DirectoryObject( key=Callback(SubtitleSetMods, mods=None, mode="remove_last", randomize=timestamp(), **kwargs), title=pad_title("Remove last applied mod (%s)" % current_mods[-1]), summary=u"Currently applied mods: %s" % (", ".join(current_mods) if current_mods else "none") )) oc.add(DirectoryObject( key=Callback(SubtitleListMods, randomize=timestamp(), **kwargs), title=pad_title("Manage applied mods"), summary=u"Currently applied mods: %s" % (", ".join(current_mods)) )) oc.add(DirectoryObject( key=Callback(SubtitleReapplyMods, randomize=timestamp(), **kwargs), title=pad_title("Reapply applied mods"), summary=u"Currently applied mods: %s" % (", ".join(current_mods) if current_mods else "none") )) oc.add(DirectoryObject( key=Callback(SubtitleSetMods, mods=None, mode="clear", randomize=timestamp(), **kwargs), title=pad_title("Restore original version"), summary=u"Currently applied mods: %s" % (", ".join(current_mods) if current_mods else "none") )) storage.destroy() return oc
def InclExclMenu(kind, rating_key, title=None, sure=False, todo="not_set"): """ displays the ignore options for a menu :param kind: :param rating_key: :param title: :param sure: :param todo: :return: """ ref_list = get_decision_list() include = ref_list.store == "include" list_str_ref = "include" if include else "ignore" in_list = rating_key in ref_list[kind] if include: # shortcut sure = True todo = "add" if not in_list else "remove" if not sure: t = u"Add %(kind)s %(title)s to the ignore list" if in_list: t = u"Remove %(kind)s %(title)s from the ignore list" oc = SubFolderObjectContainer(no_history=True, replace_parent=True, title1=_(t, kind=ref_list.verbose(kind), title=title ), title2=_("Are you sure?")) oc.add(DirectoryObject( key=Callback(InclExclMenu, kind=kind, rating_key=rating_key, title=title, sure=True, todo="add" if not in_list else "remove"), title=pad_title(_("Are you sure?")), )) return oc rel = ref_list[kind] dont_change = False state = None if todo == "remove": if not in_list: dont_change = True else: rel.remove(rating_key) Log.Info("Removed %s (%s) from the %s list", title, rating_key, list_str_ref) ref_list.remove_title(kind, rating_key) ref_list.save() elif todo == "add": if in_list: dont_change = True else: rel.append(rating_key) Log.Info("Added %s (%s) to the %s list", title, rating_key, list_str_ref) ref_list.add_title(kind, rating_key, title) ref_list.save() else: dont_change = True if dont_change: return fatality(force_title=" ", header=_("Didn't change the %(incl_excl_list_name)s", incl_excl_list_name=_(list_str_ref)), no_history=True) if include: t = "%(title)s added to the include list" if todo == "remove": t = "%(title)s removed from the include list" else: t = "%(title)s added to the ignore list" if todo == "remove": t = "%(title)s removed from the ignore list" return fatality(force_title=" ", header=_(t, title=title,), no_history=True)
def fatality(randomize=None, force_title=None, header=None, message=None, only_refresh=False, no_history=False, replace_parent=False): """ subzero main menu """ from interface.advanced import PinMenu, ClearPin, AdvancedMenu from interface.menu import RefreshMissing, IgnoreListMenu, HistoryMenu title = config.full_version # force_title if force_title is not None else config.full_version oc = ObjectContainer(title1=title, title2=title, header=unicode(header) if header else title, message=message, no_history=no_history, replace_parent=replace_parent, no_cache=True) # always re-check permissions config.refresh_permissions_status() # always re-check enabled sections config.refresh_enabled_sections() if config.lock_menu and not config.pin_correct: oc.add(DirectoryObject( key=Callback(PinMenu, randomize=timestamp()), title=pad_title(_("Enter PIN")), summary=_("The owner has restricted the access to this menu. Please enter the correct pin"), )) return oc if not config.permissions_ok and config.missing_permissions: if not isinstance(config.missing_permissions, list): oc.add(DirectoryObject( key=Callback(fatality, randomize=timestamp()), title=pad_title(_("Insufficient permissions")), summary=config.missing_permissions, )) else: for title, path in config.missing_permissions: oc.add(DirectoryObject( key=Callback(fatality, randomize=timestamp()), title=pad_title(_("Insufficient permissions")), summary=_("Insufficient permissions on library %(title)s, folder: %(path)s", title=title, path=path), )) return oc if not config.enabled_sections: oc.add(DirectoryObject( key=Callback(fatality, randomize=timestamp()), title=pad_title(_("I'm not enabled!")), summary=_("Please enable me for some of your libraries in your server settings; currently I do nothing"), )) return oc if not only_refresh: if Dict["current_refresh_state"]: oc.add(DirectoryObject( key=Callback(fatality, force_title=" ", randomize=timestamp()), title=pad_title(_("Working ... refresh here")), 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") ) )) oc.add(DirectoryObject( key=Callback(OnDeckMenu), title=_("On-deck items"), summary=_("Shows the current on deck items and allows you to individually (force-) refresh their metadata/subtitles."), thumb=R("icon-ondeck.jpg") )) if "last_played_items" in Dict and Dict["last_played_items"]: oc.add(DirectoryObject( key=Callback(RecentlyPlayedMenu), title=pad_title(_("Recently played items")), summary=_("Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.", config.store_recently_played_amount), thumb=R("icon-played.jpg") )) oc.add(DirectoryObject( key=Callback(RecentlyAddedMenu), title=_("Recently-added items"), summary=_("Shows the recently added items per section."), thumb=R("icon-added.jpg") )) oc.add(DirectoryObject( key=Callback(RecentMissingSubtitlesMenu, randomize=timestamp()), title=_("Show recently added items with missing subtitles"), summary=_("Lists items with missing subtitles. Click on \"Find recent items with missing subs\" to update list"), thumb=R("icon-missing.jpg") )) oc.add(DirectoryObject( key=Callback(SectionsMenu), title=_("Browse all items"), summary=_("Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items."), thumb=R("icon-browse.jpg") )) task_name = "SearchAllRecentlyAddedMissing" task = scheduler.task(task_name) if task.ready_for_display: task_state = _("Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)", items_done=task.items_done, items_searching=task.items_searching, percentage=task.percentage) else: lr = scheduler.last_run(task_name) nr = scheduler.next_run(task_name) task_state = _("Last run: %s; Next scheduled run: %s; Last runtime: %s", df(scheduler.last_run(task_name)) if lr else "never", df(scheduler.next_run(task_name)) if nr else "never", str(task.last_run_time).split(".")[0]) oc.add(DirectoryObject( key=Callback(RefreshMissing, randomize=timestamp()), title=_("Search for missing subtitles (in recently-added items, max-age: %s)", Prefs[ "scheduler.item_is_recent_age"]), summary=_("Automatically run periodically by the scheduler, if configured. %s", task_state), thumb=R("icon-search.jpg") )) ref_list = get_decision_list() incl_excl_ref = _("include list") if ref_list.store == "include" else _("ignore list") oc.add(DirectoryObject( key=Callback(IgnoreListMenu), title=_("Display %(incl_excl_list_name)s (%(count)d)", incl_excl_list_name=incl_excl_ref, count=len(ref_list)), summary=_("Show the current %(incl_excl_list_name)s (mainly used for the automatic tasks)", incl_excl_list_name=incl_excl_ref), thumb=R("icon-ignore.jpg") )) oc.add(DirectoryObject( key=Callback(HistoryMenu), title=_("History"), summary=_("Show the last %i downloaded subtitles", int(Prefs["history_size"])), thumb=R("icon-history.jpg") )) oc.add(DirectoryObject( key=Callback(fatality, force_title=" ", randomize=timestamp()), title=pad_title(_("Refresh")), 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") ), thumb=R("icon-refresh.jpg") )) # add re-lock after pin unlock if config.pin: oc.add(DirectoryObject( key=Callback(ClearPin, randomize=timestamp()), title=pad_title(_("Re-lock menu(s)")), summary=_("Enabled the PIN again for menu(s)") )) if not only_refresh: if "provider_throttle" in Dict and Dict["provider_throttle"].keys(): summary_data = [] for provider, data in Dict["provider_throttle"].iteritems(): reason, until, desc = data summary_data.append(unicode(_("%(throttled_provider)s until %(until_date)s (%(reason)s)", throttled_provider=provider, until_date=until.strftime("%y/%m/%d %H:%M"), reason=reason))) oc.add(DirectoryObject( key=Callback(fatality, force_title=" ", randomize=timestamp()), title=pad_title(_("Throttled providers: %s", ", ".join(Dict["provider_throttle"].keys()))), summary=", ".join(summary_data), thumb=R("icon-throttled.jpg") )) oc.add(DirectoryObject( key=Callback(AdvancedMenu), title=pad_title(_("Advanced functions")), summary=_("Use at your own risk"), thumb=R("icon-advanced.jpg") )) return oc