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: %s" % identifier)) storage.destroy() return oc
def ListStoredSubsForItemMenu(**kwargs): oc = SubFolderObjectContainer(title2=unicode(kwargs["title"]), replace_parent=True) rating_key = kwargs["rating_key"] part_id = kwargs["part_id"] language = Language.fromietf(kwargs["language"]) current_sub, stored_subs, storage = get_current_sub(rating_key, part_id, language) all_subs = stored_subs.get_all(part_id, language) kwargs.pop("randomize") for key, subtitle in sorted(filter(lambda x: x[0] != "current", all_subs.items()), key=lambda x: x[1].date_added, reverse=True): is_current = key == all_subs["current"] summary = u"added: %s, %s, Language: %s, Score: %i, Storage: %s" % \ (df(subtitle.date_added), subtitle.mode_verbose, display_language(language), subtitle.score, 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"%s%s, Score: %s" % ("Current: " if is_current else "Stored: ", sub_name, subtitle.score), summary=summary )) return oc
def ManageBlacklistMenu(**kwargs): oc = SubFolderObjectContainer(title2=unicode(kwargs["title"]), replace_parent=True) rating_key = kwargs["rating_key"] part_id = kwargs["part_id"] language = kwargs["language"] remove_sub_key = kwargs.pop("remove_sub_key", None) current_data = unicode(kwargs["current_data"]) current_sub, stored_subs, storage = get_current_sub( rating_key, part_id, language) current_bl, subs = stored_subs.get_blacklist(part_id, language) if remove_sub_key: remove_sub_key = tuple(remove_sub_key.split("__")) stored_subs.blacklist(part_id, language, remove_sub_key, add=False) storage.save(stored_subs) Log.Info("Removed %s from blacklist", remove_sub_key) kwargs.pop("randomize") oc.add( DirectoryObject(key=Callback(ItemDetailsMenu, rating_key=kwargs["rating_key"], item_title=kwargs["item_title"], title=kwargs["title"], randomize=timestamp()), title=_(u"< Back to %s", kwargs["title"]), summary=current_data, thumb=default_thumb)) def sorter(pair): # thanks RestrictedModule parser for messing with lambda (x, y) return pair[1]["date_added"] for sub_key, data in sorted(current_bl.iteritems(), key=sorter, reverse=True): provider_name, subtitle_id = sub_key title = _( u"%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, " u"Score: %(score)i, Storage: %(storage_type)s", provider_name=provider_name, subtitle_id=subtitle_id, date_added=df(data["date_added"]), mode=current_sub.get_mode_verbose(data["mode"]), language=display_language(Language.fromietf(language)), score=data["score"], storage_type=data["storage_type"]) oc.add( DirectoryObject(key=Callback(ManageBlacklistMenu, remove_sub_key="__".join(sub_key), randomize=timestamp(), **kwargs), title=title, summary=_(u"Remove subtitle from blacklist"))) storage.destroy() return oc
def SubtitleOptionsMenu(**kwargs): oc = SubFolderObjectContainer(title2=unicode(kwargs["title"]), replace_parent=True) rating_key = kwargs["rating_key"] part_id = kwargs["part_id"] language = kwargs["language"] current_data = kwargs["current_data"] current_sub, stored_subs, storage = get_current_sub( rating_key, 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=kwargs["current_data"], thumb=default_thumb)) oc.add( DirectoryObject(key=Callback(ListAvailableSubsForItemMenu, randomize=timestamp(), **kwargs), title=u"List %s subtitles" % kwargs["language_name"], summary=kwargs["current_data"])) if current_sub: oc.add( DirectoryObject( key=Callback(SubtitleModificationsMenu, randomize=timestamp(), **kwargs), title=u"Modify %s subtitle" % kwargs["language_name"], summary=u"Currently applied mods: %s" % (", ".join(current_sub.mods) if current_sub.mods else "none"))) oc.add( DirectoryObject( key=Callback(BlacklistSubtitleMenu, randomize=timestamp(), **kwargs), title=u"Blacklist %s subtitle and search for a new one" % 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 (%s contained)" % len(current_bl), summary=u"Inspect currently blacklisted subtitles")) storage.destroy() return oc
def SubtitleOptionsMenu(**kwargs): oc = SubFolderObjectContainer(title2=unicode(kwargs["title"]), replace_parent=True, header=kwargs.get("header"), message=kwargs.get("message")) rating_key = kwargs["rating_key"] part_id = kwargs["part_id"] language = kwargs["language"] current_data = unicode(kwargs["current_data"]) current_sub, stored_subs, storage = get_current_sub(rating_key, part_id, language) subs_count = stored_subs.count(part_id, language) kwargs.pop("randomize") oc.add(DirectoryObject( key=Callback(ItemDetailsMenu, rating_key=kwargs["rating_key"], item_title=kwargs["item_title"], title=kwargs["title"], randomize=timestamp()), title=_(u"< Back to %s", kwargs["title"]), summary=current_data, thumb=default_thumb )) if subs_count: oc.add(DirectoryObject( key=Callback(ListStoredSubsForItemMenu, randomize=timestamp(), **kwargs), title=_(u"Select active %(language)s subtitle", language=kwargs["language_name"]), summary=_(u"%(count)d subtitles in storage", count=subs_count) )) oc.add(DirectoryObject( key=Callback(ListAvailableSubsForItemMenu, randomize=timestamp(), **kwargs), title=_(u"List available %(language)s subtitles", language=kwargs["language_name"]), summary=current_data )) if current_sub: oc.add(DirectoryObject( key=Callback(SubtitleModificationsMenu, randomize=timestamp(), **kwargs), title=_(u"Modify current %(language)s subtitle", language=kwargs["language_name"]), summary=_(u"Currently applied mods: %(mod_list)s", mod_list=(", ".join(current_sub.mods) if current_sub.mods else "none")) )) if current_sub.provider_name != "embedded": oc.add(DirectoryObject( key=Callback(BlacklistSubtitleMenu, randomize=timestamp(), **kwargs), title=_(u"Blacklist current %(language)s subtitle and search for a new one", language=kwargs["language_name"]), summary=current_data )) current_bl, subs = stored_subs.get_blacklist(part_id, language) if current_bl: oc.add(DirectoryObject( key=Callback(ManageBlacklistMenu, randomize=timestamp(), **kwargs), title=_(u"Manage blacklist (%(amount)s contained)", amount=len(current_bl)), summary=_(u"Inspect currently blacklisted subtitles") )) storage.destroy() return oc
def blacklist(rating_key, part_id, language): current_sub, stored_subs, storage = get_current_sub(rating_key, part_id, language) if not current_sub: return stored_subs.blacklist(part_id, language, current_sub.key) storage.save(stored_subs) storage.destroy() Log.Info("Added %s to blacklist", current_sub.key) return True
def ManageBlacklistMenu(**kwargs): oc = SubFolderObjectContainer(title2=unicode(kwargs["title"]), replace_parent=True) rating_key = kwargs["rating_key"] part_id = kwargs["part_id"] language = kwargs["language"] remove_sub_key = kwargs.pop("remove_sub_key", None) current_data = unicode(kwargs["current_data"]) current_sub, stored_subs, storage = get_current_sub(rating_key, part_id, language) current_bl, subs = stored_subs.get_blacklist(part_id, language) if remove_sub_key: remove_sub_key = tuple(remove_sub_key.split("__")) stored_subs.blacklist(part_id, language, remove_sub_key, add=False) storage.save(stored_subs) Log.Info("Removed %s from blacklist", remove_sub_key) kwargs.pop("randomize") oc.add(DirectoryObject( key=Callback(ItemDetailsMenu, rating_key=kwargs["rating_key"], item_title=kwargs["item_title"], title=kwargs["title"], randomize=timestamp()), title=_(u"< Back to %s", kwargs["title"]), summary=current_data, thumb=default_thumb )) def sorter(pair): # thanks RestrictedModule parser for messing with lambda (x, y) return pair[1]["date_added"] for sub_key, data in sorted(current_bl.iteritems(), key=sorter, reverse=True): provider_name, subtitle_id = sub_key title = _(u"%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, " u"Score: %(score)i, Storage: %(storage_type)s", provider_name=_(provider_name), subtitle_id=subtitle_id, date_added=df(data["date_added"]), mode=_(current_sub.get_mode_verbose(data["mode"])), language=display_language(Language.fromietf(language)), score=data["score"], storage_type=data["storage_type"]) oc.add(DirectoryObject( key=Callback(ManageBlacklistMenu, remove_sub_key="__".join(sub_key), randomize=timestamp(), **kwargs), title=title, summary=_(u"Remove subtitle from blacklist") )) storage.destroy() return oc
def SubtitleListMods(**kwargs): rating_key = kwargs["rating_key"] part_id = kwargs["part_id"] language = kwargs["language"] current_sub, stored_subs, storage = get_current_sub(rating_key, part_id, language) kwargs.pop("randomize") oc = SubFolderObjectContainer(title2=kwargs["title"], replace_parent=True) oc.add(DirectoryObject( key=Callback(SubtitleModificationsMenu, randomize=timestamp(), **kwargs), title=_("< Back to subtitle modifications") )) for identifier in current_sub.mods: oc.add(DirectoryObject( key=Callback(SubtitleSetMods, mods=identifier, mode="remove", randomize=timestamp(), **kwargs), title=_("Remove: %(mod_name)s", mod_name=identifier) )) storage.destroy() return oc
def ListStoredSubsForItemMenu(**kwargs): oc = SubFolderObjectContainer(title2=unicode(kwargs["title"]), replace_parent=True) rating_key = kwargs["rating_key"] part_id = kwargs["part_id"] language = Language.fromietf(kwargs["language"]) current_sub, stored_subs, storage = get_current_sub(rating_key, part_id, language) all_subs = stored_subs.get_all(part_id, language) kwargs.pop("randomize") for key, subtitle in sorted(filter(lambda x: x[0] not in ("current", "blacklist"), all_subs.items()), key=lambda x: x[1].date_added, reverse=True): is_current = key == all_subs["current"] summary = _(u"added: %(date_added)s, %(mode)s, Language: %(language)s, Score: %(score)i, Storage: " u"%(storage_type)s", date_added=df(subtitle.date_added), mode=_(subtitle.mode_verbose), language=display_language(language), score=subtitle.score, storage_type=subtitle.storage_type) sub_name = subtitle.provider_name if sub_name == "embedded": sub_name += " (%s)" % subtitle.id oc.add(DirectoryObject( key=Callback(SelectStoredSubForItemMenu, randomize=timestamp(), sub_key="__".join(key), **kwargs), title=_(u"%(current_state)s%(subtitle_name)s, Score: %(score)s", current_state=_("Current: ") if is_current else _("Stored: "), subtitle_name=sub_name, score=subtitle.score), summary=summary )) return oc
def 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) 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(u"by %s" % video.release_group) video_display_data = " ".join(video_display_data) else: video_display_data = metadata["filename"] 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 )) 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"%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 ..." % (display_language(get_language(language)), video_display_data), summary=u"%sFilename: %s" % (current_display, 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 = "" if subtitle.wrong_fps: if plex_part: wrong_fps_addon = " (wrong FPS, sub: %s, media: %s)" % (subtitle.fps, plex_part.fps) else: wrong_fps_addon = " (wrong FPS, sub: %s, media: unknown, low impact mode)" % subtitle.fps 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: %s, score: %s%s" % (bl_addon, "Available" if current_id != subtitle.id else "Current", subtitle.provider_name, subtitle.score, wrong_fps_addon), summary=u"Release: %s, Matches: %s" % (subtitle.release_info, ", ".join(subtitle.matches)), thumb=default_thumb )) seen.append(subtitle.id) return oc
def SubtitleModificationsMenu(**kwargs): rating_key = kwargs["rating_key"] part_id = kwargs["part_id"] language = kwargs["language"] current_sub, stored_subs, storage = get_current_sub(rating_key, part_id, language) kwargs.pop("randomize") current_mods = current_sub.mods or [] oc = SubFolderObjectContainer(title2=kwargs["title"], replace_parent=True) from interface.item_details import SubtitleOptionsMenu oc.add(DirectoryObject( key=Callback(SubtitleOptionsMenu, randomize=timestamp(), **kwargs), title=u"< Back to subtitle options for: %s" % kwargs["title"], summary=kwargs["current_data"], thumb=default_thumb )) for identifier, mod in mod_registry.mods.iteritems(): if mod.advanced: continue if mod.exclusive and identifier in current_mods: continue oc.add(DirectoryObject( key=Callback(SubtitleSetMods, mods=identifier, mode="add", randomize=timestamp(), **kwargs), title=pad_title(mod.description), summary=mod.long_description or "" )) fps_mod = SubtitleModifications.get_mod_class("change_FPS") oc.add(DirectoryObject( key=Callback(SubtitleFPSModMenu, randomize=timestamp(), **kwargs), title=pad_title(fps_mod.description), summary=fps_mod.long_description or "" )) shift_mod = SubtitleModifications.get_mod_class("shift_offset") oc.add(DirectoryObject( key=Callback(SubtitleShiftModUnitMenu, randomize=timestamp(), **kwargs), title=pad_title(shift_mod.description), summary=shift_mod.long_description or "" )) color_mod = SubtitleModifications.get_mod_class("color") oc.add(DirectoryObject( key=Callback(SubtitleColorModMenu, randomize=timestamp(), **kwargs), title=pad_title(color_mod.description), summary=color_mod.long_description or "" )) if current_mods: oc.add(DirectoryObject( key=Callback(SubtitleSetMods, mods=None, mode="remove_last", randomize=timestamp(), **kwargs), title=pad_title("Remove last applied mod (%s)" % current_mods[-1]), summary=u"Currently applied mods: %s" % (", ".join(current_mods) if current_mods else "none") )) oc.add(DirectoryObject( key=Callback(SubtitleListMods, randomize=timestamp(), **kwargs), title=pad_title("Manage applied mods"), summary=u"Currently applied mods: %s" % (", ".join(current_mods)) )) oc.add(DirectoryObject( key=Callback(SubtitleReapplyMods, randomize=timestamp(), **kwargs), title=pad_title("Reapply applied mods"), summary=u"Currently applied mods: %s" % (", ".join(current_mods) if current_mods else "none") )) oc.add(DirectoryObject( key=Callback(SubtitleSetMods, mods=None, mode="clear", randomize=timestamp(), **kwargs), title=pad_title("Restore original version"), summary=u"Currently applied mods: %s" % (", ".join(current_mods) if current_mods else "none") )) storage.destroy() return oc
def SubtitleOptionsMenu(**kwargs): oc = SubFolderObjectContainer(title2=unicode(kwargs["title"]), replace_parent=True, header=kwargs.get("header"), message=kwargs.get("message")) rating_key = kwargs["rating_key"] part_id = kwargs["part_id"] language = kwargs["language"] current_data = unicode(kwargs["current_data"]) current_sub, stored_subs, storage = get_current_sub( rating_key, part_id, language) subs_count = stored_subs.count(part_id, language) kwargs.pop("randomize") oc.add( DirectoryObject(key=Callback(ItemDetailsMenu, rating_key=kwargs["rating_key"], item_title=kwargs["item_title"], title=kwargs["title"], randomize=timestamp()), title=_(u"< Back to %s", kwargs["title"]), summary=current_data, thumb=default_thumb)) if subs_count: oc.add( DirectoryObject(key=Callback(ListStoredSubsForItemMenu, randomize=timestamp(), **kwargs), title=_(u"Select active %(language)s subtitle", language=kwargs["language_name"]), summary=_(u"%(count)d subtitles in storage", count=subs_count))) oc.add( DirectoryObject(key=Callback(ListAvailableSubsForItemMenu, randomize=timestamp(), **kwargs), title=_(u"List available %(language)s subtitles", language=kwargs["language_name"]), summary=current_data)) if current_sub: oc.add( DirectoryObject(key=Callback(SubtitleModificationsMenu, randomize=timestamp(), **kwargs), title=_(u"Modify current %(language)s subtitle", language=kwargs["language_name"]), summary=_( u"Currently applied mods: %(mod_list)s", mod_list=(", ".join(current_sub.mods) if current_sub.mods else "none")))) if current_sub.provider_name != "embedded": oc.add( DirectoryObject( key=Callback(BlacklistSubtitleMenu, randomize=timestamp(), **kwargs), title= _(u"Blacklist current %(language)s subtitle and search for a new one", language=kwargs["language_name"]), summary=current_data)) current_bl, subs = stored_subs.get_blacklist(part_id, language) if current_bl: oc.add( DirectoryObject( key=Callback(ManageBlacklistMenu, randomize=timestamp(), **kwargs), title=_(u"Manage blacklist (%(amount)s contained)", amount=len(current_bl)), summary=_(u"Inspect currently blacklisted subtitles"))) storage.destroy() return oc
def SubtitleModificationsMenu(**kwargs): rating_key = kwargs["rating_key"] part_id = kwargs["part_id"] language = kwargs["language"] lang_instance = Language.fromietf(language) current_sub, stored_subs, storage = get_current_sub(rating_key, part_id, language) kwargs.pop("randomize") current_mods = current_sub.mods or [] oc = SubFolderObjectContainer(title2=kwargs["title"], replace_parent=True) from interface.item_details import SubtitleOptionsMenu oc.add(DirectoryObject( key=Callback(SubtitleOptionsMenu, randomize=timestamp(), **kwargs), title=_(u"< Back to subtitle options for: %s", kwargs["title"]), summary=unicode(kwargs["current_data"]), thumb=default_thumb )) for identifier, mod in mod_registry.mods.iteritems(): if mod.advanced: continue if mod.exclusive and identifier in current_mods: continue if mod.languages and lang_instance not in mod.languages: continue oc.add(DirectoryObject( key=Callback(SubtitleSetMods, mods=identifier, mode="add", randomize=timestamp(), **kwargs), title=pad_title(_(mod.description)), summary=_(mod.long_description) or "" )) fps_mod = SubtitleModifications.get_mod_class("change_FPS") oc.add(DirectoryObject( key=Callback(SubtitleFPSModMenu, randomize=timestamp(), **kwargs), title=pad_title(_(fps_mod.description)), summary=_(fps_mod.long_description) or "" )) shift_mod = SubtitleModifications.get_mod_class("shift_offset") oc.add(DirectoryObject( key=Callback(SubtitleShiftModUnitMenu, randomize=timestamp(), **kwargs), title=pad_title(_(shift_mod.description)), summary=_(shift_mod.long_description) or "" )) color_mod = SubtitleModifications.get_mod_class("color") oc.add(DirectoryObject( key=Callback(SubtitleColorModMenu, randomize=timestamp(), **kwargs), title=pad_title(_(color_mod.description)), summary=_(color_mod.long_description) or "" )) if current_mods: oc.add(DirectoryObject( key=Callback(SubtitleSetMods, mods=None, mode="remove_last", randomize=timestamp(), **kwargs), title=pad_title(_("Remove last applied mod (%s)", current_mods[-1])), summary=_(u"Currently applied mods: %(mod_list)s", mod_list=", ".join(current_mods) if current_mods else _("none")) )) oc.add(DirectoryObject( key=Callback(SubtitleListMods, randomize=timestamp(), **kwargs), title=pad_title(_("Manage applied mods")), summary=_(u"Currently applied mods: %(mod_list)s", mod_list=", ".join(current_mods)) )) oc.add(DirectoryObject( key=Callback(SubtitleReapplyMods, randomize=timestamp(), **kwargs), title=pad_title(_("Reapply applied mods")), summary=_(u"Currently applied mods: %(mod_list)s", mod_list=", ".join(current_mods) if current_mods else _("none")) )) oc.add(DirectoryObject( key=Callback(SubtitleSetMods, mods=None, mode="clear", randomize=timestamp(), **kwargs), title=pad_title(_("Restore original version")), summary=_(u"Currently applied mods: %(mod_list)s", mod_list=", ".join(current_mods) if current_mods else _("none")) )) storage.destroy() return oc
def 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