daijro
cd83f7fd2f
Bump python library to 0.5.5
2026-08-12 06:26:10 -05:00
daijro
479453d4e1
Bump pythonlib to 0.5.4
2026-07-16 17:01:21 -05:00
daijro
022b7f1f8e
Bump pythonlib to 0.5.3
2026-07-15 07:59:40 -05:00
daijro
195298d004
Temporarily cap Playwright dependency #653
...
Restrict playwright version to less than 1.61
2026-07-03 09:01:34 -05:00
daijro
3911d11dbd
Support for releases with the same version and build v0.5.2
...
Fix for JWriter20 repo having several releases with the same version and build name, which broke the manager
- Installs browsers as version-build-sha256/ rather than version-build/ since assets can share a version-build combo
- Doesn't break existing downloads
- Show date column in gui and selector tui
2026-06-23 07:24:40 -05:00
daijro
fdaffc03e9
Bump pythonlib to 0.5.1
2026-06-08 07:18:05 -05:00
daijro
61a9e1f9bb
Update browserforge (remove manual model downloading)
2026-02-07 03:14:41 -06:00
daijro
e0e2eeb2f3
Add version manager in python library
2026-02-07 02:47:01 -06:00
Julien Duponchelle
df51462c43
Set minimum Python to 3.10 to solve Python 3.14 compatibility
...
When installing package using Poetry on Python 3.14 we have compilation
errors:
```
copying src/greenlet/platform/setup_switch_x64_masm.cmd -> build/lib.linux-x86_64-cpython-314/greenlet/platform
| copying src/greenlet/platform/switch_aarch64_gcc.h -> build/lib.linux-x86_64-cpython-314/greenlet/platform
| copying src/greenlet/platform/switch_alpha_unix.h -> build/lib.linux-x86_64-cpython-314/greenlet/platform
| copying src/greenlet/platform/switch_amd64_unix.h -> build/lib.linux-x86_64-cpython-314/greenlet/platform
| copying src/greenlet/platform/switch_arm32_gcc.h -> build/lib.linux-x86_64-cpython-314/greenlet/platform
| copying src/greenlet/platform/switch_arm32_ios.h -> build/lib.linux-x86_64-cpython-314/greenlet/platform
| copying src/greenlet/platform/switch_arm64_masm.asm -> build/lib.linux-x86_64-cpython-314/greenlet/platform
| copying src/greenlet/platform/switch_arm64_masm.obj -> build/lib.linux-x86_64-cpython-314/greenlet/platform
| copying src/greenlet/platform/switch_arm64_msvc.h -> build/lib.linux-x86_64-cpython-314/greenlet/platform
| copying src/greenlet/platform/switch_csky_gcc.h -> build/lib.linux-x86_64-cpython-314/greenlet/platform
| copying src/greenlet/platform/switch_loongarch64_linux.h -> build/lib.linux-x86_64-cpython-314/greenlet/platform
| copying src/greenlet/platform/switch_m68k_gcc.h -> build/lib.linux-x86_64-cpython-314/greenlet/platform
| copying src/greenlet/platform/switch_mips_unix.h -> build/lib.linux-x86_64-cpython-314/greenlet/platform
| copying src/greenlet/platform/switch_ppc64_aix.h -> build/lib.linux-x86_64-cpython-314/greenlet/platform
| copying src/greenlet/platform/switch_ppc64_linux.h -> build/lib.linux-x86_64-cpython-314/greenlet/platform
| copying src/greenlet/platform/switch_ppc_aix.h -> build/lib.linux-x86_64-cpython-314/greenlet/platform
| copying src/greenlet/platform/switch_ppc_linux.h -> build/lib.linux-x86_64-cpython-314/greenlet/platform
| copying src/greenlet/platform/switch_ppc_macosx.h -> build/lib.linux-x86_64-cpython-314/greenlet/platform
| copying src/greenlet/platform/switch_ppc_unix.h -> build/lib.linux-x86_64-cpython-314/greenlet/platform
| copying src/greenlet/platform/switch_riscv_unix.h -> build/lib.linux-x86_64-cpython-314/greenlet/platform
| copying src/greenlet/platform/switch_s390_unix.h -> build/lib.linux-x86_64-cpython-314/greenlet/platform
| copying src/greenlet/platform/switch_sh_gcc.h -> build/lib.linux-x86_64-cpython-314/greenlet/platform
| copying src/greenlet/platform/switch_sparc_sun_gcc.h -> build/lib.linux-x86_64-cpython-314/greenlet/platform
| copying src/greenlet/platform/switch_x32_unix.h -> build/lib.linux-x86_64-cpython-314/greenlet/platform
| copying src/greenlet/platform/switch_x64_masm.asm -> build/lib.linux-x86_64-cpython-314/greenlet/platform
| copying src/greenlet/platform/switch_x64_masm.obj -> build/lib.linux-x86_64-cpython-314/greenlet/platform
| copying src/greenlet/platform/switch_x64_msvc.h -> build/lib.linux-x86_64-cpython-314/greenlet/platform
| copying src/greenlet/platform/switch_x86_msvc.h -> build/lib.linux-x86_64-cpython-314/greenlet/platform
| copying src/greenlet/platform/switch_x86_unix.h -> build/lib.linux-x86_64-cpython-314/greenlet/platform
| copying src/greenlet/tests/_test_extension.c -> build/lib.linux-x86_64-cpython-314/greenlet/tests
| copying src/greenlet/tests/_test_extension_cpp.cpp -> build/lib.linux-x86_64-cpython-314/greenlet/tests
| running build_ext
| building 'greenlet._greenlet' extension
| creating build/temp.linux-x86_64-cpython-314/src/greenlet
| c++ -pthread -fno-strict-overflow -Wsign-compare -Wunreachable-code -DNDEBUG -g -O3 -Wall -O3 -fPIC -fPIC -I/tmp/tmp55zvtgm3/.venv/include -I/home/jduponchelle/.local/share/uv/python/cpython-3.14.2-linux-x86_64-gnu/include/python3.14 -c src/greenlet/greenlet.cpp -o build/temp.linux-x86_64-cpython-314/src/greenlet/greenlet.o
| In file included from src/greenlet/greenlet.cpp:31:
| src/greenlet/TGreenlet.cpp: In member function ‘void greenlet::Greenlet::expose_frames()’:
| src/greenlet/TGreenlet.cpp:626:29: error: aggregate ‘_PyInterpreterFrame iframe_copy’ has incomplete type and cannot be defined
| 626 | _PyInterpreterFrame iframe_copy;
| | ^~~~~~~~~~~
| src/greenlet/TGreenlet.cpp:627:65: error: invalid application of ‘sizeof’ to incomplete type ‘_PyInterpreterFrame’
| 627 | this->stack_state.copy_from_stack(&iframe_copy, iframe, sizeof(*iframe));
| | ^~~~~~~~~~~~~~~
| src/greenlet/TGreenlet.cpp:628:14: error: ‘_PyFrame_IsIncomplete’ was not declared in this scope
| 628 | if (!_PyFrame_IsIncomplete(&iframe_copy)) {
| | ^~~~~~~~~~~~~~~~~~~~~
| src/greenlet/TGreenlet.cpp:654:24: error: invalid use of incomplete type ‘_PyInterpreterFrame’ {aka ‘struct _PyInterpreterFrame’}
| 654 | if (!iframe->frame_obj) {
| | ^~
| In file included from /home/jduponchelle/.local/share/uv/python/cpython-3.14.2-linux-x86_64-gnu/include/python3.14/pyframe.h:19,
| from /home/jduponchelle/.local/share/uv/python/cpython-3.14.2-linux-x86_64-gnu/include/python3.14/Python.h:113,
| from src/greenlet/greenlet.cpp:16:
| /home/jduponchelle/.local/share/uv/python/cpython-3.14.2-linux-x86_64-gnu/include/python3.14/cpython/pyframe.h:25:8: note: forward declaration of ‘_PyInterpreterFrame’ {aka ‘struct _PyInterpreterFrame’}
| 25 | struct _PyInterpreterFrame;
| | ^~~~~~~~~~~~~~~~~~~
| src/greenlet/TGreenlet.cpp:656:37: error: aggregate ‘_PyInterpreterFrame dummy_iframe’ has incomplete type and cannot be defined
| 656 | _PyInterpreterFrame dummy_iframe;
| | ^~~~~~~~~~~~
| src/greenlet/TGreenlet.cpp:661:38: error: ‘FRAME_OWNED_BY_GENERATOR’ was not declared in this scope
| 661 | dummy_iframe.owner = FRAME_OWNED_BY_GENERATOR;
| | ^~~~~~~~~~~~~~~~~~~~~~~~
| src/greenlet/TGreenlet.cpp:686:45: error: invalid use of incomplete type ‘_PyInterpreterFrame’ {aka ‘struct _PyInterpreterFrame’}
| 686 | memcpy(&last_complete_iframe->frame_obj->_f_frame_data[0],
| | ^~
| /home/jduponchelle/.local/share/uv/python/cpython-3.14.2-linux-x86_64-gnu/include/python3.14/cpython/pyframe.h:25:8: note: forward declaration of ‘_PyInterpreterFrame’ {aka ‘struct _PyInterpreterFrame’}
| 25 | struct _PyInterpreterFrame;
| | ^~~~~~~~~~~~~~~~~~~
| src/greenlet/TGreenlet.cpp:687:45: error: invalid use of incomplete type ‘_PyInterpreterFrame’ {aka ‘struct _PyInterpreterFrame’}
| 687 | &last_complete_iframe->previous, sizeof(void *));
| | ^~
| /home/jduponchelle/.local/share/uv/python/cpython-3.14.2-linux-x86_64-gnu/include/python3.14/cpython/pyframe.h:25:8: note: forward declaration of ‘_PyInterpreterFrame’ {aka ‘struct _PyInterpreterFrame’}
| 25 | struct _PyInterpreterFrame;
| | ^~~~~~~~~~~~~~~~~~~
| src/greenlet/TGreenlet.cpp:688:37: error: invalid use of incomplete type ‘_PyInterpreterFrame’ {aka ‘struct _PyInterpreterFrame’}
| 688 | last_complete_iframe->previous = iframe;
| | ^~
| /home/jduponchelle/.local/share/uv/python/cpython-3.14.2-linux-x86_64-gnu/include/python3.14/cpython/pyframe.h:25:8: note: forward declaration of ‘_PyInterpreterFrame’ {aka ‘struct _PyInterpreterFrame’}
| 25 | struct _PyInterpreterFrame;
| | ^~~~~~~~~~~~~~~~~~~
| src/greenlet/TGreenlet.cpp:705:37: error: invalid use of incomplete type ‘_PyInterpreterFrame’ {aka ‘struct _PyInterpreterFrame’}
| 705 | memcpy(&last_complete_iframe->frame_obj->_f_frame_data[0],
| | ^~
| /home/jduponchelle/.local/share/uv/python/cpython-3.14.2-linux-x86_64-gnu/include/python3.14/cpython/pyframe.h:25:8: note: forward declaration of ‘_PyInterpreterFrame’ {aka ‘struct _PyInterpreterFrame’}
| 25 | struct _PyInterpreterFrame;
| | ^~~~~~~~~~~~~~~~~~~
| src/greenlet/TGreenlet.cpp:706:37: error: invalid use of incomplete type ‘_PyInterpreterFrame’ {aka ‘struct _PyInterpreterFrame’}
| 706 | &last_complete_iframe->previous, sizeof(void *));
| | ^~
| /home/jduponchelle/.local/share/uv/python/cpython-3.14.2-linux-x86_64-gnu/include/python3.14/cpython/pyframe.h:25:8: note: forward declaration of ‘_PyInterpreterFrame’ {aka ‘struct _PyInterpreterFrame’}
| 25 | struct _PyInterpreterFrame;
| | ^~~~~~~~~~~~~~~~~~~
| src/greenlet/TGreenlet.cpp:707:29: error: invalid use of incomplete type ‘_PyInterpreterFrame’ {aka ‘struct _PyInterpreterFrame’}
| 707 | last_complete_iframe->previous = nullptr;
| | ^~
| /home/jduponchelle/.local/share/uv/python/cpython-3.14.2-linux-x86_64-gnu/include/python3.14/cpython/pyframe.h:25:8: note: forward declaration of ‘_PyInterpreterFrame’ {aka ‘struct _PyInterpreterFrame’}
| 25 | struct _PyInterpreterFrame;
| | ^~~~~~~~~~~~~~~~~~~
| In file included from src/greenlet/greenlet.cpp:36:
| src/greenlet/TPythonState.cpp: In member function ‘void greenlet::PythonState::operator<<(const PyThreadState*)’:
| src/greenlet/TPythonState.cpp:137:31: error: ‘Py_C_RECURSION_LIMIT’ was not declared in this scope
| 137 | this->c_recursion_depth = Py_C_RECURSION_LIMIT - tstate->c_recursion_remaining;
| | ^~~~~~~~~~~~~~~~~~~~
| src/greenlet/TPythonState.cpp:137:62: error: ‘const PyThreadState’ {aka ‘const struct _ts’} has no member named ‘c_recursion_remaining’; did you mean ‘py_recursion_remaining’?
| 137 | this->c_recursion_depth = Py_C_RECURSION_LIMIT - tstate->c_recursion_remaining;
| | ^~~~~~~~~~~~~~~~~~~~~
| | py_recursion_remaining
| src/greenlet/TPythonState.cpp: In member function ‘void greenlet::PythonState::unexpose_frames()’:
| src/greenlet/TPythonState.cpp:179:51: error: invalid use of incomplete type ‘_PyInterpreterFrame’ {aka ‘struct _PyInterpreterFrame’}
| 179 | _PyInterpreterFrame *prev_exposed = iframe->previous;
| | ^~
| /home/jduponchelle/.local/share/uv/python/cpython-3.14.2-linux-x86_64-gnu/include/python3.14/cpython/pyframe.h:25:8: note: forward declaration of ‘_PyInterpreterFrame’ {aka ‘struct _PyInterpreterFrame’}
| 25 | struct _PyInterpreterFrame;
| | ^~~~~~~~~~~~~~~~~~~
| src/greenlet/TPythonState.cpp:181:23: error: invalid use of incomplete type ‘_PyInterpreterFrame’ {aka ‘struct _PyInterpreterFrame’}
| 181 | memcpy(&iframe->previous, &iframe->frame_obj->_f_frame_data[0],
| | ^~
| /home/jduponchelle/.local/share/uv/python/cpython-3.14.2-linux-x86_64-gnu/include/python3.14/cpython/pyframe.h:25:8: note: forward declaration of ‘_PyInterpreterFrame’ {aka ‘struct _PyInterpreterFrame’}
| 25 | struct _PyInterpreterFrame;
| | ^~~~~~~~~~~~~~~~~~~
| src/greenlet/TPythonState.cpp:181:42: error: invalid use of incomplete type ‘_PyInterpreterFrame’ {aka ‘struct _PyInterpreterFrame’}
| 181 | memcpy(&iframe->previous, &iframe->frame_obj->_f_frame_data[0],
| | ^~
| /home/jduponchelle/.local/share/uv/python/cpython-3.14.2-linux-x86_64-gnu/include/python3.14/cpython/pyframe.h:25:8: note: forward declaration of ‘_PyInterpreterFrame’ {aka ‘struct _PyInterpreterFrame’}
| 25 | struct _PyInterpreterFrame;
| | ^~~~~~~~~~~~~~~~~~~
| src/greenlet/TPythonState.cpp: In member function ‘void greenlet::PythonState::operator>>(PyThreadState*)’:
| src/greenlet/TPythonState.cpp:212:13: error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘c_recursion_remaining’; did you mean ‘py_recursion_remaining’?
| 212 | tstate->c_recursion_remaining = Py_C_RECURSION_LIMIT - this->c_recursion_depth;
| | ^~~~~~~~~~~~~~~~~~~~~
| | py_recursion_remaining
| src/greenlet/TPythonState.cpp:212:37: error: ‘Py_C_RECURSION_LIMIT’ was not declared in this scope
| 212 | tstate->c_recursion_remaining = Py_C_RECURSION_LIMIT - this->c_recursion_depth;
| | ^~~~~~~~~~~~~~~~~~~~
| error: command '/usr/bin/c++' failed with exit code 1
```
This due to the fact we are not installing a recent greenlet version
(3.1.1) due to the Python restriction.
By upgrading the minium Python version to 3.10 (minimum version
supported by the PSF https://devguide.python.org/versions/ ) the greenlet
module is now 3.3.1, it's the last available release.
2026-01-28 12:15:19 +01:00
daijro
0dabcb726d
Add leak warning for block_images 0.4.11 #170
2025-01-29 03:32:40 -06:00
daijro
a9b1934790
pythonlib: Add COOP toggle (workaround for #150 ) 0.4.10
2025-01-25 18:02:40 -06:00
daijro
e3d3dcd6e7
pythonlib: Look for assets in earlier releases #134 0.4.9
2024-12-13 01:01:20 -06:00
daijro
9a9e61f660
pythonlib: Force Browserforge 1.2.1+
...
Apify's models have been contaminated in recent releases. Browserforge 1.2.1 reverts to a earlier model.
https://github.com/daijro/browserforge/issues/17
2024-12-11 05:48:25 -06:00
daijro
2422d622eb
pythonlib: Auto offset Canvas anti-aliasing
2024-12-09 08:27:05 -06:00
daijro
2b7334c24f
pythonlib: Bump to 0.4.7
...
Bugfix release including the fix for #114 by iSuslov.
2024-12-08 21:28:24 -06:00
daijro
4c52518dd2
pythonlib: Cleanup & bump to 0.4.6
...
- `camoufox test` will no longer highlight the cursor by default
- Fixed launch_options blocking async
- WebGL database cleanup & added ability to query all possible vendor/renderer pairs
2024-12-04 19:35:54 -06:00
daijro
31963aa83b
pythonlib: Update WebGL sample database
2024-12-04 00:38:12 -06:00
daijro
f6ef52a39b
pythonlib: Support for main world evaluation 0.4.5
2024-12-03 22:58:08 -06:00
daijro
267b285faa
pythonlib: Bump to 0.4.4
2024-11-28 22:30:57 -06:00
daijro
cf3f8e6bde
pythonlib: Fix WebGL injection causing crashing 0.4.4-beta
2024-11-25 00:20:27 -06:00
daijro
145b737069
pythonlib: [Rollback] Disable WebGL by default #90 0.4.3
...
Disables WebGL by default until a fix is available.
2024-11-22 11:13:43 -06:00
daijro
01aff40fc5
pythonlib: Rollback WebGL fingerprint injection 0.4.2
...
Rolling back WebGL injection temporarily until the crashing issue on certain devices is fixed.
2024-11-22 03:28:01 -06:00
daijro
673fdc7271
pythonlib: Hotfix imports 0.4.1
2024-11-21 21:11:08 -06:00
daijro
af937cce55
pythonlib: WebGL rotation & leak fixes 0.4.0
2024-11-21 21:03:25 -06:00
daijro
01291d2ad1
pythonlib: Bump to 0.3.10
2024-11-18 02:32:20 -06:00
daijro
3a33283cd2
pythonlib: Add enable_cache, fixed font spacing, etc 0.3.9
...
- Enable bf cache with `enable_cache=True` #74
- Font spacing is now fixed per session #63
- Re-download (or raise error) when target install path is empty. Caused when the user cancels the download.
- Bumped minimum version to beta.15
2024-11-11 22:11:43 -06:00
daijro
964f49028c
pythonlib: Fix broken import #70 0.3.8
2024-11-04 13:18:10 -06:00
daijro
e6beecb3a9
pythonlib: Bump to 0.3.7
2024-11-03 04:16:09 -06:00
daijro
33189cd5b4
pythonlib: Fully fix #61 0.3.6
2024-10-31 06:42:47 -05:00
daijro
692e8a162c
pythonlib: Support Python 3.8 #61 0.3.5
2024-10-31 05:09:17 -05:00
daijro
347885e9cb
pythonlib: Default to http schema #57 0.3.4
...
Assume the proxy is using http schema when no other schema is specified.
2024-10-29 17:58:43 -05:00
daijro
f94452fa93
pythonlib: Error handling for invalid addon paths & proxies 0.3.3
...
Help prevent confusion with using Camoufox addons #55
2024-10-28 17:40:42 -05:00
daijro
732d7bac8d
Hotfix #51 0.3.2
...
Fixes missing VirtualDisplay import on non-Linux systems.
2024-10-27 20:26:00 -05:00
daijro
75ea7b0880
pythonlib: Set window size & kill Xvfb on browser close #49 #50
...
- Added window: Tuple[int, int] argument to set a fixed width and height #50
- Experimental fix to automatically terminate Xvfb on browser.close() #49
- Bump to 0.3.1
2024-10-27 20:03:11 -05:00
daijro
0ff90fc750
Version range control, multi locale usage, etc
...
- Python library now constrains the supported Camoufox version, and will force an update if you are out of date.
- Added support patch for multiple accepted languages #37
- Added pysocks #43
- Added README deprecation notices
- Added public launch_options command
- Bumped python library to 0.3.0
- Full support for beta.12
2024-10-19 23:10:51 -05:00
daijro
216718845c
pythonlib: Add dict expected type 0.2.15
...
Adds support for beta.12.
2024-10-15 06:57:48 -05:00
daijro
c448ec81ab
More warnings & reformat README to avoid confusion/misuse 0.2.14
...
- Warns the user if they try to manually set the geolocation and locale.
- Move manual config documentation to the bottom of the README to discourage use.
- Make the parameters list more obvious.
2024-10-11 22:09:42 -05:00
daijro
deddba00c3
Allow passing in a region or language into locale 0.2.13
...
- Passing in a region like `locale='US'` will generate a language based on the region, "US".
- Passing in a language like `locale='en'` will generate a region based on the language, "en".
- Fix locale parsing errors when generating using territoryInfo.xml #36
2024-10-11 21:36:19 -05:00
daijro
3e2551e65b
pythonlib: Fix geolocation domain detection #31 0.2.12
2024-10-10 15:44:25 -05:00
daijro
76bedb5251
pythonlib: Hotfix screen property out of bounds 0.2.11
...
Adds back handling for when Browserforge screen properties are out of bounds.
2024-10-09 06:30:41 -05:00
daijro
b2f74a24f3
Update pythonlib & README for beta.11
...
- Removed warnings for using headless mode
- Xvfb is now activated with headless='virtual'
- Correctly pass window.screenX & calculate window.screenY
- Update documentation on main README and pythonlib README
- Bumped pythonlib to 0.2.10
2024-10-09 05:49:22 -05:00
daijro
bd59304481
pythonlib: Add Xvfb integration #26 0.2.9
...
- Automatically uses virtual displays on Linux
- Update documentation on README
2024-10-08 05:10:12 -05:00
daijro
351e99ed18
pythonlib: Add more leak warnings 0.2.8
...
Warns the user for when the passed parameters are likely to cause a leak.
2024-10-06 23:32:50 -05:00
daijro
4a1cd7ec64
pythonlib: Add headless detection warning #26 0.2.7
...
Raises a warning when headless mode is enabled in Camoufox.
This will be reverted once #26 is resolved.
2024-10-06 20:05:11 -05:00
daijro
f3b68ab355
pythonlib: Assert OS is valid 0.2.6
...
- Removed mobile OS support due to detection issues
- Validate the passed os name & that its lowercase
2024-10-05 02:10:43 -05:00
daijro
2832673f83
pythonlib: Add persistent_context, humanize, etc. 0.2.5
...
- Added `persistent_context` parameter #21
- Added `humanize` parameter #22
- Added validation for custom fingerprints
- Updated Browserforge integration documentation
2024-10-04 19:04:16 -05:00
daijro
79c436e506
pythonlib: Add remote server launching #7
...
Uses a hacky work around to run Javascript in Playwright's internal library to gain access to the launchServer method.
2024-10-02 02:45:26 -05:00
daijro
7985eec493
pythonlib: Allow fetch without geoip 0.2.3
...
Fix fetch not checking if geoip2 is installed before trying to download the mmdb.
2024-10-02 00:09:42 -05:00
daijro
ad55622550
pythonlib: Implement viewport hijacking 0.2.2
...
- Allow Browerforge fingerprints to override screen & viewport data.
- Set Camoufox's window dimensions to a fixed width/height generated from Browserforge.
- If the browser is headful, do not exceed 125% of the screen size.
Other changes:
- Allow public IP finder to work without verification.
- Add script to publish to pypi.
- More descriptive progress bars when downloading default addons.
- Bump to 0.2.2
2024-09-30 04:06:16 -05:00
daijro
7d825e53d9
pythonlib: Typing & environ var fixes 0.2.1
...
- Fixes typing with OS_NAME
- Fix exceeding environment variable length on Windows (caused by typing issue)
- Fix not passing fontconfig on Linux (caused by typing issue)
2024-09-29 17:30:11 -05:00