Korrektur-Flow + Freigaben-Auswahl + Schreibtest + Schnellwahl-Klartext
Ampel / ampel (push) Failing after 52s
Ampel / ampel (push) Failing after 52s
Commander-Befunde (23.07. spaet): - MANUELLE KORREKTUR (KONZEPT Schritt 5 endlich komplett): Metadaten-Seite hat jetzt Titelsuche ueber ALLE Quellen (GET /metadata/search) mit Poster-Kacheln; ein Klick uebernimmt den Treffer (POST /metadata/override) fuer Karte, Jobs UND merkt ihn sich 30 Tage per Disc-Fingerabdruck — dieselbe Disc wird beim naechsten Einlegen sofort richtig erkannt - PC/NAS per Klick: SMB-Freigaben eines Rechners auflisten (GET /storage-mounts/shares via smbclient) statt //host/share raten - Berechtigungs-PRUEFUNG beim Einhaengen: Schreibtest, Warnung bei nur-lesbaren Zielen (API + UI + Log) - "Standard-Unterordner" verstaendlich gemacht: heisst jetzt "Schnellwahl beim Rippen" mit Erklaertext; kryptisches Basis-Feld raus - Preview zeigt Poster; Fingerprint fuer Cache/Override vereinheitlicht (billiges Label+Groesse statt Mount-Titel) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -33,6 +33,32 @@ class JikanClient:
|
||||
def __init__(self):
|
||||
self.session = requests.Session()
|
||||
|
||||
def suche(self, title: str) -> list:
|
||||
"""Roh-Kandidaten für die manuelle Korrektur (ohne Ähnlichkeits-Gate)."""
|
||||
try:
|
||||
response = self.session.get(
|
||||
f"{JIKAN_BASE_URL}/anime",
|
||||
params={"q": title, "limit": 5, "sfw": "true"},
|
||||
timeout=10,
|
||||
)
|
||||
response.raise_for_status()
|
||||
eintraege = response.json().get("data") or []
|
||||
except Exception:
|
||||
return []
|
||||
ergebnisse = []
|
||||
for e in eintraege:
|
||||
bilder = (e.get("images") or {}).get("jpg") or {}
|
||||
ergebnisse.append({
|
||||
"title": e.get("title_english") or e.get("title") or "",
|
||||
"year": e.get("year"),
|
||||
"poster": bilder.get("large_image_url") or bilder.get("image_url") or "",
|
||||
"overview": (e.get("synopsis") or "")[:200],
|
||||
"type": "movie" if e.get("type") == "Movie" else "tv",
|
||||
"source": "jikan",
|
||||
"id": f"mal-{e.get('mal_id', '')}",
|
||||
})
|
||||
return ergebnisse
|
||||
|
||||
def lookup(self, title: str) -> Optional[Dict]:
|
||||
"""Sucht per Titel; nimmt den ÄHNLICHSTEN Treffer, nicht blind den ersten."""
|
||||
cache_key = f"jikan:{title.lower()}"
|
||||
|
||||
@@ -37,6 +37,34 @@ class OMDbClient:
|
||||
self.api_key = get_settings().get("omdbApiKey") or settings.omdb_api_key
|
||||
self.session = requests.Session()
|
||||
|
||||
def suche(self, title: str) -> list:
|
||||
"""Roh-Kandidaten für die manuelle Korrektur (unscharfe s=-Suche)."""
|
||||
if not self.api_key:
|
||||
return []
|
||||
try:
|
||||
antwort = self.session.get(
|
||||
OMDB_BASE_URL,
|
||||
params={"apikey": self.api_key, "s": title, "r": "json"},
|
||||
timeout=10,
|
||||
).json()
|
||||
except Exception:
|
||||
return []
|
||||
if antwort.get("Response") != "True":
|
||||
return []
|
||||
ergebnisse = []
|
||||
for e in (antwort.get("Search") or [])[:5]:
|
||||
poster = e.get("Poster", "")
|
||||
ergebnisse.append({
|
||||
"title": e.get("Title", ""),
|
||||
"year": parse_year(e.get("Year", "")),
|
||||
"poster": poster if poster != "N/A" else "",
|
||||
"overview": "",
|
||||
"type": "tv" if e.get("Type") == "series" else "movie",
|
||||
"source": "omdb",
|
||||
"id": e.get("imdbID", ""),
|
||||
})
|
||||
return ergebnisse
|
||||
|
||||
def lookup(self, title: str, year: Optional[int] = None) -> Optional[Dict]:
|
||||
"""Sucht per Titel (t=), liefert normalisierte Metadaten oder None."""
|
||||
if not self.api_key:
|
||||
|
||||
Reference in New Issue
Block a user