Exemplo n.º 1
0
def SkipRecentlyAddedMissing(randomize=None):
    task = scheduler.task("SearchAllRecentlyAddedMissing")
    task.last_run = datetime.datetime.now()

    return AdvancedMenu(randomize=timestamp(),
                        header=_("Success"),
                        message=_("SearchAllRecentlyAddedMissing skipped"))
Exemplo n.º 2
0
def ManageBlacklistMenu(**kwargs):
    oc = SubFolderObjectContainer(title2=unicode(kwargs["title"]),
                                  replace_parent=True)
    rating_key = kwargs["rating_key"]
    part_id = kwargs["part_id"]
    language = kwargs["language"]
    remove_sub_key = kwargs.pop("remove_sub_key", None)
    current_data = unicode(kwargs["current_data"])

    current_sub, stored_subs, storage = get_current_sub(
        rating_key, part_id, language)
    current_bl, subs = stored_subs.get_blacklist(part_id, language)

    if remove_sub_key:
        remove_sub_key = tuple(remove_sub_key.split("__"))
        stored_subs.blacklist(part_id, language, remove_sub_key, add=False)
        storage.save(stored_subs)
        Log.Info("Removed %s from blacklist", remove_sub_key)

    kwargs.pop("randomize")

    oc.add(
        DirectoryObject(key=Callback(ItemDetailsMenu,
                                     rating_key=kwargs["rating_key"],
                                     item_title=kwargs["item_title"],
                                     title=kwargs["title"],
                                     randomize=timestamp()),
                        title=_(u"< Back to %s", kwargs["title"]),
                        summary=current_data,
                        thumb=default_thumb))

    def sorter(pair):
        # thanks RestrictedModule parser for messing with lambda (x, y)
        return pair[1]["date_added"]

    for sub_key, data in sorted(current_bl.iteritems(),
                                key=sorter,
                                reverse=True):
        provider_name, subtitle_id = sub_key
        title = _(
            u"%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, "
            u"Score: %(score)i, Storage: %(storage_type)s",
            provider_name=provider_name,
            subtitle_id=subtitle_id,
            date_added=df(data["date_added"]),
            mode=current_sub.get_mode_verbose(data["mode"]),
            language=display_language(Language.fromietf(language)),
            score=data["score"],
            storage_type=data["storage_type"])
        oc.add(
            DirectoryObject(key=Callback(ManageBlacklistMenu,
                                         remove_sub_key="__".join(sub_key),
                                         randomize=timestamp(),
                                         **kwargs),
                            title=title,
                            summary=_(u"Remove subtitle from blacklist")))

    storage.destroy()

    return oc
Exemplo n.º 3
0
def SelectStoredSubForItemMenu(**kwargs):
    rating_key = kwargs["rating_key"]
    part_id = kwargs["part_id"]
    language = Language.fromietf(kwargs["language"])
    item_type = kwargs["item_type"]
    sub_key = tuple(kwargs.pop("sub_key").split("__"))

    plex_item = get_item(rating_key)
    storage = get_subtitle_storage()
    stored_subs = storage.load(plex_item.rating_key)

    subtitles = stored_subs.get_all(part_id, language)
    subtitle = subtitles[sub_key]

    subtitles["current"] = sub_key

    save_stored_sub(subtitle,
                    rating_key,
                    part_id,
                    language,
                    item_type,
                    plex_item=plex_item,
                    storage=storage,
                    stored_subs=stored_subs)

    storage.destroy()

    kwargs.pop("randomize")

    kwargs["header"] = _("Success")
    kwargs["message"] = _("Subtitle saved to disk")

    return SubtitleOptionsMenu(randomize=timestamp(), **kwargs)
Exemplo n.º 4
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
Exemplo n.º 5
0
def HistoryMenu():
    from support.history import get_history
    history = get_history()
    oc = SubFolderObjectContainer(title2=_("History"), replace_parent=True)

    for item in history.items[:100]:
        possible_language = item.language
        language_display = item.lang_name if not possible_language else display_language(
            possible_language)

        oc.add(
            DirectoryObject(key=Callback(ItemDetailsMenu,
                                         title=item.title,
                                         item_title=item.item_title,
                                         rating_key=item.rating_key),
                            title=u"%s (%s)" %
                            (item.item_title, _(item.mode_verbose)),
                            summary=_(u"%s in %s (%s, score: %s), %s",
                                      language_display, item.section_title,
                                      _(item.provider_name), item.score,
                                      df(item.time)),
                            thumb=item.thumb or default_thumb))

    history.destroy()

    return oc
Exemplo n.º 6
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)
    )
Exemplo n.º 7
0
def TriggerCacheMaintenance(randomize=None):
    scheduler.dispatch_task("CacheMaintenance")
    return AdvancedMenu(
        randomize=timestamp(),
        header=_("Success"),
        message=_("TriggerCacheMaintenance triggered")
    )
Exemplo n.º 8
0
def ReApplyMods(randomize=None):
    Thread.CreateTimer(1.0, apply_default_mods, reapply_current=True)
    return AdvancedMenu(
        randomize=timestamp(),
        header=_("Success"),
        message=_("This may take some time ...")
    )
Exemplo n.º 9
0
def TriggerBetterSubtitles(randomize=None):
    scheduler.dispatch_task("FindBetterSubtitles")
    return AdvancedMenu(
        randomize=timestamp(),
        header=_("Success"),
        message=_("FindBetterSubtitles triggered")
    )
Exemplo n.º 10
0
def TriggerStorageMigration(randomize=None):
    scheduler.dispatch_task("MigrateSubtitleStorage")
    return AdvancedMenu(
        randomize=timestamp(),
        header=_("Success"),
        message=_("MigrateSubtitleStorage triggered")
    )
Exemplo n.º 11
0
def OnDeckMenu(message=None):
    """
    displays the items on deck
    :param message:
    :return:
    """
    return mergedItemsMenu(title=_("Items On Deck"), base_title=_("Items On Deck"), itemGetter=get_on_deck_items)
Exemplo n.º 12
0
def LogStorage(key, randomize=None):
    log_storage(key)
    return AdvancedMenu(
        randomize=timestamp(),
        header=_("Success"),
        message=_("Information Storage (%s) logged", key)
    )
Exemplo n.º 13
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
Exemplo n.º 14
0
def SelectStoredSubForItemMenu(**kwargs):
    rating_key = kwargs["rating_key"]
    part_id = kwargs["part_id"]
    language = Language.fromietf(kwargs["language"])
    item_type = kwargs["item_type"]
    sub_key = tuple(kwargs.pop("sub_key").split("__"))

    plex_item = get_item(rating_key)
    storage = get_subtitle_storage()
    stored_subs = storage.load(plex_item.rating_key)

    subtitles = stored_subs.get_all(part_id, language)
    subtitle = subtitles[sub_key]

    save_stored_sub(subtitle, rating_key, part_id, language, item_type, plex_item=plex_item, storage=storage,
                    stored_subs=stored_subs)

    stored_subs.set_current(part_id, language, sub_key)
    storage.save(stored_subs)
    storage.destroy()

    kwa = {
        "header": _("Success"),
        "message": _("Subtitle saved to disk"),
        "title": kwargs["title"],
        "item_title": kwargs["item_title"],
        "base_title": kwargs.get("base_title")
    }

    # fixme: return to SubtitleOptionsMenu properly? (needs recomputation of current_data

    return ItemDetailsMenu(rating_key, randomize=timestamp(), **kwa)
Exemplo n.º 15
0
def SkipFindBetterSubtitles(randomize=None):
    task = scheduler.task("FindBetterSubtitles")
    task.last_run = datetime.datetime.now()

    return AdvancedMenu(randomize=timestamp(),
                        header=_("Success"),
                        message=_("FindBetterSubtitles skipped"))
Exemplo n.º 16
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))
Exemplo n.º 17
0
def ResetProviderThrottle(randomize=None):
    Dict["provider_throttle"] = {}
    Dict.Save()
    return AdvancedMenu(
        randomize=timestamp(),
        header=_("Success"),
        message=_("Provider throttles reset")
    )
Exemplo n.º 18
0
def SkipRecentlyAddedMissing(randomize=None):
    task = scheduler.task("SearchAllRecentlyAddedMissing")
    task.last_run = datetime.datetime.now()

    return AdvancedMenu(
        randomize=timestamp(),
        header=_("Success"),
        message=_("SearchAllRecentlyAddedMissing skipped")
    )
Exemplo n.º 19
0
def SkipFindBetterSubtitles(randomize=None):
    task = scheduler.task("FindBetterSubtitles")
    task.last_run = datetime.datetime.now()

    return AdvancedMenu(
        randomize=timestamp(),
        header=_("Success"),
        message=_("FindBetterSubtitles skipped")
    )
Exemplo n.º 20
0
def InvalidateCache(randomize=None):
    from subliminal.cache import region
    if config.new_style_cache:
        region.backend.clear()
    else:
        region.invalidate()
    return AdvancedMenu(randomize=timestamp(),
                        header=_("Success"),
                        message=_("Cache invalidated"))
Exemplo n.º 21
0
def TriggerRestart(randomize=None):
    set_refresh_menu_state(_("Restarting the plugin"))
    DispatchRestart()
    return fatality(header=_("Restart triggered, please wait about 5 seconds"),
                    force_title=" ",
                    only_refresh=True,
                    replace_parent=True,
                    no_history=True,
                    randomize=timestamp())
Exemplo n.º 22
0
def OnDeckMenu(message=None):
    """
    displays the items on deck
    :param message:
    :return:
    """
    return mergedItemsMenu(title=_("Items On Deck"),
                           base_title=_("Items On Deck"),
                           itemGetter=get_on_deck_items)
Exemplo n.º 23
0
def TriggerRestart(randomize=None):
    set_refresh_menu_state(_("Restarting the plugin"))
    DispatchRestart()
    return fatality(
            header=_("Restart triggered, please wait about 5 seconds"),
            force_title=" ",
            only_refresh=True,
            replace_parent=True,
            no_history=True,
            randomize=timestamp())
Exemplo n.º 24
0
def InvalidateCache(randomize=None):
    from subliminal.cache import region
    if config.new_style_cache:
        region.backend.clear()
    else:
        region.invalidate()
    return AdvancedMenu(
        randomize=timestamp(),
        header=_("Success"),
        message=_("Cache invalidated")
    )
Exemplo n.º 25
0
def SectionsMenu(base_title=_("Sections"), section_items_key="all", ignore_options=True):
    """
    displays the menu for all sections
    :return:
    """
    items = get_all_items("sections")

    return dig_tree(SubFolderObjectContainer(title2=_("Sections"), no_cache=True, no_history=True), items, None,
                    menu_determination_callback=determine_section_display, pass_kwargs={"base_title": base_title,
                                                                                        "section_items_key": section_items_key,
                                                                                        "ignore_options": ignore_options},
                    fill_args={"title": "section_title"})
Exemplo n.º 26
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")
         )
     ))
Exemplo n.º 27
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")
         )
     ))
Exemplo n.º 28
0
def SubtitleOptionsMenu(**kwargs):
    oc = SubFolderObjectContainer(title2=unicode(kwargs["title"]), replace_parent=True, header=kwargs.get("header"),
                                  message=kwargs.get("message"))
    rating_key = kwargs["rating_key"]
    part_id = kwargs["part_id"]
    language = kwargs["language"]
    current_data = unicode(kwargs["current_data"])

    current_sub, stored_subs, storage = get_current_sub(rating_key, part_id, language)
    subs_count = stored_subs.count(part_id, language)
    kwargs.pop("randomize")

    oc.add(DirectoryObject(
        key=Callback(ItemDetailsMenu, rating_key=kwargs["rating_key"], item_title=kwargs["item_title"],
                     title=kwargs["title"], randomize=timestamp()),
        title=_(u"< Back to %s", kwargs["title"]),
        summary=current_data,
        thumb=default_thumb
    ))
    if subs_count:
        oc.add(DirectoryObject(
            key=Callback(ListStoredSubsForItemMenu, randomize=timestamp(), **kwargs),
            title=_(u"Select active %(language)s subtitle", language=kwargs["language_name"]),
            summary=_(u"%(count)d subtitles in storage", count=subs_count)
        ))

    oc.add(DirectoryObject(
        key=Callback(ListAvailableSubsForItemMenu, randomize=timestamp(), **kwargs),
        title=_(u"List available %(language)s subtitles", language=kwargs["language_name"]),
        summary=current_data
    ))
    if current_sub:
        oc.add(DirectoryObject(
            key=Callback(SubtitleModificationsMenu, randomize=timestamp(), **kwargs),
            title=_(u"Modify current %(language)s subtitle", language=kwargs["language_name"]),
            summary=_(u"Currently applied mods: %(mod_list)s",
                      mod_list=(", ".join(current_sub.mods) if current_sub.mods else "none"))
        ))

        if current_sub.provider_name != "embedded":
            oc.add(DirectoryObject(
                key=Callback(BlacklistSubtitleMenu, randomize=timestamp(), **kwargs),
                title=_(u"Blacklist current %(language)s subtitle and search for a new one",
                        language=kwargs["language_name"]),
                summary=current_data
            ))

        current_bl, subs = stored_subs.get_blacklist(part_id, language)
        if current_bl:
            oc.add(DirectoryObject(
                key=Callback(ManageBlacklistMenu, randomize=timestamp(), **kwargs),
                title=_(u"Manage blacklist (%(amount)s contained)", amount=len(current_bl)),
                summary=_(u"Inspect currently blacklisted subtitles")
            ))

    storage.destroy()
    return oc
Exemplo n.º 29
0
def ManageBlacklistMenu(**kwargs):
    oc = SubFolderObjectContainer(title2=unicode(kwargs["title"]), replace_parent=True)
    rating_key = kwargs["rating_key"]
    part_id = kwargs["part_id"]
    language = kwargs["language"]
    remove_sub_key = kwargs.pop("remove_sub_key", None)
    current_data = unicode(kwargs["current_data"])

    current_sub, stored_subs, storage = get_current_sub(rating_key, part_id, language)
    current_bl, subs = stored_subs.get_blacklist(part_id, language)

    if remove_sub_key:
        remove_sub_key = tuple(remove_sub_key.split("__"))
        stored_subs.blacklist(part_id, language, remove_sub_key, add=False)
        storage.save(stored_subs)
        Log.Info("Removed %s from blacklist", remove_sub_key)

    kwargs.pop("randomize")

    oc.add(DirectoryObject(
        key=Callback(ItemDetailsMenu, rating_key=kwargs["rating_key"], item_title=kwargs["item_title"],
                     title=kwargs["title"], randomize=timestamp()),
        title=_(u"< Back to %s", kwargs["title"]),
        summary=current_data,
        thumb=default_thumb
    ))

    def sorter(pair):
        # thanks RestrictedModule parser for messing with lambda (x, y)
        return pair[1]["date_added"]

    for sub_key, data in sorted(current_bl.iteritems(), key=sorter, reverse=True):
        provider_name, subtitle_id = sub_key
        title = _(u"%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, "
                  u"Score: %(score)i, Storage: %(storage_type)s",
                  provider_name=_(provider_name),
                  subtitle_id=subtitle_id,
                  date_added=df(data["date_added"]),
                  mode=_(current_sub.get_mode_verbose(data["mode"])),
                  language=display_language(Language.fromietf(language)),
                  score=data["score"],
                  storage_type=data["storage_type"])
        oc.add(DirectoryObject(
            key=Callback(ManageBlacklistMenu, remove_sub_key="__".join(sub_key), randomize=timestamp(), **kwargs),
            title=title,
            summary=_(u"Remove subtitle from blacklist")
        ))

    storage.destroy()

    return oc
Exemplo n.º 30
0
def SeasonExtractEmbedded(**kwargs):
    rating_key = kwargs.get("rating_key")
    requested_language = kwargs.pop("language")
    with_mods = kwargs.pop("with_mods")
    item_title = kwargs.pop("item_title")
    title = kwargs.pop("title")
    force = kwargs.pop("force", False)

    Thread.Create(season_extract_embedded, **{"rating_key": rating_key, "requested_language": requested_language,
                                              "with_mods": with_mods, "force": force})

    kwargs["header"] = _("Success")
    kwargs["message"] = _(u"Extracting of embedded subtitles for %s triggered", title)

    kwargs.pop("randomize")
    return MetadataMenu(randomize=timestamp(), title=item_title, **kwargs)
Exemplo n.º 31
0
def SubtitleShiftModMenu(unit=None, **kwargs):
    if unit not in POSSIBLE_UNITS_D:
        raise NotImplementedError

    kwargs.pop("randomize")

    oc = SubFolderObjectContainer(title2=kwargs["title"], replace_parent=True)

    oc.add(DirectoryObject(
        key=Callback(SubtitleShiftModUnitMenu, randomize=timestamp(), **kwargs),
        title=_("< Back to unit selection")
    ))

    rng = []
    if unit == "h":
        rng = list(reversed(range(-10, 0))) + list(reversed(range(1, 11)))
    elif unit in ("m", "s"):
        rng = list(reversed(range(-15, 0))) + list(reversed(range(1, 16)))
    elif unit == "ms":
        rng = list(reversed(range(-900, 0, 100))) + list(reversed(range(100, 1000, 100)))

    for i in rng:
        if i == 0:
            continue

        mod_ident = SubtitleModifications.get_mod_signature("shift_offset", **{unit: i})
        oc.add(DirectoryObject(
            key=Callback(SubtitleSetMods, mods=mod_ident, mode="add", randomize=timestamp(), **kwargs),
            title="%s %s" % (("%s" if i < 0 else "+%s") % i, unit)
        ))

    return oc
Exemplo n.º 32
0
def add_ignore_options(oc, kind, callback_menu=None, title=None, rating_key=None, add_kind=True):
    """

    :param oc: oc to add our options to
    :param kind: movie, show, episode ... - gets translated to the ignore key (sections, series, items)
    :param callback_menu: menu to inject
    :param title:
    :param rating_key:
    :return:
    """
    # try to translate kind to the ignore key
    use_kind = kind
    if kind not in ignore_list:
        use_kind = ignore_list.translate_key(kind)
    if not use_kind or use_kind not in ignore_list:
        return

    in_list = rating_key in ignore_list[use_kind]

    t = u"Ignore %(kind)s \"%(title)s\""
    if in_list:
        t = u"Un-ignore %(kind)s \"%(title)s\""

    oc.add(DirectoryObject(
        key=Callback(callback_menu, kind=use_kind, sure=False, todo="not_set", rating_key=rating_key, title=title),
        title=_(t,
                kind=ignore_list.verbose(kind) if add_kind else "",
                title=unicode(title))
    )
    )
Exemplo n.º 33
0
def SectionFirstLetterMenu(rating_key, title=None, base_title=None, section_title=None, ignore_options=True,
                           section_items_key="all"):
    """
    displays the contents of a section indexed by its first char (A-Z, 0-9...)
    :param ignore_options: ignored
    :param section_items_key: ignored
    :param rating_key:
    :param title:
    :param base_title:
    :param section_title:
    :return:
    """
    from menu import FirstLetterMetadataMenu
    items = get_all_items(key="first_character", value=rating_key, base="library/sections")

    kind, deeper = get_items_info(items)

    title = unicode(title)
    oc = SubFolderObjectContainer(title2=section_title, no_cache=True, no_history=True)
    title = base_title + " > " + title
    add_incl_excl_options(oc, "sections", title=section_title, rating_key=rating_key, callback_menu=InclExclMenu)

    oc.add(DirectoryObject(
        key=Callback(SectionMenu, title=_("All"), base_title=title, rating_key=rating_key, ignore_options=False),
        title="All"
    )
    )
    return dig_tree(oc, items, FirstLetterMetadataMenu, force_rating_key=rating_key, fill_args={"key": "key"},
                    pass_kwargs={"base_title": title, "display_items": deeper, "previous_rating_key": rating_key})
Exemplo n.º 34
0
def TriggerDownloadSubtitle(rating_key=None,
                            subtitle_id=None,
                            item_title=None,
                            language=None,
                            randomize=None):
    from interface.main import fatality

    set_refresh_menu_state(
        _("Downloading subtitle for %(title_or_id)s",
          title_or_id=item_title or rating_key))
    search_results = get_item_task_data("AvailableSubsForItem", rating_key,
                                        language)

    download_subtitle = None
    for subtitle in search_results:
        if str(subtitle.id) == subtitle_id:
            download_subtitle = subtitle
            break
    if not download_subtitle:
        Log.Error(u"Something went horribly wrong")

    else:
        scheduler.dispatch_task("DownloadSubtitleForItem",
                                rating_key=rating_key,
                                subtitle=download_subtitle)

    scheduler.clear_task_data("AvailableSubsForItem")

    return fatality(randomize=timestamp(), header=" ", replace_parent=True)
Exemplo n.º 35
0
def SeasonExtractEmbedded(**kwargs):
    rating_key = kwargs.get("rating_key")
    requested_language = kwargs.pop("language")
    with_mods = kwargs.pop("with_mods")
    item_title = kwargs.pop("item_title")
    title = kwargs.pop("title")
    force = kwargs.pop("force", False)

    Thread.Create(season_extract_embedded, **{"rating_key": rating_key, "requested_language": requested_language,
                                              "with_mods": with_mods, "force": force})

    kwargs["header"] = _("Success")
    kwargs["message"] = _(u"Extracting of embedded subtitles for %s triggered", title)

    kwargs.pop("randomize")
    return MetadataMenu(randomize=timestamp(), title=item_title, **kwargs)
Exemplo n.º 36
0
def RecentlyPlayedMenu():
    base_title = _("Recently Played")
    oc = SubFolderObjectContainer(title2=base_title, replace_parent=True)

    for item in [
            get_item(rating_key) for rating_key in Dict["last_played_items"]
    ]:
        if not item:
            continue

        if getattr(getattr(item, "__class__"),
                   "__name__") not in ("Episode", "Movie"):
            continue

        item_title = get_item_title(item)

        oc.add(
            DirectoryObject(thumb=get_item_thumb(item) or default_thumb,
                            title=item_title,
                            key=Callback(ItemDetailsMenu,
                                         title=base_title + " > " + item.title,
                                         item_title=item.title,
                                         rating_key=item.rating_key)))

    return oc
Exemplo n.º 37
0
def RecentlyAddedMenu(message=None):
    """
    displays the items recently added per section
    :param message:
    :return:
    """
    return SectionsMenu(base_title=_("Recently added"), section_items_key="recently_added", ignore_options=False)
Exemplo n.º 38
0
def SubtitleShiftModUnitMenu(**kwargs):
    oc = SubFolderObjectContainer(title2=kwargs["title"], replace_parent=True)

    kwargs.pop("randomize")

    oc.add(DirectoryObject(
        key=Callback(SubtitleModificationsMenu, randomize=timestamp(), **kwargs),
        title=_("< Back to subtitle modifications")
    ))

    for unit, title in POSSIBLE_UNITS:
        oc.add(DirectoryObject(
            key=Callback(SubtitleShiftModMenu, unit=unit, randomize=timestamp(), **kwargs),
            title=_("Adjust by %(time_and_unit)s", time_and_unit=title)
        ))

    return oc
Exemplo n.º 39
0
def ListStoredSubsForItemMenu(**kwargs):
    oc = SubFolderObjectContainer(title2=unicode(kwargs["title"]),
                                  replace_parent=True)
    rating_key = kwargs["rating_key"]
    part_id = kwargs["part_id"]
    language = Language.fromietf(kwargs["language"])

    current_sub, stored_subs, storage = get_current_sub(
        rating_key, part_id, language)
    all_subs = stored_subs.get_all(part_id, language)
    kwargs.pop("randomize")

    for key, subtitle in sorted(filter(
            lambda x: x[0] not in ("current", "blacklist"), all_subs.items()),
                                key=lambda x: x[1].date_added,
                                reverse=True):
        is_current = key == all_subs["current"]

        summary = _(
            u"added: %(date_added)s, %(mode)s, Language: %(language)s, Score: %(score)i, Storage: "
            u"%(storage_type)s",
            date_added=df(subtitle.date_added),
            mode=subtitle.mode_verbose,
            language=display_language(language),
            score=subtitle.score,
            storage_type=subtitle.storage_type)

        sub_name = subtitle.provider_name
        if sub_name == "embedded":
            sub_name += " (%s)" % subtitle.id

        oc.add(
            DirectoryObject(
                key=Callback(SelectStoredSubForItemMenu,
                             randomize=timestamp(),
                             sub_key="__".join(key),
                             **kwargs),
                title=_(
                    u"%(current_state)s%(subtitle_name)s, Score: %(score)s",
                    current_state=_("Current: ")
                    if is_current else _("Stored: "),
                    subtitle_name=sub_name,
                    score=subtitle.score),
                summary=summary))

    return oc
Exemplo n.º 40
0
def set_refresh_menu_state(state_or_media, media_type="movies"):
    """

    :param state_or_media: string, None, or Media argument from Agent.update()
    :param media_type: movies or series
    :return:
    """
    if not state_or_media:
        # store it in last state and remove the current
        Dict["last_refresh_state"] = Dict["current_refresh_state"]
        Dict["current_refresh_state"] = None
        Dict.Save()
        return

    if isinstance(state_or_media,
                  types.StringTypes) or is_localized_string(state_or_media):
        Dict["current_refresh_state"] = unicode(state_or_media)
        Dict.Save()
        return

    media = state_or_media
    media_id = media.id
    title = None
    if media_type == "series":
        for season in media.seasons:
            for episode in media.seasons[season].episodes:
                ep = media.seasons[season].episodes[episode]
                media_id = ep.id
                title = get_video_display_title(_("show"),
                                                ep.title,
                                                parent_title=media.title,
                                                season=int(season),
                                                episode=int(episode))
    else:
        title = get_video_display_title(_("movie"), media.title)

    intent = get_intent()
    force_refresh = intent.get("force", media_id)

    t = u"Refreshing %(title)s"
    if force_refresh:
        t = u"Force-refreshing %(title)s"

    Dict["current_refresh_state"] = unicode(_(t, title=unicode(title)))
    Dict.Save()
Exemplo n.º 41
0
def RecentlyAddedMenu(message=None):
    """
    displays the items recently added per section
    :param message:
    :return:
    """
    return SectionsMenu(base_title=_("Recently added"),
                        section_items_key="recently_added",
                        ignore_options=False)
Exemplo n.º 42
0
def RecentMissingSubtitlesMenu(force=False, randomize=None):
    title = _("Items with missing subtitles")
    oc = SubFolderObjectContainer(title2=title, no_cache=True, no_history=True)

    running = scheduler.is_task_running("MissingSubtitles")
    task_data = scheduler.get_task_data("MissingSubtitles")
    missing_items = task_data["missing_subtitles"] if task_data else None

    if ((missing_items is None) or force) and not running:
        scheduler.dispatch_task("MissingSubtitles")
        running = True

    if not running:
        oc.add(
            DirectoryObject(
                key=Callback(RecentMissingSubtitlesMenu,
                             force=True,
                             randomize=timestamp()),
                title=_(u"Find recent items with missing subtitles"),
                thumb=default_thumb))
    else:
        oc.add(
            DirectoryObject(key=Callback(RecentMissingSubtitlesMenu,
                                         force=False,
                                         randomize=timestamp()),
                            title=_(u"Updating, refresh here ..."),
                            thumb=default_thumb))

    if missing_items is not None:
        for added_at, item_id, item_title, item, missing_languages in missing_items:
            oc.add(
                DirectoryObject(key=Callback(ItemDetailsMenu,
                                             title=title + " > " + item_title,
                                             item_title=item_title,
                                             rating_key=item_id),
                                title=item_title,
                                summary=_(
                                    "Missing: %s", ", ".join(
                                        display_language(l)
                                        for l in missing_languages)),
                                thumb=get_item_thumb(item) or default_thumb))

    return oc
Exemplo n.º 43
0
def GetLogsLink():
    if not config.plex_token:
        oc = ObjectContainer(title2=_("Download Logs"),
                             no_cache=True,
                             no_history=True,
                             header=_("Sorry, feature unavailable"),
                             message=_("Universal Plex token not available"))
        return oc

    # try getting the link base via the request in context, first, otherwise use the public ip
    req_headers = Core.sandbox.context.request.headers
    get_external_ip = True
    link_base = ""

    if "Origin" in req_headers:
        link_base = req_headers["Origin"]
        Log.Debug("Using origin-based link_base")
        get_external_ip = False

    elif "Referer" in req_headers:
        parsed = urlparse.urlparse(req_headers["Referer"])
        link_base = "%s://%s%s" % (parsed.scheme, parsed.hostname,
                                   (":%s" %
                                    parsed.port) if parsed.port else "")
        Log.Debug("Using referer-based link_base")
        get_external_ip = False

    if get_external_ip or "plex.tv" in link_base:
        ip = Core.networking.http_request("http://www.plexapp.com/ip.php",
                                          cacheTime=7200).content.strip()
        link_base = "https://%s:32400" % ip
        Log.Debug("Using ip-based fallback link_base")

    logs_link = "%s%s?X-Plex-Token=%s" % (link_base, PREFIX + '/logs',
                                          config.plex_token)
    oc = ObjectContainer(
        title2=logs_link,
        no_cache=True,
        no_history=True,
        header=_("Copy this link and open this in your browser, please"),
        message=logs_link)
    return oc
Exemplo n.º 44
0
def RefreshItem(rating_key=None, came_from="/recent", item_title=None, force=False, refresh_kind=None,
                previous_rating_key=None, timeout=8000, randomize=None, trigger=True):
    assert rating_key
    from interface.main import fatality
    header = " "
    if trigger:
        t = u"Triggering refresh for %(title)s"
        if force:
            u"Triggering forced refresh for %(title)s"
        set_refresh_menu_state(_(t,
                                 title=item_title))
        Thread.Create(refresh_item, rating_key=rating_key, force=force, refresh_kind=refresh_kind,
                      parent_rating_key=previous_rating_key, timeout=int(timeout))

        t = u"Refresh of item %(item_id)s triggered"
        if force:
            t = u"Forced refresh of item %(item_id)s triggered"
        header = _(t,
                   item_id=rating_key)
    return fatality(randomize=timestamp(), header=header, replace_parent=True)
Exemplo n.º 45
0
def IgnoreListMenu():
    ref_list = get_decision_list()
    include = ref_list.store == "include"
    list_title = _("Include list" if include else "Ignore list")
    oc = SubFolderObjectContainer(title2=list_title, replace_parent=True)
    for key in ref_list.key_order:
        values = ref_list[key]
        for value in values:
            add_incl_excl_options(oc, key, title=ref_list.get_title(key, value), rating_key=value,
                                  callback_menu=InclExclMenu)
    return oc
Exemplo n.º 46
0
def set_refresh_menu_state(state_or_media, media_type="movies"):
    """

    :param state_or_media: string, None, or Media argument from Agent.update()
    :param media_type: movies or series
    :return:
    """
    if not state_or_media:
        # store it in last state and remove the current
        Dict["last_refresh_state"] = Dict["current_refresh_state"]
        Dict["current_refresh_state"] = None
        Dict.Save()
        return

    if isinstance(state_or_media, types.StringTypes) or is_localized_string(state_or_media):
        Dict["current_refresh_state"] = unicode(state_or_media)
        Dict.Save()
        return

    media = state_or_media
    media_id = media.id
    title = None
    if media_type == "series":
        for season in media.seasons:
            for episode in media.seasons[season].episodes:
                ep = media.seasons[season].episodes[episode]
                media_id = ep.id
                title = get_video_display_title(_("show"), ep.title, parent_title=media.title, season=int(season), episode=int(episode))
    else:
        title = get_video_display_title(_("movie"), media.title)

    intent = get_intent()
    force_refresh = intent.get("force", media_id)

    t = u"Refreshing %(title)s"
    if force_refresh:
        t = u"Force-refreshing %(title)s"

    Dict["current_refresh_state"] = unicode(_(t,
                                              title=unicode(title)))
    Dict.Save()
Exemplo n.º 47
0
def HistoryMenu():
    from support.history import get_history
    history = get_history()
    oc = SubFolderObjectContainer(title2=_("History"), replace_parent=True)

    for item in history.items[:100]:
        possible_language = item.language
        language_display = item.lang_name if not possible_language else display_language(possible_language)

        oc.add(DirectoryObject(
            key=Callback(ItemDetailsMenu, title=item.title, item_title=item.item_title,
                         rating_key=item.rating_key),
            title=u"%s (%s)" % (item.item_title, _(item.mode_verbose)),
            summary=_(u"%s in %s (%s, score: %s), %s", language_display, item.section_title,
                                                       _(item.provider_name), item.score, df(item.time)),
            thumb=item.thumb or default_thumb
        ))

    history.destroy()

    return oc
Exemplo n.º 48
0
def SectionsMenu(
        base_title=_("Sections"), section_items_key="all",
        ignore_options=True):
    """
    displays the menu for all sections
    :return:
    """
    items = get_all_items("sections")

    return dig_tree(SubFolderObjectContainer(title2=_("Sections"),
                                             no_cache=True,
                                             no_history=True),
                    items,
                    None,
                    menu_determination_callback=determine_section_display,
                    pass_kwargs={
                        "base_title": base_title,
                        "section_items_key": section_items_key,
                        "ignore_options": ignore_options
                    },
                    fill_args={"title": "section_title"})
Exemplo n.º 49
0
def GetLogsLink():
    if not config.plex_token:
        oc = ObjectContainer(
                title2=_("Download Logs"),
                no_cache=True,
                no_history=True,
                header=_("Sorry, feature unavailable"),
                message=_("Universal Plex token not available"))
        return oc

    # try getting the link base via the request in context, first, otherwise use the public ip
    req_headers = Core.sandbox.context.request.headers
    get_external_ip = True
    link_base = ""

    if "Origin" in req_headers:
        link_base = req_headers["Origin"]
        Log.Debug("Using origin-based link_base")
        get_external_ip = False

    elif "Referer" in req_headers:
        parsed = urlparse.urlparse(req_headers["Referer"])
        link_base = "%s://%s%s" % (parsed.scheme, parsed.hostname, (":%s" % parsed.port) if parsed.port else "")
        Log.Debug("Using referer-based link_base")
        get_external_ip = False

    if get_external_ip or "plex.tv" in link_base:
        ip = Core.networking.http_request("http://www.plexapp.com/ip.php", cacheTime=7200).content.strip()
        link_base = "https://%s:32400" % ip
        Log.Debug("Using ip-based fallback link_base")

    logs_link = "%s%s?X-Plex-Token=%s" % (link_base, PREFIX + '/logs', config.plex_token)
    oc = ObjectContainer(
            title2=logs_link,
            no_cache=True,
            no_history=True,
            header=_("Copy this link and open this in your browser, please"),
            message=logs_link)
    return oc
Exemplo n.º 50
0
def SubtitleFPSModMenu(**kwargs):
    rating_key = kwargs["rating_key"]
    part_id = kwargs["part_id"]
    item_type = kwargs["item_type"]

    kwargs.pop("randomize")

    oc = SubFolderObjectContainer(title2=kwargs["title"], replace_parent=True)

    oc.add(DirectoryObject(
        key=Callback(SubtitleModificationsMenu, randomize=timestamp(), **kwargs),
        title=_("< Back to subtitle modification menu")
    ))

    metadata = get_plex_metadata(rating_key, part_id, item_type)
    scanned_parts = scan_videos([metadata], ignore_all=True, skip_hashing=True)
    video, plex_part = scanned_parts.items()[0]

    target_fps = plex_part.fps

    for fps in ["23.980", "23.976", "24.000", "25.000", "29.970", "30.000", "50.000", "59.940", "60.000"]:
        if float(fps) == float(target_fps):
            continue

        if float(fps) > float(target_fps):
            indicator = _("subs constantly getting faster")
        else:
            indicator = _("subs constantly getting slower")

        mod_ident = SubtitleModifications.get_mod_signature("change_FPS", **{"from": fps, "to": target_fps})
        oc.add(DirectoryObject(
            key=Callback(SubtitleSetMods, mods=mod_ident, mode="add", randomize=timestamp(), **kwargs),
            title=_("%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)",
                    from_fps=fps,
                    to_fps=target_fps,
                    slower_or_faster_indicator=indicator)
        ))

    return oc
Exemplo n.º 51
0
def SectionFirstLetterMenu(rating_key,
                           title=None,
                           base_title=None,
                           section_title=None,
                           ignore_options=True,
                           section_items_key="all"):
    """
    displays the contents of a section indexed by its first char (A-Z, 0-9...)
    :param ignore_options: ignored
    :param section_items_key: ignored
    :param rating_key:
    :param title:
    :param base_title:
    :param section_title:
    :return:
    """
    from menu import FirstLetterMetadataMenu
    items = get_all_items(key="first_character",
                          value=rating_key,
                          base="library/sections")

    kind, deeper = get_items_info(items)

    title = unicode(title)
    oc = SubFolderObjectContainer(title2=section_title,
                                  no_cache=True,
                                  no_history=True)
    title = base_title + " > " + title
    add_ignore_options(oc,
                       "sections",
                       title=section_title,
                       rating_key=rating_key,
                       callback_menu=IgnoreMenu)

    oc.add(
        DirectoryObject(key=Callback(SectionMenu,
                                     title=_("All"),
                                     base_title=title,
                                     rating_key=rating_key,
                                     ignore_options=False),
                        title="All"))
    return dig_tree(oc,
                    items,
                    FirstLetterMetadataMenu,
                    force_rating_key=rating_key,
                    fill_args={"key": "key"},
                    pass_kwargs={
                        "base_title": title,
                        "display_items": deeper,
                        "previous_rating_key": rating_key
                    })
Exemplo n.º 52
0
def SelectStoredSubForItemMenu(**kwargs):
    rating_key = kwargs["rating_key"]
    part_id = kwargs["part_id"]
    language = Language.fromietf(kwargs["language"])
    item_type = kwargs["item_type"]
    sub_key = tuple(kwargs.pop("sub_key").split("__"))

    plex_item = get_item(rating_key)
    storage = get_subtitle_storage()
    stored_subs = storage.load(plex_item.rating_key)

    subtitles = stored_subs.get_all(part_id, language)
    subtitle = subtitles[sub_key]

    save_stored_sub(subtitle,
                    rating_key,
                    part_id,
                    language,
                    item_type,
                    plex_item=plex_item,
                    storage=storage,
                    stored_subs=stored_subs)

    stored_subs.set_current(part_id, language, sub_key)
    storage.save(stored_subs)
    storage.destroy()

    kwa = {
        "header": _("Success"),
        "message": _("Subtitle saved to disk"),
        "title": kwargs["title"],
        "item_title": kwargs["item_title"],
        "base_title": kwargs.get("base_title")
    }

    # fixme: return to SubtitleOptionsMenu properly? (needs recomputation of current_data

    return ItemDetailsMenu(rating_key, randomize=timestamp(), **kwa)
Exemplo n.º 53
0
def IgnoreListMenu():
    ref_list = get_decision_list()
    include = ref_list.store == "include"
    list_title = _("Include list" if include else "Ignore list")
    oc = SubFolderObjectContainer(title2=list_title, replace_parent=True)
    for key in ref_list.key_order:
        values = ref_list[key]
        for value in values:
            add_incl_excl_options(oc,
                                  key,
                                  title=ref_list.get_title(key, value),
                                  rating_key=value,
                                  callback_menu=InclExclMenu)
    return oc
Exemplo n.º 54
0
def RecentMissingSubtitlesMenu(force=False, randomize=None):
    title = _("Items with missing subtitles")
    oc = SubFolderObjectContainer(title2=title, no_cache=True, no_history=True)

    running = scheduler.is_task_running("MissingSubtitles")
    task_data = scheduler.get_task_data("MissingSubtitles")
    missing_items = task_data["missing_subtitles"] if task_data else None

    if ((missing_items is None) or force) and not running:
        scheduler.dispatch_task("MissingSubtitles")
        running = True

    if not running:
        oc.add(DirectoryObject(
            key=Callback(RecentMissingSubtitlesMenu, force=True, randomize=timestamp()),
            title=_(u"Find recent items with missing subtitles"),
            thumb=default_thumb
        ))
    else:
        oc.add(DirectoryObject(
            key=Callback(RecentMissingSubtitlesMenu, force=False, randomize=timestamp()),
            title=_(u"Updating, refresh here ..."),
            thumb=default_thumb
        ))

    if missing_items is not None:
        for added_at, item_id, item_title, item, missing_languages in missing_items:
            oc.add(DirectoryObject(
                key=Callback(ItemDetailsMenu, title=title + " > " + item_title, item_title=item_title,
                             rating_key=item_id),
                title=item_title,
                summary=_("Missing: %s", ", ".join(display_language(l) for l in missing_languages)),
                thumb=get_item_thumb(item) or default_thumb
            ))

    return oc
Exemplo n.º 55
0
def SubtitleListMods(**kwargs):
    rating_key = kwargs["rating_key"]
    part_id = kwargs["part_id"]
    language = kwargs["language"]
    current_sub, stored_subs, storage = get_current_sub(rating_key, part_id, language)

    kwargs.pop("randomize")

    oc = SubFolderObjectContainer(title2=kwargs["title"], replace_parent=True)

    oc.add(DirectoryObject(
        key=Callback(SubtitleModificationsMenu, randomize=timestamp(), **kwargs),
        title=_("< Back to subtitle modifications")
    ))

    for identifier in current_sub.mods:
        oc.add(DirectoryObject(
            key=Callback(SubtitleSetMods, mods=identifier, mode="remove", randomize=timestamp(), **kwargs),
            title=_("Remove: %(mod_name)s", mod_name=identifier)
        ))

    storage.destroy()

    return oc
Exemplo n.º 56
0
def add_incl_excl_options(oc,
                          kind,
                          callback_menu=None,
                          title=None,
                          rating_key=None,
                          add_kind=True):
    """

    :param oc: oc to add our options to
    :param kind: movie, show, episode ... - gets translated to the ignore key (sections, series, items)
    :param callback_menu: menu to inject
    :param title:
    :param rating_key:
    :return:
    """
    # try to translate kind to the ignore key
    use_kind = kind
    ref_list = get_decision_list()
    if kind not in ref_list:
        use_kind = ref_list.translate_key(kind)
    if not use_kind or use_kind not in ref_list:
        return

    in_list = rating_key in ref_list[use_kind]
    include = ref_list.store == "include"

    if include:
        t = u"Enable Sub-Zero for %(kind)s \"%(title)s\""
        if in_list:
            t = u"Disable Sub-Zero for %(kind)s \"%(title)s\""
    else:
        t = u"Ignore %(kind)s \"%(title)s\""
        if in_list:
            t = u"Un-ignore %(kind)s \"%(title)s\""

    oc.add(
        DirectoryObject(key=Callback(callback_menu,
                                     kind=use_kind,
                                     sure=False,
                                     todo="not_set",
                                     rating_key=str(rating_key),
                                     title=title),
                        title=_(
                            t,
                            kind=ref_list.verbose(kind) if add_kind else "",
                            title=unicode(title))))