Example #1
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
Example #2
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)
    )
Example #3
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})
Example #4
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
Example #5
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
Example #6
0
def SubtitleColorModMenu(**kwargs):
    kwargs.pop("randomize")

    color_mod = SubtitleModifications.get_mod_class("color")

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

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

    for color, code in color_mod.colors.iteritems():
        mod_ident = SubtitleModifications.get_mod_signature("color", **{"name": color})
        oc.add(DirectoryObject(
            key=Callback(SubtitleSetMods, mods=mod_ident, mode="add", randomize=timestamp(), **kwargs),
            title="%s (%s)" % (color, code)
        ))

    return oc
Example #7
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
Example #8
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
Example #9
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
Example #10
0
def mergedItemsMenu(title, itemGetter, itemGetterKwArgs=None, base_title=None, *args, **kwargs):
    """
    displays an item list of dynamic kinds of items
    :param title:
    :param itemGetter:
    :param itemGetterKwArgs:
    :param base_title:
    :param args:
    :param kwargs:
    :return:
    """
    oc = SubFolderObjectContainer(title2=title, no_cache=True, no_history=True)
    items = itemGetter(*args, **kwargs)

    for kind, title, item_id, deeper, item in items:
        oc.add(DirectoryObject(
            title=title,
            key=Callback(ItemDetailsMenu, title=base_title + " > " + title, item_title=title, rating_key=item_id),
            thumb=get_item_thumb(item) or default_thumb
        ))

    return oc
Example #11
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
Example #12
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
Example #13
0
def ListEmbeddedSubsForItemMenu(**kwargs):
    rating_key = kwargs["rating_key"]
    part_id = kwargs["part_id"]
    title = kwargs["title"]
    kwargs.pop("randomize")

    oc = SubFolderObjectContainer(title2=title, replace_parent=True)

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

    plex_item = get_item(rating_key)
    part = get_part(plex_item, part_id)

    if part:
        for stream_data in get_embedded_subtitle_streams(part, skip_duplicate_unknown=False):
            language = stream_data["language"]
            is_unknown = stream_data["is_unknown"]
            stream = stream_data["stream"]
            is_forced = stream_data["is_forced"]

            if language:
                oc.add(DirectoryObject(
                    key=Callback(TriggerExtractEmbeddedSubForItemMenu, randomize=timestamp(),
                                 stream_index=str(stream.index), language=language, with_mods=True, **kwargs),
                    title=_(u"Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s"
                            u"%(stream_title)s with default mods",
                            stream_index=stream.index,
                            language=display_language(language),
                            unknown_state=_(" (unknown)") if is_unknown else "",
                            forced_state=_(" (forced)") if is_forced else "",
                            stream_title=" (\"%s\")" % stream.title if stream.title else ""),
                ))
                oc.add(DirectoryObject(
                    key=Callback(TriggerExtractEmbeddedSubForItemMenu, randomize=timestamp(),
                                 stream_index=str(stream.index), language=language, **kwargs),
                    title=_(u"Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s"
                            u"%(stream_title)s",
                            stream_index=stream.index,
                            language=display_language(language),
                            unknown_state=_(" (unknown)") if is_unknown else "",
                            forced_state=_(" (forced)") if is_forced else "",
                            stream_title=" (\"%s\")" % stream.title if stream.title else ""),
                ))
    return oc
Example #14
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
Example #15
0
def ItemDetailsMenu(rating_key,
                    title=None,
                    base_title=None,
                    item_title=None,
                    randomize=None):
    """
    displays the item details menu of an item that doesn't contain any deeper tree, such as a movie or an episode
    :param rating_key:
    :param title:
    :param base_title:
    :param item_title:
    :param randomize:
    :return:
    """
    from interface.main import IgnoreMenu

    title = unicode(base_title) + " > " + unicode(
        title) if base_title else unicode(title)
    item = get_item(rating_key)
    current_kind = get_item_kind_from_rating_key(rating_key)

    timeout = 30

    oc = SubFolderObjectContainer(title2=title, replace_parent=True)

    # add back to season for episode
    if current_kind == "episode":
        from interface.menu import MetadataMenu
        show = get_item(item.show.rating_key)
        season = get_item(item.season.rating_key)

        oc.add(
            DirectoryObject(key=Callback(MetadataMenu,
                                         rating_key=season.rating_key,
                                         title=season.title,
                                         base_title=show.title,
                                         previous_item_type="show",
                                         previous_rating_key=show.rating_key,
                                         display_items=True,
                                         randomize=timestamp()),
                            title=u"< Back to %s" % season.title,
                            summary="Back to %s > %s" %
                            (show.title, season.title),
                            thumb=season.thumb or default_thumb))

    oc.add(
        DirectoryObject(
            key=Callback(RefreshItem,
                         rating_key=rating_key,
                         item_title=item_title,
                         randomize=timestamp(),
                         timeout=timeout * 1000),
            title=u"Refresh: %s" % item_title,
            summary=
            "Refreshes the %s, possibly searching for missing and picking up new subtitles on disk"
            % current_kind,
            thumb=item.thumb or default_thumb))
    oc.add(
        DirectoryObject(
            key=Callback(RefreshItem,
                         rating_key=rating_key,
                         item_title=item_title,
                         force=True,
                         randomize=timestamp(),
                         timeout=timeout * 1000),
            title=u"Force-find subtitles: %s" % item_title,
            summary=
            "Issues a forced refresh, ignoring known subtitles and searching for new ones",
            thumb=item.thumb or default_thumb))

    # get stored subtitle info for item id
    subtitle_storage = get_subtitle_storage()
    stored_subs = subtitle_storage.load_or_new(item)

    # get the plex item
    plex_item = get_item(rating_key)

    # look for subtitles for all available media parts and all of their languages
    has_multiple_parts = len(plex_item.media) > 1
    part_index = 0
    for media in plex_item.media:
        for part in media.parts:
            filename = os.path.basename(part.file)
            if not os.path.exists(part.file):
                continue

            part_id = str(part.id)
            part_index += 1

            # iterate through all configured languages
            for lang in config.lang_list:
                # get corresponding stored subtitle data for that media part (physical media item), for language
                current_sub = stored_subs.get_any(part_id, lang)
                current_sub_id = None
                current_sub_provider_name = None

                part_index_addon = ""
                part_summary_addon = ""
                if has_multiple_parts:
                    part_index_addon = u"File %s: " % part_index
                    part_summary_addon = "%s " % filename

                summary = u"%sNo current subtitle in storage" % part_summary_addon
                current_score = None
                if current_sub:
                    current_sub_id = current_sub.id
                    current_sub_provider_name = current_sub.provider_name
                    current_score = current_sub.score

                    summary = u"%sCurrent subtitle: %s (added: %s, %s), Language: %s, Score: %i, Storage: %s" % \
                              (part_summary_addon, current_sub.provider_name, df(current_sub.date_added),
                               current_sub.mode_verbose, lang, current_sub.score, current_sub.storage_type)

                    oc.add(
                        DirectoryObject(key=Callback(
                            SubtitleOptionsMenu,
                            rating_key=rating_key,
                            part_id=part_id,
                            title=title,
                            item_title=item_title,
                            language=lang,
                            language_name=lang.name,
                            current_id=current_sub_id,
                            item_type=plex_item.type,
                            filename=filename,
                            current_data=summary,
                            randomize=timestamp(),
                            current_provider=current_sub_provider_name,
                            current_score=current_score),
                                        title=u"%sActions for %s subtitle" %
                                        (part_index_addon, lang.name),
                                        summary=summary))
                else:
                    oc.add(
                        DirectoryObject(key=Callback(
                            ListAvailableSubsForItemMenu,
                            rating_key=rating_key,
                            part_id=part_id,
                            title=title,
                            item_title=item_title,
                            language=lang,
                            language_name=lang.name,
                            current_id=current_sub_id,
                            item_type=plex_item.type,
                            filename=filename,
                            current_data=summary,
                            randomize=timestamp(),
                            current_provider=current_sub_provider_name,
                            current_score=current_score),
                                        title=u"%sList %s subtitles" %
                                        (part_index_addon, lang.name),
                                        summary=summary))

    add_ignore_options(oc,
                       "videos",
                       title=item_title,
                       rating_key=rating_key,
                       callback_menu=IgnoreMenu)
    subtitle_storage.destroy()

    return oc
Example #16
0
def MetadataMenu(rating_key,
                 title=None,
                 base_title=None,
                 display_items=False,
                 previous_item_type=None,
                 previous_rating_key=None,
                 randomize=None):
    """
    displays the contents of a section based on whether it has a deeper tree or not (movies->movie (item) list; series->series list)
    :param rating_key:
    :param title:
    :param base_title:
    :param display_items:
    :param previous_item_type:
    :param previous_rating_key:
    :return:
    """
    title = unicode(title)
    item_title = title
    title = base_title + " > " + title
    oc = SubFolderObjectContainer(title2=title, no_cache=True, no_history=True)

    current_kind = get_item_kind_from_rating_key(rating_key)

    if display_items:
        timeout = 30

        # add back to series for season
        if current_kind == "season":
            timeout = 360

            show = get_item(previous_rating_key)
            oc.add(
                DirectoryObject(key=Callback(MetadataMenu,
                                             rating_key=show.rating_key,
                                             title=show.title,
                                             base_title=show.section.title,
                                             previous_item_type="section",
                                             display_items=True,
                                             randomize=timestamp()),
                                title=u"< Back to %s" % show.title,
                                thumb=show.thumb or default_thumb))
        elif current_kind == "series":
            timeout = 1800

        items = get_all_items(key="children",
                              value=rating_key,
                              base="library/metadata")
        kind, deeper = get_items_info(items)
        dig_tree(oc,
                 items,
                 MetadataMenu,
                 pass_kwargs={
                     "base_title": title,
                     "display_items": deeper,
                     "previous_item_type": kind,
                     "previous_rating_key": rating_key
                 })
        # we don't know exactly where we are here, only add ignore option to series
        if should_display_ignore(items, previous=previous_item_type):
            add_ignore_options(oc,
                               "series",
                               title=item_title,
                               rating_key=rating_key,
                               callback_menu=IgnoreMenu)

        # add refresh
        oc.add(
            DirectoryObject(
                key=Callback(RefreshItem,
                             rating_key=rating_key,
                             item_title=title,
                             refresh_kind=current_kind,
                             previous_rating_key=previous_rating_key,
                             timeout=timeout * 1000,
                             randomize=timestamp()),
                title=u"Refresh: %s" % item_title,
                summary=
                "Refreshes the %s, possibly searching for missing and picking up new subtitles on disk"
                % current_kind))
        oc.add(
            DirectoryObject(
                key=Callback(RefreshItem,
                             rating_key=rating_key,
                             item_title=title,
                             force=True,
                             refresh_kind=current_kind,
                             previous_rating_key=previous_rating_key,
                             timeout=timeout * 1000,
                             randomize=timestamp()),
                title=u"Auto-Find subtitles: %s" % item_title,
                summary=
                "Issues a forced refresh, ignoring known subtitles and searching for new ones"
            ))
    else:
        return ItemDetailsMenu(rating_key=rating_key,
                               title=title,
                               item_title=item_title)

    return oc
Example #17
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=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: %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
Example #18
0
def ItemDetailsMenu(rating_key,
                    title=None,
                    base_title=None,
                    item_title=None,
                    randomize=None,
                    header=None,
                    message=None):
    """
    displays the item details menu of an item that doesn't contain any deeper tree, such as a movie or an episode
    :param rating_key:
    :param title:
    :param base_title:
    :param item_title:
    :param randomize:
    :return:
    """
    from interface.main import InclExclMenu

    title = unicode(base_title) + " > " + unicode(
        title) if base_title else unicode(title)
    item = plex_item = get_item(rating_key)
    current_kind = get_item_kind_from_rating_key(rating_key)

    timeout = 30

    oc = SubFolderObjectContainer(title2=title,
                                  replace_parent=True,
                                  header=header,
                                  message=message)

    if not item:
        oc.add(
            DirectoryObject(
                key=Callback(ItemDetailsMenu,
                             rating_key=rating_key,
                             title=title,
                             base_title=base_title,
                             item_title=item_title,
                             randomize=timestamp()),
                title=_(u"Item not found: %s!", item_title),
                summary=
                _("Plex didn't return any information about the item, please refresh it and come back later"
                  ),
                thumb=default_thumb))
        return oc

    # add back to season for episode
    if current_kind == "episode":
        from interface.menu import MetadataMenu
        show = get_item(item.show.rating_key)
        season = get_item(item.season.rating_key)

        oc.add(
            DirectoryObject(key=Callback(MetadataMenu,
                                         rating_key=season.rating_key,
                                         title=season.title,
                                         base_title=show.title,
                                         previous_item_type="show",
                                         previous_rating_key=show.rating_key,
                                         display_items=True,
                                         randomize=timestamp()),
                            title=_(u"< Back to %s", season.title),
                            summary=_("Back to %s > %s", show.title,
                                      season.title),
                            thumb=season.thumb or default_thumb))

    oc.add(
        DirectoryObject(
            key=Callback(RefreshItem,
                         rating_key=rating_key,
                         item_title=item_title,
                         randomize=timestamp(),
                         timeout=timeout * 1000),
            title=_(u"Refresh: %s", item_title),
            summary=_(
                "Refreshes %(the_movie_series_season_episode)s, possibly searching for missing and picking up "
                "new subtitles on disk",
                the_movie_series_season_episode=_(u"the %s" % current_kind)),
            thumb=item.thumb or default_thumb))
    oc.add(
        DirectoryObject(
            key=Callback(RefreshItem,
                         rating_key=rating_key,
                         item_title=item_title,
                         force=True,
                         randomize=timestamp(),
                         timeout=timeout * 1000),
            title=_(u"Force-find subtitles: %(item_title)s",
                    item_title=item_title),
            summary=
            _("Issues a forced refresh, ignoring known subtitles and searching for new ones"
              ),
            thumb=item.thumb or default_thumb))

    # get stored subtitle info for item id
    subtitle_storage = get_subtitle_storage()
    stored_subs = subtitle_storage.load_or_new(item)

    # look for subtitles for all available media parts and all of their languages
    has_multiple_parts = len(plex_item.media) > 1
    part_index = 0
    for media in plex_item.media:
        for part in media.parts:
            filename = os.path.basename(part.file)
            if not os.path.exists(part.file):
                continue

            part_id = str(part.id)
            part_index += 1

            part_index_addon = u""
            part_summary_addon = u""
            if has_multiple_parts:
                part_index_addon = _(u"File %(file_part_index)s: ",
                                     file_part_index=part_index)
                part_summary_addon = u"%s " % filename

            # iterate through all configured languages
            for lang in config.lang_list:
                # get corresponding stored subtitle data for that media part (physical media item), for language
                current_sub = stored_subs.get_any(part_id, lang)
                current_sub_id = None
                current_sub_provider_name = None

                summary = _(u"%(part_summary)sNo current subtitle in storage",
                            part_summary=part_summary_addon)
                current_score = None
                if current_sub:
                    current_sub_id = current_sub.id
                    current_sub_provider_name = current_sub.provider_name
                    current_score = current_sub.score

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

                    oc.add(
                        DirectoryObject(
                            key=Callback(
                                SubtitleOptionsMenu,
                                rating_key=rating_key,
                                part_id=part_id,
                                title=title,
                                item_title=item_title,
                                language=lang,
                                language_name=display_language(lang),
                                current_id=current_sub_id,
                                item_type=plex_item.type,
                                filename=filename,
                                current_data=summary,
                                randomize=timestamp(),
                                current_provider=current_sub_provider_name,
                                current_score=current_score),
                            title=_(
                                u"%(part_summary)sManage %(language)s subtitle",
                                part_summary=part_index_addon,
                                language=display_language(lang)),
                            summary=summary))
                else:
                    oc.add(
                        DirectoryObject(
                            key=Callback(
                                ListAvailableSubsForItemMenu,
                                rating_key=rating_key,
                                part_id=part_id,
                                title=title,
                                item_title=item_title,
                                language=lang,
                                language_name=display_language(lang),
                                current_id=current_sub_id,
                                item_type=plex_item.type,
                                filename=filename,
                                current_data=summary,
                                randomize=timestamp(),
                                current_provider=current_sub_provider_name,
                                current_score=current_score),
                            title=_(
                                u"%(part_summary)sList %(language)s subtitles",
                                part_summary=part_index_addon,
                                language=display_language(lang)),
                            summary=summary))

            if config.plex_transcoder:
                # embedded subtitles
                embedded_count = 0
                embedded_langs = []
                for stream in part.streams:
                    # subtitle stream
                    if stream.stream_type == 3 and not stream.stream_key and stream.codec in TEXT_SUBTITLE_EXTS:
                        lang = get_language_from_stream(stream.language_code)
                        is_forced = is_stream_forced(stream)

                        if not lang and config.treat_und_as_first:
                            lang = list(config.lang_list)[0]

                        if lang:
                            lang = Language.rebuild(lang, forced=is_forced)
                            embedded_langs.append(lang)
                            embedded_count += 1

                if embedded_count:
                    oc.add(
                        DirectoryObject(
                            key=Callback(ListEmbeddedSubsForItemMenu,
                                         rating_key=rating_key,
                                         part_id=part_id,
                                         title=title,
                                         item_type=plex_item.type,
                                         item_title=item_title,
                                         base_title=base_title,
                                         randomize=timestamp()),
                            title=
                            _(u"%(part_summary)sEmbedded subtitles (%(languages)s)",
                              part_summary=part_index_addon,
                              languages=", ".join(
                                  display_language(l) for l in list(
                                      OrderedDict.fromkeys(embedded_langs)))),
                            summary=_(u"Extract embedded subtitle streams")))

    ignore_title = item_title
    if current_kind == "episode":
        ignore_title = get_item_title(item)
    add_incl_excl_options(oc,
                          "videos",
                          title=ignore_title,
                          rating_key=rating_key,
                          callback_menu=InclExclMenu)
    subtitle_storage.destroy()

    return oc
Example #19
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
Example #20
0
def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, randomize=None, header=None,
                    message=None):
    """
    displays the item details menu of an item that doesn't contain any deeper tree, such as a movie or an episode
    :param rating_key:
    :param title:
    :param base_title:
    :param item_title:
    :param randomize:
    :return:
    """
    from interface.main import InclExclMenu

    title = unicode(base_title) + " > " + unicode(title) if base_title else unicode(title)
    item = plex_item = get_item(rating_key)
    current_kind = get_item_kind_from_rating_key(rating_key)

    timeout = 30

    oc = SubFolderObjectContainer(
            title2=title,
            replace_parent=True,
            header=header,
            message=message)

    if not item:
        oc.add(DirectoryObject(
            key=Callback(
                    ItemDetailsMenu,
                    rating_key=rating_key,
                    title=title,
                    base_title=base_title,
                    item_title=item_title,
                    randomize=timestamp()),
            title=_(u"Item not found: %s!", item_title),
            summary=_("Plex didn't return any information about the item, please refresh it and come back later"),
            thumb=default_thumb
        ))
        return oc

    # add back to season for episode
    if current_kind == "episode":
        from interface.menu import MetadataMenu
        show = get_item(item.show.rating_key)
        season = get_item(item.season.rating_key)

        oc.add(DirectoryObject(
            key=Callback(
                    MetadataMenu,
                    rating_key=season.rating_key,
                    title=season.title,
                    base_title=show.title,
                    previous_item_type="show",
                    previous_rating_key=show.rating_key,
                    display_items=True,
                    randomize=timestamp()),
            title=_(u"< Back to %s", season.title),
            summary=_("Back to %s > %s", show.title, season.title),
            thumb=season.thumb or default_thumb
        ))

    oc.add(DirectoryObject(
        key=Callback(
                RefreshItem,
                rating_key=rating_key,
                item_title=item_title,
                randomize=timestamp(),
                timeout=timeout * 1000),
        title=_(u"Refresh: %s", item_title),
        summary=_("Refreshes %(the_movie_series_season_episode)s, possibly searching for missing and picking up "
                  "new subtitles on disk", the_movie_series_season_episode=_(u"the %s" % current_kind)),
        thumb=item.thumb or default_thumb
    ))
    oc.add(DirectoryObject(
        key=Callback(RefreshItem, rating_key=rating_key, item_title=item_title, force=True, randomize=timestamp(),
                     timeout=timeout * 1000),
        title=_(u"Force-find subtitles: %(item_title)s", item_title=item_title),
        summary=_("Issues a forced refresh, ignoring known subtitles and searching for new ones"),
        thumb=item.thumb or default_thumb
    ))

    # get stored subtitle info for item id
    subtitle_storage = get_subtitle_storage()
    stored_subs = subtitle_storage.load_or_new(item)

    # look for subtitles for all available media parts and all of their languages
    has_multiple_parts = len(plex_item.media) > 1
    part_index = 0
    for media in plex_item.media:
        for part in media.parts:
            filename = os.path.basename(part.file)
            if not os.path.exists(part.file):
                continue

            part_id = str(part.id)
            part_index += 1

            part_index_addon = u""
            part_summary_addon = u""
            if has_multiple_parts:
                part_index_addon = _(u"File %(file_part_index)s: ", file_part_index=part_index)
                part_summary_addon = u"%s " % filename

            # iterate through all configured languages
            for lang in config.lang_list:
                # get corresponding stored subtitle data for that media part (physical media item), for language
                current_sub = stored_subs.get_any(part_id, lang)
                current_sub_id = None
                current_sub_provider_name = None

                summary = _(u"%(part_summary)sNo current subtitle in storage", part_summary=part_summary_addon)
                current_score = None
                if current_sub:
                    current_sub_id = current_sub.id
                    current_sub_provider_name = current_sub.provider_name
                    current_score = current_sub.score

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

                    oc.add(DirectoryObject(
                        key=Callback(SubtitleOptionsMenu, rating_key=rating_key, part_id=part_id, title=title,
                                     item_title=item_title, language=lang, language_name=display_language(lang),
                                     current_id=current_sub_id,
                                     item_type=plex_item.type, filename=filename, current_data=summary,
                                     randomize=timestamp(), current_provider=current_sub_provider_name,
                                     current_score=current_score),
                        title=_(u"%(part_summary)sManage %(language)s subtitle", part_summary=part_index_addon,
                                language=display_language(lang)),
                        summary=summary
                    ))
                else:
                    oc.add(DirectoryObject(
                        key=Callback(ListAvailableSubsForItemMenu, rating_key=rating_key, part_id=part_id, title=title,
                                     item_title=item_title, language=lang, language_name=display_language(lang),
                                     current_id=current_sub_id,
                                     item_type=plex_item.type, filename=filename, current_data=summary,
                                     randomize=timestamp(), current_provider=current_sub_provider_name,
                                     current_score=current_score),
                        title=_(u"%(part_summary)sList %(language)s subtitles", part_summary=part_index_addon,
                                language=display_language(lang)),
                        summary=summary
                    ))

            if config.plex_transcoder:
                # embedded subtitles
                embedded_count = 0
                embedded_langs = []
                for stream in part.streams:
                    # subtitle stream
                    if stream.stream_type == 3 and not stream.stream_key and stream.codec in TEXT_SUBTITLE_EXTS:
                        lang = get_language_from_stream(stream.language_code)
                        is_forced = is_stream_forced(stream)

                        if not lang and config.treat_und_as_first:
                            lang = list(config.lang_list)[0]

                        if lang:
                            lang = Language.rebuild(lang, forced=is_forced)
                            embedded_langs.append(lang)
                            embedded_count += 1

                if embedded_count:
                    oc.add(DirectoryObject(
                        key=Callback(ListEmbeddedSubsForItemMenu, rating_key=rating_key, part_id=part_id, title=title,
                                     item_type=plex_item.type, item_title=item_title, base_title=base_title,
                                     randomize=timestamp()),
                        title=_(u"%(part_summary)sEmbedded subtitles (%(languages)s)",
                                part_summary=part_index_addon,
                                languages=", ".join(display_language(l)
                                                    for l in list(OrderedDict.fromkeys(embedded_langs)))),
                        summary=_(u"Extract embedded subtitle streams")
                    ))

    ignore_title = item_title
    if current_kind == "episode":
        ignore_title = get_item_title(item)
    add_incl_excl_options(oc, "videos", title=ignore_title, rating_key=rating_key, callback_menu=InclExclMenu)
    subtitle_storage.destroy()

    return oc
Example #21
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(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(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(InvalidateCache, randomize=timestamp()),
            title=pad_title(
                "Invalidate Sub-Zero metadata caches (subliminal)"),
        ))
    return oc
Example #22
0
def MetadataMenu(rating_key, title=None, base_title=None, display_items=False, previous_item_type=None,
                 previous_rating_key=None, message=None, header=None, randomize=None):
    """
    displays the contents of a section based on whether it has a deeper tree or not (movies->movie (item) list; series->series list)
    :param rating_key:
    :param title:
    :param base_title:
    :param display_items:
    :param previous_item_type:
    :param previous_rating_key:
    :return:
    """
    title = unicode(title)
    item_title = title
    title = base_title + " > " + title
    oc = SubFolderObjectContainer(title2=title, no_cache=True, no_history=True, header=header, message=message,
                                  view_group="full_details")

    current_kind = get_item_kind_from_rating_key(rating_key)

    if display_items:
        timeout = 30
        show = None

        # add back to series for season
        if current_kind == "season":
            timeout = 720

            show = get_item(previous_rating_key)
            oc.add(DirectoryObject(
                key=Callback(MetadataMenu, rating_key=show.rating_key, title=show.title, base_title=show.section.title,
                             previous_item_type="section", display_items=True, randomize=timestamp()),
                title=_(u"< Back to %s", show.title),
                thumb=show.thumb or default_thumb
            ))
        elif current_kind == "series":
            # it shouldn't take more than 6 minutes to scan all of a series' files and determine the force refresh
            timeout = 3600

        items = get_all_items(key="children", value=rating_key, base="library/metadata")
        kind, deeper = get_items_info(items)
        dig_tree(oc, items, MetadataMenu,
                 pass_kwargs={"base_title": title, "display_items": deeper, "previous_item_type": kind,
                              "previous_rating_key": rating_key})

        # we don't know exactly where we are here, only add ignore option to series
        if current_kind in ("series", "season"):
            item = get_item(rating_key)
            sub_title = get_item_title(item)
            add_incl_excl_options(oc, current_kind, title=sub_title, rating_key=rating_key, callback_menu=InclExclMenu)

        # mass-extract embedded
        if current_kind == "season" and config.plex_transcoder:
            for lang in config.lang_list:
                oc.add(DirectoryObject(
                    key=Callback(SeasonExtractEmbedded, rating_key=rating_key, language=lang,
                                 base_title=show.section.title, display_items=display_items, item_title=item_title,
                                 title=title,
                                 previous_item_type=previous_item_type, with_mods=True,
                                 previous_rating_key=previous_rating_key, randomize=timestamp()),
                    title=_(u"Extract missing %(language)s embedded subtitles", language=display_language(lang)),
                    summary=_("Extracts the not yet extracted embedded subtitles of all episodes for the current "
                              "season with all configured default modifications")
                ))
                oc.add(DirectoryObject(
                    key=Callback(SeasonExtractEmbedded, rating_key=rating_key, language=lang,
                                 base_title=show.section.title, display_items=display_items, item_title=item_title,
                                 title=title, force=True,
                                 previous_item_type=previous_item_type, with_mods=True,
                                 previous_rating_key=previous_rating_key, randomize=timestamp()),
                    title=_(u"Extract and activate %(language)s embedded subtitles", language=display_language(lang)),
                    summary=_("Extracts embedded subtitles of all episodes for the current season "
                              "with all configured default modifications")
                ))

        # add refresh
        oc.add(DirectoryObject(
            key=Callback(RefreshItem, rating_key=rating_key, item_title=title, refresh_kind=current_kind,
                         previous_rating_key=previous_rating_key, timeout=timeout * 1000, randomize=timestamp()),
            title=_(u"Refresh: %s", item_title),
            summary=_("Refreshes %(the_movie_series_season_episode)s, possibly searching for missing and picking up "
                      "new subtitles on disk", the_movie_series_season_episode=_(u"the %s" % current_kind))
        ))
        oc.add(DirectoryObject(
            key=Callback(RefreshItem, rating_key=rating_key, item_title=title, force=True,
                         refresh_kind=current_kind, previous_rating_key=previous_rating_key, timeout=timeout * 1000,
                         randomize=timestamp()),
            title=_(u"Auto-Find subtitles: %s", item_title),
            summary=_("Issues a forced refresh, ignoring known subtitles and searching for new ones")
        ))
    else:
        return ItemDetailsMenu(rating_key=rating_key, title=title, item_title=item_title)

    return oc
Example #23
0
def ListEmbeddedSubsForItemMenu(**kwargs):
    rating_key = kwargs["rating_key"]
    part_id = kwargs["part_id"]
    title = kwargs["title"]
    kwargs.pop("randomize")

    oc = SubFolderObjectContainer(title2=title, replace_parent=True)

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

    plex_item = get_item(rating_key)
    part = get_part(plex_item, part_id)

    if part:
        for stream_data in get_embedded_subtitle_streams(
                part, skip_duplicate_unknown=False):
            language = stream_data["language"]
            is_unknown = stream_data["is_unknown"]
            stream = stream_data["stream"]
            is_forced = stream_data["is_forced"]

            if language:
                oc.add(
                    DirectoryObject(
                        key=Callback(TriggerExtractEmbeddedSubForItemMenu,
                                     randomize=timestamp(),
                                     stream_index=str(stream.index),
                                     language=language,
                                     with_mods=True,
                                     **kwargs),
                        title=_(
                            u"Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s"
                            u"%(stream_title)s with default mods",
                            stream_index=stream.index,
                            language=display_language(language),
                            unknown_state=_(" (unknown)")
                            if is_unknown else "",
                            forced_state=_(" (forced)") if is_forced else "",
                            stream_title=" (\"%s\")" %
                            stream.title if stream.title else ""),
                    ))
                oc.add(
                    DirectoryObject(
                        key=Callback(TriggerExtractEmbeddedSubForItemMenu,
                                     randomize=timestamp(),
                                     stream_index=str(stream.index),
                                     language=language,
                                     **kwargs),
                        title=_(
                            u"Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s"
                            u"%(stream_title)s",
                            stream_index=stream.index,
                            language=display_language(language),
                            unknown_state=_(" (unknown)")
                            if is_unknown else "",
                            forced_state=_(" (forced)") if is_forced else "",
                            stream_title=" (\"%s\")" %
                            stream.title if stream.title else ""),
                    ))
    return oc
Example #24
0
def ListAvailableSubsForItemMenu(rating_key=None,
                                 part_id=None,
                                 title=None,
                                 item_title=None,
                                 filename=None,
                                 item_type="episode",
                                 language=None,
                                 language_name=None,
                                 force=False,
                                 current_id=None,
                                 current_data=None,
                                 current_provider=None,
                                 current_score=None,
                                 randomize=None):
    assert rating_key, part_id

    running = scheduler.is_task_running("AvailableSubsForItem")
    search_results = get_item_task_data("AvailableSubsForItem", rating_key,
                                        language)

    current_data = unicode(current_data) if current_data else None

    if (search_results is None or force) and not running:
        scheduler.dispatch_task("AvailableSubsForItem",
                                rating_key=rating_key,
                                item_type=item_type,
                                part_id=part_id,
                                language=language)
        running = True

    oc = SubFolderObjectContainer(title2=unicode(title), replace_parent=True)
    oc.add(
        DirectoryObject(key=Callback(ItemDetailsMenu,
                                     rating_key=rating_key,
                                     item_title=item_title,
                                     title=title,
                                     randomize=timestamp()),
                        title=_(u"< Back to %s", title),
                        summary=current_data,
                        thumb=default_thumb))

    metadata = get_plex_metadata(rating_key, part_id, item_type)
    plex_part = None
    if not config.low_impact_mode:
        scanned_parts = scan_videos([metadata], ignore_all=True)

        if not scanned_parts:
            Log.Error("Couldn't list available subtitles for %s", rating_key)
            return oc

        video, plex_part = scanned_parts.items()[0]

        video_display_data = [video.format] if video.format else []
        if video.release_group:
            video_display_data.append(
                unicode(
                    _(u"by %(release_group)s",
                      release_group=video.release_group)))
        video_display_data = " ".join(video_display_data)
    else:
        video_display_data = metadata["filename"]

    current_display = (_(u"Current: %(provider_name)s (%(score)s) ",
                         provider_name=_(current_provider),
                         score=current_score if current_provider else ""))
    if not running:
        oc.add(
            DirectoryObject(
                key=Callback(ListAvailableSubsForItemMenu,
                             rating_key=rating_key,
                             item_title=item_title,
                             language=language,
                             filename=filename,
                             part_id=part_id,
                             title=title,
                             current_id=current_id,
                             force=True,
                             current_provider=current_provider,
                             current_score=current_score,
                             current_data=current_data,
                             item_type=item_type,
                             randomize=timestamp()),
                title=_(u"Search for %(language)s subs (%(video_data)s)",
                        language=get_language(language).name,
                        video_data=video_display_data),
                summary=_(u"%(current_info)sFilename: %(filename)s",
                          current_info=current_display,
                          filename=filename),
                thumb=default_thumb))

        if search_results == "found_none":
            oc.add(
                DirectoryObject(key=Callback(ListAvailableSubsForItemMenu,
                                             rating_key=rating_key,
                                             item_title=item_title,
                                             language=language,
                                             filename=filename,
                                             current_data=current_data,
                                             force=True,
                                             part_id=part_id,
                                             title=title,
                                             current_id=current_id,
                                             item_type=item_type,
                                             current_provider=current_provider,
                                             current_score=current_score,
                                             randomize=timestamp()),
                                title=_(u"No subtitles found"),
                                summary=_(
                                    u"%(current_info)sFilename: %(filename)s",
                                    current_info=current_display,
                                    filename=filename),
                                thumb=default_thumb))
    else:
        oc.add(
            DirectoryObject(
                key=Callback(ListAvailableSubsForItemMenu,
                             rating_key=rating_key,
                             item_title=item_title,
                             language=language,
                             filename=filename,
                             current_data=current_data,
                             part_id=part_id,
                             title=title,
                             current_id=current_id,
                             item_type=item_type,
                             current_provider=current_provider,
                             current_score=current_score,
                             randomize=timestamp()),
                title=
                _(u"Searching for %(language)s subs (%(video_data)s), refresh here ...",
                  language=display_language(get_language(language)),
                  video_data=video_display_data),
                summary=_(u"%(current_info)sFilename: %(filename)s",
                          current_info=current_display,
                          filename=filename),
                thumb=default_thumb))

    if not search_results or search_results == "found_none":
        return oc

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

    seen = []
    for subtitle in search_results:
        if subtitle.id in seen:
            continue

        bl_addon = ""
        if (str(subtitle.provider_name), str(subtitle.id)) in current_bl:
            bl_addon = "Blacklisted "

        wrong_fps_addon = ""
        wrong_series_addon = ""
        wrong_season_ep_addon = ""
        if subtitle.wrong_fps:
            if plex_part:
                wrong_fps_addon = _(
                    " (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)",
                    subtitle_fps=subtitle.fps,
                    media_fps=plex_part.fps)
            else:
                wrong_fps_addon = _(
                    " (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)",
                    subtitle_fps=subtitle.fps)

        if subtitle.wrong_series:
            wrong_series_addon = _(" (possibly wrong series)")

        if subtitle.wrong_season_ep:
            wrong_season_ep_addon = _(" (possibly wrong season/episode)")

        oc.add(
            DirectoryObject(
                key=Callback(TriggerDownloadSubtitle,
                             rating_key=rating_key,
                             randomize=timestamp(),
                             item_title=item_title,
                             subtitle_id=str(subtitle.id),
                             language=language),
                title=_(
                    u"%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s"
                    u"%(wrong_series_state)s%(wrong_season_ep_state)s",
                    blacklisted_state=bl_addon,
                    current_state=_("Available")
                    if current_id != subtitle.id else _("Current"),
                    provider_name=_(subtitle.provider_name),
                    score=subtitle.score,
                    wrong_fps_state=wrong_fps_addon,
                    wrong_series_state=wrong_series_addon,
                    wrong_season_ep_state=wrong_season_ep_addon),
                summary=_(u"Release: %(release_info)s, Matches: %(matches)s",
                          release_info=subtitle.release_info,
                          matches=", ".join(subtitle.matches)),
                thumb=default_thumb))

        seen.append(subtitle.id)

    return oc
Example #25
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
Example #26
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
Example #27
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)
Example #28
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)
Example #29
0
def ListAvailableSubsForItemMenu(rating_key=None, part_id=None, title=None, item_title=None, filename=None,
                                 item_type="episode", language=None, force=False, current_id=None, current_data=None,
                                 current_provider=None, current_score=None, randomize=None):
    assert rating_key, part_id

    running = scheduler.is_task_running("AvailableSubsForItem")
    search_results = get_item_task_data("AvailableSubsForItem", rating_key, language)

    if (search_results is None or force) and not running:
        scheduler.dispatch_task("AvailableSubsForItem", rating_key=rating_key, item_type=item_type, part_id=part_id,
                                language=language)
        running = True

    oc = SubFolderObjectContainer(title2=unicode(title), replace_parent=True)
    oc.add(DirectoryObject(
        key=Callback(ItemDetailsMenu, rating_key=rating_key, item_title=item_title, title=title, randomize=timestamp()),
        title=u"Back to: %s" % title,
        summary=current_data,
        thumb=default_thumb
    ))

    metadata = get_plex_metadata(rating_key, part_id, item_type)
    scanned_parts = scan_videos([metadata], kind="series" if item_type == "episode" else "movie", ignore_all=True)

    if not scanned_parts:
        Log.Error("Couldn't list available subtitles for %s", rating_key)
        return oc

    video, plex_part = scanned_parts.items()[0]

    video_display_data = [video.format] if video.format else []
    if video.release_group:
        video_display_data.append(u"by %s" % video.release_group)
    video_display_data = " ".join(video_display_data)

    current_display = (u"Current: %s (%s) " % (current_provider, current_score) if current_provider else "")
    if not running:
        oc.add(DirectoryObject(
            key=Callback(ListAvailableSubsForItemMenu, rating_key=rating_key, item_title=item_title, language=language,
                         filename=filename, part_id=part_id, title=title, current_id=current_id, force=True,
                         current_provider=current_provider, current_score=current_score,
                         current_data=current_data, item_type=item_type, randomize=timestamp()),
            title=u"Search for %s subs (%s)" % (get_language(language).name, video_display_data),
            summary=u"%sFilename: %s" % (current_display, filename),
            thumb=default_thumb
        ))
    else:
        oc.add(DirectoryObject(
            key=Callback(ListAvailableSubsForItemMenu, rating_key=rating_key, item_title=item_title,
                         language=language, filename=filename, current_data=current_data,
                         part_id=part_id, title=title, current_id=current_id, item_type=item_type,
                         current_provider=current_provider, current_score=current_score,
                         randomize=timestamp()),
            title=u"Searching for %s subs (%s), refresh here ..." % (get_language(language).name, video_display_data),
            summary=u"%sFilename: %s" % (current_display, filename),
            thumb=default_thumb
        ))

    if not search_results:
        return oc

    for subtitle in search_results:
        oc.add(DirectoryObject(
            key=Callback(TriggerDownloadSubtitle, rating_key=rating_key, randomize=timestamp(), item_title=item_title,
                         subtitle_id=str(subtitle.id), language=language),
            title=u"%s: %s, score: %s" % ("Available" if current_id != subtitle.id else "Current",
                                    subtitle.provider_name, subtitle.score),
            summary=u"Release: %s, Matches: %s" % (subtitle.release_info, ", ".join(subtitle.matches)),
            thumb=default_thumb
        ))

    return oc
Example #30
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
Example #31
0
def ListAvailableSubsForItemMenu(rating_key=None, part_id=None, title=None, item_title=None, filename=None,
                                 item_type="episode", language=None, language_name=None, force=False, current_id=None,
                                 current_data=None,
                                 current_provider=None, current_score=None, randomize=None):
    assert rating_key, part_id

    running = scheduler.is_task_running("AvailableSubsForItem")
    search_results = get_item_task_data("AvailableSubsForItem", rating_key, language)

    current_data = unicode(current_data) if current_data else None

    if (search_results is None or force) and not running:
        scheduler.dispatch_task("AvailableSubsForItem", rating_key=rating_key, item_type=item_type, part_id=part_id,
                                language=language)
        running = True

    oc = SubFolderObjectContainer(title2=unicode(title), replace_parent=True)
    oc.add(DirectoryObject(
        key=Callback(ItemDetailsMenu, rating_key=rating_key, item_title=item_title, title=title, randomize=timestamp()),
        title=_(u"< Back to %s", title),
        summary=current_data,
        thumb=default_thumb
    ))

    metadata = get_plex_metadata(rating_key, part_id, item_type)
    plex_part = None
    if not config.low_impact_mode:
        scanned_parts = scan_videos([metadata], ignore_all=True)

        if not scanned_parts:
            Log.Error("Couldn't list available subtitles for %s", rating_key)
            return oc

        video, plex_part = scanned_parts.items()[0]

        video_display_data = [video.format] if video.format else []
        if video.release_group:
            video_display_data.append(unicode(_(u"by %(release_group)s", release_group=video.release_group)))
        video_display_data = " ".join(video_display_data)
    else:
        video_display_data = metadata["filename"]

    current_display = (_(u"Current: %(provider_name)s (%(score)s) ",
                         provider_name=_(current_provider),
                         score=current_score if current_provider else ""))
    if not running:
        oc.add(DirectoryObject(
            key=Callback(ListAvailableSubsForItemMenu, rating_key=rating_key, item_title=item_title, language=language,
                         filename=filename, part_id=part_id, title=title, current_id=current_id, force=True,
                         current_provider=current_provider, current_score=current_score,
                         current_data=current_data, item_type=item_type, randomize=timestamp()),
            title=_(u"Search for %(language)s subs (%(video_data)s)",
                    language=get_language(language).name,
                    video_data=video_display_data),
            summary=_(u"%(current_info)sFilename: %(filename)s", current_info=current_display, filename=filename),
            thumb=default_thumb
        ))

        if search_results == "found_none":
            oc.add(DirectoryObject(
                key=Callback(ListAvailableSubsForItemMenu, rating_key=rating_key, item_title=item_title,
                             language=language, filename=filename, current_data=current_data, force=True,
                             part_id=part_id, title=title, current_id=current_id, item_type=item_type,
                             current_provider=current_provider, current_score=current_score,
                             randomize=timestamp()),
                title=_(u"No subtitles found"),
                summary=_(u"%(current_info)sFilename: %(filename)s", current_info=current_display, filename=filename),
                thumb=default_thumb
            ))
    else:
        oc.add(DirectoryObject(
            key=Callback(ListAvailableSubsForItemMenu, rating_key=rating_key, item_title=item_title,
                         language=language, filename=filename, current_data=current_data,
                         part_id=part_id, title=title, current_id=current_id, item_type=item_type,
                         current_provider=current_provider, current_score=current_score,
                         randomize=timestamp()),
            title=_(u"Searching for %(language)s subs (%(video_data)s), refresh here ...",
                    language=display_language(get_language(language)),
                    video_data=video_display_data),
            summary=_(u"%(current_info)sFilename: %(filename)s", current_info=current_display, filename=filename),
            thumb=default_thumb
        ))

    if not search_results or search_results == "found_none":
        return oc

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

    seen = []
    for subtitle in search_results:
        if subtitle.id in seen:
            continue

        bl_addon = ""
        if (str(subtitle.provider_name), str(subtitle.id)) in current_bl:
            bl_addon = "Blacklisted "

        wrong_fps_addon = ""
        wrong_series_addon = ""
        wrong_season_ep_addon = ""
        if subtitle.wrong_fps:
            if plex_part:
                wrong_fps_addon = _(" (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)",
                                    subtitle_fps=subtitle.fps,
                                    media_fps=plex_part.fps)
            else:
                wrong_fps_addon = _(" (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)",
                                    subtitle_fps=subtitle.fps)

        if subtitle.wrong_series:
            wrong_series_addon = _(" (possibly wrong series)")

        if subtitle.wrong_season_ep:
            wrong_season_ep_addon = _(" (possibly wrong season/episode)")

        oc.add(DirectoryObject(
            key=Callback(TriggerDownloadSubtitle, rating_key=rating_key, randomize=timestamp(), item_title=item_title,
                         subtitle_id=str(subtitle.id), language=language),
            title=_(u"%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s"
                    u"%(wrong_series_state)s%(wrong_season_ep_state)s",
                    blacklisted_state=bl_addon,
                    current_state=_("Available") if current_id != subtitle.id else _("Current"),
                    provider_name=_(subtitle.provider_name),
                    score=subtitle.score,
                    wrong_fps_state=wrong_fps_addon,
                    wrong_series_state=wrong_series_addon,
                    wrong_season_ep_state=wrong_season_ep_addon),
            summary=_(u"Release: %(release_info)s, Matches: %(matches)s",
                      release_info=subtitle.release_info,
                      matches=", ".join(subtitle.matches)),
            thumb=default_thumb
        ))

        seen.append(subtitle.id)

    return oc
Example #32
0
def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, randomize=None):
    """
    displays the item details menu of an item that doesn't contain any deeper tree, such as a movie or an episode
    :param rating_key:
    :param title:
    :param base_title:
    :param item_title:
    :param randomize:
    :return:
    """
    title = unicode(base_title) + " > " + unicode(title) if base_title else unicode(title)
    item = get_item(rating_key)
    current_kind = get_item_kind_from_rating_key(rating_key)

    timeout = 30

    oc = SubFolderObjectContainer(title2=title, replace_parent=True)
    oc.add(DirectoryObject(
        key=Callback(RefreshItem, rating_key=rating_key, item_title=item_title, randomize=timestamp(),
                     timeout=timeout*1000),
        title=u"Refresh: %s" % item_title,
        summary="Refreshes the %s, possibly searching for missing and picking up new subtitles on disk" % current_kind,
        thumb=item.thumb or default_thumb
    ))
    oc.add(DirectoryObject(
        key=Callback(RefreshItem, rating_key=rating_key, item_title=item_title, force=True, randomize=timestamp(),
                     timeout=timeout*1000),
        title=u"Auto-search: %s" % item_title,
        summary="Issues a forced refresh, ignoring known subtitles and searching for new ones",
        thumb=item.thumb or default_thumb
    ))

    # get stored subtitle info for item id
    current_subtitle_info = get_subtitle_info(rating_key)

    # get the plex item
    plex_item = list(Plex["library"].metadata(rating_key))[0]

    # get current media info for that item
    media = plex_item.media

    # look for subtitles for all available media parts and all of their languages
    for part in media.parts:
        filename = os.path.basename(part.file)
        part_id = str(part.id)

        # get corresponding stored subtitle data for that media part (physical media item)
        sub_part_data = current_subtitle_info.get(part_id, {}) if current_subtitle_info else {}

        # iterate through all configured languages
        for lang in config.lang_list:
            lang_a2 = lang.alpha2
            # ietf lang?
            if cast_bool(Prefs["subtitles.language.ietf"]) and "-" in lang_a2:
                lang_a2 = lang_a2.split("-")[0]

            sub_data_for_lang = sub_part_data.get(lang_a2, {})

            # try getting current subtitle information for that language
            current_subtitle_key = sub_data_for_lang.get("current", (None, None))
            current_sub_provider_name, current_sub_id = current_subtitle_key

            summary = u"No current subtitle in storage"
            current_score = None
            if current_sub_provider_name:
                current_subtitle = sub_part_data[lang_a2][current_subtitle_key]
                current_score = current_subtitle["score"]

                summary = u"Current subtitle: %s (added: %s, %s), Language: %s, Score: %i, Storage: %s" % \
                          (current_sub_provider_name,
                           df(current_subtitle["date_added"]), mode_map.get(current_subtitle.get("mode", "a")), lang,
                           current_subtitle["score"], current_subtitle["storage"])

            oc.add(DirectoryObject(
                key=Callback(ListAvailableSubsForItemMenu, rating_key=rating_key, part_id=part_id, title=title,
                             item_title=item_title, language=lang, current_id=current_sub_id,
                             item_type=plex_item.type, filename=filename, current_data=summary,
                             randomize=timestamp(), current_provider=current_sub_provider_name,
                             current_score=current_score),
                title=u"List %s subtitles" % lang.name,
                summary=summary
            ))

    add_ignore_options(oc, "videos", title=item_title, rating_key=rating_key, callback_menu=IgnoreMenu)

    return oc
Example #33
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)
Example #34
0
def MetadataMenu(rating_key, title=None, base_title=None, display_items=False, previous_item_type=None,
                 previous_rating_key=None, message=None, header=None, randomize=None):
    """
    displays the contents of a section based on whether it has a deeper tree or not (movies->movie (item) list; series->series list)
    :param rating_key:
    :param title:
    :param base_title:
    :param display_items:
    :param previous_item_type:
    :param previous_rating_key:
    :return:
    """
    title = unicode(title)
    item_title = title
    title = base_title + " > " + title
    oc = SubFolderObjectContainer(title2=title, no_cache=True, no_history=True, header=header, message=message,
                                  view_group="full_details")

    current_kind = get_item_kind_from_rating_key(rating_key)

    if display_items:
        timeout = 30
        show = None

        # add back to series for season
        if current_kind == "season":
            timeout = 720

            show = get_item(previous_rating_key)
            oc.add(DirectoryObject(
                key=Callback(MetadataMenu, rating_key=show.rating_key, title=show.title, base_title=show.section.title,
                             previous_item_type="section", display_items=True, randomize=timestamp()),
                title=u"< Back to %s" % show.title,
                thumb=show.thumb or default_thumb
            ))
        elif current_kind == "series":
            # it shouldn't take more than 6 minutes to scan all of a series' files and determine the force refresh
            timeout = 3600

        items = get_all_items(key="children", value=rating_key, base="library/metadata")
        kind, deeper = get_items_info(items)
        dig_tree(oc, items, MetadataMenu,
                 pass_kwargs={"base_title": title, "display_items": deeper, "previous_item_type": kind,
                              "previous_rating_key": rating_key})

        # we don't know exactly where we are here, only add ignore option to series
        if current_kind in ("series", "season"):
            item = get_item(rating_key)
            sub_title = get_item_title(item)
            add_ignore_options(oc, current_kind, title=sub_title, rating_key=rating_key, callback_menu=IgnoreMenu)

        # mass-extract embedded
        if current_kind == "season" and config.plex_transcoder:
            for lang in config.lang_list:
                oc.add(DirectoryObject(
                    key=Callback(SeasonExtractEmbedded, rating_key=rating_key, language=lang,
                                 base_title=show.section.title, display_items=display_items, item_title=item_title,
                                 title=title,
                                 previous_item_type=previous_item_type, with_mods=True,
                                 previous_rating_key=previous_rating_key, randomize=timestamp()),
                    title=u"Extract missing %s embedded subtitles" % display_language(lang),
                    summary="Extracts the not yet extracted embedded subtitles of all episodes for the current season "
                            "with all configured default modifications"
                ))
                oc.add(DirectoryObject(
                    key=Callback(SeasonExtractEmbedded, rating_key=rating_key, language=lang,
                                 base_title=show.section.title, display_items=display_items, item_title=item_title,
                                 title=title, force=True,
                                 previous_item_type=previous_item_type, with_mods=True,
                                 previous_rating_key=previous_rating_key, randomize=timestamp()),
                    title=u"Extract and activate %s embedded subtitles" % display_language(lang),
                    summary="Extracts embedded subtitles of all episodes for the current season "
                            "with all configured default modifications"
                ))

        # add refresh
        oc.add(DirectoryObject(
            key=Callback(RefreshItem, rating_key=rating_key, item_title=title, refresh_kind=current_kind,
                         previous_rating_key=previous_rating_key, timeout=timeout * 1000, randomize=timestamp()),
            title=u"Refresh: %s" % item_title,
            summary="Refreshes the %s, possibly searching for missing and picking up new subtitles on disk" % current_kind
        ))
        oc.add(DirectoryObject(
            key=Callback(RefreshItem, rating_key=rating_key, item_title=title, force=True,
                         refresh_kind=current_kind, previous_rating_key=previous_rating_key, timeout=timeout * 1000,
                         randomize=timestamp()),
            title=u"Auto-Find subtitles: %s" % item_title,
            summary="Issues a forced refresh, ignoring known subtitles and searching for new ones"
        ))
    else:
        return ItemDetailsMenu(rating_key=rating_key, title=title, item_title=item_title)

    return oc
Example #35
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="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(LogStorage, key="history", randomize=timestamp()),
        title=pad_title("Log the plugin's internal history 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"),
    ))
    oc.add(DirectoryObject(
        key=Callback(ResetStorage, key="history", randomize=timestamp()),
        title=pad_title("Reset the plugin's internal history storage"),
    ))
    return oc