Beispiel #1
0
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
Beispiel #2
0
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
Beispiel #3
0
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
Beispiel #4
0
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
Beispiel #5
0
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
Beispiel #7
0
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)
    )
Beispiel #8
0
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
Beispiel #9
0
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)
Beispiel #10
0
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
Beispiel #11
0
 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")
         )
     ))
Beispiel #12
0
 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"
         )
     ))
Beispiel #13
0
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
Beispiel #14
0
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)
Beispiel #15
0
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'
    )
Beispiel #16
0
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')
Beispiel #17
0
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
Beispiel #18
0
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
Beispiel #19
0
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
Beispiel #20
0
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
Beispiel #21
0
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
Beispiel #22
0
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
Beispiel #23
0
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
Beispiel #24
0
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)
Beispiel #25
0
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
Beispiel #26
0
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
Beispiel #27
0
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
Beispiel #28
0
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)
Beispiel #29
0
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