57 Commits

Author SHA1 Message Date
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