Commit Graph
210 Commits
Author SHA1 Message Date
renovate[bot] 35023c7d61 chore(deps): update python to ==3.15.* 2026-11-09 05:51:06 +00:00
renovate[bot] c81385f59e chore(deps): lock file maintenance (#451)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-11-09 05:50:12 +00:00
renovate[bot]andThePhaseless 93ffe3ec0f fix(deps): pin dependencies (#446)
* fix(deps): pin dependencies

* fix: stop passing log_level to FastAPI

FastAPI never had a log_level parameter; it went into **extra and was
ignored until 0.162 removed **extra, where it raises TypeError at import.
uvicorn.run already receives the log level.

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: ThePhaseless <kukubaorch@gmail.com>
2026-11-05 16:56:43 +01:00
renovate[bot]andThePhaseless 3e8c09ea39 chore(deps): lock file maintenance (#432)
* chore(deps): lock file maintenance

* fix: fall back to the host timezone when the egress lookup raises

invisible-core 49.46 always looks up the egress IP and raises
GeoTimezoneError when an "auto" lookup fails, instead of returning an
empty zone. Catch it so a failed lookup uses the host timezone again
rather than failing the request, update the explicit-settings test to
the new always-lookup behaviour, and correct the README.

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: ThePhaseless <kukubaorch@gmail.com>
2026-11-04 23:33:51 +01:00
renovate[bot] 3d34b33ff8 chore(deps): update dependency pytest to ==9.2.* (#443)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-28 03:34:30 +00:00
renovate[bot] 6be4b57dd8 chore(deps): update dependency setuptools to v84.1.0 [security] (#442)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-26 13:56:56 +00:00
renovate[bot] 96e49b71a1 chore(deps): update dependency httpx2 to ==2.16.* (#440)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-21 13:56:52 +00:00
renovate[bot] 94ae1e7b9a chore(deps): update dependency httpx2 to ==2.15.* (#438)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-20 23:30:18 +00:00
renovate[bot] 5c3681129d chore(deps): update dependency httpx2 to ==2.14.* (#436)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-18 21:53:19 +00:00
renovate[bot] 405a45b334 fix(deps): update dependency playwright to ==1.64.* (#434)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-14 04:34:40 +00:00
renovate[bot] 4e4e76ffed chore(deps): update dependency ruff to ==0.17.* (#431)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-10 04:58:49 +00:00
Jakub Orchowski e1eaa19166 Merge pull request #427 from ThePhaseless/fix/vendored-playwright-errors
fix: catch invisible_playwright's own error classes
2026-10-09 00:00:33 +02:00
Jakub Orchowski 9246d3a732 Merge pull request #428 from ThePhaseless/fix/per-request-geo-lookup
fix: resolve the browser timezone once per process instead of per request
2026-10-08 23:56:35 +02:00
ThePhaselessandClaude Opus 5.5 804c776a80 refactor: take the host timezone from tzlocal
The fallback zone used after a failed egress lookup came from hand-rolled
TZ and /etc/localtime parsing. That parsing passed values such as
TZ=UTC0, TZ=CET-1CEST,M3.5.0,M10.5.0/3 or TZ=:/usr/share/zoneinfo/... to
the browser unchanged, and Playwright rejects them as an invalid
timezone ID. tzlocal.get_localzone_name() handles those forms and returns
only names it could load, or None. A None result still falls back to UTC.

tzlocal already came in through trafilatura (htmldate -> dateparser).
It is now a direct dependency because Byparr imports it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 23:52:44 +02:00
ThePhaseless 34181005d5 Merge remote-tracking branch 'origin/main' into fix/vendored-playwright-errors
# Conflicts:
#	pyproject.toml
#	uv.lock
2026-10-08 23:42:23 +02:00
renovate[bot] 06b67c498e fix(deps): update dependency fastapi to ==0.143.* (#430)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-08 19:37:48 +00:00
ThePhaselessandClaude Opus 5.5 39bdeedecd fix: catch invisible_playwright's own error classes
invisible_playwright drives Firefox through a vendored copy of Playwright
(invisible_playwright._pw), and its Error/TimeoutError are not subclasses
of playwright.async_api's classes or of the builtin TimeoutError. Every
except and suppress in Byparr named the playwright.async_api classes, so
in production none of them matched:

- a Turnstile widget read that outlasted its 1s timeout escaped the
  suppress() in the solve loop and turned the whole request into a 500
  (the Locator.bounding_box traceback in #419), even with budget left
- an unreachable host was a 500 instead of a 502
- a goto/domcontentloaded timeout was a 500 instead of a 408
- a page that never reaches networkidle was a 500 instead of returning
  the loaded page, and /load returned empty content for it

Nothing in Byparr runs the real playwright package at runtime any more;
it is only used for type hints. So the handlers now import the classes
invisible_playwright re-exports from its public async_api, and nothing
else. That module exports them since 0.15.0, hence the raised floor.

The unit-test fakes raised the playwright.async_api classes too, which
is why the suite stayed green. They now raise the vendored classes, and
a new test covers a widget read timing out mid-solve.

Refs #419

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 23:51:21 +02:00
Jakub Orchowski c6b97e60bb Merge pull request #421 from ThePhaseless/renovate/trafilatura-2.x
fix(deps): update dependency trafilatura to ==2.3.*
2026-10-07 00:18:44 +02:00
renovate[bot] 16b3bd2a9c chore(deps): lock file maintenance 2026-10-06 21:19:36 +00:00
renovate[bot] b87a07439c fix(deps): update dependency trafilatura to ==2.3.* 2026-10-06 21:19:26 +00:00
renovate[bot] 8bcc5e89c4 fix(deps): update dependency fastapi to ==0.142.* (#420)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-30 03:46:54 +00:00
renovate[bot] b46614fb55 fix(deps): update dependency playwright to ==1.63.* (#413)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-16 02:11:38 +00:00
renovate[bot] cdfd73785a chore(deps): update dependency httpx2 to ==2.13.* (#412)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-14 21:29:44 +00:00
renovate[bot] 080b0f9141 chore(deps): update dependency httpx2 to ==2.12.* (#406)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-27 05:27:30 +00:00
renovate[bot] c611afb865 fix(deps): update dependency playwright to ==1.62.* (#369)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-27 01:34:31 +00:00
ThePhaseless 2852dc2527 fix: report an unreachable target as a gateway failure, not a crash
A host that will not resolve arrived as a plain PlaywrightError, which
nothing caught, so Byparr answered 500 and read as its own defect. It is
the upstream that failed, and the failure is usually transient, so 502
also lets clients retry where a 4xx would tell them not to. The timeout
branch stays ahead of it, since PlaywrightTimeoutError subclasses Error.
2026-08-18 12:29:39 +02:00
ThePhaseless aa9a331064 reformat, upgrade and fix timeout 2026-08-15 00:15:50 +02:00
renovate[bot] 07309c8d8e chore(deps): update dependency httpx2 to ==2.10.* (#386)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-09 16:33:10 +00:00
ThePhaseless cb80a0f2a0 Merge remote-tracking branch 'origin/main' into feat/owui-loader-cleanup
# Conflicts:
#	uv.lock
2026-08-08 01:42:54 +02:00
ThePhaseless 23374ce58e chore: migrate tests from httpx to httpx2
Starlette's TestClient deprecates httpx; httpx2 is the maintained
successor (Pydantic stewardship) with a drop-in API.
2026-08-08 01:42:10 +02:00
ThePhaseless 941d5e7350 Revert "chore: migrate tests from httpx to httpx2"
This reverts commit ff70ffc32b.
2026-08-08 01:41:52 +02:00
ThePhaseless ff70ffc32b chore: migrate tests from httpx to httpx2
Starlette's TestClient deprecates httpx; httpx2 is the maintained
successor (Pydantic stewardship) with a drop-in API.
2026-08-08 01:40:12 +02:00
ThePhaseless 0dff659e34 feat: extract articles with trafilatura on /load
Run trafilatura server-side on the rendered DOM (page.content()), so
JS-rendered pages stay fully visible to the extractor; fall back to
innerText when trafilatura cannot score any main content.
2026-08-08 01:26:35 +02:00
renovate[bot] 709a73a5cb fix(deps): update dependency fastapi to ==0.141.* 2026-08-07 21:49:50 +00:00
ThePhaseless e298eb8d3f chore(deps): update invisible-playwright to 0.6.1
Bump the PyPI floor to the latest release (0.6.1), which pins
invisible-core 18.13.0 and drops Windows-only deps (pywin32, tqdm).
2026-08-07 23:49:01 +02:00
renovate[bot] 10be6973da chore(deps): update dependency setuptools to v83 [security] (#378)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-07 23:39:57 +02:00
renovate[bot] c42a353b8a chore(deps): update dependency ruff to ==0.16.* (#377)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-24 02:43:56 +00:00
ThePhaseless 8c3e7a9fe4 refactor: use pydantic-settings for environment configuration
- Add pydantic-settings as direct dependency

- Replace os.getenv calls with typed Settings class

- Add BLOCK_MEDIA and RETURN_ONLY_COOKIES env defaults
2026-07-04 17:42:53 +02:00
ThePhaseless 4800ef7f5f feat: migrate from camoufox to invisible_playwright
- Replace camoufox[geoip] with invisible_playwright git dependency

- Switch playwright-captcha framework from CAMOUFOX to PLAYWRIGHT

- Remove camoufox addon path from consts

- Add git to Docker base image; fetch invisible_playwright binary

- Make /cache writable for runtime USER 1000
2026-07-04 17:34:48 +02:00
ThePhaseless 10aa77fb00 fix: revert to camoufox 0.4.*, pin playwright==1.60.*
cloverlabs-camoufox 0.6.0 was a confirmed regression (3/6 tests failed
with 'Cloudflare iframes not found' vs 6/6 passing on camoufox 0.4.11).
Revert to camoufox[geoip]==0.4.* and pin playwright==1.60.* (exact pin
to avoid the 1.61 protocol error).
2026-07-04 16:14:37 +02:00
ThePhaseless b177dc6ad4 feat: migrate to cloverlabs-camoufox, pin playwright<1.61, add tini as PID 1
- Migrate from daijro/camoufox==0.4.* to cloverlabs-camoufox==0.6.*
  (drop-in API: same import path, same kwargs)
- Pin playwright>=1.58,<1.61 to prevent protocol error
  (Browser.setDefaultViewport viewport.isMobile incompatibility with
  camoufox bundled Firefox v135.0.1-beta.24; upstream daijro/camoufox#653)
- Bump fastapi 0.136->0.139, pytest 9.0->9.1, pytest-asyncio 1.3->1.4
  (absorbs Renovate PRs #360, #359, #357)
- Remove dead deptry DEP002 pyautogui ignore (cloverlabs dropped pyautogui)
- Add tini to Dockerfile base image and set as ENTRYPOINT PID 1
  (fixes zombie/defunct Firefox subprocesses: [Socket Process],
  [RDD Process], [Utility Process] — verified: 21 zombies without tini,
  0 zombies with tini after 5 POST /v1 requests)
- Remove init: true from compose.yaml (tini makes it redundant)
- Remove --init/init: true checkbox from bug report template

Closes #339, #340, #360, #359, #357, #366
2026-07-04 15:18:21 +02:00
renovate[bot] ce6b4e84d6 chore(deps): update dependency pytest to v9.0.3 [security] (#342)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-17 01:17:49 +00:00
renovate[bot] 680c5cd709 fix(deps): update dependency fastapi to ==0.136.* (#343)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-16 23:32:34 +00:00
renovate[bot] 1064addf5e chore(deps): update dependency deptry to ==0.25.* (#335)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-03-19 04:58:07 +00:00
renovate[bot] 818b54848c fix(deps): update dependency fastapi to ==0.135.* (#324)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-03-02 02:15:47 +00:00
renovate[bot] 740efc573e fix(deps): update dependency fastapi to ==0.134.* (#323)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-02-28 01:00:34 +00:00
renovate[bot] 1a18bbfe1a fix(deps): update dependency fastapi to ==0.133.* (#321)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-02-24 19:11:48 +00:00
renovate[bot] 1826610937 fix(deps): update dependency fastapi to ==0.132.* (#320)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-02-24 02:09:13 +00:00
renovate[bot] 27ee7c2fb8 fix(deps): update dependency fastapi to ==0.131.* (#319)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-02-22 20:57:33 +00:00
renovate[bot] 8575316da6 fix(deps): update dependency fastapi to ==0.129.* (#317)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-02-12 22:24:32 +00:00