fix(windows): Cover, Arbeitsverzeichnis und die zurueckgelassenen _MEI-Ordner
Drei Befunde des Commanders vom 28.08.2026, alle drei gemessen.
## 1. „Was ist mit dem Cover auf Windows Rippy?"
Es gab keins, weil es keinen Treffer gab. `_scan_video` verlangte woertliche
Gleichheit:
if movie.get("title", "").lower() == kandidat.lower():
An seiner Disc gemessen:
'Evangelion 2.22' 1 Treffer Evangelion: 2.0 You Can (Not) Advance
'Evangelion' 20 Treffer irgendein Evangelion
Der EINZIGE Treffer auf den vollen Disc-Titel war der richtige Film, mit
Poster — und wurde verworfen. Jetzt zaehlt die SPEZIFITAET der Anfrage: Wer
auf den vollen Disc-Titel hoechstens drei Treffer bekommt, hat gefragt wie
jemand, der weiss was er sucht. Ergebnis an derselben Disc:
Evangelion: 2.0 You Can (Not) Advance / 2009 / 80 % / Poster + dt. Text
## 2. „Warum heisst das hier noch container platte? … Waere es moeglich das
## Arbeitsverzeichnis zu aendern? momentan geht das nicht."
Beide Haelften gehen auf EINE Zeile zurueck: `MEDIA_ROOT = "/app/media"` war
zugleich Vorgabe UND Pfadgrenze. Auf Windows gibt es den Ordner nicht:
* `/storage-targets` fing den OSError und gab still [] zurueck — die Auswahl
hatte genau einen Eintrag. Das ist „momentan geht das nicht".
* Dessen Text war fest verdrahtet „(Container-Platte)".
* `/browse` antwortete auf jeden Pfad mit 422.
Die Grenze faellt nicht weg, sie wird betriebsabhaengig: Container und
Kopflos-Betrieb bedienen ein Netz, die native App den Menschen davor.
Gemessen auf seinem PC: 7 Laufwerke zur Auswahl, X/Y/Z mit je 2,2 TB frei.
## 3. „Failed to remove temporary directory: …_MEI0000b0882"
GEMESSEN: 20 zurueckgelassene _MEI-Ordner mit 1,1 GB. Ursache: `Popen` ohne
`env=` reicht PyInstallers Auspack-Zeiger an die Kinder weiter (--dienst und
--oeffnen). Beide laufen dann im Ordner des Elternprozesses, der sich zuerst
beendet und ihn loeschen will. Waere das TEILWEISE geglueckt, haetten Dienst
und Fenster mitten im Betrieb ihre Dateien verloren.
Nebenbefund: test_setup_fenster scheiterte in jeder Umgebung ohne pywebview.
794 Tests gruen, ruff sauber.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
11001a443e
commit
35370fd552
@@ -25,6 +25,13 @@ from cache.keys import generate_prescan_key
|
||||
# test_treiberwahl.py.
|
||||
detection = _laufwerks_schicht.treiber()
|
||||
|
||||
# Wie viele Treffer eine Suche hoechstens liefern darf, damit sie als
|
||||
# SPEZIFISCH gilt. Gemessen am 28.08.2026: Der volle Disc-Titel
|
||||
# „Evangelion 2.22" ergab bei TMDB 1 Treffer (den richtigen), die gekuerzte
|
||||
# Variante „Evangelion" ergab 20 (beliebige). Drei ist grosszuegig genug fuer
|
||||
# Neuauflagen und Regie-Fassungen desselben Films.
|
||||
WENIGE_TREFFER = 3
|
||||
|
||||
def normalize_disc_label(label: str) -> str:
|
||||
"""Disc-Labels wie 'PULP_FICTION_DE' → 'Pulp Fiction De' (pure Funktion).
|
||||
|
||||
@@ -447,11 +454,13 @@ class PreScan:
|
||||
# probieren — Disc-Titel sind selten API-freundlich formatiert.
|
||||
kandidaten = titel_kandidaten(title) or [title]
|
||||
movies = []
|
||||
movies_kandidat = "" # WELCHE Variante hat sie geliefert?
|
||||
|
||||
for kandidat in kandidaten:
|
||||
treffer = self.tmdb.search_movie(kandidat)
|
||||
if treffer and not movies:
|
||||
movies = treffer # bester Rohtreffer für den Vorschlags-Fallback
|
||||
movies_kandidat = kandidat
|
||||
for movie in treffer:
|
||||
if movie.get("title", "").lower() == kandidat.lower():
|
||||
confidence = 0.95
|
||||
@@ -498,6 +507,55 @@ class PreScan:
|
||||
if matched:
|
||||
break
|
||||
|
||||
# ── Ein spezifischer Treffer zählt, auch ohne exakten Titel ─────────
|
||||
#
|
||||
# ## Der Befund des Commanders (28.08.2026)
|
||||
#
|
||||
# > „Was ist mit dem Cover auf Windows Rippy? In der Web Version haben
|
||||
# > wir ein cover."
|
||||
#
|
||||
# Es gab keins, weil es gar keinen Treffer gab — und der Grund war
|
||||
# nicht Windows, sondern die Bedingung oben: `movie["title"].lower()
|
||||
# == kandidat.lower()`. An seiner Disc gemessen:
|
||||
#
|
||||
# 'Evangelion 2.22' 1 Treffer Evangelion: 2.0 You Can (Not) Advance
|
||||
# 'Evangelion' 20 Treffer irgendein Evangelion
|
||||
#
|
||||
# Der EINZIGE Treffer auf den vollen Disc-Titel war der richtige Film,
|
||||
# mit Poster — und wurde verworfen, weil der Titel nicht wörtlich
|
||||
# gleich war. Danach gewann eine schlechtere Quelle oder gar keine.
|
||||
#
|
||||
# ## Warum die Trefferzahl das bessere Kriterium ist als Ähnlichkeit
|
||||
#
|
||||
# Die Ähnlichkeit hilft hier nicht: „Evangelion 2.22" gegen
|
||||
# „Evangelion: 2.0 You Can (Not) Advance" ergibt 0,51 — das steht als
|
||||
# Messung schon im Jikan-Absatz unten und fällt durch jedes sinnvolle
|
||||
# Gatter. Die SPEZIFITÄT der Anfrage sagt mehr: Wer auf den vollen,
|
||||
# ungekürzten Disc-Titel eine Handvoll Treffer bekommt, hat gefragt
|
||||
# wie jemand, der weiß, was er sucht. Wer 20 bekommt, hat geraten.
|
||||
#
|
||||
# Deshalb: nur der UNGEKÜRZTE Titel (kandidaten[0]) und nur wenige
|
||||
# Treffer. Confidence 0,8 — sicherer als ein Vorschlag (0,6), aber
|
||||
# ehrlich unter einem wörtlichen Treffer (0,95).
|
||||
if not matched and movies and movies_kandidat == kandidaten[0] \
|
||||
and len(movies) <= WENIGE_TREFFER:
|
||||
details = self.tmdb.get_movie_details(movies[0]["id"])
|
||||
if details:
|
||||
confidence = 0.8
|
||||
metadata = {
|
||||
"type": "movie",
|
||||
"id": movies[0]["id"],
|
||||
"title": details.get("title", title),
|
||||
"year": int(details.get("release_date", "0")[:4]) if details.get("release_date") else None,
|
||||
"overview": details.get("overview", ""),
|
||||
"poster_path": details.get("poster_path", ""),
|
||||
"backdrop_path": details.get("backdrop_path", ""),
|
||||
"runtime": details.get("runtime", 0),
|
||||
"genres": [g["name"] for g in details.get("genres", [])],
|
||||
"source": "tmdb",
|
||||
}
|
||||
matched = True
|
||||
|
||||
# Fallback 1: Jikan/MyAnimeList (kostenlos, KEIN Key) — für Anime die
|
||||
# präziseste Quelle; wählt per Titel-Ähnlichkeit, nicht Treffer #1.
|
||||
#
|
||||
|
||||
Reference in New Issue
Block a user