Add savetv_country_filter: exclude DE/FR production countries from film selection

This commit is contained in:
orbitalo 2026-03-31 11:24:04 +00:00
parent 6d19ae5a9b
commit 830682945b

View file

@ -0,0 +1,79 @@
"""Save.TV — Filter: Deutschland/Frankreich (Produktionsland via Wikidata-Cache).
Nutzt dieselbe .filminfo_cache.json wie savetv_extra_routes (Wikidata countries).
Ohne Cache-Eintrag fuer einen Titel wird nicht gefiltert (Film bleibt sichtbar).
Deaktivieren: Umgebungsvariable SAVETV_FILTER_DE_FR=0
"""
from __future__ import annotations
import json
import os
import re
from pathlib import Path
FILMINFO_CACHE = Path("/mnt/savetv/.filminfo_cache.json")
# Deutschland / Frankreich (haeufige Wikidata-Sprachvarianten)
_COUNTRY_EXCL = re.compile(
r"\b("
r"deutschland|germany|allemagne|bundesrepublik(\s+deutschland)?|"
r"west\s+germany|east\s+germany|german\s+democratic\s+republic|"
r"rfa|\bbrd\b|\bddr\b|\bgdr\b|"
r"frankreich|france|republique\s+francaise"
r")\b",
re.IGNORECASE,
)
def _enabled() -> bool:
v = (os.environ.get("SAVETV_FILTER_DE_FR") or "1").strip().lower()
return v not in ("0", "false", "no", "off")
def _norm_title_key(s: str) -> str:
return re.sub(r"\s+", " ", re.sub(r"[^\w\s]", " ", s or "")).strip().lower()
def load_filminfo_cache() -> dict:
if not FILMINFO_CACHE.exists():
return {}
try:
data = json.loads(FILMINFO_CACHE.read_text(encoding="utf-8"))
return data if isinstance(data, dict) else {}
except Exception:
return {}
def _countries_for_title(title: str, cache: dict) -> list[str] | None:
if not title or not cache:
return None
entry = cache.get(title)
if entry is None:
nk = _norm_title_key(title)
for k, v in cache.items():
if isinstance(k, str) and _norm_title_key(k) == nk:
entry = v
break
if not entry or not isinstance(entry, dict):
return None
c = entry.get("countries")
if not c:
return None
if isinstance(c, list):
return [str(x) for x in c if x]
return [str(c)]
def should_exclude_production_country(title: str, cache: dict | None = None) -> bool:
"""True, wenn ein Produktionsland DE oder FR ist (laut Wikidata-Cache)."""
if not _enabled():
return False
cache = load_filminfo_filter() if cache is None else cache
countries = _countries_for_title(title, cache)
if not countries:
return False
for name in countries:
if name and _COUNTRY_EXCL.search(name):
return True
return False