Skip to content

Commit 188b79c

Browse files
committed
feat: Install browser automatically
1 parent 14fbfef commit 188b79c

2 files changed

Lines changed: 46 additions & 6 deletions

File tree

src/ogpy/client/browser.py

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,27 +6,56 @@
66

77
from __future__ import annotations
88

9-
from typing import TYPE_CHECKING
9+
import logging
10+
import subprocess
11+
from pathlib import Path
12+
from typing import TYPE_CHECKING, Literal
1013

1114
from bs4 import BeautifulSoup
1215
from playwright.sync_api import sync_playwright
1316

1417
from .. import parser, types
1518

1619
if TYPE_CHECKING:
17-
from playwright.sync_api import Browser, Playwright
20+
from playwright.sync_api import Browser, BrowserType, Playwright
1821

22+
logger = logging.getLogger(__name__)
1923

20-
def get_browser(playwright: Playwright, name: str) -> Browser:
21-
if not hasattr(playwright, name):
24+
BrowserName = Literal["chromium", "firefox", "webkit"]
25+
BrowserChannel = Literal[
26+
"chrome",
27+
"msedge",
28+
"chrome-beta",
29+
"msedge-beta",
30+
"chrome-dev",
31+
"msedge-dev",
32+
"chrome-canary",
33+
"msedge-canary",
34+
]
35+
BrowserLabel = BrowserName | BrowserChannel
36+
37+
38+
def get_browser(playwright: Playwright, name: BrowserLabel) -> Browser:
39+
browser_name = "chromium"
40+
browser_channel = None
41+
if name in BrowserName.__args__: # type: ignore[attr-defined]
42+
browser_name = name
43+
elif name in BrowserChannel.__args__: # type: ignore[attr-defined]
44+
browser_channel = name
45+
else:
2246
raise ValueError(f"Browser type '{name}' is not supported.")
23-
return playwright.chromium.launch(channel=name)
47+
48+
# Install browser automatically.
49+
logger.info(f"Now installing browser '{name}' automatically.")
50+
subprocess.run(f"playwright install {name}".split())
51+
52+
return getattr(playwright, browser_name).launch(channel=browser_channel)
2453

2554

2655
def fetch(
2756
url: str,
2857
fuzzy_mode: bool = False,
29-
browser_name: str = "chromium",
58+
browser_name: BrowserLabel = "chromium",
3059
) -> types.Metadata | types.MetadataFuzzy:
3160
"""Fetch and parse HTTP content."""
3261
with sync_playwright() as p:

tests/test_browser.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,3 +51,14 @@ def test_fetch__wait_javascript_challenge():
5151
assert data.title == "sphinx-revealjs"
5252
assert data.type == "website"
5353
assert data.url == "https://pypi.org/project/sphinx-revealjs/"
54+
55+
56+
@pytest.mark.webtest
57+
def test_fetch__with_installing_browser():
58+
"""This case requests IMDB website that is used as example in OGP website."""
59+
data = browser.fetch(
60+
"https://pypi.org/project/sphinx-revealjs", browser_name="firefox"
61+
)
62+
assert data.title == "sphinx-revealjs"
63+
assert data.type == "website"
64+
assert data.url == "https://pypi.org/project/sphinx-revealjs/"

0 commit comments

Comments
 (0)