Add Doku-Streams plugin and prefer source metadata
This commit is contained in:
432
addon/default.py
432
addon/default.py
@@ -958,6 +958,57 @@ def _update_repository_source(info_url: str) -> bool:
|
||||
return False
|
||||
|
||||
|
||||
def _settings_key_for_plugin(name: str) -> str:
|
||||
safe = re.sub(r"[^a-z0-9]+", "_", (name or "").strip().casefold()).strip("_")
|
||||
return f"update_version_{safe}" if safe else "update_version_unknown"
|
||||
|
||||
|
||||
def _collect_plugin_metadata(plugin: BasisPlugin, titles: list[str]) -> dict[str, tuple[dict[str, str], dict[str, str], list[TmdbCastMember] | None]]:
|
||||
getter = getattr(plugin, "metadata_for", None)
|
||||
if not callable(getter):
|
||||
return {}
|
||||
collected: dict[str, tuple[dict[str, str], dict[str, str], list[TmdbCastMember] | None]] = {}
|
||||
for title in titles:
|
||||
try:
|
||||
labels, art, cast = getter(title)
|
||||
except Exception:
|
||||
continue
|
||||
if isinstance(labels, dict) or isinstance(art, dict) or cast:
|
||||
label_map = {str(k): str(v) for k, v in dict(labels or {}).items() if v}
|
||||
art_map = {str(k): str(v) for k, v in dict(art or {}).items() if v}
|
||||
collected[title] = (label_map, art_map, cast if isinstance(cast, list) else None)
|
||||
return collected
|
||||
|
||||
|
||||
def _needs_tmdb(labels: dict[str, str], art: dict[str, str], *, want_plot: bool, want_art: bool) -> bool:
|
||||
if want_plot and not labels.get("plot"):
|
||||
return True
|
||||
if want_art and not (art.get("thumb") or art.get("poster") or art.get("fanart") or art.get("landscape")):
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def _merge_metadata(
|
||||
title: str,
|
||||
tmdb_labels: dict[str, str] | None,
|
||||
tmdb_art: dict[str, str] | None,
|
||||
tmdb_cast: list[TmdbCastMember] | None,
|
||||
plugin_meta: tuple[dict[str, str], dict[str, str], list[TmdbCastMember] | None] | None,
|
||||
) -> tuple[dict[str, str], dict[str, str], list[TmdbCastMember] | None]:
|
||||
labels = dict(tmdb_labels or {})
|
||||
art = dict(tmdb_art or {})
|
||||
cast = tmdb_cast
|
||||
if plugin_meta is not None:
|
||||
meta_labels, meta_art, meta_cast = plugin_meta
|
||||
labels.update({k: str(v) for k, v in dict(meta_labels or {}).items() if v})
|
||||
art.update({k: str(v) for k, v in dict(meta_art or {}).items() if v})
|
||||
if meta_cast is not None:
|
||||
cast = meta_cast
|
||||
if "title" not in labels:
|
||||
labels["title"] = title
|
||||
return labels, art, cast
|
||||
|
||||
|
||||
def _sync_update_version_settings() -> None:
|
||||
addon = _get_addon()
|
||||
addon_version = "0.0.0"
|
||||
@@ -974,9 +1025,10 @@ def _sync_update_version_settings() -> None:
|
||||
"update_version_einschalten": "-",
|
||||
"update_version_topstreamfilm": "-",
|
||||
"update_version_filmpalast": "-",
|
||||
"update_version_doku_streams": "-",
|
||||
}
|
||||
for plugin in _discover_plugins().values():
|
||||
key = f"update_version_{str(plugin.name).strip().lower()}"
|
||||
key = _settings_key_for_plugin(str(plugin.name))
|
||||
if key in versions:
|
||||
versions[key] = _plugin_version(plugin)
|
||||
for key, value in versions.items():
|
||||
@@ -1072,10 +1124,24 @@ def _show_plugin_search_results(plugin_name: str, query: str) -> None:
|
||||
results = [str(t).strip() for t in (results or []) if t and str(t).strip()]
|
||||
results.sort(key=lambda value: value.casefold())
|
||||
|
||||
plugin_meta = _collect_plugin_metadata(plugin, results)
|
||||
tmdb_prefetched: dict[str, tuple[dict[str, str], dict[str, str], list[TmdbCastMember]]] = {}
|
||||
if results and not canceled:
|
||||
show_tmdb = _tmdb_enabled()
|
||||
show_plot = _get_setting_bool("tmdb_show_plot", default=True)
|
||||
show_art = _get_setting_bool("tmdb_show_art", default=True)
|
||||
prefer_source = bool(getattr(plugin, "prefer_source_metadata", False))
|
||||
tmdb_titles = list(results)
|
||||
if show_tmdb and prefer_source:
|
||||
tmdb_titles = []
|
||||
for title in results:
|
||||
meta = plugin_meta.get(title)
|
||||
meta_labels = meta[0] if meta else {}
|
||||
meta_art = meta[1] if meta else {}
|
||||
if _needs_tmdb(meta_labels, meta_art, want_plot=show_plot, want_art=show_art):
|
||||
tmdb_titles.append(title)
|
||||
if show_tmdb and tmdb_titles and not canceled:
|
||||
canceled = progress(35, f"{plugin_name} (1/1) Metadaten…")
|
||||
tmdb_prefetched = _tmdb_labels_and_art_bulk(list(results))
|
||||
tmdb_prefetched = _tmdb_labels_and_art_bulk(list(tmdb_titles))
|
||||
|
||||
total_results = max(1, len(results))
|
||||
for index, title in enumerate(results, start=1):
|
||||
@@ -1084,8 +1150,9 @@ def _show_plugin_search_results(plugin_name: str, query: str) -> None:
|
||||
if index == 1 or index == total_results or (index % 10 == 0):
|
||||
pct = 35 + int((index / float(total_results)) * 60)
|
||||
canceled = progress(pct, f"{plugin_name} (1/1) aufbereiten {index}/{total_results}")
|
||||
info_labels, art, cast = tmdb_prefetched.get(title, _tmdb_labels_and_art(title))
|
||||
info_labels = dict(info_labels or {})
|
||||
tmdb_info, tmdb_art, tmdb_cast = tmdb_prefetched.get(title, ({}, {}, []))
|
||||
meta = plugin_meta.get(title)
|
||||
info_labels, art, cast = _merge_metadata(title, tmdb_info, tmdb_art, tmdb_cast, meta)
|
||||
info_labels.setdefault("mediatype", "tvshow")
|
||||
if (info_labels.get("mediatype") or "").strip().casefold() == "tvshow":
|
||||
info_labels.setdefault("tvshowtitle", title)
|
||||
@@ -1248,15 +1315,29 @@ def _show_search_results(query: str) -> None:
|
||||
continue
|
||||
results = [str(t).strip() for t in (results or []) if t and str(t).strip()]
|
||||
_log(f"Treffer ({plugin_name}): {len(results)}", xbmc.LOGDEBUG)
|
||||
plugin_meta = _collect_plugin_metadata(plugin, results)
|
||||
tmdb_prefetched: dict[str, tuple[dict[str, str], dict[str, str], list[TmdbCastMember]]] = {}
|
||||
if results:
|
||||
show_tmdb = _tmdb_enabled()
|
||||
show_plot = _get_setting_bool("tmdb_show_plot", default=True)
|
||||
show_art = _get_setting_bool("tmdb_show_art", default=True)
|
||||
prefer_source = bool(getattr(plugin, "prefer_source_metadata", False))
|
||||
tmdb_titles = list(results)
|
||||
if show_tmdb and prefer_source:
|
||||
tmdb_titles = []
|
||||
for title in results:
|
||||
meta = plugin_meta.get(title)
|
||||
meta_labels = meta[0] if meta else {}
|
||||
meta_art = meta[1] if meta else {}
|
||||
if _needs_tmdb(meta_labels, meta_art, want_plot=show_plot, want_art=show_art):
|
||||
tmdb_titles.append(title)
|
||||
if show_tmdb and tmdb_titles:
|
||||
canceled = progress(
|
||||
range_start + int((range_end - range_start) * 0.35),
|
||||
f"{plugin_name} ({plugin_index}/{total_plugins}) Metadaten…",
|
||||
)
|
||||
if canceled:
|
||||
break
|
||||
tmdb_prefetched = _tmdb_labels_and_art_bulk(list(results))
|
||||
tmdb_prefetched = _tmdb_labels_and_art_bulk(list(tmdb_titles))
|
||||
total_results = max(1, len(results))
|
||||
for title_index, title in enumerate(results, start=1):
|
||||
if title_index == 1 or title_index == total_results or (title_index % 10 == 0):
|
||||
@@ -1266,8 +1347,9 @@ def _show_search_results(query: str) -> None:
|
||||
)
|
||||
if canceled:
|
||||
break
|
||||
info_labels, art, cast = tmdb_prefetched.get(title, _tmdb_labels_and_art(title))
|
||||
info_labels = dict(info_labels or {})
|
||||
tmdb_info, tmdb_art, tmdb_cast = tmdb_prefetched.get(title, ({}, {}, []))
|
||||
meta = plugin_meta.get(title)
|
||||
info_labels, art, cast = _merge_metadata(title, tmdb_info, tmdb_art, tmdb_cast, meta)
|
||||
info_labels.setdefault("mediatype", "tvshow")
|
||||
if (info_labels.get("mediatype") or "").strip().casefold() == "tvshow":
|
||||
info_labels.setdefault("tvshowtitle", title)
|
||||
@@ -1619,6 +1701,176 @@ def _show_genres(plugin_name: str) -> None:
|
||||
xbmcplugin.endOfDirectory(handle)
|
||||
|
||||
|
||||
def _show_categories(plugin_name: str) -> None:
|
||||
handle = _get_handle()
|
||||
_log(f"Kategorien laden: {plugin_name}")
|
||||
plugin = _discover_plugins().get(plugin_name)
|
||||
if plugin is None:
|
||||
xbmcgui.Dialog().notification("Kategorien", "Plugin nicht gefunden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcplugin.endOfDirectory(handle)
|
||||
return
|
||||
getter = getattr(plugin, "categories", None)
|
||||
if not callable(getter):
|
||||
xbmcgui.Dialog().notification("Kategorien", "Kategorien nicht verfuegbar.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcplugin.endOfDirectory(handle)
|
||||
return
|
||||
try:
|
||||
categories = list(getter() or [])
|
||||
except Exception as exc:
|
||||
_log(f"Kategorien konnten nicht geladen werden ({plugin_name}): {exc}", xbmc.LOGWARNING)
|
||||
xbmcgui.Dialog().notification("Kategorien", "Kategorien konnten nicht geladen werden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcplugin.endOfDirectory(handle)
|
||||
return
|
||||
for category in categories:
|
||||
category = str(category).strip()
|
||||
if not category:
|
||||
continue
|
||||
_add_directory_item(
|
||||
handle,
|
||||
category,
|
||||
"category_titles_page",
|
||||
{"plugin": plugin_name, "category": category, "page": "1"},
|
||||
is_folder=True,
|
||||
)
|
||||
xbmcplugin.endOfDirectory(handle)
|
||||
|
||||
|
||||
def _show_category_titles_page(plugin_name: str, category: str, page: int = 1) -> None:
|
||||
handle = _get_handle()
|
||||
plugin = _discover_plugins().get(plugin_name)
|
||||
if plugin is None:
|
||||
xbmcgui.Dialog().notification("Kategorien", "Plugin nicht gefunden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcplugin.endOfDirectory(handle)
|
||||
return
|
||||
|
||||
page = max(1, int(page or 1))
|
||||
paging_getter = getattr(plugin, "titles_for_genre_page", None)
|
||||
if not callable(paging_getter):
|
||||
xbmcgui.Dialog().notification("Kategorien", "Paging nicht verfuegbar.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcplugin.endOfDirectory(handle)
|
||||
return
|
||||
|
||||
total_pages = None
|
||||
count_getter = getattr(plugin, "genre_page_count", None)
|
||||
if callable(count_getter):
|
||||
try:
|
||||
total_pages = int(count_getter(category) or 1)
|
||||
except Exception:
|
||||
total_pages = None
|
||||
if total_pages is not None:
|
||||
page = min(page, max(1, total_pages))
|
||||
xbmcplugin.setPluginCategory(handle, f"{category} ({page}/{total_pages})")
|
||||
else:
|
||||
xbmcplugin.setPluginCategory(handle, f"{category} ({page})")
|
||||
_set_content(handle, "movies" if (plugin_name or "").casefold() == "einschalten" else "tvshows")
|
||||
|
||||
if page > 1:
|
||||
_add_directory_item(
|
||||
handle,
|
||||
"Vorherige Seite",
|
||||
"category_titles_page",
|
||||
{"plugin": plugin_name, "category": category, "page": str(page - 1)},
|
||||
is_folder=True,
|
||||
)
|
||||
|
||||
try:
|
||||
titles = list(paging_getter(category, page) or [])
|
||||
except Exception as exc:
|
||||
_log(f"Kategorie-Seite konnte nicht geladen werden ({plugin_name}/{category} p{page}): {exc}", xbmc.LOGWARNING)
|
||||
xbmcgui.Dialog().notification("Kategorien", "Seite konnte nicht geladen werden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcplugin.endOfDirectory(handle)
|
||||
return
|
||||
|
||||
titles = [str(t).strip() for t in titles if t and str(t).strip()]
|
||||
titles.sort(key=lambda value: value.casefold())
|
||||
|
||||
show_tmdb = _get_setting_bool("tmdb_genre_metadata", default=False)
|
||||
if titles:
|
||||
plugin_meta = _collect_plugin_metadata(plugin, titles)
|
||||
show_tmdb = _tmdb_enabled()
|
||||
show_plot = _get_setting_bool("tmdb_show_plot", default=True)
|
||||
show_art = _get_setting_bool("tmdb_show_art", default=True)
|
||||
prefer_source = bool(getattr(plugin, "prefer_source_metadata", False))
|
||||
tmdb_prefetched: dict[str, tuple[dict[str, str], dict[str, str], list[TmdbCastMember]]] = {}
|
||||
tmdb_titles = list(titles)
|
||||
if show_tmdb and prefer_source:
|
||||
tmdb_titles = []
|
||||
for title in titles:
|
||||
meta = plugin_meta.get(title)
|
||||
meta_labels = meta[0] if meta else {}
|
||||
meta_art = meta[1] if meta else {}
|
||||
if _needs_tmdb(meta_labels, meta_art, want_plot=show_plot, want_art=show_art):
|
||||
tmdb_titles.append(title)
|
||||
if show_tmdb and tmdb_titles:
|
||||
with _busy_dialog():
|
||||
tmdb_prefetched = _tmdb_labels_and_art_bulk(tmdb_titles)
|
||||
if show_tmdb:
|
||||
for title in titles:
|
||||
tmdb_info, tmdb_art, tmdb_cast = tmdb_prefetched.get(title, ({}, {}, []))
|
||||
meta = plugin_meta.get(title)
|
||||
info_labels, art, cast = _merge_metadata(title, tmdb_info, tmdb_art, tmdb_cast, meta)
|
||||
info_labels.setdefault("mediatype", "tvshow")
|
||||
if (info_labels.get("mediatype") or "").strip().casefold() == "tvshow":
|
||||
info_labels.setdefault("tvshowtitle", title)
|
||||
playstate = _title_playstate(plugin_name, title)
|
||||
info_labels = _apply_playstate_to_info(dict(info_labels), playstate)
|
||||
display_label = _label_with_duration(title, info_labels)
|
||||
display_label = _label_with_playstate(display_label, playstate)
|
||||
direct_play = bool(
|
||||
plugin_name.casefold() == "einschalten"
|
||||
and _get_setting_bool("einschalten_enable_playback", default=False)
|
||||
)
|
||||
_add_directory_item(
|
||||
handle,
|
||||
display_label,
|
||||
"play_movie" if direct_play else "seasons",
|
||||
{"plugin": plugin_name, "title": title, **_series_url_params(plugin, title)},
|
||||
is_folder=not direct_play,
|
||||
info_labels=info_labels,
|
||||
art=art,
|
||||
cast=cast,
|
||||
)
|
||||
else:
|
||||
for title in titles:
|
||||
playstate = _title_playstate(plugin_name, title)
|
||||
meta = plugin_meta.get(title)
|
||||
info_labels, art, cast = _merge_metadata(title, {}, {}, None, meta)
|
||||
direct_play = bool(
|
||||
plugin_name.casefold() == "einschalten"
|
||||
and _get_setting_bool("einschalten_enable_playback", default=False)
|
||||
)
|
||||
_add_directory_item(
|
||||
handle,
|
||||
_label_with_playstate(title, playstate),
|
||||
"play_movie" if direct_play else "seasons",
|
||||
{"plugin": plugin_name, "title": title, **_series_url_params(plugin, title)},
|
||||
is_folder=not direct_play,
|
||||
info_labels=_apply_playstate_to_info(info_labels, playstate),
|
||||
art=art,
|
||||
cast=cast,
|
||||
)
|
||||
|
||||
show_next = False
|
||||
if total_pages is not None:
|
||||
show_next = page < total_pages
|
||||
else:
|
||||
has_more_getter = getattr(plugin, "genre_has_more", None)
|
||||
if callable(has_more_getter):
|
||||
try:
|
||||
show_next = bool(has_more_getter(category, page))
|
||||
except Exception:
|
||||
show_next = False
|
||||
|
||||
if show_next:
|
||||
_add_directory_item(
|
||||
handle,
|
||||
"Nächste Seite",
|
||||
"category_titles_page",
|
||||
{"plugin": plugin_name, "category": category, "page": str(page + 1)},
|
||||
is_folder=True,
|
||||
)
|
||||
xbmcplugin.endOfDirectory(handle)
|
||||
|
||||
def _show_genre_titles_page(plugin_name: str, genre: str, page: int = 1) -> None:
|
||||
handle = _get_handle()
|
||||
plugin = _discover_plugins().get(plugin_name)
|
||||
@@ -1670,48 +1922,49 @@ def _show_genre_titles_page(plugin_name: str, genre: str, page: int = 1) -> None
|
||||
|
||||
show_tmdb = _get_setting_bool("tmdb_genre_metadata", default=False)
|
||||
if titles:
|
||||
if show_tmdb:
|
||||
with _busy_dialog():
|
||||
tmdb_prefetched = _tmdb_labels_and_art_bulk(titles)
|
||||
for title in titles:
|
||||
info_labels, art, cast = tmdb_prefetched.get(title, _tmdb_labels_and_art(title))
|
||||
info_labels = dict(info_labels or {})
|
||||
info_labels.setdefault("mediatype", "tvshow")
|
||||
if (info_labels.get("mediatype") or "").strip().casefold() == "tvshow":
|
||||
info_labels.setdefault("tvshowtitle", title)
|
||||
playstate = _title_playstate(plugin_name, title)
|
||||
info_labels = _apply_playstate_to_info(dict(info_labels), playstate)
|
||||
display_label = _label_with_duration(title, info_labels)
|
||||
display_label = _label_with_playstate(display_label, playstate)
|
||||
direct_play = bool(
|
||||
plugin_name.casefold() == "einschalten"
|
||||
and _get_setting_bool("einschalten_enable_playback", default=False)
|
||||
)
|
||||
_add_directory_item(
|
||||
handle,
|
||||
display_label,
|
||||
"play_movie" if direct_play else "seasons",
|
||||
{"plugin": plugin_name, "title": title, **_series_url_params(plugin, title)},
|
||||
is_folder=not direct_play,
|
||||
info_labels=info_labels,
|
||||
art=art,
|
||||
cast=cast,
|
||||
)
|
||||
else:
|
||||
plugin_meta = _collect_plugin_metadata(plugin, titles)
|
||||
show_tmdb = show_tmdb and _tmdb_enabled()
|
||||
show_plot = _get_setting_bool("tmdb_show_plot", default=True)
|
||||
show_art = _get_setting_bool("tmdb_show_art", default=True)
|
||||
prefer_source = bool(getattr(plugin, "prefer_source_metadata", False))
|
||||
tmdb_prefetched: dict[str, tuple[dict[str, str], dict[str, str], list[TmdbCastMember]]] = {}
|
||||
tmdb_titles = list(titles)
|
||||
if show_tmdb and prefer_source:
|
||||
tmdb_titles = []
|
||||
for title in titles:
|
||||
playstate = _title_playstate(plugin_name, title)
|
||||
direct_play = bool(
|
||||
plugin_name.casefold() == "einschalten"
|
||||
and _get_setting_bool("einschalten_enable_playback", default=False)
|
||||
)
|
||||
_add_directory_item(
|
||||
handle,
|
||||
_label_with_playstate(title, playstate),
|
||||
"play_movie" if direct_play else "seasons",
|
||||
{"plugin": plugin_name, "title": title, **_series_url_params(plugin, title)},
|
||||
is_folder=not direct_play,
|
||||
info_labels=_apply_playstate_to_info({"title": title}, playstate),
|
||||
)
|
||||
meta = plugin_meta.get(title)
|
||||
meta_labels = meta[0] if meta else {}
|
||||
meta_art = meta[1] if meta else {}
|
||||
if _needs_tmdb(meta_labels, meta_art, want_plot=show_plot, want_art=show_art):
|
||||
tmdb_titles.append(title)
|
||||
if show_tmdb and tmdb_titles:
|
||||
with _busy_dialog():
|
||||
tmdb_prefetched = _tmdb_labels_and_art_bulk(tmdb_titles)
|
||||
for title in titles:
|
||||
tmdb_info, tmdb_art, tmdb_cast = tmdb_prefetched.get(title, ({}, {}, [])) if show_tmdb else ({}, {}, [])
|
||||
meta = plugin_meta.get(title)
|
||||
info_labels, art, cast = _merge_metadata(title, tmdb_info, tmdb_art, tmdb_cast, meta)
|
||||
info_labels.setdefault("mediatype", "tvshow")
|
||||
if (info_labels.get("mediatype") or "").strip().casefold() == "tvshow":
|
||||
info_labels.setdefault("tvshowtitle", title)
|
||||
playstate = _title_playstate(plugin_name, title)
|
||||
info_labels = _apply_playstate_to_info(dict(info_labels), playstate)
|
||||
display_label = _label_with_duration(title, info_labels)
|
||||
display_label = _label_with_playstate(display_label, playstate)
|
||||
direct_play = bool(
|
||||
plugin_name.casefold() == "einschalten"
|
||||
and _get_setting_bool("einschalten_enable_playback", default=False)
|
||||
)
|
||||
_add_directory_item(
|
||||
handle,
|
||||
display_label,
|
||||
"play_movie" if direct_play else "seasons",
|
||||
{"plugin": plugin_name, "title": title, **_series_url_params(plugin, title)},
|
||||
is_folder=not direct_play,
|
||||
info_labels=info_labels,
|
||||
art=art,
|
||||
cast=cast,
|
||||
)
|
||||
|
||||
show_next = False
|
||||
if total_pages is not None:
|
||||
@@ -2159,40 +2412,45 @@ def _show_popular(plugin_name: str | None = None, page: int = 1) -> None:
|
||||
|
||||
show_tmdb = _get_setting_bool("tmdb_genre_metadata", default=False)
|
||||
if page_items:
|
||||
if show_tmdb:
|
||||
with _busy_dialog():
|
||||
tmdb_prefetched = _tmdb_labels_and_art_bulk(page_items)
|
||||
for title in page_items:
|
||||
info_labels, art, cast = tmdb_prefetched.get(title, _tmdb_labels_and_art(title))
|
||||
info_labels = dict(info_labels or {})
|
||||
info_labels.setdefault("mediatype", "tvshow")
|
||||
if (info_labels.get("mediatype") or "").strip().casefold() == "tvshow":
|
||||
info_labels.setdefault("tvshowtitle", title)
|
||||
playstate = _title_playstate(plugin_name, title)
|
||||
info_labels = _apply_playstate_to_info(dict(info_labels), playstate)
|
||||
display_label = _label_with_duration(title, info_labels)
|
||||
display_label = _label_with_playstate(display_label, playstate)
|
||||
_add_directory_item(
|
||||
handle,
|
||||
display_label,
|
||||
"seasons",
|
||||
{"plugin": plugin_name, "title": title, **_series_url_params(plugin, title)},
|
||||
is_folder=True,
|
||||
info_labels=info_labels,
|
||||
art=art,
|
||||
cast=cast,
|
||||
)
|
||||
else:
|
||||
plugin_meta = _collect_plugin_metadata(plugin, page_items)
|
||||
show_tmdb = show_tmdb and _tmdb_enabled()
|
||||
show_plot = _get_setting_bool("tmdb_show_plot", default=True)
|
||||
show_art = _get_setting_bool("tmdb_show_art", default=True)
|
||||
prefer_source = bool(getattr(plugin, "prefer_source_metadata", False))
|
||||
tmdb_prefetched: dict[str, tuple[dict[str, str], dict[str, str], list[TmdbCastMember]]] = {}
|
||||
tmdb_titles = list(page_items)
|
||||
if show_tmdb and prefer_source:
|
||||
tmdb_titles = []
|
||||
for title in page_items:
|
||||
playstate = _title_playstate(plugin_name, title)
|
||||
_add_directory_item(
|
||||
handle,
|
||||
_label_with_playstate(title, playstate),
|
||||
"seasons",
|
||||
{"plugin": plugin_name, "title": title, **_series_url_params(plugin, title)},
|
||||
is_folder=True,
|
||||
info_labels=_apply_playstate_to_info({"title": title}, playstate),
|
||||
)
|
||||
meta = plugin_meta.get(title)
|
||||
meta_labels = meta[0] if meta else {}
|
||||
meta_art = meta[1] if meta else {}
|
||||
if _needs_tmdb(meta_labels, meta_art, want_plot=show_plot, want_art=show_art):
|
||||
tmdb_titles.append(title)
|
||||
if show_tmdb and tmdb_titles:
|
||||
with _busy_dialog():
|
||||
tmdb_prefetched = _tmdb_labels_and_art_bulk(tmdb_titles)
|
||||
for title in page_items:
|
||||
tmdb_info, tmdb_art, tmdb_cast = tmdb_prefetched.get(title, ({}, {}, []))
|
||||
meta = plugin_meta.get(title)
|
||||
info_labels, art, cast = _merge_metadata(title, tmdb_info, tmdb_art, tmdb_cast, meta)
|
||||
info_labels.setdefault("mediatype", "tvshow")
|
||||
if (info_labels.get("mediatype") or "").strip().casefold() == "tvshow":
|
||||
info_labels.setdefault("tvshowtitle", title)
|
||||
playstate = _title_playstate(plugin_name, title)
|
||||
info_labels = _apply_playstate_to_info(dict(info_labels), playstate)
|
||||
display_label = _label_with_duration(title, info_labels)
|
||||
display_label = _label_with_playstate(display_label, playstate)
|
||||
_add_directory_item(
|
||||
handle,
|
||||
display_label,
|
||||
"seasons",
|
||||
{"plugin": plugin_name, "title": title, **_series_url_params(plugin, title)},
|
||||
is_folder=True,
|
||||
info_labels=info_labels,
|
||||
art=art,
|
||||
cast=cast,
|
||||
)
|
||||
|
||||
if total_pages > 1 and page < total_pages:
|
||||
_add_directory_item(
|
||||
@@ -2945,6 +3203,8 @@ def run() -> None:
|
||||
_show_genre_sources()
|
||||
elif action == "genres":
|
||||
_show_genres(params.get("plugin", ""))
|
||||
elif action == "categories":
|
||||
_show_categories(params.get("plugin", ""))
|
||||
elif action == "new_titles":
|
||||
_show_new_titles(
|
||||
params.get("plugin", ""),
|
||||
@@ -2966,6 +3226,12 @@ def run() -> None:
|
||||
params.get("genre", ""),
|
||||
_parse_positive_int(params.get("page", "1"), default=1),
|
||||
)
|
||||
elif action == "category_titles_page":
|
||||
_show_category_titles_page(
|
||||
params.get("plugin", ""),
|
||||
params.get("category", ""),
|
||||
_parse_positive_int(params.get("page", "1"), default=1),
|
||||
)
|
||||
elif action == "alpha_index":
|
||||
_show_alpha_index(params.get("plugin", ""))
|
||||
elif action == "alpha_titles_page":
|
||||
|
||||
Reference in New Issue
Block a user