feat(savetv): Der Clou als geschuetzten Wunschfilm aufnehmen
This commit is contained in:
parent
c7250a7ff7
commit
196f36372e
3 changed files with 58 additions and 3 deletions
|
|
@ -37,6 +37,11 @@ Automatische KI-Anreicherung von Save.TV-Filmarchiv mit Beschreibungen, Darstell
|
||||||
- **Erlaubt automatisch:** internationale Kinofilme aus USA/UK/Kanada/Australien/Japan/Südkorea/Hongkong mit passendem Genre oder klar erkennbarem Kino-Titel.
|
- **Erlaubt automatisch:** internationale Kinofilme aus USA/UK/Kanada/Australien/Japan/Südkorea/Hongkong mit passendem Genre oder klar erkennbarem Kino-Titel.
|
||||||
- **Konsequenz:** Unbekannte RBB/MDR/hr/WDR/BR/SWR/ZDF/ARD/arte/ONE-Titel werden nicht mehr automatisch aufgenommen oder heruntergeladen, bis sie angereichert sind oder eindeutig als Kinofilm erkannt werden.
|
- **Konsequenz:** Unbekannte RBB/MDR/hr/WDR/BR/SWR/ZDF/ARD/arte/ONE-Titel werden nicht mehr automatisch aufgenommen oder heruntergeladen, bis sie angereichert sind oder eindeutig als Kinofilm erkannt werden.
|
||||||
|
|
||||||
|
### 5. Wunschfilm: Der Clou
|
||||||
|
- **Wunschtitel:** `Der Clou` / `The Sting` (1973)
|
||||||
|
- **Automatik:** Wird im Save.TV-Scan immer automatisch aufgenommen, wenn der Titel eindeutig `Der Clou` oder `The Sting` ist.
|
||||||
|
- **Schutz gegen Fehlgriff:** Der einzelne Titel `Sting` wird nur akzeptiert, wenn Beschreibung/Untertitel auf Paul Newman, Robert Redford, Johnny Hooker, Gondorff, Lonnegan oder das 1930er-Setting verweisen. Dadurch wird `Sting` (2024, Spinnen-Horror) nicht erneut als `Der Clou` behandelt.
|
||||||
|
|
||||||
## Erfahrungen / Gotchas
|
## Erfahrungen / Gotchas
|
||||||
|
|
||||||
- `qwen2.5:14b` ist zuverlässiger für JSON-Output als `qwen3:30b-a3b`
|
- `qwen2.5:14b` ist zuverlässiger für JSON-Output als `qwen3:30b-a3b`
|
||||||
|
|
|
||||||
|
|
@ -43,6 +43,28 @@ DOWNLOAD_FORMAT_SD = 5
|
||||||
AUTO_RECORD_SCORE = 80
|
AUTO_RECORD_SCORE = 80
|
||||||
SUGGEST_SCORE = 60
|
SUGGEST_SCORE = 60
|
||||||
|
|
||||||
|
WISHLIST_MOVIES = [
|
||||||
|
{
|
||||||
|
"name": "Der Clou",
|
||||||
|
"title_patterns": [
|
||||||
|
r"\bder\s+clou\b",
|
||||||
|
r"\bthe\s+sting\b",
|
||||||
|
],
|
||||||
|
# "Sting" alleine ist mehrdeutig; nur mit inhaltlichem Treffer aufnehmen.
|
||||||
|
"ambiguous_title_patterns": [
|
||||||
|
r"\bsting\b",
|
||||||
|
],
|
||||||
|
"required_context_patterns": [
|
||||||
|
r"\bpaul\s+newman\b",
|
||||||
|
r"\brobert\s+redford\b",
|
||||||
|
r"\bjohnny\s+hooker\b",
|
||||||
|
r"\bgondorff\b",
|
||||||
|
r"\blonnegan\b",
|
||||||
|
r"\b1930\b",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
SPAM_SUBCATEGORIES = {
|
SPAM_SUBCATEGORIES = {
|
||||||
"teleshop", "shopping", "dauerwerbesendung", "volksmusik",
|
"teleshop", "shopping", "dauerwerbesendung", "volksmusik",
|
||||||
"casting", "reality", "quiz/spiel", "comic", "zeichentrick",
|
"casting", "reality", "quiz/spiel", "comic", "zeichentrick",
|
||||||
|
|
@ -353,6 +375,11 @@ def _filter_films(telecasts, only_new=False):
|
||||||
if is_highlight:
|
if is_highlight:
|
||||||
score += 10
|
score += 10
|
||||||
|
|
||||||
|
wishlist_match = _wishlist_match(tc)
|
||||||
|
if wishlist_match:
|
||||||
|
score = max(score, 100)
|
||||||
|
tc["_wishlist_match"] = wishlist_match
|
||||||
|
|
||||||
tc["_score"] = score
|
tc["_score"] = score
|
||||||
tc["_start_dt"] = start_dt
|
tc["_start_dt"] = start_dt
|
||||||
films.append(tc)
|
films.append(tc)
|
||||||
|
|
@ -372,6 +399,23 @@ def _mark_seen(films):
|
||||||
_save_seen(seen)
|
_save_seen(seen)
|
||||||
|
|
||||||
|
|
||||||
|
def _wishlist_match(tc):
|
||||||
|
"""Gibt den Wunschtitel zurueck, wenn eine Sendung sicher passt."""
|
||||||
|
haystack = " ".join(
|
||||||
|
str(tc.get(k) or "")
|
||||||
|
for k in ("STITLE", "STHEMA", "SFULLSUBTITLE", "SDESCRIPTION")
|
||||||
|
).lower()
|
||||||
|
title = str(tc.get("STITLE") or "").lower()
|
||||||
|
for movie in WISHLIST_MOVIES:
|
||||||
|
for pattern in movie["title_patterns"]:
|
||||||
|
if re.search(pattern, title, re.IGNORECASE):
|
||||||
|
return movie["name"]
|
||||||
|
if any(re.search(p, title, re.IGNORECASE) for p in movie["ambiguous_title_patterns"]):
|
||||||
|
if any(re.search(p, haystack, re.IGNORECASE) for p in movie["required_context_patterns"]):
|
||||||
|
return movie["name"]
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
def _record_telecast(telecast_id):
|
def _record_telecast(telecast_id):
|
||||||
"""Aufnahme anlegen."""
|
"""Aufnahme anlegen."""
|
||||||
s = _get_session()
|
s = _get_session()
|
||||||
|
|
@ -734,12 +778,13 @@ def get_new_films():
|
||||||
suggestions = []
|
suggestions = []
|
||||||
|
|
||||||
for f in films:
|
for f in films:
|
||||||
|
wishlist_match = f.get("_wishlist_match")
|
||||||
allow_auto, quality_reason = savetv_country_filter.classify_auto_quality(
|
allow_auto, quality_reason = savetv_country_filter.classify_auto_quality(
|
||||||
f.get("STITLE", ""),
|
f.get("STITLE", ""),
|
||||||
f.get("STVSTATIONNAME", ""),
|
f.get("STVSTATIONNAME", ""),
|
||||||
filminfo_cache,
|
filminfo_cache,
|
||||||
)
|
)
|
||||||
if not allow_auto:
|
if not allow_auto and not wishlist_match:
|
||||||
log.info("Auto-Aufnahme übersprungen: %s (%s)",
|
log.info("Auto-Aufnahme übersprungen: %s (%s)",
|
||||||
f.get("STITLE"), quality_reason)
|
f.get("STITLE"), quality_reason)
|
||||||
continue
|
continue
|
||||||
|
|
@ -756,8 +801,12 @@ def get_new_films():
|
||||||
result = _record_telecast(tid)
|
result = _record_telecast(tid)
|
||||||
f["_record_result"] = result
|
f["_record_result"] = result
|
||||||
auto_recorded.append(f)
|
auto_recorded.append(f)
|
||||||
log.info("Auto-Aufnahme: %s (Score %d) -> %s",
|
if wishlist_match:
|
||||||
f.get("STITLE"), score, result)
|
log.info("Wunschfilm-Aufnahme (%s): %s -> %s",
|
||||||
|
wishlist_match, f.get("STITLE"), result)
|
||||||
|
else:
|
||||||
|
log.info("Auto-Aufnahme: %s (Score %d) -> %s",
|
||||||
|
f.get("STITLE"), score, result)
|
||||||
else:
|
else:
|
||||||
suggestions.append(f)
|
suggestions.append(f)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -83,6 +83,7 @@ _KNOWN_CINEMA_TITLE = {
|
||||||
"blacklight", "blade runner", "bodyguard", "bohemian rhapsody",
|
"blacklight", "blade runner", "bodyguard", "bohemian rhapsody",
|
||||||
"bourne", "braveheart", "carlito", "casino", "chinatown",
|
"bourne", "braveheart", "carlito", "casino", "chinatown",
|
||||||
"colombiana", "contraband", "crank", "deadpool", "der staatsfeind",
|
"colombiana", "contraband", "crank", "deadpool", "der staatsfeind",
|
||||||
|
"der clou", "the sting",
|
||||||
"die bourne identität", "die bourne identitaet", "das vermächtnis",
|
"die bourne identität", "die bourne identitaet", "das vermächtnis",
|
||||||
"das vermaechtnis", "g20", "green zone", "hitman", "manchurian",
|
"das vermaechtnis", "g20", "green zone", "hitman", "manchurian",
|
||||||
"network", "stirb langsam", "the nice guys", "tom clancy",
|
"network", "stirb langsam", "the nice guys", "tom clancy",
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue