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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: PlaywrightCapture
3
- Version: 1.27.9
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.12)
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.50.0)
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 (>=75.8.0)
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
- playwright = sync_playwright().start()
26
- devices: dict[str, PlaywrightDevice] = playwright.devices
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.27.9"
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.50.0)",
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 (>=75.8.0)",
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.12)",
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.4"
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.20250204"
52
+ types-pytz = "^2025.1.0.20250318"
53
53
 
54
54
 
55
55
  [build-system]