diff --git a/app/tests/test_generic_browser.py b/app/tests/test_generic_browser.py
index 94244818..0ef657e8 100644
--- a/app/tests/test_generic_browser.py
+++ b/app/tests/test_generic_browser.py
@@ -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 = (
+ '
'
+ ''
+ ''
+ "Page Title"
+ )
+ 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()
diff --git a/app/yt_dlp_plugins/extractor/generic_browser.py b/app/yt_dlp_plugins/extractor/generic_browser.py
index 5d39e2c3..b67e00e7 100644
--- a/app/yt_dlp_plugins/extractor/generic_browser.py
+++ b/app/yt_dlp_plugins/extractor/generic_browser.py
@@ -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"([^<]+)",
- r']+property=["\']og:title["\'][^>]+content=["\']([^"\']+)["\']',
- r']+name=["\']title["\'][^>]+content=["\']([^"\']+)["\']',
- r"]*>([^<]+)
",
- ],
- )
-
- def _get_desc(self, webpage: str) -> str | None:
- return self._extract_from_html(
- webpage,
- [
- r']+property=["\']og:description["\'][^>]+content=["\']([^"\']+)["\']',
- r']+name=["\']description["\'][^>]+content=["\']([^"\']+)["\']',
- r']*class=["\']description["\'][^>]*>([^<]+)
',
- ],
- )
-
- 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: