PlaywrightCapture 1.27.9__tar.gz → 1.28.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {playwrightcapture-1.27.9 → playwrightcapture-1.28.1}/PKG-INFO +4 -4
- {playwrightcapture-1.27.9 → playwrightcapture-1.28.1}/playwrightcapture/capture.py +17 -1
- {playwrightcapture-1.27.9 → playwrightcapture-1.28.1}/playwrightcapture/helpers.py +2 -3
- {playwrightcapture-1.27.9 → playwrightcapture-1.28.1}/pyproject.toml +6 -6
- {playwrightcapture-1.27.9 → playwrightcapture-1.28.1}/LICENSE +0 -0
- {playwrightcapture-1.27.9 → playwrightcapture-1.28.1}/README.md +0 -0
- {playwrightcapture-1.27.9 → playwrightcapture-1.28.1}/playwrightcapture/__init__.py +0 -0
- {playwrightcapture-1.27.9 → playwrightcapture-1.28.1}/playwrightcapture/exceptions.py +0 -0
- {playwrightcapture-1.27.9 → playwrightcapture-1.28.1}/playwrightcapture/py.typed +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: PlaywrightCapture
|
3
|
-
Version: 1.
|
3
|
+
Version: 1.28.1
|
4
4
|
Summary: A simple library to capture websites using playwright
|
5
5
|
License: BSD-3-Clause
|
6
6
|
Author: Raphaël Vinot
|
@@ -20,15 +20,15 @@ Classifier: Topic :: Security
|
|
20
20
|
Provides-Extra: recaptcha
|
21
21
|
Requires-Dist: SpeechRecognition (>=3.14.1) ; extra == "recaptcha"
|
22
22
|
Requires-Dist: aiohttp-socks (>=0.10.1)
|
23
|
-
Requires-Dist: aiohttp[speedups] (>=3.11.
|
23
|
+
Requires-Dist: aiohttp[speedups] (>=3.11.14)
|
24
24
|
Requires-Dist: async-timeout (>=5.0.1) ; python_version < "3.11"
|
25
25
|
Requires-Dist: beautifulsoup4[charset-normalizer,lxml] (>=4.13.3)
|
26
26
|
Requires-Dist: dateparser (>=1.2.1)
|
27
|
-
Requires-Dist: playwright (>=1.
|
27
|
+
Requires-Dist: playwright (>=1.51.0)
|
28
28
|
Requires-Dist: playwright-stealth (>=1.0.6)
|
29
29
|
Requires-Dist: puremagic (>=1.28)
|
30
30
|
Requires-Dist: pydub (>=0.25.1) ; extra == "recaptcha"
|
31
|
-
Requires-Dist: setuptools (>=
|
31
|
+
Requires-Dist: setuptools (>=77.0.1)
|
32
32
|
Requires-Dist: tzdata (>=2025.1)
|
33
33
|
Requires-Dist: w3lib (>=2.3.1)
|
34
34
|
Project-URL: Issues, https://github.com/Lookyloo/PlaywrightCapture/issues
|
@@ -50,7 +50,7 @@ if TYPE_CHECKING:
|
|
50
50
|
from playwright._impl._api_structures import (SetCookieParam, Geolocation,
|
51
51
|
HttpCredentials, Headers,
|
52
52
|
ViewportSize, Cookie,
|
53
|
-
ProxySettings)
|
53
|
+
ProxySettings, StorageState)
|
54
54
|
BROWSER = Literal['chromium', 'firefox', 'webkit']
|
55
55
|
|
56
56
|
try:
|
@@ -66,6 +66,7 @@ class CaptureResponse(TypedDict, total=False):
|
|
66
66
|
last_redirected_url: str
|
67
67
|
har: dict[str, Any] | None
|
68
68
|
cookies: list[Cookie] | None
|
69
|
+
storage: StorageState | None
|
69
70
|
error: str | None
|
70
71
|
error_name: str | None
|
71
72
|
html: str | None
|
@@ -186,6 +187,7 @@ class Capture():
|
|
186
187
|
self.should_retry: bool = False
|
187
188
|
self.__network_not_idle: int = 2 # makes sure we do not wait for network idle the max amount of time the capture is allowed to take
|
188
189
|
self._cookies: list[SetCookieParam] = []
|
190
|
+
self._storage: StorageState = {}
|
189
191
|
self._http_credentials: HttpCredentials = {}
|
190
192
|
self._geolocation: Geolocation = {}
|
191
193
|
self._headers: Headers = {}
|
@@ -358,6 +360,18 @@ class Capture():
|
|
358
360
|
path = cookie.get("path")
|
359
361
|
self.logger.warning(f'The cookie must have a URL ({url}) or a domain ({domain}) and a path ({path})')
|
360
362
|
|
363
|
+
@property
|
364
|
+
def storage(self) -> StorageState:
|
365
|
+
return self._storage
|
366
|
+
|
367
|
+
@storage.setter
|
368
|
+
def storage(self, storage: dict[str, Any] | None) -> None:
|
369
|
+
if not storage:
|
370
|
+
return
|
371
|
+
if 'cookies' in storage and 'origins' in storage:
|
372
|
+
self._storage['cookies'] = storage['cookies']
|
373
|
+
self._storage['origins'] = storage['origins']
|
374
|
+
|
361
375
|
@property
|
362
376
|
def headers(self) -> Headers:
|
363
377
|
return self._headers
|
@@ -458,6 +472,7 @@ class Capture():
|
|
458
472
|
timezone_id=self.timezone_id if self.timezone_id else None,
|
459
473
|
color_scheme=self.color_scheme if self.color_scheme else None,
|
460
474
|
viewport=vp,
|
475
|
+
storage_state=self.storage if self.storage else None,
|
461
476
|
# For debug only
|
462
477
|
# record_video_dir='./videos/',
|
463
478
|
**device_context_settings
|
@@ -1177,6 +1192,7 @@ class Capture():
|
|
1177
1192
|
self.logger.debug('Finishing up capture.')
|
1178
1193
|
if not capturing_sub:
|
1179
1194
|
try:
|
1195
|
+
to_return['storage'] = await self.context.storage_state(indexed_db=True)
|
1180
1196
|
to_return['cookies'] = await self.context.cookies()
|
1181
1197
|
self.logger.debug('Done with cookies.')
|
1182
1198
|
except Exception as e:
|
@@ -22,9 +22,8 @@ class PlaywrightDevice(TypedDict):
|
|
22
22
|
|
23
23
|
def get_devices(in_testsuite: bool=False) -> dict[str, dict[str, dict[str, PlaywrightDevice]]]:
|
24
24
|
to_return: dict[str, dict[str, dict[str, PlaywrightDevice]]] = {'desktop': defaultdict(dict), 'mobile': defaultdict(dict)}
|
25
|
-
|
26
|
-
|
27
|
-
playwright.stop()
|
25
|
+
with sync_playwright() as playwright:
|
26
|
+
devices: dict[str, PlaywrightDevice] = playwright.devices
|
28
27
|
for device_name, settings in devices.items():
|
29
28
|
splitted_name = device_name.split(' ')
|
30
29
|
if splitted_name[0] == 'Desktop':
|
@@ -1,6 +1,6 @@
|
|
1
1
|
[project]
|
2
2
|
name = "PlaywrightCapture"
|
3
|
-
version = "1.
|
3
|
+
version = "1.28.1"
|
4
4
|
description = "A simple library to capture websites using playwright"
|
5
5
|
authors = [
|
6
6
|
{name="Raphaël Vinot", email= "raphael.vinot@circl.lu"}
|
@@ -12,16 +12,16 @@ requires-python = ">=3.9"
|
|
12
12
|
dynamic = [ "classifiers" ]
|
13
13
|
|
14
14
|
dependencies = [
|
15
|
-
"playwright (>=1.
|
15
|
+
"playwright (>=1.51.0)",
|
16
16
|
"dateparser (>=1.2.1)",
|
17
17
|
"beautifulsoup4[charset-normalizer,lxml] (>=4.13.3)",
|
18
18
|
"w3lib (>=2.3.1)",
|
19
19
|
"tzdata (>=2025.1)",
|
20
20
|
"playwright-stealth (>=1.0.6)",
|
21
|
-
"setuptools (>=
|
21
|
+
"setuptools (>=77.0.1)",
|
22
22
|
"puremagic (>=1.28)",
|
23
23
|
"async-timeout (>=5.0.1) ; python_version < \"3.11\"",
|
24
|
-
"aiohttp[speedups] (>=3.11.
|
24
|
+
"aiohttp[speedups] (>=3.11.14)",
|
25
25
|
"aiohttp-socks (>=0.10.1)"
|
26
26
|
]
|
27
27
|
|
@@ -46,10 +46,10 @@ recaptcha = [
|
|
46
46
|
|
47
47
|
[tool.poetry.group.dev.dependencies]
|
48
48
|
types-beautifulsoup4 = "^4.12.0.20250204"
|
49
|
-
pytest = "^8.3.
|
49
|
+
pytest = "^8.3.5"
|
50
50
|
mypy = "^1.15.0"
|
51
51
|
types-dateparser = "^1.2.0.20250208"
|
52
|
-
types-pytz = "^2025.1.0.
|
52
|
+
types-pytz = "^2025.1.0.20250318"
|
53
53
|
|
54
54
|
|
55
55
|
[build-system]
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|