fix: prefer first-post F95 covers and banners over metadata thumbnails
This commit is contained in:
1 parent
e48521bdfb
commit
5b911d1e3b
3 files changed
+49
-8
No files matched your search
+13
-4
@@ -4,7 +4,7 @@ import urllib.error
|
||||
import urllib.request
|
||||
from html import unescape
|
||||
from html.parser import HTMLParser
|
||||
from urllib.parse import urljoin, urlparse
|
||||
from urllib.parse import unquote, urljoin, urlparse
|
||||
|
||||
THREAD_RE = re.compile(r"^/threads/[^/]+\.\d+/?|^/threads/\d+/?")
|
||||
UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124 Safari/537.36"
|
||||
@@ -132,6 +132,7 @@ class _Parser(HTMLParser):
|
||||
self.og_title = ""
|
||||
self.og_image = None
|
||||
self.post_image = None
|
||||
self.cover_image = None
|
||||
self.tags: list[str] = []
|
||||
self.post: list[str] = []
|
||||
self.template = ""
|
||||
@@ -164,10 +165,18 @@ class _Parser(HTMLParser):
|
||||
self._depth += 1
|
||||
if self._skip or {"bbCodeSpoiler", "messageHide"} & set(cls):
|
||||
self._skip += 1
|
||||
elif tag == "img" and "bbImage" in cls and not self._skip and not self.post_image:
|
||||
elif tag == "img" and "bbImage" in cls and not self._skip:
|
||||
for key in ("data-src", "src"):
|
||||
if candidate := image_url(a.get(key) or ""):
|
||||
self.post_image = candidate
|
||||
if not self.post_image:
|
||||
self.post_image = candidate
|
||||
# Prefer a cover/banner explicitly identified in the opening post.
|
||||
# Metadata thumbnails and earlier inline images may be unrelated.
|
||||
name = " ".join((a.get("alt") or "", a.get("title") or "",
|
||||
unquote(urlparse(candidate).path.rsplit("/", 1)[-1])))
|
||||
name = re.sub(r"([a-z])([A-Z])", r"\1_\2", name)
|
||||
if not self.cover_image and re.search(r"(?:^|[^a-z])(?:f95[ _-]*)?(?:cover|banner)(?:[^a-z]|$)", name, re.I):
|
||||
self.cover_image = candidate
|
||||
break
|
||||
elif tag == "br" and not self._skip:
|
||||
self.post.append("\n")
|
||||
@@ -207,7 +216,7 @@ def parse(html: str) -> dict:
|
||||
title = re.sub(r"\s*\[[^\]]*\]", "", title)
|
||||
title = re.sub(r"^(?:[A-Za-z0-9'’ ]{1,20} - )+", "", title).strip()
|
||||
return {"title": title, "description": _description("".join(p.post)),
|
||||
"tags": sorted(set(p.tags)), "image_url": p.og_image or p.post_image,
|
||||
"tags": sorted(set(p.tags)), "image_url": p.cover_image or p.post_image or p.og_image,
|
||||
"logged_in": p.logged_in}
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user