daijro
febffaa85c
Missing geoip support message in gui
2026-02-07 19:53:30 -06:00
daijro
3c13e6ed5f
Fix windows strftime
2026-02-07 19:45:31 -06:00
daijro
314b328925
Remove unneeded assets
2026-02-07 04:47:07 -06:00
daijro
5661e0a676
Add more spacing in cli version info
2026-02-07 04:46:47 -06:00
daijro
d43b4004f4
Add media to pythonlib docs & cleanup
2026-02-07 04:46:17 -06:00
daijro
1e4dbc5a01
Update pythonlib docs
2026-02-07 04:23:08 -06:00
daijro
f843120052
Cli fixes
2026-02-07 04:10:57 -06:00
daijro
ee27755bb3
Show active even if not installed
2026-02-07 03:32:03 -06:00
daijro
0923b12194
Exception handling
2026-02-07 03:29:35 -06:00
daijro
61a9e1f9bb
Update browserforge (remove manual model downloading)
2026-02-07 03:14:41 -06:00
daijro
4973672d01
Remove canvas anti-fingerprinting
2026-02-07 03:05:50 -06:00
daijro
b4d5ae515f
Merge branch 'daijro-fixes' into daijro-camoufox-manager
2026-02-07 03:04:31 -06:00
daijro
e0e2eeb2f3
Add version manager in python library
2026-02-07 02:47:01 -06:00
icepaq
18e983ad33
Merge pull request #477 from wiremind/executable_path
...
feat: Add --executable-path flag to the test command
2026-02-06 14:29:15 -05:00
Julien Duponchelle
99f5aaaca2
feat: Add --executable-path flag to the test command
...
This allow to pass to Camoufox library the executable-path
from the cli test command allowing to use a camoufox from a different
folder during development.
Example:
python -m camoufox test --executable-path="/tmp/camoufox/camoufox-bin"
2026-02-02 09:41:35 +01: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
e365d42a72
Merge pull request #351 from PierreMesure/patch-1
...
Use GITHUB_TOKEN if it exists to download Camoufox
2026-01-11 23:40:26 -06:00
daijro
fa647700e9
Merge pull request #323 from dozed-dev/main
...
fix: return correct country from geoip database
2026-01-11 23:39:53 -06:00
daijro
90c916e708
Merge pull request #273 from joaoneves0/fix/xvfb-leak
...
fix: Ensure virtual_display is killed even if browser.close fails
2026-01-11 23:38:28 -06:00
daijro
2e98b57693
Merge pull request #251 from wv-opt-ai/patch-1
...
Fix cleanup on exception in sync_api __enter__
2026-01-11 23:37:49 -06:00
daijro
b161c24fc9
Merge branch 'fix-ip-exception' into daijro-fixes
2026-01-11 23:34:54 -06:00
daijro
72833eeff9
Merge library fixes from coryking
2026-01-11 23:30:51 -06:00
Pierre
6e6f6736fb
Use GITHUB_TOKEN if it exists to download Camoufox
2025-07-10 15:01:19 +02:00
dozed-dev
b08a700314
fix: return correct country from geoip database
...
Return country instead of registered_country for iso code in get_geolocation
2025-06-08 19:53:51 +03:00
joaoneves0
fd1bb2f878
Ensure virtual display cleanup runs on browser close failure
2025-04-14 14:23:38 -03:00
wv-opt-ai
e008580521
Fix cleanup on exception in sync_api __enter__
...
If an exception is raised in the synchronous api during the setup, super().__enter__ has been called but super().__exit__ will not get called, leading to asyncio runloop exceptions further down the line if one tries to create a new context. This commit catches the exception in order to clean up the super().__exit__ calls before reraising.
2025-03-21 16:35:11 +01:00
DeviousStoat
326e3a6976
Fix unbound exception ip function
2025-03-21 14:59:04 +01:00
Ven Om
dcda82e94f
Get IP fix
2025-03-06 15:30:25 +01:00
gsli97
c8eca598a9
unexpected keyword argument when using proxy-bypass with geoip=True
...
passing a proxy to camoufox with the "bypass"-argument while using geoip=True runs into an exception.
extending the class attributes fixes the problem on my local machine
2025-02-07 18:15:57 -08: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
Karim shoair
6fc8ee287e
Make Geolocation frozen to use less memory
...
And it can be cached later if that intended in the future
2025-01-24 21:21:27 +02:00
Karim shoair
b5a248707e
Small performance boost on ip validation with caching
2025-01-24 21:19:29 +02:00
TimurKutsenko
a44986e1a0
Remove print on start of virtual display
2025-01-05 10:23:55 +02:00
vihangatheturtle
133afbcdea
Update launchServer.js
2024-12-17 17:58:18 +00:00
vihangatheturtle
f5def98300
Update server.py
2024-12-17 17:57:50 +00: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
Ivan Suslov
685f2ff744
Fixes WebGL support for virtual display
2024-12-08 10:36:14 -05: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
3210351527
pythonlib: Add parameter to only use user-specified fonts #109
...
Added a `custom_fonts_only` parameter to ignore the fonts in fonts.json.
2024-11-28 22:15:36 -06:00
daijro
30a92edb1b
pythonlib: Do not override productSub #105
2024-11-28 21:36:49 -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