Skip to content

Commit 370c96e

Browse files
authored
chore: Optional pillow requirement (#135)
* Optional pillow requirement * Regen poetry lock files & add documentation * Pass logger in EcoindexScraper class
1 parent 07f971a commit 370c96e

10 files changed

Lines changed: 334 additions & 299 deletions

File tree

components/ecoindex/scraper/helper.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,13 @@ def run_page_analysis(
2020
wait_after_scroll=wait_after_scroll,
2121
wait_before_scroll=wait_before_scroll,
2222
page_load_timeout=20,
23+
logger=logger,
2324
)
2425
try:
2526
return (run(scraper.get_page_analysis()), True)
2627
except Exception as e:
27-
logger.error(f"{url} -- {e.msg if hasattr(e, 'msg') else e}")
28+
if logger:
29+
logger.error(f"{url} -- {e.msg if hasattr(e, 'msg') else e}")
2830

2931
return (
3032
Result(

components/ecoindex/scraper/scrap.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ def __init__(
3232
basic_auth: str | None = None,
3333
cookies: list[SetCookieParam] = [],
3434
custom_headers: dict[str, str] = {},
35+
logger=None,
3536
):
3637
self.url = url
3738
self.window_size = window_size
@@ -50,6 +51,7 @@ def __init__(
5051
self.basic_auth = basic_auth
5152
self.cookies = cookies
5253
self.custom_headers = custom_headers
54+
self.logger = logger
5355

5456
@staticmethod
5557
def get_user_agent() -> UserAgent:
@@ -129,7 +131,13 @@ async def scrap_page(self) -> PageMetrics:
129131
async def generate_screenshot(self) -> None:
130132
if self.screenshot and self.screenshot.folder and self.screenshot.id:
131133
await self.page.screenshot(path=self.screenshot.get_png())
132-
await convert_screenshot_to_webp(self.screenshot)
134+
try:
135+
await convert_screenshot_to_webp(self.screenshot)
136+
except ImportError:
137+
if self.logger:
138+
self.logger.warning(
139+
"WebP conversion skipped: Pillow library is not installed."
140+
)
133141
await set_screenshot_rights(
134142
screenshot=self.screenshot,
135143
uid=self.screenshot_uid,
@@ -191,8 +199,7 @@ async def check_page_response(self, response) -> None:
191199
{
192200
"mimetype": content_type,
193201
"message": (
194-
"This resource is not "
195-
"a standard page with mimeType 'text/html'"
202+
"This resource is not a standard page with mimeType 'text/html'"
196203
),
197204
}
198205
)

components/ecoindex/utils/screenshots.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,18 @@
11
import os
22

33
from ecoindex.models import ScreenShot
4-
from PIL import Image
4+
5+
try:
6+
from PIL import Image
7+
8+
_pillow_available = True
9+
except ImportError:
10+
_pillow_available = False
511

612

713
async def convert_screenshot_to_webp(screenshot: ScreenShot) -> None:
14+
if not _pillow_available:
15+
raise ImportError("Pillow is required for WebP conversion. Install it with: pip install ecoindex-scraper[webp]")
816
image = Image.open(rf"{screenshot.get_png()}")
917
width, height = image.size
1018
ratio = 800 / height if width > height else 600 / width
@@ -17,7 +25,9 @@ async def convert_screenshot_to_webp(screenshot: ScreenShot) -> None:
1725

1826

1927
async def set_screenshot_rights(
20-
screenshot: ScreenShot, uid: int | None = None, gid: int | None = None
28+
screenshot: ScreenShot,
29+
uid: int | None = None,
30+
gid: int | None = None,
2131
) -> None:
2232
if uid and gid:
2333
os.chown(path=screenshot.get_webp(), uid=uid, gid=gid)

poetry.lock

Lines changed: 97 additions & 97 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

projects/ecoindex_api/poetry.lock

Lines changed: 96 additions & 95 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

projects/ecoindex_api/pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ aiofile = "^3.8.8"
2727
alembic = "^1.12.1"
2828
celery = "^5.3.4"
2929
fastapi = "^0.109.1"
30-
pillow = "^12.0.0"
30+
pillow = { version = "^12.2.0", optional = true }
3131
playwright = "^1.39.0"
3232
playwright-stealth = "^1.0.6"
3333
pydantic = { version = ">=2.1.1,<=2.4.2", extras = ["email"] }
@@ -46,7 +46,7 @@ ua-generator = "^2.0.5"
4646
uvicorn = "^0.23.2"
4747

4848
[tool.poetry.group.worker.dependencies]
49-
pillow = "^12.0.0"
49+
pillow = { version = "^12.2.0", optional = true }
5050
playwright = "^1.39.0"
5151
playwright-stealth = "^1.0.6"
5252

projects/ecoindex_scraper/README.md

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,13 @@ This module provides a simple interface to get the [Ecoindex](http://www.ecoinde
1414
## Install
1515

1616
```shell
17-
pip install ecoindex-scraper
17+
pip install ecoindex_scraper
18+
```
19+
20+
If you need to convert the screenshot to webp with the `generate_screenshot` method, you need to install the Pillow dependency.
21+
22+
```shell
23+
pip install ecoindex_scraper[webp] # OR directly pillow
1824
```
1925

2026
## Use
@@ -171,4 +177,4 @@ pprint(requests_by_category.model_dump())
171177
# 'javascript': {'total_count': 1, 'total_size': 9823.0},
172178
# 'other': {'total_count': 1, 'total_size': 892.0},
173179
# 'video': {'total_count': 0, 'total_size': 0.0}}
174-
```
180+
```

projects/ecoindex_scraper/poetry.lock

Lines changed: 99 additions & 95 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

projects/ecoindex_scraper/pyproject.toml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,13 @@ pydantic = "^2.4.2"
2424
python = "^3.10"
2525
typing-extensions = "^4.8.0"
2626
pyyaml = "^6.0.1"
27-
pillow = ">=10.1,<13.0"
27+
pillow = { version = "^12.2.0", optional = true }
2828
setuptools = ">=69.5.1,<79.0.0"
2929
ua-generator = "^2.0.5"
3030

31+
[tool.poetry.extras]
32+
webp = ["pillow"]
33+
3134
[build-system]
3235
requires = ["poetry-core>=1.0.0"]
3336
build-backend = "poetry.core.masonry.api"

pyproject.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,12 @@ setuptools = "^78.1.1"
3636
cryptography = "^44.0.2"
3737

3838
[tool.poetry.group.scraper.dependencies]
39-
pillow = "^12.0.0"
4039
playwright = "^1.39.0"
4140
playwright-stealth = "^1.0.6"
4241

42+
[tool.poetry.group.scraper-webp.dependencies]
43+
pillow = { version = "^12.2.0", optional = true }
44+
4345
[tool.poetry.group.cli.dependencies]
4446
click-spinner = "^0.1.10"
4547
jinja2 = "^3.1.3"

0 commit comments

Comments
 (0)