nightly: bump to 0.1.60 and finalize menu, resolver, settings cleanup
This commit is contained in:
20
CHANGELOG-NIGHTLY.md
Normal file
20
CHANGELOG-NIGHTLY.md
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
# Changelog (Nightly)
|
||||||
|
|
||||||
|
## 0.1.59-nightly - 2026-02-23
|
||||||
|
|
||||||
|
- Enthaelt alle Aenderungen aus `0.1.58`.
|
||||||
|
- Update-Kanal standardmaessig auf `Nightly`.
|
||||||
|
- Nightly-Repo-URL als Standard gesetzt.
|
||||||
|
- Settings-Menue neu sortiert:
|
||||||
|
- Quellen
|
||||||
|
- Metadaten
|
||||||
|
- TMDB Erweitert
|
||||||
|
- Updates
|
||||||
|
- Debug Global
|
||||||
|
- Debug Quellen
|
||||||
|
- Seitengroesse in Listen auf 20 gesetzt.
|
||||||
|
- `topstream_genre_max_pages` entfernt.
|
||||||
|
|
||||||
|
## Hinweis
|
||||||
|
|
||||||
|
- Nightly ist fuer Tests und kann sich kurzfristig aendern.
|
||||||
12
CHANGELOG.md
Normal file
12
CHANGELOG.md
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
# Changelog (Stable)
|
||||||
|
|
||||||
|
## 0.1.58 - 2026-02-23
|
||||||
|
|
||||||
|
- Menuebezeichnungen vereinheitlicht (`Haeufig gesehen`, `Neuste Titel`).
|
||||||
|
- `Neue Titel` und `Neueste Folgen` im Menue zu `Neuste Titel` zusammengelegt.
|
||||||
|
- Hoster-Header-Anpassung zentral nach `resolve_stream_link` eingebaut.
|
||||||
|
- Hinweis bei Cloudflare-Block durch ResolveURL statt stiller Fehlversuche.
|
||||||
|
- Update-Einstellungen erweitert (Kanal, manueller Check, optionaler Auto-Check).
|
||||||
|
- Metadaten-Parsing in AniWorld und Filmpalast nachgezogen (Cover/Plot robuster).
|
||||||
|
- Topstreamfilm-Suche: fehlender `urlencode`-Import behoben.
|
||||||
|
- Einige ungenutzte Funktionen entfernt.
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version='1.0' encoding='utf-8'?>
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
<addon id="plugin.video.viewit" name="ViewIt" version="0.1.59-nightly" provider-name="ViewIt">
|
<addon id="plugin.video.viewit" name="ViewIt" version="0.1.60-nightly" provider-name="ViewIt">
|
||||||
<requires>
|
<requires>
|
||||||
<import addon="xbmc.python" version="3.0.0" />
|
<import addon="xbmc.python" version="3.0.0" />
|
||||||
<import addon="script.module.requests" />
|
<import addon="script.module.requests" />
|
||||||
|
|||||||
@@ -131,6 +131,7 @@ _TMDB_LOCK = threading.RLock()
|
|||||||
WATCHED_THRESHOLD = 0.9
|
WATCHED_THRESHOLD = 0.9
|
||||||
POPULAR_MENU_LABEL = "Haeufig gesehen"
|
POPULAR_MENU_LABEL = "Haeufig gesehen"
|
||||||
LATEST_MENU_LABEL = "Neuste Titel"
|
LATEST_MENU_LABEL = "Neuste Titel"
|
||||||
|
LIST_PAGE_SIZE = 20
|
||||||
|
|
||||||
atexit.register(close_all_sessions)
|
atexit.register(close_all_sessions)
|
||||||
|
|
||||||
@@ -305,10 +306,6 @@ def _playstate_key(*, plugin_name: str, title: str, season: str, episode: str) -
|
|||||||
return f"{plugin_name}\t{title}\t{season}\t{episode}"
|
return f"{plugin_name}\t{title}\t{season}\t{episode}"
|
||||||
|
|
||||||
|
|
||||||
def _playstate_path() -> str:
|
|
||||||
return _get_log_path("playstate.json")
|
|
||||||
|
|
||||||
|
|
||||||
def _load_playstate() -> dict[str, dict[str, object]]:
|
def _load_playstate() -> dict[str, dict[str, object]]:
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
@@ -2574,7 +2571,7 @@ def _plugins_with_popular() -> list[tuple[str, BasisPlugin, str]]:
|
|||||||
|
|
||||||
def _show_popular(plugin_name: str | None = None, page: int = 1) -> None:
|
def _show_popular(plugin_name: str | None = None, page: int = 1) -> None:
|
||||||
handle = _get_handle()
|
handle = _get_handle()
|
||||||
page_size = 10
|
page_size = LIST_PAGE_SIZE
|
||||||
page = max(1, int(page or 1))
|
page = max(1, int(page or 1))
|
||||||
|
|
||||||
if plugin_name:
|
if plugin_name:
|
||||||
@@ -2701,7 +2698,7 @@ def _show_popular(plugin_name: str | None = None, page: int = 1) -> None:
|
|||||||
|
|
||||||
def _show_new_titles(plugin_name: str, page: int = 1, *, action_name: str = "new_titles") -> None:
|
def _show_new_titles(plugin_name: str, page: int = 1, *, action_name: str = "new_titles") -> None:
|
||||||
handle = _get_handle()
|
handle = _get_handle()
|
||||||
page_size = 10
|
page_size = LIST_PAGE_SIZE
|
||||||
page = max(1, int(page or 1))
|
page = max(1, int(page or 1))
|
||||||
|
|
||||||
plugin_name = (plugin_name or "").strip()
|
plugin_name = (plugin_name or "").strip()
|
||||||
@@ -2949,7 +2946,7 @@ def _show_latest_titles(plugin_name: str, page: int = 1) -> None:
|
|||||||
|
|
||||||
def _show_genre_series_group(plugin_name: str, genre: str, group_code: str, page: int = 1) -> None:
|
def _show_genre_series_group(plugin_name: str, genre: str, group_code: str, page: int = 1) -> None:
|
||||||
handle = _get_handle()
|
handle = _get_handle()
|
||||||
page_size = 10
|
page_size = LIST_PAGE_SIZE
|
||||||
page = max(1, int(page or 1))
|
page = max(1, int(page or 1))
|
||||||
plugin = _discover_plugins().get(plugin_name)
|
plugin = _discover_plugins().get(plugin_name)
|
||||||
if plugin is None:
|
if plugin is None:
|
||||||
@@ -3182,23 +3179,28 @@ def _extract_first_int(value: str) -> int | None:
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
def _duration_label(duration_seconds: int) -> str:
|
|
||||||
try:
|
|
||||||
duration_seconds = int(duration_seconds or 0)
|
|
||||||
except Exception:
|
|
||||||
duration_seconds = 0
|
|
||||||
if duration_seconds <= 0:
|
|
||||||
return ""
|
|
||||||
total_minutes = max(0, duration_seconds // 60)
|
|
||||||
hours = max(0, total_minutes // 60)
|
|
||||||
minutes = max(0, total_minutes % 60)
|
|
||||||
return f"{hours:02d}:{minutes:02d} Laufzeit"
|
|
||||||
|
|
||||||
|
|
||||||
def _label_with_duration(label: str, info_labels: dict[str, str] | None) -> str:
|
def _label_with_duration(label: str, info_labels: dict[str, str] | None) -> str:
|
||||||
return label
|
return label
|
||||||
|
|
||||||
|
|
||||||
|
def _resolveurl_last_error() -> str:
|
||||||
|
try:
|
||||||
|
from resolveurl_backend import get_last_error # type: ignore
|
||||||
|
except Exception:
|
||||||
|
return ""
|
||||||
|
try:
|
||||||
|
return str(get_last_error() or "")
|
||||||
|
except Exception:
|
||||||
|
return ""
|
||||||
|
|
||||||
|
|
||||||
|
def _is_cloudflare_challenge_error(message: str) -> bool:
|
||||||
|
text = str(message or "").casefold()
|
||||||
|
if not text:
|
||||||
|
return False
|
||||||
|
return "cloudflare" in text or "challenge" in text or "attention required" in text
|
||||||
|
|
||||||
|
|
||||||
def _play_final_link(
|
def _play_final_link(
|
||||||
link: str,
|
link: str,
|
||||||
*,
|
*,
|
||||||
@@ -3242,10 +3244,6 @@ def _play_final_link(
|
|||||||
player.play(item=link, listitem=list_item)
|
player.play(item=link, listitem=list_item)
|
||||||
|
|
||||||
|
|
||||||
def _track_playback_and_update_state(key: str) -> None:
|
|
||||||
return
|
|
||||||
|
|
||||||
|
|
||||||
def _track_playback_and_update_state_async(key: str) -> None:
|
def _track_playback_and_update_state_async(key: str) -> None:
|
||||||
# Eigenes Resume/Watched ist deaktiviert; Kodi verwaltet das selbst.
|
# Eigenes Resume/Watched ist deaktiviert; Kodi verwaltet das selbst.
|
||||||
return
|
return
|
||||||
@@ -3334,8 +3332,30 @@ def _play_episode(
|
|||||||
xbmcgui.Dialog().notification("Wiedergabe", "Kein Stream gefunden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
xbmcgui.Dialog().notification("Wiedergabe", "Kein Stream gefunden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||||
return
|
return
|
||||||
_log(f"Stream-Link: {link}", xbmc.LOGDEBUG)
|
_log(f"Stream-Link: {link}", xbmc.LOGDEBUG)
|
||||||
final_link = plugin.resolve_stream_link(link) or link
|
resolved_link = plugin.resolve_stream_link(link)
|
||||||
|
if not resolved_link:
|
||||||
|
err = _resolveurl_last_error()
|
||||||
|
if _is_cloudflare_challenge_error(err):
|
||||||
|
_log(f"ResolveURL Cloudflare-Challenge: {err}", xbmc.LOGWARNING)
|
||||||
|
xbmcgui.Dialog().notification(
|
||||||
|
"Wiedergabe",
|
||||||
|
"Hoster durch Cloudflare geschuetzt. Bitte spaeter erneut probieren.",
|
||||||
|
xbmcgui.NOTIFICATION_INFO,
|
||||||
|
4500,
|
||||||
|
)
|
||||||
|
return
|
||||||
|
final_link = resolved_link or link
|
||||||
final_link = normalize_resolved_stream_url(final_link, source_url=link)
|
final_link = normalize_resolved_stream_url(final_link, source_url=link)
|
||||||
|
err = _resolveurl_last_error()
|
||||||
|
if _is_cloudflare_challenge_error(err) and final_link.strip() == link.strip():
|
||||||
|
_log(f"ResolveURL Cloudflare-Challenge (unresolved): {err}", xbmc.LOGWARNING)
|
||||||
|
xbmcgui.Dialog().notification(
|
||||||
|
"Wiedergabe",
|
||||||
|
"Hoster durch Cloudflare geschuetzt. Bitte spaeter erneut probieren.",
|
||||||
|
xbmcgui.NOTIFICATION_INFO,
|
||||||
|
4500,
|
||||||
|
)
|
||||||
|
return
|
||||||
finally:
|
finally:
|
||||||
if restore_hosters is not None and callable(preferred_setter):
|
if restore_hosters is not None and callable(preferred_setter):
|
||||||
preferred_setter(restore_hosters)
|
preferred_setter(restore_hosters)
|
||||||
@@ -3422,8 +3442,30 @@ def _play_episode_url(
|
|||||||
xbmcgui.Dialog().notification("Wiedergabe", "Kein Stream gefunden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
xbmcgui.Dialog().notification("Wiedergabe", "Kein Stream gefunden.", xbmcgui.NOTIFICATION_INFO, 3000)
|
||||||
return
|
return
|
||||||
_log(f"Stream-Link: {link}", xbmc.LOGDEBUG)
|
_log(f"Stream-Link: {link}", xbmc.LOGDEBUG)
|
||||||
final_link = plugin.resolve_stream_link(link) or link
|
resolved_link = plugin.resolve_stream_link(link)
|
||||||
|
if not resolved_link:
|
||||||
|
err = _resolveurl_last_error()
|
||||||
|
if _is_cloudflare_challenge_error(err):
|
||||||
|
_log(f"ResolveURL Cloudflare-Challenge: {err}", xbmc.LOGWARNING)
|
||||||
|
xbmcgui.Dialog().notification(
|
||||||
|
"Wiedergabe",
|
||||||
|
"Hoster durch Cloudflare geschuetzt. Bitte spaeter erneut probieren.",
|
||||||
|
xbmcgui.NOTIFICATION_INFO,
|
||||||
|
4500,
|
||||||
|
)
|
||||||
|
return
|
||||||
|
final_link = resolved_link or link
|
||||||
final_link = normalize_resolved_stream_url(final_link, source_url=link)
|
final_link = normalize_resolved_stream_url(final_link, source_url=link)
|
||||||
|
err = _resolveurl_last_error()
|
||||||
|
if _is_cloudflare_challenge_error(err) and final_link.strip() == link.strip():
|
||||||
|
_log(f"ResolveURL Cloudflare-Challenge (unresolved): {err}", xbmc.LOGWARNING)
|
||||||
|
xbmcgui.Dialog().notification(
|
||||||
|
"Wiedergabe",
|
||||||
|
"Hoster durch Cloudflare geschuetzt. Bitte spaeter erneut probieren.",
|
||||||
|
xbmcgui.NOTIFICATION_INFO,
|
||||||
|
4500,
|
||||||
|
)
|
||||||
|
return
|
||||||
finally:
|
finally:
|
||||||
if restore_hosters is not None and callable(preferred_setter):
|
if restore_hosters is not None and callable(preferred_setter):
|
||||||
preferred_setter(restore_hosters)
|
preferred_setter(restore_hosters)
|
||||||
|
|||||||
@@ -603,15 +603,6 @@ class EinschaltenPlugin(BasisPlugin):
|
|||||||
url = urljoin(base + "/", path.lstrip("/"))
|
url = urljoin(base + "/", path.lstrip("/"))
|
||||||
return f"{url}?{urlencode({'query': query})}"
|
return f"{url}?{urlencode({'query': query})}"
|
||||||
|
|
||||||
def _api_movies_url(self, *, with_genres: int, page: int = 1) -> str:
|
|
||||||
base = self._get_base_url()
|
|
||||||
if not base:
|
|
||||||
return ""
|
|
||||||
params: Dict[str, str] = {"withGenres": str(int(with_genres))}
|
|
||||||
if page and int(page) > 1:
|
|
||||||
params["page"] = str(int(page))
|
|
||||||
return urljoin(base + "/", "api/movies") + f"?{urlencode(params)}"
|
|
||||||
|
|
||||||
def _genre_page_url(self, *, genre_id: int, page: int = 1) -> str:
|
def _genre_page_url(self, *, genre_id: int, page: int = 1) -> str:
|
||||||
"""Genre title pages are rendered server-side and embed the movie list in ng-state.
|
"""Genre title pages are rendered server-side and embed the movie list in ng-state.
|
||||||
|
|
||||||
@@ -771,23 +762,6 @@ class EinschaltenPlugin(BasisPlugin):
|
|||||||
except Exception:
|
except Exception:
|
||||||
return []
|
return []
|
||||||
|
|
||||||
def _fetch_new_titles_movies(self) -> List[MovieItem]:
|
|
||||||
# "Neue Filme" lives at `/movies/new` and embeds the list in ng-state (`u: "/api/movies"`).
|
|
||||||
url = self._new_titles_url()
|
|
||||||
if not url:
|
|
||||||
return []
|
|
||||||
try:
|
|
||||||
_, body = self._http_get_text(url, timeout=20)
|
|
||||||
payload = _extract_ng_state_payload(body)
|
|
||||||
movies = _parse_ng_state_movies(payload)
|
|
||||||
_log_debug_line(f"parse_ng_state_movies:count={len(movies)}")
|
|
||||||
if movies:
|
|
||||||
_log_titles(movies, context="new_titles")
|
|
||||||
return movies
|
|
||||||
return []
|
|
||||||
except Exception:
|
|
||||||
return []
|
|
||||||
|
|
||||||
def _fetch_new_titles_movies_page(self, page: int) -> List[MovieItem]:
|
def _fetch_new_titles_movies_page(self, page: int) -> List[MovieItem]:
|
||||||
page = max(1, int(page or 1))
|
page = max(1, int(page or 1))
|
||||||
url = self._new_titles_url()
|
url = self._new_titles_url()
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ import os
|
|||||||
import re
|
import re
|
||||||
import json
|
import json
|
||||||
from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional
|
from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional
|
||||||
from urllib.parse import urljoin
|
from urllib.parse import urlencode, urljoin
|
||||||
|
|
||||||
try: # pragma: no cover - optional dependency
|
try: # pragma: no cover - optional dependency
|
||||||
import requests
|
import requests
|
||||||
@@ -66,12 +66,9 @@ SETTING_LOG_URLS = "log_urls_topstreamfilm"
|
|||||||
SETTING_DUMP_HTML = "dump_html_topstreamfilm"
|
SETTING_DUMP_HTML = "dump_html_topstreamfilm"
|
||||||
SETTING_SHOW_URL_INFO = "show_url_info_topstreamfilm"
|
SETTING_SHOW_URL_INFO = "show_url_info_topstreamfilm"
|
||||||
SETTING_LOG_ERRORS = "log_errors_topstreamfilm"
|
SETTING_LOG_ERRORS = "log_errors_topstreamfilm"
|
||||||
SETTING_GENRE_MAX_PAGES = "topstream_genre_max_pages"
|
|
||||||
DEFAULT_TIMEOUT = 20
|
DEFAULT_TIMEOUT = 20
|
||||||
DEFAULT_PREFERRED_HOSTERS = ["supervideo", "dropload", "voe"]
|
DEFAULT_PREFERRED_HOSTERS = ["supervideo", "dropload", "voe"]
|
||||||
MEINECLOUD_HOST = "meinecloud.click"
|
MEINECLOUD_HOST = "meinecloud.click"
|
||||||
DEFAULT_GENRE_MAX_PAGES = 20
|
|
||||||
HARD_MAX_GENRE_PAGES = 200
|
|
||||||
HEADERS = {
|
HEADERS = {
|
||||||
"User-Agent": "Mozilla/5.0 (Kodi; ViewIt) AppleWebKit/537.36 (KHTML, like Gecko)",
|
"User-Agent": "Mozilla/5.0 (Kodi; ViewIt) AppleWebKit/537.36 (KHTML, like Gecko)",
|
||||||
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
|
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
|
||||||
@@ -347,22 +344,6 @@ class TopstreamfilmPlugin(BasisPlugin):
|
|||||||
return urljoin(base if base.endswith("/") else base + "/", href)
|
return urljoin(base if base.endswith("/") else base + "/", href)
|
||||||
return href
|
return href
|
||||||
|
|
||||||
def _get_setting_bool(self, setting_id: str, *, default: bool = False) -> bool:
|
|
||||||
return get_setting_bool(ADDON_ID, setting_id, default=default)
|
|
||||||
|
|
||||||
def _get_setting_int(self, setting_id: str, *, default: int) -> int:
|
|
||||||
if xbmcaddon is None:
|
|
||||||
return default
|
|
||||||
try:
|
|
||||||
addon = xbmcaddon.Addon(ADDON_ID)
|
|
||||||
getter = getattr(addon, "getSettingInt", None)
|
|
||||||
if callable(getter):
|
|
||||||
return int(getter(setting_id))
|
|
||||||
raw = str(addon.getSetting(setting_id) or "").strip()
|
|
||||||
return int(raw) if raw else default
|
|
||||||
except Exception:
|
|
||||||
return default
|
|
||||||
|
|
||||||
def _notify_url(self, url: str) -> None:
|
def _notify_url(self, url: str) -> None:
|
||||||
notify_url(
|
notify_url(
|
||||||
ADDON_ID,
|
ADDON_ID,
|
||||||
|
|||||||
@@ -8,8 +8,16 @@ from __future__ import annotations
|
|||||||
|
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
|
_LAST_RESOLVE_ERROR = ""
|
||||||
|
|
||||||
|
|
||||||
|
def get_last_error() -> str:
|
||||||
|
return str(_LAST_RESOLVE_ERROR or "")
|
||||||
|
|
||||||
|
|
||||||
def resolve(url: str) -> Optional[str]:
|
def resolve(url: str) -> Optional[str]:
|
||||||
|
global _LAST_RESOLVE_ERROR
|
||||||
|
_LAST_RESOLVE_ERROR = ""
|
||||||
if not url:
|
if not url:
|
||||||
return None
|
return None
|
||||||
try:
|
try:
|
||||||
@@ -23,12 +31,14 @@ def resolve(url: str) -> Optional[str]:
|
|||||||
hmf = hosted(url)
|
hmf = hosted(url)
|
||||||
valid = getattr(hmf, "valid_url", None)
|
valid = getattr(hmf, "valid_url", None)
|
||||||
if callable(valid) and not valid():
|
if callable(valid) and not valid():
|
||||||
|
_LAST_RESOLVE_ERROR = "invalid url"
|
||||||
return None
|
return None
|
||||||
resolver = getattr(hmf, "resolve", None)
|
resolver = getattr(hmf, "resolve", None)
|
||||||
if callable(resolver):
|
if callable(resolver):
|
||||||
result = resolver()
|
result = resolver()
|
||||||
return str(result) if result else None
|
return str(result) if result else None
|
||||||
except Exception:
|
except Exception as exc:
|
||||||
|
_LAST_RESOLVE_ERROR = str(exc or "")
|
||||||
pass
|
pass
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@@ -36,8 +46,8 @@ def resolve(url: str) -> Optional[str]:
|
|||||||
if callable(resolve_fn):
|
if callable(resolve_fn):
|
||||||
result = resolve_fn(url)
|
result = resolve_fn(url)
|
||||||
return str(result) if result else None
|
return str(result) if result else None
|
||||||
except Exception:
|
except Exception as exc:
|
||||||
|
_LAST_RESOLVE_ERROR = str(exc or "")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,59 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<settings>
|
<settings>
|
||||||
<category label="Debug und Logs">
|
<category label="Quellen">
|
||||||
|
<setting id="serienstream_base_url" type="text" label="SerienStream Basis-URL" default="https://s.to" />
|
||||||
|
<setting id="aniworld_base_url" type="text" label="AniWorld Basis-URL" default="https://aniworld.to" />
|
||||||
|
<setting id="topstream_base_url" type="text" label="TopStream Basis-URL" default="https://topstreamfilm.live" />
|
||||||
|
<setting id="einschalten_base_url" type="text" label="Einschalten Basis-URL" default="https://einschalten.in" />
|
||||||
|
<setting id="filmpalast_base_url" type="text" label="Filmpalast Basis-URL" default="https://filmpalast.to" />
|
||||||
|
<setting id="doku_streams_base_url" type="text" label="Doku-Streams Basis-URL" default="https://doku-streams.com" />
|
||||||
|
</category>
|
||||||
|
|
||||||
|
<category label="Metadaten">
|
||||||
|
<setting id="serienstream_metadata_source" type="enum" label="SerienStream Metadatenquelle" default="0" values="Automatisch|Quelle|TMDB|Mischen" />
|
||||||
|
<setting id="aniworld_metadata_source" type="enum" label="AniWorld Metadatenquelle" default="0" values="Automatisch|Quelle|TMDB|Mischen" />
|
||||||
|
<setting id="topstreamfilm_metadata_source" type="enum" label="TopStream Metadatenquelle" default="0" values="Automatisch|Quelle|TMDB|Mischen" />
|
||||||
|
<setting id="einschalten_metadata_source" type="enum" label="Einschalten Metadatenquelle" default="0" values="Automatisch|Quelle|TMDB|Mischen" />
|
||||||
|
<setting id="filmpalast_metadata_source" type="enum" label="Filmpalast Metadatenquelle" default="0" values="Automatisch|Quelle|TMDB|Mischen" />
|
||||||
|
<setting id="doku_streams_metadata_source" type="enum" label="Doku-Streams Metadatenquelle" default="0" values="Automatisch|Quelle|TMDB|Mischen" />
|
||||||
|
<setting id="tmdb_enabled" type="bool" label="TMDB aktivieren" default="true" />
|
||||||
|
<setting id="tmdb_language" type="text" label="TMDB Sprache (z. B. de-DE)" default="de-DE" />
|
||||||
|
<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 Bewertung anzeigen" default="true" />
|
||||||
|
<setting id="tmdb_show_votes" type="bool" label="TMDB Stimmen anzeigen" default="false" />
|
||||||
|
</category>
|
||||||
|
|
||||||
|
<category label="TMDB Erweitert">
|
||||||
|
<setting id="tmdb_api_key" type="text" label="TMDB API Key" default="" />
|
||||||
|
<setting id="tmdb_prefetch_concurrency" type="number" label="TMDB: gleichzeitige Anfragen (1-20)" default="6" />
|
||||||
|
<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 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="Updates">
|
||||||
|
<setting id="update_channel" type="enum" label="Update-Kanal" default="1" values="Main|Nightly|Custom" />
|
||||||
|
<setting id="auto_update_enabled" type="bool" label="Automatische Updates (beim Start pruefen)" default="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_repo_url_main" type="text" label="Main URL (addons.xml)" default="https://gitea.it-drui.de/viewit/ViewIT-Kodi-Repo/raw/branch/main/addons.xml" />
|
||||||
|
<setting id="update_repo_url_nightly" type="text" label="Nightly URL (addons.xml)" default="https://gitea.it-drui.de/viewit/ViewIT-Kodi-Repo/raw/branch/nightly/addons.xml" />
|
||||||
|
<setting id="update_repo_url" type="text" label="Custom URL (addons.xml)" default="https://gitea.it-drui.de/viewit/ViewIT-Kodi-Repo/raw/branch/nightly/addons.xml" />
|
||||||
|
<setting id="auto_update_last_ts" type="text" label="Auto-Update letzte Pruefung (intern)" default="0" visible="false" />
|
||||||
|
<setting id="update_version_addon" type="text" label="ViewIT Version" default="-" visible="false" />
|
||||||
|
<setting id="update_version_serienstream" type="text" label="SerienStream Version" default="-" visible="false" />
|
||||||
|
<setting id="update_version_aniworld" type="text" label="AniWorld Version" default="-" visible="false" />
|
||||||
|
<setting id="update_version_einschalten" type="text" label="Einschalten Version" default="-" visible="false" />
|
||||||
|
<setting id="update_version_topstreamfilm" type="text" label="TopStream Version" default="-" visible="false" />
|
||||||
|
<setting id="update_version_filmpalast" type="text" label="Filmpalast Version" default="-" visible="false" />
|
||||||
|
<setting id="update_version_doku_streams" type="text" label="Doku-Streams Version" default="-" visible="false" />
|
||||||
|
</category>
|
||||||
|
|
||||||
|
<category label="Debug Global">
|
||||||
<setting id="debug_log_urls" type="bool" label="URLs mitschreiben (global)" default="false" />
|
<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_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_show_url_info" type="bool" label="Aktuelle URL anzeigen (global)" default="false" />
|
||||||
@@ -8,83 +61,32 @@
|
|||||||
<setting id="log_max_mb" type="number" label="URL-Log: maximale Dateigroesse (MB)" default="5" />
|
<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="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="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" />
|
</category>
|
||||||
<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" />
|
<category label="Debug Quellen">
|
||||||
<setting id="log_errors_serienstream" type="bool" label="Serienstream: Fehler mitschreiben" default="false" />
|
<setting id="log_urls_serienstream" type="bool" label="SerienStream: URLs mitschreiben" default="false" />
|
||||||
<setting id="log_urls_aniworld" type="bool" label="Aniworld: URLs mitschreiben" default="false" />
|
<setting id="dump_html_serienstream" type="bool" label="SerienStream: HTML speichern" default="false" />
|
||||||
<setting id="dump_html_aniworld" type="bool" label="Aniworld: HTML speichern" default="false" />
|
<setting id="show_url_info_serienstream" type="bool" label="SerienStream: Aktuelle URL anzeigen" default="false" />
|
||||||
<setting id="show_url_info_aniworld" type="bool" label="Aniworld: Aktuelle URL anzeigen" default="false" />
|
<setting id="log_errors_serienstream" type="bool" label="SerienStream: Fehler mitschreiben" 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="log_urls_aniworld" type="bool" label="AniWorld: URLs mitschreiben" default="false" />
|
||||||
<setting id="dump_html_topstreamfilm" type="bool" label="Topstreamfilm: HTML speichern" default="false" />
|
<setting id="dump_html_aniworld" type="bool" label="AniWorld: HTML speichern" default="false" />
|
||||||
<setting id="show_url_info_topstreamfilm" type="bool" label="Topstreamfilm: Aktuelle URL anzeigen" default="false" />
|
<setting id="show_url_info_aniworld" type="bool" label="AniWorld: Aktuelle URL anzeigen" default="false" />
|
||||||
<setting id="log_errors_topstreamfilm" type="bool" label="Topstreamfilm: Fehler mitschreiben" default="false" />
|
<setting id="log_errors_aniworld" type="bool" label="AniWorld: Fehler mitschreiben" default="false" />
|
||||||
|
|
||||||
|
<setting id="log_urls_topstreamfilm" type="bool" label="TopStream: URLs mitschreiben" default="false" />
|
||||||
|
<setting id="dump_html_topstreamfilm" type="bool" label="TopStream: HTML speichern" default="false" />
|
||||||
|
<setting id="show_url_info_topstreamfilm" type="bool" label="TopStream: Aktuelle URL anzeigen" default="false" />
|
||||||
|
<setting id="log_errors_topstreamfilm" type="bool" label="TopStream: Fehler mitschreiben" default="false" />
|
||||||
|
|
||||||
<setting id="log_urls_einschalten" type="bool" label="Einschalten: URLs 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="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="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_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="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="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="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" />
|
<setting id="log_errors_filmpalast" type="bool" label="Filmpalast: Fehler mitschreiben" default="false" />
|
||||||
</category>
|
</category>
|
||||||
<category label="TopStream">
|
|
||||||
<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="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="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="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="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="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: 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 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 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_channel" type="enum" label="Update-Kanal" default="1" values="Main|Nightly|Custom" />
|
|
||||||
<setting id="auto_update_enabled" type="bool" label="Automatische Updates (beim Start pruefen)" default="false" />
|
|
||||||
<setting id="update_repo_url_main" type="text" label="Main URL (addons.xml)" default="https://gitea.it-drui.de/viewit/ViewIT-Kodi-Repo/raw/branch/main/addons.xml" />
|
|
||||||
<setting id="update_repo_url_nightly" type="text" label="Nightly URL (addons.xml)" default="https://gitea.it-drui.de/viewit/ViewIT-Kodi-Repo/raw/branch/nightly/addons.xml" />
|
|
||||||
<setting id="update_repo_url" type="text" label="Custom URL (addons.xml)" default="https://gitea.it-drui.de/viewit/ViewIT-Kodi-Repo/raw/branch/nightly/addons.xml" />
|
|
||||||
<setting id="auto_update_last_ts" type="text" label="Auto-Update letzte Pruefung (intern)" default="0" visible="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>
|
</settings>
|
||||||
|
|||||||
Reference in New Issue
Block a user