fix: use yt-dlp meta extractors methods instead of local rolled ones
This commit is contained in:
parent
12eb4de83d
commit
a0b50ac351
2 changed files with 36 additions and 30 deletions
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Reference in a new issue