dev: include plot text in Serienstream genre list entries
This commit is contained in:
@@ -6,6 +6,7 @@
|
|||||||
- Genre-Listen laden strikt nur die angeforderte Seite (on-demand, max. 20 Titel).
|
- Genre-Listen laden strikt nur die angeforderte Seite (on-demand, max. 20 Titel).
|
||||||
- Weitere Seiten werden erst bei `Naechste Seite` geladen.
|
- Weitere Seiten werden erst bei `Naechste Seite` geladen.
|
||||||
- Listen-Parser reduziert auf Titel, Serien-URL und Cover.
|
- Listen-Parser reduziert auf Titel, Serien-URL und Cover.
|
||||||
|
- Plot wird aus den Karten mit uebernommen und in der Liste angezeigt, falls vorhanden.
|
||||||
- Detail-Metadaten werden erst beim Oeffnen von Staffel/Episode geholt.
|
- Detail-Metadaten werden erst beim Oeffnen von Staffel/Episode geholt.
|
||||||
|
|
||||||
## 0.1.61-nightly - 2026-02-23
|
## 0.1.61-nightly - 2026-02-23
|
||||||
|
|||||||
@@ -1427,6 +1427,42 @@ class SerienstreamPlugin(BasisPlugin):
|
|||||||
art.setdefault("poster", cover)
|
art.setdefault("poster", cover)
|
||||||
self._series_metadata_cache[key] = (info, art)
|
self._series_metadata_cache[key] = (info, art)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _card_description(anchor: BeautifulSoupT) -> str:
|
||||||
|
if not anchor:
|
||||||
|
return ""
|
||||||
|
candidates: List[str] = []
|
||||||
|
direct = (anchor.get("data-search") or "").strip()
|
||||||
|
if direct:
|
||||||
|
candidates.append(direct)
|
||||||
|
title_attr = (anchor.get("data-title") or "").strip()
|
||||||
|
if title_attr:
|
||||||
|
candidates.append(title_attr)
|
||||||
|
for selector in ("p", ".description", ".desc", ".text-muted", ".small", ".overview"):
|
||||||
|
node = anchor.select_one(selector)
|
||||||
|
if node is None:
|
||||||
|
continue
|
||||||
|
text = (node.get_text(" ", strip=True) or "").strip()
|
||||||
|
if text:
|
||||||
|
candidates.append(text)
|
||||||
|
parent = anchor.parent if anchor else None
|
||||||
|
if parent is not None:
|
||||||
|
parent_data = (parent.get("data-search") or "").strip()
|
||||||
|
if parent_data:
|
||||||
|
candidates.append(parent_data)
|
||||||
|
parent_text = ""
|
||||||
|
try:
|
||||||
|
parent_text = (parent.get_text(" ", strip=True) or "").strip()
|
||||||
|
except Exception:
|
||||||
|
parent_text = ""
|
||||||
|
if parent_text and len(parent_text) > 24:
|
||||||
|
candidates.append(parent_text)
|
||||||
|
for value in candidates:
|
||||||
|
cleaned = re.sub(r"\s+", " ", str(value or "")).strip()
|
||||||
|
if cleaned and len(cleaned) > 12:
|
||||||
|
return cleaned
|
||||||
|
return ""
|
||||||
|
|
||||||
def _parse_genre_entries_from_soup(self, soup: BeautifulSoupT) -> List[SeriesResult]:
|
def _parse_genre_entries_from_soup(self, soup: BeautifulSoupT) -> List[SeriesResult]:
|
||||||
entries: List[SeriesResult] = []
|
entries: List[SeriesResult] = []
|
||||||
seen_urls: set[str] = set()
|
seen_urls: set[str] = set()
|
||||||
@@ -1459,10 +1495,7 @@ class SerienstreamPlugin(BasisPlugin):
|
|||||||
or (anchor.get("title") or "")
|
or (anchor.get("title") or "")
|
||||||
or (anchor.get_text(" ", strip=True) or "")
|
or (anchor.get_text(" ", strip=True) or "")
|
||||||
).strip()
|
).strip()
|
||||||
description = (anchor.get("data-search") or "").strip()
|
description = self._card_description(anchor)
|
||||||
parent = anchor.parent if anchor else None
|
|
||||||
if parent is not None and not description:
|
|
||||||
description = (parent.get("data-search") or "").strip()
|
|
||||||
cover = (img.get("data-src") if img else "") or (img.get("src") if img else "")
|
cover = (img.get("data-src") if img else "") or (img.get("src") if img else "")
|
||||||
_add_entry(title, description, href, cover)
|
_add_entry(title, description, href, cover)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user