diff --git a/CHANGELOG-DEV.md b/CHANGELOG-DEV.md index ccdfb81..8601d59 100644 --- a/CHANGELOG-DEV.md +++ b/CHANGELOG-DEV.md @@ -1,5 +1,10 @@ # Changelog (Dev) +## 0.1.65-dev - 2026-02-24 + +- Resolver-Diagnosepfad wieder vereinfacht (Fallback/Embed-Block aus dem Router entfernt). +- Serienstream und AniWorld wieder mit VOE als bevorzugtem Hoster in der Default-Prioritaet. + ## 0.1.64-dev - 2026-02-24 - Update-Kanaele in den Settings erweitert: `Dev` ist jetzt ein eigener Kanal. diff --git a/addon/addon.xml b/addon/addon.xml index 6f48bb6..8fd2d7f 100644 --- a/addon/addon.xml +++ b/addon/addon.xml @@ -1,5 +1,5 @@ - + diff --git a/addon/default.py b/addon/default.py index 9c72782..18fa644 100644 --- a/addon/default.py +++ b/addon/default.py @@ -3666,21 +3666,6 @@ def _resolveurl_last_error() -> str: return "" -def _resolveurl_resolve(url: str) -> str | None: - try: - from resolveurl_backend import resolve as _resolve # type: ignore - except Exception: - return None - try: - result = _resolve(url) - except Exception as exc: - _log(f"ResolveURL direkter Aufruf fehlgeschlagen: {exc}", xbmc.LOGWARNING) - return None - if not result: - return None - return str(result) - - def _is_cloudflare_challenge_error(message: str) -> bool: text = str(message or "").casefold() if not text: @@ -3692,37 +3677,6 @@ def _is_resolveurl_missing_error(message: str) -> bool: return str(message or "").strip().casefold() == "resolveurl missing" -def _is_resolveurl_soft_error(message: str) -> bool: - text = str(message or "").strip().casefold() - return text in {"resolveurl missing", "unresolved", "invalid url"} - - -def _looks_like_media_url(url: str) -> bool: - raw = str(url or "").strip() - if not raw: - return False - source = raw.split("|", 1)[0] - path = urlparse(source).path.casefold() - return bool( - re.search(r"\.(m3u8|mpd|mp4|mkv|webm|avi|mov|ts)(?:$|[/?#])", path) - ) - - -def _looks_like_embed_page_url(url: str) -> bool: - raw = str(url or "").strip() - if not raw: - return False - source = raw.split("|", 1)[0] - parsed = urlparse(source) - host = (parsed.netloc or "").casefold() - path = (parsed.path or "").casefold() - if not host.startswith(("voe.", "streamtape.", "dood.", "filemoon.", "vidmoly.", "supervideo.", "veev.", "vidnest.", "vidara.", "strmup.")): - return False - if _looks_like_media_url(source): - return False - return bool(re.search(r"/(e|embed|v)/", path)) - - def _play_final_link( link: str, *, @@ -3855,24 +3809,13 @@ def _play_episode( return _log(f"Stream-Link: {link}", xbmc.LOGDEBUG) resolved_link = plugin.resolve_stream_link(link) - err = _resolveurl_last_error() - if err: - _log(f"ResolveURL Status: {err}", xbmc.LOGDEBUG) - if resolved_link and _looks_like_embed_page_url(resolved_link) and _is_resolveurl_soft_error(err): - _log("Unaufgeloester Hoster-Link erkannt: versuche ResolveURL-Reparatur.", xbmc.LOGWARNING) - _ensure_resolveurl_installed(force=True, silent=True) - resolved_link = plugin.resolve_stream_link(link) - err = _resolveurl_last_error() - if err: - _log(f"ResolveURL Status (nach Reparatur): {err}", xbmc.LOGDEBUG) if not resolved_link: + err = _resolveurl_last_error() if _is_resolveurl_missing_error(err): _log("ResolveURL fehlt: versuche Auto-Installation.", xbmc.LOGWARNING) _ensure_resolveurl_installed(force=True, silent=True) resolved_link = plugin.resolve_stream_link(link) err = _resolveurl_last_error() - if err: - _log(f"ResolveURL Status (nach Auto-Installation): {err}", xbmc.LOGDEBUG) if _is_cloudflare_challenge_error(err): _log(f"ResolveURL Cloudflare-Challenge: {err}", xbmc.LOGWARNING) xbmcgui.Dialog().notification( @@ -3885,20 +3828,6 @@ def _play_episode( final_link = resolved_link or link final_link = normalize_resolved_stream_url(final_link, source_url=link) err = _resolveurl_last_error() - if _looks_like_embed_page_url(final_link): - direct_resolved = _resolveurl_resolve(final_link) - if direct_resolved: - _log(f"ResolveURL Direkt-Fallback Treffer: {direct_resolved}", xbmc.LOGDEBUG) - final_link = normalize_resolved_stream_url(direct_resolved, source_url=final_link) - _log(f"Hoster-Link nicht aufgeloest: {final_link}", xbmc.LOGWARNING) - if _looks_like_embed_page_url(final_link): - xbmcgui.Dialog().notification( - "Wiedergabe", - "Hoster-Link konnte nicht aufgeloest werden. ResolveURL pruefen.", - xbmcgui.NOTIFICATION_INFO, - 5000, - ) - return if _is_cloudflare_challenge_error(err) and final_link.strip() == link.strip(): _log(f"ResolveURL Cloudflare-Challenge (unresolved): {err}", xbmc.LOGWARNING) xbmcgui.Dialog().notification( @@ -3995,24 +3924,13 @@ def _play_episode_url( return _log(f"Stream-Link: {link}", xbmc.LOGDEBUG) resolved_link = plugin.resolve_stream_link(link) - err = _resolveurl_last_error() - if err: - _log(f"ResolveURL Status: {err}", xbmc.LOGDEBUG) - if resolved_link and _looks_like_embed_page_url(resolved_link) and _is_resolveurl_soft_error(err): - _log("Unaufgeloester Hoster-Link erkannt: versuche ResolveURL-Reparatur.", xbmc.LOGWARNING) - _ensure_resolveurl_installed(force=True, silent=True) - resolved_link = plugin.resolve_stream_link(link) - err = _resolveurl_last_error() - if err: - _log(f"ResolveURL Status (nach Reparatur): {err}", xbmc.LOGDEBUG) if not resolved_link: + err = _resolveurl_last_error() if _is_resolveurl_missing_error(err): _log("ResolveURL fehlt: versuche Auto-Installation.", xbmc.LOGWARNING) _ensure_resolveurl_installed(force=True, silent=True) resolved_link = plugin.resolve_stream_link(link) err = _resolveurl_last_error() - if err: - _log(f"ResolveURL Status (nach Auto-Installation): {err}", xbmc.LOGDEBUG) if _is_cloudflare_challenge_error(err): _log(f"ResolveURL Cloudflare-Challenge: {err}", xbmc.LOGWARNING) xbmcgui.Dialog().notification( @@ -4025,20 +3943,6 @@ def _play_episode_url( final_link = resolved_link or link final_link = normalize_resolved_stream_url(final_link, source_url=link) err = _resolveurl_last_error() - if _looks_like_embed_page_url(final_link): - direct_resolved = _resolveurl_resolve(final_link) - if direct_resolved: - _log(f"ResolveURL Direkt-Fallback Treffer: {direct_resolved}", xbmc.LOGDEBUG) - final_link = normalize_resolved_stream_url(direct_resolved, source_url=final_link) - _log(f"Hoster-Link nicht aufgeloest: {final_link}", xbmc.LOGWARNING) - if _looks_like_embed_page_url(final_link): - xbmcgui.Dialog().notification( - "Wiedergabe", - "Hoster-Link konnte nicht aufgeloest werden. ResolveURL pruefen.", - xbmcgui.NOTIFICATION_INFO, - 5000, - ) - return if _is_cloudflare_challenge_error(err) and final_link.strip() == link.strip(): _log(f"ResolveURL Cloudflare-Challenge (unresolved): {err}", xbmc.LOGWARNING) xbmcgui.Dialog().notification( diff --git a/addon/plugins/aniworld_plugin.py b/addon/plugins/aniworld_plugin.py index aa7f768..f105eb4 100644 --- a/addon/plugins/aniworld_plugin.py +++ b/addon/plugins/aniworld_plugin.py @@ -50,7 +50,7 @@ else: # pragma: no cover SETTING_BASE_URL = "aniworld_base_url" DEFAULT_BASE_URL = "https://aniworld.to" -DEFAULT_PREFERRED_HOSTERS = ["supervideo", "filemoon", "vidmoly", "doodstream", "voe"] +DEFAULT_PREFERRED_HOSTERS = ["voe"] DEFAULT_TIMEOUT = 20 ADDON_ID = "plugin.video.viewit" GLOBAL_SETTING_LOG_URLS = "debug_log_urls" diff --git a/addon/plugins/serienstream_plugin.py b/addon/plugins/serienstream_plugin.py index 7c1a32c..e05e0d9 100644 --- a/addon/plugins/serienstream_plugin.py +++ b/addon/plugins/serienstream_plugin.py @@ -56,7 +56,7 @@ else: # pragma: no cover SETTING_BASE_URL = "serienstream_base_url" DEFAULT_BASE_URL = "https://s.to" -DEFAULT_PREFERRED_HOSTERS = ["supervideo", "filemoon", "vidmoly", "doodstream", "voe"] +DEFAULT_PREFERRED_HOSTERS = ["voe"] DEFAULT_TIMEOUT = 20 SEARCH_TIMEOUT = 8 ADDON_ID = "plugin.video.viewit"