fix: use yt-dlp meta extractors methods instead of local rolled ones

This commit is contained in:
arabcoders 2026-05-08 21:39:12 +03:00
parent 12eb4de83d
commit a0b50ac351
2 changed files with 36 additions and 30 deletions

View file

@ -184,6 +184,38 @@ def test_log_non_html(monkeypatch: pytest.MonkeyPatch) -> None:
ie.write_debug.assert_any_call("plain text body")
def test_html_meta(monkeypatch: pytest.MonkeyPatch) -> None:
ie = _make_ie()
monkeypatch.setenv("YTP_BROWSER_URL", "playwright+ws://browser")
ie._looks_like_html = lambda webpage: True
ie._generic_title = generic_browser.GenericIE._generic_title.__get__(ie, generic_browser.GenericBrowserIE)
session = Mock()
session.content.return_value = (
'<html><head><meta property="og:title" content="OG Title">'
'<meta name="description" content="Meta Desc">'
'<meta property="og:image" content="https://img.example/thumb.jpg">'
"</head><body><title>Page Title</title></body></html>"
)
session.get_requests.return_value = []
session.get_media_requests.return_value = []
class FakeDriver:
__name__ = "FakeDriver"
@staticmethod
def connect(ws_url: str, timeout: int | None = None):
return session
monkeypatch.setattr(generic_browser.GenericBrowserIE, "_select_driver", lambda self, ws_url: FakeDriver)
result = ie._real_extract("https://example.com/watch")
assert result["title"] == "OG Title"
assert result["description"] == "Meta Desc"
assert result["thumbnail"] == "https://img.example/thumb.jpg"
def test_no_media() -> None:
ie = _make_ie()
ie.__wrapped__ = Mock()

View file

@ -542,8 +542,10 @@ class GenericBrowserIE(GenericIE, plugin_name="browser"):
}
if webpage and self._looks_like_html(webpage):
info_dict["title"] = self._get_title(webpage) or self._generic_title(url, webpage)
info_dict["description"] = self._get_desc(webpage)
info_dict["title"] = self._generic_title(url, webpage)
info_dict["description"] = self._og_search_description(webpage, default=None) or self._html_search_meta(
"description", webpage, default=None
)
thumbnail = self._og_search_thumbnail(webpage, default=None)
if thumbnail:
info_dict["thumbnail"] = thumbnail
@ -776,34 +778,6 @@ class GenericBrowserIE(GenericIE, plugin_name="browser"):
)
)
def _get_title(self, webpage: str) -> str | None:
return self._extract_from_html(
webpage,
[
r"<title>([^<]+)</title>",
r'<meta[^>]+property=["\']og:title["\'][^>]+content=["\']([^"\']+)["\']',
r'<meta[^>]+name=["\']title["\'][^>]+content=["\']([^"\']+)["\']',
r"<h1[^>]*>([^<]+)</h1>",
],
)
def _get_desc(self, webpage: str) -> str | None:
return self._extract_from_html(
webpage,
[
r'<meta[^>]+property=["\']og:description["\'][^>]+content=["\']([^"\']+)["\']',
r'<meta[^>]+name=["\']description["\'][^>]+content=["\']([^"\']+)["\']',
r'<p[^>]*class=["\']description["\'][^>]*>([^<]+)</p>',
],
)
def _extract_from_html(self, webpage: str, patterns: list[str]) -> str | None:
for pattern in patterns:
match = re.search(pattern, webpage, re.IGNORECASE)
if match and match.group(1):
return match.group(1).strip()
return None
def _get_timeout_ms(self) -> int | None:
socket_timeout = self._downloader.params.get("socket_timeout")
if isinstance(socket_timeout, (int, float)) and socket_timeout > 0: