Add Filmpalast A-Z browsing and document Gitea release upload

This commit is contained in:
2026-02-06 12:29:12 +01:00
parent 9aedbee083
commit 280a82f08b
4 changed files with 428 additions and 1 deletions

View File

@@ -1018,6 +1018,9 @@ def _show_plugin_menu(plugin_name: str) -> None:
if _plugin_has_capability(plugin, "genres"):
_add_directory_item(handle, "Genres", "genres", {"plugin": plugin_name}, is_folder=True)
if _plugin_has_capability(plugin, "alpha"):
_add_directory_item(handle, "A-Z", "alpha_index", {"plugin": plugin_name}, is_folder=True)
if _plugin_has_capability(plugin, "popular_series"):
_add_directory_item(handle, "Meist gesehen", "popular", {"plugin": plugin_name, "page": "1"}, is_folder=True)
@@ -1729,6 +1732,149 @@ def _show_genre_titles_page(plugin_name: str, genre: str, page: int = 1) -> None
xbmcplugin.endOfDirectory(handle)
def _show_alpha_index(plugin_name: str) -> None:
handle = _get_handle()
_log(f"A-Z laden: {plugin_name}")
plugin = _discover_plugins().get(plugin_name)
if plugin is None:
xbmcgui.Dialog().notification("A-Z", "Plugin nicht gefunden.", xbmcgui.NOTIFICATION_INFO, 3000)
xbmcplugin.endOfDirectory(handle)
return
getter = getattr(plugin, "alpha_index", None)
if not callable(getter):
xbmcgui.Dialog().notification("A-Z", "A-Z nicht verfügbar.", xbmcgui.NOTIFICATION_INFO, 3000)
xbmcplugin.endOfDirectory(handle)
return
try:
letters = list(getter() or [])
except Exception as exc:
_log(f"A-Z konnte nicht geladen werden ({plugin_name}): {exc}", xbmc.LOGWARNING)
xbmcgui.Dialog().notification("A-Z", "A-Z konnte nicht geladen werden.", xbmcgui.NOTIFICATION_INFO, 3000)
xbmcplugin.endOfDirectory(handle)
return
for letter in letters:
letter = str(letter).strip()
if not letter:
continue
_add_directory_item(
handle,
letter,
"alpha_titles_page",
{"plugin": plugin_name, "letter": letter, "page": "1"},
is_folder=True,
)
xbmcplugin.endOfDirectory(handle)
def _show_alpha_titles_page(plugin_name: str, letter: str, page: int = 1) -> None:
handle = _get_handle()
plugin = _discover_plugins().get(plugin_name)
if plugin is None:
xbmcgui.Dialog().notification("A-Z", "Plugin nicht gefunden.", xbmcgui.NOTIFICATION_INFO, 3000)
xbmcplugin.endOfDirectory(handle)
return
page = max(1, int(page or 1))
paging_getter = getattr(plugin, "titles_for_alpha_page", None)
if not callable(paging_getter):
xbmcgui.Dialog().notification("A-Z", "Paging nicht verfügbar.", xbmcgui.NOTIFICATION_INFO, 3000)
xbmcplugin.endOfDirectory(handle)
return
total_pages = None
count_getter = getattr(plugin, "alpha_page_count", None)
if callable(count_getter):
try:
total_pages = int(count_getter(letter) or 1)
except Exception:
total_pages = None
if total_pages is not None:
page = min(page, max(1, total_pages))
xbmcplugin.setPluginCategory(handle, f"{letter} ({page}/{total_pages})")
else:
xbmcplugin.setPluginCategory(handle, f"{letter} ({page})")
_set_content(handle, "movies" if (plugin_name or "").casefold() == "einschalten" else "tvshows")
if page > 1:
_add_directory_item(
handle,
"Vorherige Seite",
"alpha_titles_page",
{"plugin": plugin_name, "letter": letter, "page": str(page - 1)},
is_folder=True,
)
try:
titles = list(paging_getter(letter, page) or [])
except Exception as exc:
_log(f"A-Z Seite konnte nicht geladen werden ({plugin_name}/{letter} p{page}): {exc}", xbmc.LOGWARNING)
xbmcgui.Dialog().notification("A-Z", "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:
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:
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),
)
show_next = False
if total_pages is not None:
show_next = page < total_pages
if show_next:
_add_directory_item(
handle,
"Nächste Seite",
"alpha_titles_page",
{"plugin": plugin_name, "letter": letter, "page": str(page + 1)},
is_folder=True,
)
xbmcplugin.endOfDirectory(handle)
def _title_group_key(title: str) -> str:
raw = (title or "").strip()
if not raw:
@@ -2708,6 +2854,14 @@ def run() -> None:
params.get("genre", ""),
_parse_positive_int(params.get("page", "1"), default=1),
)
elif action == "alpha_index":
_show_alpha_index(params.get("plugin", ""))
elif action == "alpha_titles_page":
_show_alpha_titles_page(
params.get("plugin", ""),
params.get("letter", ""),
_parse_positive_int(params.get("page", "1"), default=1),
)
elif action == "genre_series_group":
_show_genre_series_group(
params.get("plugin", ""),