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: