ui: make user-visible texts clearer and more human
This commit is contained in:
@@ -10,8 +10,8 @@
|
||||
<provides>video</provides>
|
||||
</extension>
|
||||
<extension point="xbmc.addon.metadata">
|
||||
<summary>ViewIt Kodi Plugin</summary>
|
||||
<description>Streaming-Addon für Streamingseiten: Suche, Staffeln/Episoden und Wiedergabe.</description>
|
||||
<summary>Suche und Wiedergabe fuer mehrere Quellen</summary>
|
||||
<description>Findet Titel in unterstuetzten Quellen und startet Filme oder Episoden direkt in Kodi.</description>
|
||||
<assets>
|
||||
<icon>icon.png</icon>
|
||||
</assets>
|
||||
|
||||
@@ -1128,7 +1128,7 @@ def _sync_update_version_settings() -> None:
|
||||
def _show_root_menu() -> None:
|
||||
handle = _get_handle()
|
||||
_log("Root-Menue wird angezeigt.")
|
||||
_add_directory_item(handle, "Globale Suche", "search")
|
||||
_add_directory_item(handle, "Suche in allen Quellen", "search")
|
||||
|
||||
plugins = _discover_plugins()
|
||||
for plugin_name in sorted(plugins.keys(), key=lambda value: value.casefold()):
|
||||
@@ -1143,7 +1143,7 @@ def _show_plugin_menu(plugin_name: str) -> None:
|
||||
plugin_name = (plugin_name or "").strip()
|
||||
plugin = _discover_plugins().get(plugin_name)
|
||||
if not plugin:
|
||||
xbmcgui.Dialog().notification("Plugin", "Plugin nicht gefunden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcgui.Dialog().notification("Quelle", "Quelle nicht gefunden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcplugin.endOfDirectory(handle)
|
||||
return
|
||||
|
||||
@@ -1167,7 +1167,7 @@ def _show_plugin_menu(plugin_name: str) -> None:
|
||||
_add_directory_item(handle, "Serien", "series_catalog", {"plugin": plugin_name, "page": "1"}, 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)
|
||||
_add_directory_item(handle, "Beliebte Serien", "popular", {"plugin": plugin_name, "page": "1"}, is_folder=True)
|
||||
|
||||
xbmcplugin.endOfDirectory(handle)
|
||||
|
||||
@@ -1176,7 +1176,7 @@ def _show_plugin_search(plugin_name: str) -> None:
|
||||
plugin_name = (plugin_name or "").strip()
|
||||
plugin = _discover_plugins().get(plugin_name)
|
||||
if not plugin:
|
||||
xbmcgui.Dialog().notification("Suche", "Plugin nicht gefunden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcgui.Dialog().notification("Suche", "Quelle nicht gefunden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
_show_root_menu()
|
||||
return
|
||||
|
||||
@@ -1197,7 +1197,7 @@ def _show_plugin_search_results(plugin_name: str, query: str) -> None:
|
||||
query = (query or "").strip()
|
||||
plugin = _discover_plugins().get(plugin_name)
|
||||
if not plugin:
|
||||
xbmcgui.Dialog().notification("Suche", "Plugin nicht gefunden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcgui.Dialog().notification("Suche", "Quelle nicht gefunden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcplugin.endOfDirectory(handle)
|
||||
return
|
||||
|
||||
@@ -1208,8 +1208,8 @@ def _show_plugin_search_results(plugin_name: str, query: str) -> None:
|
||||
list_items: list[dict[str, object]] = []
|
||||
canceled = False
|
||||
try:
|
||||
with _progress_dialog("Suche läuft", f"{plugin_name} (1/1) starte…") as progress:
|
||||
canceled = progress(5, f"{plugin_name} (1/1) Suche…")
|
||||
with _progress_dialog("Suche laeuft", f"{plugin_name} (1/1) startet...") as progress:
|
||||
canceled = progress(5, f"{plugin_name} (1/1) Suche...")
|
||||
search_coro = plugin.search_titles(query)
|
||||
try:
|
||||
results = _run_async(search_coro)
|
||||
@@ -1240,7 +1240,7 @@ def _show_plugin_search_results(plugin_name: str, query: str) -> None:
|
||||
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…")
|
||||
canceled = progress(35, f"{plugin_name} (1/1) Metadaten...")
|
||||
tmdb_prefetched = _tmdb_labels_and_art_bulk(list(tmdb_titles))
|
||||
|
||||
total_results = max(1, len(results))
|
||||
@@ -1415,7 +1415,7 @@ def _series_url_params(plugin: BasisPlugin, title: str) -> dict[str, str]:
|
||||
def _show_search() -> None:
|
||||
_log("Suche gestartet.")
|
||||
dialog = xbmcgui.Dialog()
|
||||
query = dialog.input("Serientitel eingeben", type=xbmcgui.INPUT_ALPHANUM).strip()
|
||||
query = dialog.input("Titel eingeben", type=xbmcgui.INPUT_ALPHANUM).strip()
|
||||
if not query:
|
||||
_log("Suche abgebrochen (leere Eingabe).", xbmc.LOGDEBUG)
|
||||
_show_root_menu()
|
||||
@@ -1430,18 +1430,18 @@ def _show_search_results(query: str) -> None:
|
||||
_set_content(handle, "tvshows")
|
||||
plugins = _discover_plugins()
|
||||
if not plugins:
|
||||
xbmcgui.Dialog().notification("Suche", "Keine Plugins gefunden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcgui.Dialog().notification("Suche", "Keine Quellen gefunden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcplugin.endOfDirectory(handle)
|
||||
return
|
||||
list_items: list[dict[str, object]] = []
|
||||
canceled = False
|
||||
plugin_entries = list(plugins.items())
|
||||
total_plugins = max(1, len(plugin_entries))
|
||||
with _progress_dialog("Suche läuft", "Suche gestartet…") as progress:
|
||||
with _progress_dialog("Suche laeuft", "Suche startet...") as progress:
|
||||
for plugin_index, (plugin_name, plugin) in enumerate(plugin_entries, start=1):
|
||||
range_start = int(((plugin_index - 1) / float(total_plugins)) * 100)
|
||||
range_end = int((plugin_index / float(total_plugins)) * 100)
|
||||
canceled = progress(range_start, f"{plugin_name} ({plugin_index}/{total_plugins}) Suche…")
|
||||
canceled = progress(range_start, f"{plugin_name} ({plugin_index}/{total_plugins}) Suche...")
|
||||
if canceled:
|
||||
break
|
||||
search_coro = plugin.search_titles(query)
|
||||
@@ -1476,7 +1476,7 @@ def _show_search_results(query: str) -> None:
|
||||
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…",
|
||||
f"{plugin_name} ({plugin_index}/{total_plugins}) Metadaten...",
|
||||
)
|
||||
if canceled:
|
||||
break
|
||||
@@ -1519,7 +1519,7 @@ def _show_search_results(query: str) -> None:
|
||||
if canceled:
|
||||
break
|
||||
if not canceled:
|
||||
progress(100, "Suche abgeschlossen")
|
||||
progress(100, "Suche fertig")
|
||||
if canceled and not list_items:
|
||||
xbmcgui.Dialog().notification("Suche", "Suche abgebrochen.", xbmcgui.NOTIFICATION_INFO, 2500)
|
||||
xbmcplugin.endOfDirectory(handle)
|
||||
@@ -1544,7 +1544,7 @@ def _show_seasons(plugin_name: str, title: str, series_url: str = "") -> None:
|
||||
_log(f"Staffeln laden: {plugin_name} / {title}")
|
||||
plugin = _discover_plugins().get(plugin_name)
|
||||
if plugin is None:
|
||||
xbmcgui.Dialog().notification("Staffeln", "Plugin nicht gefunden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcgui.Dialog().notification("Staffeln", "Quelle nicht gefunden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcplugin.endOfDirectory(handle)
|
||||
return
|
||||
if series_url:
|
||||
@@ -1634,7 +1634,7 @@ def _show_seasons(plugin_name: str, title: str, series_url: str = "") -> None:
|
||||
seasons = plugin.seasons_for(title)
|
||||
except Exception as exc:
|
||||
_log(f"Staffeln laden fehlgeschlagen ({plugin_name}): {exc}", xbmc.LOGWARNING)
|
||||
xbmcgui.Dialog().notification("Staffeln", "Konnte Staffeln nicht laden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcgui.Dialog().notification("Staffeln", "Staffeln konnten nicht geladen werden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcplugin.endOfDirectory(handle)
|
||||
return
|
||||
|
||||
@@ -1715,7 +1715,7 @@ def _show_episodes(plugin_name: str, title: str, season: str, series_url: str =
|
||||
_log(f"Episoden laden: {plugin_name} / {title} / {season}")
|
||||
plugin = _discover_plugins().get(plugin_name)
|
||||
if plugin is None:
|
||||
xbmcgui.Dialog().notification("Episoden", "Plugin nicht gefunden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcgui.Dialog().notification("Episoden", "Quelle nicht gefunden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcplugin.endOfDirectory(handle)
|
||||
return
|
||||
if series_url:
|
||||
@@ -1839,7 +1839,7 @@ def _show_genre_sources() -> None:
|
||||
sources.append((plugin_name, plugin))
|
||||
|
||||
if not sources:
|
||||
xbmcgui.Dialog().notification("Genres", "Keine Genre-Quellen gefunden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcgui.Dialog().notification("Genres", "Keine Quellen mit Genres gefunden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcplugin.endOfDirectory(handle)
|
||||
return
|
||||
|
||||
@@ -1859,7 +1859,7 @@ def _show_genres(plugin_name: str) -> None:
|
||||
_log(f"Genres laden: {plugin_name}")
|
||||
plugin = _discover_plugins().get(plugin_name)
|
||||
if plugin is None:
|
||||
xbmcgui.Dialog().notification("Genres", "Plugin nicht gefunden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcgui.Dialog().notification("Genres", "Quelle nicht gefunden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcplugin.endOfDirectory(handle)
|
||||
return
|
||||
try:
|
||||
@@ -1896,7 +1896,7 @@ def _show_categories(plugin_name: str) -> None:
|
||||
_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)
|
||||
xbmcgui.Dialog().notification("Kategorien", "Quelle nicht gefunden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcplugin.endOfDirectory(handle)
|
||||
return
|
||||
getter = getattr(plugin, "categories", None)
|
||||
@@ -1929,14 +1929,14 @@ def _show_category_titles_page(plugin_name: str, category: str, page: int = 1) -
|
||||
handle = _get_handle()
|
||||
plugin = _discover_plugins().get(plugin_name)
|
||||
if plugin is None:
|
||||
xbmcgui.Dialog().notification("Kategorien", "Plugin nicht gefunden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcgui.Dialog().notification("Kategorien", "Quelle 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)
|
||||
xbmcgui.Dialog().notification("Kategorien", "Seitenwechsel nicht verfuegbar.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcplugin.endOfDirectory(handle)
|
||||
return
|
||||
|
||||
@@ -2045,14 +2045,14 @@ def _show_genre_titles_page(plugin_name: str, genre: str, page: int = 1) -> None
|
||||
handle = _get_handle()
|
||||
plugin = _discover_plugins().get(plugin_name)
|
||||
if plugin is None:
|
||||
xbmcgui.Dialog().notification("Genres", "Plugin nicht gefunden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcgui.Dialog().notification("Genres", "Quelle 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("Genres", "Paging nicht verfügbar.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcgui.Dialog().notification("Genres", "Seitenwechsel nicht verfuegbar.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcplugin.endOfDirectory(handle)
|
||||
return
|
||||
|
||||
@@ -2163,12 +2163,12 @@ def _show_alpha_index(plugin_name: str) -> None:
|
||||
_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)
|
||||
xbmcgui.Dialog().notification("A-Z", "Quelle 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)
|
||||
xbmcgui.Dialog().notification("A-Z", "A-Z nicht verfuegbar.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcplugin.endOfDirectory(handle)
|
||||
return
|
||||
try:
|
||||
@@ -2196,14 +2196,14 @@ def _show_alpha_titles_page(plugin_name: str, letter: str, page: int = 1) -> Non
|
||||
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)
|
||||
xbmcgui.Dialog().notification("A-Z", "Quelle 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)
|
||||
xbmcgui.Dialog().notification("A-Z", "Seitenwechsel nicht verfuegbar.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcplugin.endOfDirectory(handle)
|
||||
return
|
||||
|
||||
@@ -2308,14 +2308,14 @@ def _show_series_catalog(plugin_name: str, page: int = 1) -> None:
|
||||
plugin_name = (plugin_name or "").strip()
|
||||
plugin = _discover_plugins().get(plugin_name)
|
||||
if plugin is None:
|
||||
xbmcgui.Dialog().notification("Serien", "Plugin nicht gefunden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcgui.Dialog().notification("Serien", "Quelle nicht gefunden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcplugin.endOfDirectory(handle)
|
||||
return
|
||||
|
||||
page = max(1, int(page or 1))
|
||||
paging_getter = getattr(plugin, "series_catalog_page", None)
|
||||
if not callable(paging_getter):
|
||||
xbmcgui.Dialog().notification("Serien", "Serien nicht verfügbar.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcgui.Dialog().notification("Serien", "Serienkatalog nicht verfuegbar.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcplugin.endOfDirectory(handle)
|
||||
return
|
||||
|
||||
@@ -2548,7 +2548,7 @@ def _show_popular(plugin_name: str | None = None, page: int = 1) -> None:
|
||||
if plugin_name:
|
||||
plugin = _discover_plugins().get(plugin_name)
|
||||
if plugin is None or not _plugin_has_capability(plugin, "popular_series"):
|
||||
xbmcgui.Dialog().notification("Beliebte Serien", "Plugin nicht gefunden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcgui.Dialog().notification("Beliebte Serien", "Quelle nicht gefunden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcplugin.endOfDirectory(handle)
|
||||
return
|
||||
try:
|
||||
@@ -2667,13 +2667,13 @@ def _show_new_titles(plugin_name: str, page: int = 1) -> None:
|
||||
plugin_name = (plugin_name or "").strip()
|
||||
plugin = _discover_plugins().get(plugin_name)
|
||||
if plugin is None or not _plugin_has_capability(plugin, "new_titles"):
|
||||
xbmcgui.Dialog().notification("Neue Titel", "Plugin nicht gefunden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcgui.Dialog().notification("Neue Titel", "Quelle nicht gefunden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcplugin.endOfDirectory(handle)
|
||||
return
|
||||
|
||||
getter = getattr(plugin, "new_titles", None)
|
||||
if not callable(getter):
|
||||
xbmcgui.Dialog().notification("Neue Titel", "Nicht verfügbar.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcgui.Dialog().notification("Neue Titel", "Diese Liste ist nicht verfuegbar.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcplugin.endOfDirectory(handle)
|
||||
return
|
||||
|
||||
@@ -2715,7 +2715,7 @@ def _show_new_titles(plugin_name: str, page: int = 1) -> None:
|
||||
if total == 0:
|
||||
xbmcgui.Dialog().notification(
|
||||
"Neue Titel",
|
||||
"Keine Titel gefunden (Basis-URL/Index prüfen).",
|
||||
"Keine Titel gefunden. Bitte Basis-URL oder Index pruefen.",
|
||||
xbmcgui.NOTIFICATION_INFO,
|
||||
4000,
|
||||
)
|
||||
@@ -2806,13 +2806,13 @@ def _show_latest_episodes(plugin_name: str, page: int = 1) -> None:
|
||||
plugin_name = (plugin_name or "").strip()
|
||||
plugin = _discover_plugins().get(plugin_name)
|
||||
if not plugin:
|
||||
xbmcgui.Dialog().notification("Neueste Folgen", "Plugin nicht gefunden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcgui.Dialog().notification("Neueste Folgen", "Quelle nicht gefunden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcplugin.endOfDirectory(handle)
|
||||
return
|
||||
|
||||
getter = getattr(plugin, "latest_episodes", None)
|
||||
if not callable(getter):
|
||||
xbmcgui.Dialog().notification("Neueste Folgen", "Nicht unterstützt.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcgui.Dialog().notification("Neueste Folgen", "Diese Quelle bietet das nicht an.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcplugin.endOfDirectory(handle)
|
||||
return
|
||||
|
||||
@@ -2883,7 +2883,7 @@ def _show_genre_series_group(plugin_name: str, genre: str, group_code: str, page
|
||||
page = max(1, int(page or 1))
|
||||
plugin = _discover_plugins().get(plugin_name)
|
||||
if plugin is None:
|
||||
xbmcgui.Dialog().notification("Genres", "Plugin nicht gefunden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcgui.Dialog().notification("Genres", "Quelle nicht gefunden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcplugin.endOfDirectory(handle)
|
||||
return
|
||||
|
||||
@@ -3071,11 +3071,11 @@ def _run_update_check() -> None:
|
||||
builtin("UpdateAddonRepos")
|
||||
builtin("UpdateLocalAddons")
|
||||
builtin("ActivateWindow(addonbrowser,addons://updates/)")
|
||||
xbmcgui.Dialog().notification("ViewIT Update", "Update-Pruefung gestartet.", xbmcgui.NOTIFICATION_INFO, 4000)
|
||||
xbmcgui.Dialog().notification("Updates", "Update-Check gestartet.", xbmcgui.NOTIFICATION_INFO, 4000)
|
||||
except Exception as exc:
|
||||
_log(f"Update-Pruefung fehlgeschlagen: {exc}", xbmc.LOGWARNING)
|
||||
try:
|
||||
xbmcgui.Dialog().notification("ViewIT Update", "Update-Pruefung fehlgeschlagen.", xbmcgui.NOTIFICATION_ERROR, 4000)
|
||||
xbmcgui.Dialog().notification("Updates", "Update-Check fehlgeschlagen.", xbmcgui.NOTIFICATION_ERROR, 4000)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
@@ -3249,7 +3249,7 @@ def _play_episode(
|
||||
_log(f"Play anfordern: {plugin_name} / {title} / {season} / {episode}")
|
||||
plugin = _discover_plugins().get(plugin_name)
|
||||
if plugin is None:
|
||||
xbmcgui.Dialog().notification("Play", "Plugin nicht gefunden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcgui.Dialog().notification("Wiedergabe", "Quelle nicht gefunden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
return
|
||||
|
||||
available_hosters: list[str] = []
|
||||
@@ -3266,7 +3266,7 @@ def _play_episode(
|
||||
if len(available_hosters) == 1:
|
||||
selected_hoster = available_hosters[0]
|
||||
else:
|
||||
selected_index = xbmcgui.Dialog().select("Hoster wählen", available_hosters)
|
||||
selected_index = xbmcgui.Dialog().select("Hoster waehlen", available_hosters)
|
||||
if selected_index is None or selected_index < 0:
|
||||
_log("Play abgebrochen (kein Hoster gewählt).", xbmc.LOGDEBUG)
|
||||
return
|
||||
@@ -3284,8 +3284,8 @@ def _play_episode(
|
||||
try:
|
||||
link = plugin.stream_link_for(title, season, episode)
|
||||
if not link:
|
||||
_log("Kein Stream-Link gefunden.", xbmc.LOGWARNING)
|
||||
xbmcgui.Dialog().notification("Play", "Kein Stream-Link gefunden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
_log("Kein Stream gefunden.", xbmc.LOGWARNING)
|
||||
xbmcgui.Dialog().notification("Wiedergabe", "Kein Stream gefunden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
return
|
||||
_log(f"Stream-Link: {link}", xbmc.LOGDEBUG)
|
||||
final_link = plugin.resolve_stream_link(link) or link
|
||||
@@ -3333,7 +3333,7 @@ def _play_episode_url(
|
||||
_log(f"Play (URL) anfordern: {plugin_name} / {title} / {season_label} / {episode_label} / {episode_url}")
|
||||
plugin = _discover_plugins().get(plugin_name)
|
||||
if plugin is None:
|
||||
xbmcgui.Dialog().notification("Play", "Plugin nicht gefunden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcgui.Dialog().notification("Wiedergabe", "Quelle nicht gefunden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
return
|
||||
|
||||
available_hosters: list[str] = []
|
||||
@@ -3350,7 +3350,7 @@ def _play_episode_url(
|
||||
if len(available_hosters) == 1:
|
||||
selected_hoster = available_hosters[0]
|
||||
else:
|
||||
selected_index = xbmcgui.Dialog().select("Hoster wählen", available_hosters)
|
||||
selected_index = xbmcgui.Dialog().select("Hoster waehlen", available_hosters)
|
||||
if selected_index is None or selected_index < 0:
|
||||
_log("Play abgebrochen (kein Hoster gewählt).", xbmc.LOGDEBUG)
|
||||
return
|
||||
@@ -3367,12 +3367,12 @@ def _play_episode_url(
|
||||
try:
|
||||
link_getter = getattr(plugin, "stream_link_for_url", None)
|
||||
if not callable(link_getter):
|
||||
xbmcgui.Dialog().notification("Play", "Nicht unterstützt.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
xbmcgui.Dialog().notification("Wiedergabe", "Diese Funktion wird von der Quelle nicht unterstuetzt.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
return
|
||||
link = link_getter(episode_url)
|
||||
if not link:
|
||||
_log("Kein Stream-Link gefunden.", xbmc.LOGWARNING)
|
||||
xbmcgui.Dialog().notification("Play", "Kein Stream-Link gefunden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
_log("Kein Stream gefunden.", xbmc.LOGWARNING)
|
||||
xbmcgui.Dialog().notification("Wiedergabe", "Kein Stream gefunden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||
return
|
||||
_log(f"Stream-Link: {link}", xbmc.LOGDEBUG)
|
||||
final_link = plugin.resolve_stream_link(link) or link
|
||||
|
||||
@@ -1,85 +1,85 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<settings>
|
||||
<category label="Logging">
|
||||
<setting id="debug_log_urls" type="bool" label="URL-Logging aktivieren (global)" default="false" />
|
||||
<setting id="debug_dump_html" type="bool" label="HTML-Dumps aktivieren (global)" default="false" />
|
||||
<setting id="debug_show_url_info" type="bool" label="URL-Info anzeigen (global)" default="false" />
|
||||
<setting id="debug_log_errors" type="bool" label="Fehler-Logging aktivieren (global)" default="false" />
|
||||
<setting id="log_max_mb" type="number" label="URL-Log: max. Datei-Größe (MB)" default="5" />
|
||||
<setting id="log_max_files" type="number" label="URL-Log: max. Rotationen" default="3" />
|
||||
<setting id="dump_max_files" type="number" label="HTML-Dumps: max. Dateien pro Plugin" default="200" />
|
||||
<setting id="log_urls_serienstream" type="bool" label="Serienstream: URL-Logging" default="false" />
|
||||
<setting id="dump_html_serienstream" type="bool" label="Serienstream: HTML-Dumps" default="false" />
|
||||
<setting id="show_url_info_serienstream" type="bool" label="Serienstream: URL-Info anzeigen" default="false" />
|
||||
<setting id="log_errors_serienstream" type="bool" label="Serienstream: Fehler loggen" default="false" />
|
||||
<setting id="log_urls_aniworld" type="bool" label="Aniworld: URL-Logging" default="false" />
|
||||
<setting id="dump_html_aniworld" type="bool" label="Aniworld: HTML-Dumps" default="false" />
|
||||
<setting id="show_url_info_aniworld" type="bool" label="Aniworld: URL-Info anzeigen" default="false" />
|
||||
<setting id="log_errors_aniworld" type="bool" label="Aniworld: Fehler loggen" default="false" />
|
||||
<setting id="log_urls_topstreamfilm" type="bool" label="Topstreamfilm: URL-Logging" default="false" />
|
||||
<setting id="dump_html_topstreamfilm" type="bool" label="Topstreamfilm: HTML-Dumps" default="false" />
|
||||
<setting id="show_url_info_topstreamfilm" type="bool" label="Topstreamfilm: URL-Info anzeigen" default="false" />
|
||||
<setting id="log_errors_topstreamfilm" type="bool" label="Topstreamfilm: Fehler loggen" default="false" />
|
||||
<setting id="log_urls_einschalten" type="bool" label="Einschalten: URL-Logging" default="false" />
|
||||
<setting id="dump_html_einschalten" type="bool" label="Einschalten: HTML-Dumps" default="false" />
|
||||
<setting id="show_url_info_einschalten" type="bool" label="Einschalten: URL-Info anzeigen" default="false" />
|
||||
<setting id="log_errors_einschalten" type="bool" label="Einschalten: Fehler loggen" default="false" />
|
||||
<setting id="log_urls_filmpalast" type="bool" label="Filmpalast: URL-Logging" default="false" />
|
||||
<setting id="dump_html_filmpalast" type="bool" label="Filmpalast: HTML-Dumps" default="false" />
|
||||
<setting id="show_url_info_filmpalast" type="bool" label="Filmpalast: URL-Info anzeigen" default="false" />
|
||||
<setting id="log_errors_filmpalast" type="bool" label="Filmpalast: Fehler loggen" default="false" />
|
||||
<category label="Debug und Logs">
|
||||
<setting id="debug_log_urls" type="bool" label="URLs mitschreiben (global)" default="false" />
|
||||
<setting id="debug_dump_html" type="bool" label="HTML speichern (global)" default="false" />
|
||||
<setting id="debug_show_url_info" type="bool" label="Aktuelle URL anzeigen (global)" default="false" />
|
||||
<setting id="debug_log_errors" type="bool" label="Fehler mitschreiben (global)" default="false" />
|
||||
<setting id="log_max_mb" type="number" label="URL-Log: maximale Dateigroesse (MB)" default="5" />
|
||||
<setting id="log_max_files" type="number" label="URL-Log: Anzahl alter Dateien" default="3" />
|
||||
<setting id="dump_max_files" type="number" label="HTML: maximale Dateien pro Plugin" default="200" />
|
||||
<setting id="log_urls_serienstream" type="bool" label="Serienstream: URLs mitschreiben" default="false" />
|
||||
<setting id="dump_html_serienstream" type="bool" label="Serienstream: HTML speichern" default="false" />
|
||||
<setting id="show_url_info_serienstream" type="bool" label="Serienstream: Aktuelle URL anzeigen" default="false" />
|
||||
<setting id="log_errors_serienstream" type="bool" label="Serienstream: Fehler mitschreiben" default="false" />
|
||||
<setting id="log_urls_aniworld" type="bool" label="Aniworld: URLs mitschreiben" default="false" />
|
||||
<setting id="dump_html_aniworld" type="bool" label="Aniworld: HTML speichern" default="false" />
|
||||
<setting id="show_url_info_aniworld" type="bool" label="Aniworld: Aktuelle URL anzeigen" default="false" />
|
||||
<setting id="log_errors_aniworld" type="bool" label="Aniworld: Fehler mitschreiben" default="false" />
|
||||
<setting id="log_urls_topstreamfilm" type="bool" label="Topstreamfilm: URLs mitschreiben" default="false" />
|
||||
<setting id="dump_html_topstreamfilm" type="bool" label="Topstreamfilm: HTML speichern" default="false" />
|
||||
<setting id="show_url_info_topstreamfilm" type="bool" label="Topstreamfilm: Aktuelle URL anzeigen" default="false" />
|
||||
<setting id="log_errors_topstreamfilm" type="bool" label="Topstreamfilm: Fehler mitschreiben" default="false" />
|
||||
<setting id="log_urls_einschalten" type="bool" label="Einschalten: URLs mitschreiben" default="false" />
|
||||
<setting id="dump_html_einschalten" type="bool" label="Einschalten: HTML speichern" default="false" />
|
||||
<setting id="show_url_info_einschalten" type="bool" label="Einschalten: Aktuelle URL anzeigen" default="false" />
|
||||
<setting id="log_errors_einschalten" type="bool" label="Einschalten: Fehler mitschreiben" default="false" />
|
||||
<setting id="log_urls_filmpalast" type="bool" label="Filmpalast: URLs mitschreiben" default="false" />
|
||||
<setting id="dump_html_filmpalast" type="bool" label="Filmpalast: HTML speichern" default="false" />
|
||||
<setting id="show_url_info_filmpalast" type="bool" label="Filmpalast: Aktuelle URL anzeigen" default="false" />
|
||||
<setting id="log_errors_filmpalast" type="bool" label="Filmpalast: Fehler mitschreiben" default="false" />
|
||||
</category>
|
||||
<category label="TopStream">
|
||||
<setting id="topstream_base_url" type="text" label="Domain (BASE_URL)" default="https://topstreamfilm.live" />
|
||||
<setting id="topstreamfilm_metadata_source" type="enum" label="Metadatenquelle" default="0" values="Auto|Quelle|TMDB|Mix" />
|
||||
<setting id="topstream_genre_max_pages" type="number" label="Genres: max. Seiten laden (Pagination)" default="20" />
|
||||
<setting id="topstream_base_url" type="text" label="Basis-URL" default="https://topstreamfilm.live" />
|
||||
<setting id="topstreamfilm_metadata_source" type="enum" label="Metadatenquelle" default="0" values="Automatisch|Quelle|TMDB|Mischen" />
|
||||
<setting id="topstream_genre_max_pages" type="number" label="Genres: max. Seiten laden" default="20" />
|
||||
</category>
|
||||
<category label="SerienStream">
|
||||
<setting id="serienstream_base_url" type="text" label="Domain (BASE_URL)" default="https://s.to" />
|
||||
<setting id="serienstream_metadata_source" type="enum" label="Metadatenquelle" default="0" values="Auto|Quelle|TMDB|Mix" />
|
||||
<setting id="serienstream_base_url" type="text" label="Basis-URL" default="https://s.to" />
|
||||
<setting id="serienstream_metadata_source" type="enum" label="Metadatenquelle" default="0" values="Automatisch|Quelle|TMDB|Mischen" />
|
||||
</category>
|
||||
<category label="AniWorld">
|
||||
<setting id="aniworld_base_url" type="text" label="Domain (BASE_URL)" default="https://aniworld.to" />
|
||||
<setting id="aniworld_metadata_source" type="enum" label="Metadatenquelle" default="0" values="Auto|Quelle|TMDB|Mix" />
|
||||
<setting id="aniworld_base_url" type="text" label="Basis-URL" default="https://aniworld.to" />
|
||||
<setting id="aniworld_metadata_source" type="enum" label="Metadatenquelle" default="0" values="Automatisch|Quelle|TMDB|Mischen" />
|
||||
</category>
|
||||
<category label="Einschalten">
|
||||
<setting id="einschalten_base_url" type="text" label="Domain (BASE_URL)" default="https://einschalten.in" />
|
||||
<setting id="einschalten_metadata_source" type="enum" label="Metadatenquelle" default="0" values="Auto|Quelle|TMDB|Mix" />
|
||||
<setting id="einschalten_base_url" type="text" label="Basis-URL" default="https://einschalten.in" />
|
||||
<setting id="einschalten_metadata_source" type="enum" label="Metadatenquelle" default="0" values="Automatisch|Quelle|TMDB|Mischen" />
|
||||
</category>
|
||||
<category label="Filmpalast">
|
||||
<setting id="filmpalast_base_url" type="text" label="Domain (BASE_URL)" default="https://filmpalast.to" />
|
||||
<setting id="filmpalast_metadata_source" type="enum" label="Metadatenquelle" default="0" values="Auto|Quelle|TMDB|Mix" />
|
||||
<setting id="filmpalast_base_url" type="text" label="Basis-URL" default="https://filmpalast.to" />
|
||||
<setting id="filmpalast_metadata_source" type="enum" label="Metadatenquelle" default="0" values="Automatisch|Quelle|TMDB|Mischen" />
|
||||
</category>
|
||||
<category label="Doku-Streams">
|
||||
<setting id="doku_streams_base_url" type="text" label="Domain (BASE_URL)" default="https://doku-streams.com" />
|
||||
<setting id="doku_streams_metadata_source" type="enum" label="Metadatenquelle" default="0" values="Auto|Quelle|TMDB|Mix" />
|
||||
<setting id="doku_streams_base_url" type="text" label="Basis-URL" default="https://doku-streams.com" />
|
||||
<setting id="doku_streams_metadata_source" type="enum" label="Metadatenquelle" default="0" values="Automatisch|Quelle|TMDB|Mischen" />
|
||||
</category>
|
||||
<category label="TMDB">
|
||||
<setting id="tmdb_enabled" type="bool" label="TMDB aktivieren" default="true" />
|
||||
<setting id="tmdb_api_key" type="text" label="TMDB API Key" default="" />
|
||||
<setting id="tmdb_language" type="text" label="TMDB Sprache (z.B. de-DE)" default="de-DE" />
|
||||
<setting id="tmdb_prefetch_concurrency" type="number" label="TMDB: Parallelität (Prefetch, 1-20)" default="6" />
|
||||
<setting id="tmdb_show_plot" type="bool" label="TMDB Plot anzeigen" default="true" />
|
||||
<setting id="tmdb_show_art" type="bool" label="TMDB Poster/Thumb anzeigen" default="true" />
|
||||
<setting id="tmdb_language" type="text" label="TMDB Sprache (z. B. de-DE)" default="de-DE" />
|
||||
<setting id="tmdb_prefetch_concurrency" type="number" label="TMDB: gleichzeitige Anfragen (1-20)" default="6" />
|
||||
<setting id="tmdb_show_plot" type="bool" label="TMDB Beschreibung anzeigen" default="true" />
|
||||
<setting id="tmdb_show_art" type="bool" label="TMDB Poster und Vorschaubild anzeigen" default="true" />
|
||||
<setting id="tmdb_show_fanart" type="bool" label="TMDB Fanart/Backdrop anzeigen" default="true" />
|
||||
<setting id="tmdb_show_rating" type="bool" label="TMDB Rating anzeigen" default="true" />
|
||||
<setting id="tmdb_show_votes" type="bool" label="TMDB Vote-Count anzeigen" default="false" />
|
||||
<setting id="tmdb_show_cast" type="bool" label="TMDB Cast anzeigen" default="false" />
|
||||
<setting id="tmdb_show_rating" type="bool" label="TMDB Bewertung anzeigen" default="true" />
|
||||
<setting id="tmdb_show_votes" type="bool" label="TMDB Stimmen anzeigen" default="false" />
|
||||
<setting id="tmdb_show_cast" type="bool" label="TMDB Besetzung anzeigen" default="false" />
|
||||
<setting id="tmdb_show_episode_cast" type="bool" label="TMDB Besetzung pro Episode anzeigen" default="false" />
|
||||
<setting id="tmdb_genre_metadata" type="bool" label="TMDB Meta in Genre-Liste anzeigen" default="false" />
|
||||
<setting id="tmdb_log_requests" type="bool" label="TMDB API Requests loggen" default="false" />
|
||||
<setting id="tmdb_log_responses" type="bool" label="TMDB API Antworten loggen" default="false" />
|
||||
<setting id="tmdb_genre_metadata" type="bool" label="TMDB Daten in Genre-Listen anzeigen" default="false" />
|
||||
<setting id="tmdb_log_requests" type="bool" label="TMDB API-Anfragen loggen" default="false" />
|
||||
<setting id="tmdb_log_responses" type="bool" label="TMDB API-Antworten loggen" default="false" />
|
||||
</category>
|
||||
<category label="Update">
|
||||
<setting id="update_repo_url" type="text" label="Update-URL (addons.xml)" default="http://127.0.0.1:8080/repo/addons.xml" />
|
||||
<setting id="run_update_check" type="action" label="Jetzt auf Updates pruefen" action="RunPlugin(plugin://plugin.video.viewit/?action=check_updates)" option="close" />
|
||||
<setting id="update_info" type="text" label="Kodi-Repository-Updates werden ueber den Kodi-Update-Mechanismus verarbeitet." default="" enable="false" />
|
||||
<setting id="update_version_addon" type="text" label="ViewIT Addon Version" default="-" enable="false" />
|
||||
<setting id="update_version_serienstream" type="text" label="Serienstream Plugin Version" default="-" enable="false" />
|
||||
<setting id="update_version_aniworld" type="text" label="Aniworld Plugin Version" default="-" enable="false" />
|
||||
<setting id="update_version_einschalten" type="text" label="Einschalten Plugin Version" default="-" enable="false" />
|
||||
<setting id="update_version_topstreamfilm" type="text" label="Topstreamfilm Plugin Version" default="-" enable="false" />
|
||||
<setting id="update_version_filmpalast" type="text" label="Filmpalast Plugin Version" default="-" enable="false" />
|
||||
<setting id="update_version_doku_streams" type="text" label="Doku-Streams Plugin Version" default="-" enable="false" />
|
||||
<setting id="run_update_check" type="action" label="Jetzt nach Updates suchen" action="RunPlugin(plugin://plugin.video.viewit/?action=check_updates)" option="close" />
|
||||
<setting id="update_info" type="text" label="Updates laufen ueber den normalen Kodi-Update-Mechanismus." default="" enable="false" />
|
||||
<setting id="update_version_addon" type="text" label="ViewIT Version" default="-" enable="false" />
|
||||
<setting id="update_version_serienstream" type="text" label="Serienstream Version" default="-" enable="false" />
|
||||
<setting id="update_version_aniworld" type="text" label="Aniworld Version" default="-" enable="false" />
|
||||
<setting id="update_version_einschalten" type="text" label="Einschalten Version" default="-" enable="false" />
|
||||
<setting id="update_version_topstreamfilm" type="text" label="Topstreamfilm Version" default="-" enable="false" />
|
||||
<setting id="update_version_filmpalast" type="text" label="Filmpalast Version" default="-" enable="false" />
|
||||
<setting id="update_version_doku_streams" type="text" label="Doku-Streams Version" default="-" enable="false" />
|
||||
</category>
|
||||
</settings>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# ViewIT Plugin Entwicklung (`addon/plugins/*_plugin.py`)
|
||||
|
||||
Diese Datei beschreibt den Vertrag zwischen Router und Plugins.
|
||||
Diese Datei zeigt, wie Plugins im Projekt aufgebaut sind und wie sie mit dem Router zusammenarbeiten.
|
||||
|
||||
## Grundlagen
|
||||
- Ein Plugin ist eine Python Datei in `addon/plugins/`.
|
||||
|
||||
Reference in New Issue
Block a user