lacuscore 1.15.0__tar.gz → 1.15.2__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: lacuscore
3
- Version: 1.15.0
3
+ Version: 1.15.2
4
4
  Summary: Core of Lacus, usable as a module
5
5
  License: BSD-3-Clause
6
6
  Author: Raphaël Vinot
@@ -27,7 +27,7 @@ Requires-Dist: defang (>=0.5.3)
27
27
  Requires-Dist: dnspython (>=2.7.0)
28
28
  Requires-Dist: eval-type-backport (>=0.2.2) ; python_version < "3.10"
29
29
  Requires-Dist: playwrightcapture[recaptcha] (>=1.30.0)
30
- Requires-Dist: pydantic (>=2.11.4)
30
+ Requires-Dist: pydantic (>=2.11.5)
31
31
  Requires-Dist: redis[hiredis] (>=5.3.0,<6.0.0)
32
32
  Requires-Dist: requests (>=2.32.3)
33
33
  Requires-Dist: typing-extensions (>=4.12.2,<5.0.0) ; python_version < "3.12"
@@ -122,12 +122,12 @@ class CaptureSettings(BaseModel):
122
122
  storage: dict[str, Any] | None = None
123
123
  headers: dict[str, str] | None = None
124
124
  http_credentials: dict[str, str] | None = None
125
- geolocation: dict[str, float] | None = None
125
+ geolocation: dict[str, str | int | float] | None = None
126
126
  timezone_id: str | None = None
127
127
  locale: str | None = None
128
- color_scheme: str | None = None
128
+ color_scheme: Literal['dark', 'light', 'no-preference', 'null'] | None = None
129
129
  java_script_enabled: bool = True
130
- viewport: dict[str, int] | None = None
130
+ viewport: dict[str, str | int] | None = None
131
131
  referer: str | None = None
132
132
  with_screenshot: bool = True
133
133
  with_favicon: bool = True
@@ -137,12 +137,12 @@ class LacusCore():
137
137
  storage: dict[str, Any] | None=None,
138
138
  headers: dict[str, str] | None=None,
139
139
  http_credentials: dict[str, str] | None=None,
140
- geolocation: dict[str, float] | None=None,
140
+ geolocation: dict[str, str | int | float] | None=None,
141
141
  timezone_id: str | None=None,
142
142
  locale: str | None=None,
143
143
  color_scheme: str | None=None,
144
144
  java_script_enabled: bool=True,
145
- viewport: dict[str, int] | None=None,
145
+ viewport: dict[str, int | str] | None=None,
146
146
  referer: str | None=None,
147
147
  rendered_hostname_only: bool=True,
148
148
  with_screenshot: bool=True,
@@ -171,12 +171,12 @@ class LacusCore():
171
171
  storage: dict[str, Any] | None=None,
172
172
  headers: dict[str, str] | None=None,
173
173
  http_credentials: dict[str, str] | None=None,
174
- geolocation: dict[str, float] | None=None,
174
+ geolocation: dict[str, str | int | float] | None=None,
175
175
  timezone_id: str | None=None,
176
176
  locale: str | None=None,
177
177
  color_scheme: str | None=None,
178
178
  java_script_enabled: bool=True,
179
- viewport: dict[str, int] | None=None,
179
+ viewport: dict[str, int | str] | None=None,
180
180
  referer: str | None=None,
181
181
  rendered_hostname_only: bool=True,
182
182
  with_screenshot: bool=True,
@@ -260,6 +260,10 @@ class LacusCore():
260
260
  # Make sure we do not already have a capture with that UUID
261
261
  if self.get_capture_status(uuid) == CaptureStatus.UNKNOWN:
262
262
  perma_uuid = uuid
263
+ elif (self.get_capture_status(uuid) == CaptureStatus.DONE
264
+ and self.get_capture(uuid).get('error') is not None):
265
+ # The UUID exists, the capture is done, but it has an error -> re-capture on the same UUID
266
+ perma_uuid = uuid
263
267
  else:
264
268
  perma_uuid = str(uuid4())
265
269
  self.master_logger.warning(f'UUID {uuid} already exists, forcing a new one: {perma_uuid}.')
@@ -269,7 +273,7 @@ class LacusCore():
269
273
  p = self.redis.pipeline()
270
274
  p.set(f'lacus:query_hash:{hash_query}', perma_uuid, nx=True, ex=recapture_interval)
271
275
  p.hset(f'lacus:capture_settings:{perma_uuid}', mapping=to_enqueue.redis_dump())
272
- p.expire(f'lacus:capture_settings:{perma_uuid}', self.max_capture_time * 2)
276
+ p.expire(f'lacus:capture_settings:{perma_uuid}', self.max_capture_time * 10)
273
277
  p.zadd('lacus:to_capture', {perma_uuid: priority if priority is not None else 0})
274
278
  try:
275
279
  p.execute()
@@ -527,16 +531,16 @@ class LacusCore():
527
531
  headless=to_capture.headless,
528
532
  uuid=uuid) as capture:
529
533
  # required by Mypy: https://github.com/python/mypy/issues/3004
530
- capture.headers = to_capture.headers # type: ignore[assignment]
534
+ capture.headers = to_capture.headers
531
535
  capture.cookies = cookies # type: ignore[assignment]
532
- capture.storage = to_capture.storage # type: ignore[assignment]
533
- capture.viewport = to_capture.viewport # type: ignore[assignment]
534
- capture.user_agent = to_capture.user_agent # type: ignore[assignment]
535
- capture.http_credentials = to_capture.http_credentials # type: ignore[assignment]
536
- capture.geolocation = to_capture.geolocation # type: ignore[assignment]
537
- capture.timezone_id = to_capture.timezone_id # type: ignore[assignment]
538
- capture.locale = to_capture.locale # type: ignore[assignment]
539
- capture.color_scheme = to_capture.color_scheme # type: ignore[assignment]
536
+ capture.storage = to_capture.storage
537
+ capture.viewport = to_capture.viewport
538
+ capture.user_agent = to_capture.user_agent
539
+ capture.http_credentials = to_capture.http_credentials
540
+ capture.geolocation = to_capture.geolocation
541
+ capture.timezone_id = to_capture.timezone_id
542
+ capture.locale = to_capture.locale
543
+ capture.color_scheme = to_capture.color_scheme
540
544
  capture.java_script_enabled = to_capture.java_script_enabled
541
545
 
542
546
  # make sure the initialization doesn't take too long
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "lacuscore"
3
- version = "1.15.0"
3
+ version = "1.15.2"
4
4
  description = "Core of Lacus, usable as a module"
5
5
  authors = [
6
6
  {name="Raphaël Vinot", email="raphael.vinot@circl.lu"}
@@ -21,7 +21,7 @@ dependencies = [
21
21
  "redis[hiredis] (>=5.3.0,<6.0.0)",
22
22
  "dnspython (>=2.7.0)",
23
23
  "async-timeout (>=5.0.1) ; python_version < \"3.11\"",
24
- "pydantic (>=2.11.4)",
24
+ "pydantic (>=2.11.5)",
25
25
  "eval-type-backport (>=0.2.2) ; python_version < \"3.10\"",
26
26
  "typing-extensions (>=4.12.2,<5.0.0) ; python_version < \"3.12\""
27
27
  ]
@@ -47,11 +47,11 @@ classifiers = [
47
47
  docs = ["Sphinx (>=8.2.3) ; python_version >= \"3.11\""]
48
48
 
49
49
  [tool.poetry.group.dev.dependencies]
50
- mypy = "^1.15.0"
50
+ mypy = "^1.16.0"
51
51
  types-redis = {version = "^4.6.0.20241004"}
52
- types-requests = "^2.32.0.20250515"
52
+ types-requests = "^2.32.0.20250602"
53
53
  types-beautifulsoup4 = "^4.12.0.20250516"
54
- pytest = "^8.3.5"
54
+ pytest = "^8.4.0"
55
55
 
56
56
  [build-system]
57
57
  requires = ["poetry-core>=2.0"]
File without changes
File without changes