├── .github ├── intro.png └── workflows │ └── publish.yml ├── .gitignore ├── .nerve.toml ├── LICENSE ├── README.md ├── pdm.lock ├── pyproject.toml ├── src └── tsticker │ ├── __init__.py │ ├── cli.py │ ├── const.py │ ├── core │ ├── __init__.py │ ├── const.py │ └── create.py │ └── utils.py └── tests └── __init__.py /.github/intro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sudoskys/tsticker/30902ecb08165c52fddf96f14fcf4d18d40f6fb3/.github/intro.png -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: publish 2 | on: 3 | workflow_dispatch: 4 | push: 5 | tags: 6 | - pypi* 7 | 8 | permissions: 9 | contents: read 10 | 11 | jobs: 12 | pypi-publish: 13 | name: upload release to PyPI 14 | runs-on: ubuntu-latest 15 | permissions: 16 | # IMPORTANT: this permission is mandatory for trusted publishing 17 | id-token: write 18 | steps: 19 | - uses: actions/checkout@v3 20 | 21 | - uses: pdm-project/setup-pdm@v3 22 | 23 | - name: Publish package distributions to PyPI 24 | run: pdm publish 25 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | share/python-wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | MANIFEST 28 | 29 | # PyInstaller 30 | # Usually these files are written by a python script from a template 31 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 32 | *.manifest 33 | *.spec 34 | 35 | # Installer logs 36 | pip-log.txt 37 | pip-delete-this-directory.txt 38 | 39 | # Unit test / coverage reports 40 | htmlcov/ 41 | .tox/ 42 | .nox/ 43 | .coverage 44 | .coverage.* 45 | .cache 46 | nosetests.xml 47 | coverage.xml 48 | *.cover 49 | *.py,cover 50 | .hypothesis/ 51 | .pytest_cache/ 52 | cover/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | .pybuilder/ 76 | target/ 77 | 78 | # Jupyter Notebook 79 | .ipynb_checkpoints 80 | 81 | # IPython 82 | profile_default/ 83 | ipython_config.py 84 | 85 | # pyenv 86 | # For a library or package, you might want to ignore these files since the code is 87 | # intended to run in multiple environments; otherwise, check them in: 88 | # .python-version 89 | 90 | # pipenv 91 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 92 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 93 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 94 | # install all needed dependencies. 95 | #Pipfile.lock 96 | 97 | # poetry 98 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. 99 | # This is especially recommended for binary packages to ensure reproducibility, and is more 100 | # commonly ignored for libraries. 101 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control 102 | #poetry.lock 103 | 104 | # pdm 105 | # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. 106 | #pdm.lock 107 | # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it 108 | # in version control. 109 | # https://pdm-project.org/#use-with-ide 110 | .pdm.toml 111 | .pdm-python 112 | .pdm-build/ 113 | 114 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm 115 | __pypackages__/ 116 | 117 | # Celery stuff 118 | celerybeat-schedule 119 | celerybeat.pid 120 | 121 | # SageMath parsed files 122 | *.sage.py 123 | 124 | # Environments 125 | .env 126 | .venv 127 | env/ 128 | venv/ 129 | ENV/ 130 | env.bak/ 131 | venv.bak/ 132 | 133 | # Spyder project settings 134 | .spyderproject 135 | .spyproject 136 | 137 | # Rope project settings 138 | .ropeproject 139 | 140 | # mkdocs documentation 141 | /site 142 | 143 | # mypy 144 | .mypy_cache/ 145 | .dmypy.json 146 | dmypy.json 147 | 148 | # Pyre type checker 149 | .pyre/ 150 | 151 | # pytype static type analyzer 152 | .pytype/ 153 | 154 | # Cython debug symbols 155 | cython_debug/ 156 | 157 | # PyCharm 158 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can 159 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore 160 | # and can be added to the global gitignore or merged into this file. For a more nuclear 161 | # option (not recommended) you can uncomment the following to ignore the entire idea folder. 162 | #.idea/ 163 | /.idea/inspectionProfiles/profiles_settings.xml 164 | /.idea/inspectionProfiles/Project_Default.xml 165 | /.idea/.gitignore 166 | /.idea/misc.xml 167 | /.idea/modules.xml 168 | /.idea/tsticker.iml 169 | /.idea/vcs.xml 170 | -------------------------------------------------------------------------------- /.nerve.toml: -------------------------------------------------------------------------------- 1 | contributor = "01cc89e1-b7c2-4629-b249-27bb0aec5db3" 2 | # https://github.com/LlmKira/contributor/blob/main/.nerve.toml 3 | 4 | language = "English" 5 | issue_auto_label = true 6 | # Whether to automatically label issues 7 | issue_title_format = true 8 | # Whether to use the default issue title format 9 | issue_body_format = true 10 | # Whether to use the default issue body format 11 | issue_close_with_report = true 12 | # Whether to close the issue with a report 13 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Jasmine 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # tsticker 2 | 3 | [![PyPI version](https://badge.fury.io/py/tsticker.svg)](https://badge.fury.io/py/tsticker) [![Downloads](https://pepy.tech/badge/tsticker)](https://pepy.tech/project/tsticker) 4 | 5 | ## 📘 Overview 6 | 7 | `tsticker` is a telegram sticker pack management cli. 8 | 9 | Just put your images in the `/stickers` directory and run `tsticker push` to override your cloud sticker 10 | with local stickers. 11 | 12 | ![intro](.github/intro.png) 13 | 14 | Or you can use the `tsticker sync` command to override your local sticker pack with the cloud sticker pack. 15 | 16 | Simple? Yes, it is! 17 | 18 | - Auto select emoji for sticker 19 | - Auto resize image for sticker 20 | - Auto convert (gif,webm,mov ...) to webm for animated sticker 21 | - You can change the name of the pack by changing the title property in index.json. 22 | > The only thing that can be edited in `index.json` is the `title` 23 | 24 | ## 📦 Commands 25 | 26 | | Command | Description | 27 | |---------------------|--------------------------------------------------------------------------------------------------| 28 | | `tsticker init` | Initializes a new sticker pack. | 29 | | `tsticker sync` | **Override**, Syncs the sticker pack from your local directory with changes from the cloud. | 30 | | `tsticker push` | **Override**, Pushes changes from your local directory to the cloud, updating existing stickers. | 31 | | `tsticker login` | Logs in to your Telegram account. | 32 | | `tsticker logout` | Logs out of your Telegram account. | 33 | | `tsticker help` | Displays help information for the CLI. | 34 | | `tsticker download` | Download any sticker pack from the cloud to your local directory. | 35 | | `tsticker trace` | Import cloud sticker pack from url. | 36 | | `tsticker show` | Show the sticker pack information. | 37 | 38 | | Example | Description | 39 | |------------------------------------------------------------------|----------------------------------------------| 40 | | `tsticker init -s regular -n 'sticker_id' -t 'My sticker title'` | Initialize a new sticker | 41 | | `tsticker sync` | Sync sticker pack | 42 | | `tsticker push` | Push sticker pack | 43 | | `tsticker login -t -u ` | Log in to Telegram | 44 | | `tsticker logout` | Log out of Telegram | 45 | | `tsticker download -l ` | Download any sticker pack, cant make changes | 46 | | `tsticker trace -l ` | Import sticker pack(can make changes) | 47 | 48 | **If you encounter any issues, please [create a new Issue](https://github.com/sudoskys/tsticker/issues) on our GitHub 49 | repository.** 50 | 51 | ## 📋 Prerequisites 52 | 53 | Wait! Before installing `tsticker`, ensure that your computer meets the following requirements: 54 | 55 | - [install ffmpeg](https://ffmpeg.org/download.html) 56 | 57 | - [install ImageMagick](https://docs.wand-py.org/en/0.6.12/guide/install.html) 58 | 59 | ## Installing `tsticker` 60 | 61 | The recommended way to install `tsticker` is through `pipx` for isolated environments: 62 | 63 | ```bash 64 | pipx install tsticker 65 | ``` 66 | 67 | If `pipx` is not installed, install it with the following commands: 68 | 69 | ```bash 70 | python3 -m pip install --user pipx 71 | python3 -m pipx ensurepath 72 | ``` 73 | 74 | If you want to upgrade `tsticker` to the latest version, use the following command: 75 | 76 | ```bash 77 | pipx upgrade tsticker 78 | ``` 79 | 80 | ## 🔑 Login with Telegram 81 | 82 | We need create a bot as a bridge to manage stickers. 83 | 84 | Remember the bot can **only** **auto** manage stickers **created by the bot itself**, once you lost your bot, you can 85 | only manage stickers manually. 86 | 87 | To create and manage stickers with `tsticker`, you need a **Telegram Bot Token**. Follow these steps: 88 | 89 | 1. Open Telegram and search for the [BotFather](https://t.me/BotFather) bot. 90 | 2. Start a conversation with BotFather and send the command `/newbot`. 91 | 3. Follow the instructions to create your bot and acquire the bot token. 92 | 93 | The bot token provided by BotFather will be used as your `BotToken`. 94 | 95 | Win + R, type `cmd`, and press Enter to open the command prompt. Run the following command to login 96 | 97 | Replace `` with your Telegram bot token and `` with your Telegram user ID (you can get your user ID 98 | from [getidsbot](https://t.me/getidsbot) by sending `/my_id`). 99 | 100 | ```bash 101 | tsticker login -t -u 102 | ``` 103 | 104 | We use https://pypi.org/project/keyring/ to manage your tokens, which may require additional steps. If you encounter 105 | problems, refer to: https://github.com/jaraco/keyring 106 | 107 | ## Adding or Removing Stickers 108 | 109 | Just put your images in the `/stickers` directory and run `tsticker push` to override your cloud sticker pack with 110 | the local sticker pack. We support almost all image formats, including `png`, `jpg`, `jpeg`, `gif`, `webm`, and 111 | `mov` and so on. 112 | 113 | Please don't operate lots of stickers at once time, if there is any error, it will break your workflow, but you can 114 | use `tsticker sync` to recover. 115 | 116 | ```bash 117 | tsticker push 118 | ``` 119 | 120 | even there are auto-resize and auto-convert, there still have some bad input such as too large image, too long video, so 121 | be careful. 122 | 123 | The name of the sticker file can be some direct emoji(like `😄some🧑` ), or you can fill in the name freely, and we will 124 | look for the most similar 125 | emoji! 126 | 127 | ## Limitations of `tsticker` 128 | 129 | | Note | Description | 130 | |---------------------------------|----------------------------------------------------------------------------------------------------------------------| 131 | | **No Support for Tgs Stickers** | `tgs` format is not supported for this cli. We using mixed `png` and `webm` format for static and animated stickers. | 132 | | **Rate Limiting** | Each request is throttled to 2 seconds to avoid being blocked by Telegram. | 133 | | **Only Bot User** | Stickers can only be managed through your bot or the official @Stickers bot by the sticker pack creator. | 134 | 135 | ## 📄 License 136 | 137 | `tsticker` is released under the MIT License. See [LICENSE](LICENSE) for more information. 138 | 139 | --- 140 | 141 | Enhance your Telegram sticker creation process with `tsticker` and become part of our community striving to simplify 142 | sticker management through the command line! 143 | 144 | --- 145 | -------------------------------------------------------------------------------- /pdm.lock: -------------------------------------------------------------------------------- 1 | # This file is @generated by PDM. 2 | # It is not intended for manual editing. 3 | 4 | [metadata] 5 | groups = ["default"] 6 | strategy = ["inherit_metadata"] 7 | lock_version = "4.5.0" 8 | content_hash = "sha256:2abe8b9ee0d3d21fa4f9b73ae53619af83098466e0dd13c2e0e69b39a940c39c" 9 | 10 | [[metadata.targets]] 11 | requires_python = ">=3.9,<3.13" 12 | 13 | [[package]] 14 | name = "aiohappyeyeballs" 15 | version = "2.4.4" 16 | requires_python = ">=3.8" 17 | summary = "Happy Eyeballs for asyncio" 18 | groups = ["default"] 19 | files = [ 20 | {file = "aiohappyeyeballs-2.4.4-py3-none-any.whl", hash = "sha256:a980909d50efcd44795c4afeca523296716d50cd756ddca6af8c65b996e27de8"}, 21 | {file = "aiohappyeyeballs-2.4.4.tar.gz", hash = "sha256:5fdd7d87889c63183afc18ce9271f9b0a7d32c2303e394468dd45d514a757745"}, 22 | ] 23 | 24 | [[package]] 25 | name = "aiohttp" 26 | version = "3.11.13" 27 | requires_python = ">=3.9" 28 | summary = "Async http client/server framework (asyncio)" 29 | groups = ["default"] 30 | dependencies = [ 31 | "aiohappyeyeballs>=2.3.0", 32 | "aiosignal>=1.1.2", 33 | "async-timeout<6.0,>=4.0; python_version < \"3.11\"", 34 | "attrs>=17.3.0", 35 | "frozenlist>=1.1.1", 36 | "multidict<7.0,>=4.5", 37 | "propcache>=0.2.0", 38 | "yarl<2.0,>=1.17.0", 39 | ] 40 | files = [ 41 | {file = "aiohttp-3.11.13-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a4fe27dbbeec445e6e1291e61d61eb212ee9fed6e47998b27de71d70d3e8777d"}, 42 | {file = "aiohttp-3.11.13-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9e64ca2dbea28807f8484c13f684a2f761e69ba2640ec49dacd342763cc265ef"}, 43 | {file = "aiohttp-3.11.13-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9840be675de208d1f68f84d578eaa4d1a36eee70b16ae31ab933520c49ba1325"}, 44 | {file = "aiohttp-3.11.13-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28a772757c9067e2aee8a6b2b425d0efaa628c264d6416d283694c3d86da7689"}, 45 | {file = "aiohttp-3.11.13-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b88aca5adbf4625e11118df45acac29616b425833c3be7a05ef63a6a4017bfdb"}, 46 | {file = "aiohttp-3.11.13-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ce10ddfbe26ed5856d6902162f71b8fe08545380570a885b4ab56aecfdcb07f4"}, 47 | {file = "aiohttp-3.11.13-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa48dac27f41b36735c807d1ab093a8386701bbf00eb6b89a0f69d9fa26b3671"}, 48 | {file = "aiohttp-3.11.13-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:89ce611b1eac93ce2ade68f1470889e0173d606de20c85a012bfa24be96cf867"}, 49 | {file = "aiohttp-3.11.13-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:78e4dd9c34ec7b8b121854eb5342bac8b02aa03075ae8618b6210a06bbb8a115"}, 50 | {file = "aiohttp-3.11.13-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:66047eacbc73e6fe2462b77ce39fc170ab51235caf331e735eae91c95e6a11e4"}, 51 | {file = "aiohttp-3.11.13-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5ad8f1c19fe277eeb8bc45741c6d60ddd11d705c12a4d8ee17546acff98e0802"}, 52 | {file = "aiohttp-3.11.13-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:64815c6f02e8506b10113ddbc6b196f58dbef135751cc7c32136df27b736db09"}, 53 | {file = "aiohttp-3.11.13-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:967b93f21b426f23ca37329230d5bd122f25516ae2f24a9cea95a30023ff8283"}, 54 | {file = "aiohttp-3.11.13-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cf1f31f83d16ec344136359001c5e871915c6ab685a3d8dee38e2961b4c81730"}, 55 | {file = "aiohttp-3.11.13-cp310-cp310-win32.whl", hash = "sha256:00c8ac69e259c60976aa2edae3f13d9991cf079aaa4d3cd5a49168ae3748dee3"}, 56 | {file = "aiohttp-3.11.13-cp310-cp310-win_amd64.whl", hash = "sha256:90d571c98d19a8b6e793b34aa4df4cee1e8fe2862d65cc49185a3a3d0a1a3996"}, 57 | {file = "aiohttp-3.11.13-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6b35aab22419ba45f8fc290d0010898de7a6ad131e468ffa3922b1b0b24e9d2e"}, 58 | {file = "aiohttp-3.11.13-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f81cba651db8795f688c589dd11a4fbb834f2e59bbf9bb50908be36e416dc760"}, 59 | {file = "aiohttp-3.11.13-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f55d0f242c2d1fcdf802c8fabcff25a9d85550a4cf3a9cf5f2a6b5742c992839"}, 60 | {file = "aiohttp-3.11.13-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4bea08a6aad9195ac9b1be6b0c7e8a702a9cec57ce6b713698b4a5afa9c2e33"}, 61 | {file = "aiohttp-3.11.13-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c6070bcf2173a7146bb9e4735b3c62b2accba459a6eae44deea0eb23e0035a23"}, 62 | {file = "aiohttp-3.11.13-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:718d5deb678bc4b9d575bfe83a59270861417da071ab44542d0fcb6faa686636"}, 63 | {file = "aiohttp-3.11.13-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f6b2c5b4a4d22b8fb2c92ac98e0747f5f195e8e9448bfb7404cd77e7bfa243f"}, 64 | {file = "aiohttp-3.11.13-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:747ec46290107a490d21fe1ff4183bef8022b848cf9516970cb31de6d9460088"}, 65 | {file = "aiohttp-3.11.13-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:01816f07c9cc9d80f858615b1365f8319d6a5fd079cd668cc58e15aafbc76a54"}, 66 | {file = "aiohttp-3.11.13-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:a08ad95fcbd595803e0c4280671d808eb170a64ca3f2980dd38e7a72ed8d1fea"}, 67 | {file = "aiohttp-3.11.13-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:c97be90d70f7db3aa041d720bfb95f4869d6063fcdf2bb8333764d97e319b7d0"}, 68 | {file = "aiohttp-3.11.13-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ab915a57c65f7a29353c8014ac4be685c8e4a19e792a79fe133a8e101111438e"}, 69 | {file = "aiohttp-3.11.13-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:35cda4e07f5e058a723436c4d2b7ba2124ab4e0aa49e6325aed5896507a8a42e"}, 70 | {file = "aiohttp-3.11.13-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:af55314407714fe77a68a9ccaab90fdb5deb57342585fd4a3a8102b6d4370080"}, 71 | {file = "aiohttp-3.11.13-cp311-cp311-win32.whl", hash = "sha256:42d689a5c0a0c357018993e471893e939f555e302313d5c61dfc566c2cad6185"}, 72 | {file = "aiohttp-3.11.13-cp311-cp311-win_amd64.whl", hash = "sha256:b73a2b139782a07658fbf170fe4bcdf70fc597fae5ffe75e5b67674c27434a9f"}, 73 | {file = "aiohttp-3.11.13-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2eabb269dc3852537d57589b36d7f7362e57d1ece308842ef44d9830d2dc3c90"}, 74 | {file = "aiohttp-3.11.13-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7b77ee42addbb1c36d35aca55e8cc6d0958f8419e458bb70888d8c69a4ca833d"}, 75 | {file = "aiohttp-3.11.13-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55789e93c5ed71832e7fac868167276beadf9877b85697020c46e9a75471f55f"}, 76 | {file = "aiohttp-3.11.13-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c929f9a7249a11e4aa5c157091cfad7f49cc6b13f4eecf9b747104befd9f56f2"}, 77 | {file = "aiohttp-3.11.13-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d33851d85537bbf0f6291ddc97926a754c8f041af759e0aa0230fe939168852b"}, 78 | {file = "aiohttp-3.11.13-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9229d8613bd8401182868fe95688f7581673e1c18ff78855671a4b8284f47bcb"}, 79 | {file = "aiohttp-3.11.13-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:669dd33f028e54fe4c96576f406ebb242ba534dd3a981ce009961bf49960f117"}, 80 | {file = "aiohttp-3.11.13-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c1b20a1ace54af7db1f95af85da530fe97407d9063b7aaf9ce6a32f44730778"}, 81 | {file = "aiohttp-3.11.13-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5724cc77f4e648362ebbb49bdecb9e2b86d9b172c68a295263fa072e679ee69d"}, 82 | {file = "aiohttp-3.11.13-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:aa36c35e94ecdb478246dd60db12aba57cfcd0abcad43c927a8876f25734d496"}, 83 | {file = "aiohttp-3.11.13-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9b5b37c863ad5b0892cc7a4ceb1e435e5e6acd3f2f8d3e11fa56f08d3c67b820"}, 84 | {file = "aiohttp-3.11.13-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e06cf4852ce8c4442a59bae5a3ea01162b8fcb49ab438d8548b8dc79375dad8a"}, 85 | {file = "aiohttp-3.11.13-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5194143927e494616e335d074e77a5dac7cd353a04755330c9adc984ac5a628e"}, 86 | {file = "aiohttp-3.11.13-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:afcb6b275c2d2ba5d8418bf30a9654fa978b4f819c2e8db6311b3525c86fe637"}, 87 | {file = "aiohttp-3.11.13-cp312-cp312-win32.whl", hash = "sha256:7104d5b3943c6351d1ad7027d90bdd0ea002903e9f610735ac99df3b81f102ee"}, 88 | {file = "aiohttp-3.11.13-cp312-cp312-win_amd64.whl", hash = "sha256:47dc018b1b220c48089b5b9382fbab94db35bef2fa192995be22cbad3c5730c8"}, 89 | {file = "aiohttp-3.11.13-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:51c3ff9c7a25f3cad5c09d9aacbc5aefb9267167c4652c1eb737989b554fe278"}, 90 | {file = "aiohttp-3.11.13-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e271beb2b1dabec5cd84eb488bdabf9758d22ad13471e9c356be07ad139b3012"}, 91 | {file = "aiohttp-3.11.13-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0e9eb7e5764abcb49f0e2bd8f5731849b8728efbf26d0cac8e81384c95acec3f"}, 92 | {file = "aiohttp-3.11.13-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:baae005092e3f200de02699314ac8933ec20abf998ec0be39448f6605bce93df"}, 93 | {file = "aiohttp-3.11.13-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1982c98ac62c132d2b773d50e2fcc941eb0b8bad3ec078ce7e7877c4d5a2dce7"}, 94 | {file = "aiohttp-3.11.13-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d2b25b2eeb35707113b2d570cadc7c612a57f1c5d3e7bb2b13870fe284e08fc0"}, 95 | {file = "aiohttp-3.11.13-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b27961d65639128336b7a7c3f0046dcc62a9443d5ef962e3c84170ac620cec47"}, 96 | {file = "aiohttp-3.11.13-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a01fe9f1e05025eacdd97590895e2737b9f851d0eb2e017ae9574d9a4f0b6252"}, 97 | {file = "aiohttp-3.11.13-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fa1fb1b61881c8405829c50e9cc5c875bfdbf685edf57a76817dfb50643e4a1a"}, 98 | {file = "aiohttp-3.11.13-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:25de43bb3cf83ad83efc8295af7310219af6dbe4c543c2e74988d8e9c8a2a917"}, 99 | {file = "aiohttp-3.11.13-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fe7065e2215e4bba63dc00db9ae654c1ba3950a5fff691475a32f511142fcddb"}, 100 | {file = "aiohttp-3.11.13-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:7836587eef675a17d835ec3d98a8c9acdbeb2c1d72b0556f0edf4e855a25e9c1"}, 101 | {file = "aiohttp-3.11.13-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:85fa0b18558eb1427090912bd456a01f71edab0872f4e0f9e4285571941e4090"}, 102 | {file = "aiohttp-3.11.13-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a86dc177eb4c286c19d1823ac296299f59ed8106c9536d2b559f65836e0fb2c6"}, 103 | {file = "aiohttp-3.11.13-cp39-cp39-win32.whl", hash = "sha256:684eea71ab6e8ade86b9021bb62af4bf0881f6be4e926b6b5455de74e420783a"}, 104 | {file = "aiohttp-3.11.13-cp39-cp39-win_amd64.whl", hash = "sha256:82c249f2bfa5ecbe4a1a7902c81c0fba52ed9ebd0176ab3047395d02ad96cfcb"}, 105 | {file = "aiohttp-3.11.13.tar.gz", hash = "sha256:8ce789231404ca8fff7f693cdce398abf6d90fd5dae2b1847477196c243b1fbb"}, 106 | ] 107 | 108 | [[package]] 109 | name = "aiosignal" 110 | version = "1.3.2" 111 | requires_python = ">=3.9" 112 | summary = "aiosignal: a list of registered asynchronous callbacks" 113 | groups = ["default"] 114 | dependencies = [ 115 | "frozenlist>=1.1.0", 116 | ] 117 | files = [ 118 | {file = "aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5"}, 119 | {file = "aiosignal-1.3.2.tar.gz", hash = "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54"}, 120 | ] 121 | 122 | [[package]] 123 | name = "annotated-types" 124 | version = "0.7.0" 125 | requires_python = ">=3.8" 126 | summary = "Reusable constraint types to use with typing.Annotated" 127 | groups = ["default"] 128 | dependencies = [ 129 | "typing-extensions>=4.0.0; python_version < \"3.9\"", 130 | ] 131 | files = [ 132 | {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, 133 | {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, 134 | ] 135 | 136 | [[package]] 137 | name = "anyio" 138 | version = "4.8.0" 139 | requires_python = ">=3.9" 140 | summary = "High level compatibility layer for multiple asynchronous event loop implementations" 141 | groups = ["default"] 142 | dependencies = [ 143 | "exceptiongroup>=1.0.2; python_version < \"3.11\"", 144 | "idna>=2.8", 145 | "sniffio>=1.1", 146 | "typing-extensions>=4.5; python_version < \"3.13\"", 147 | ] 148 | files = [ 149 | {file = "anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a"}, 150 | {file = "anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a"}, 151 | ] 152 | 153 | [[package]] 154 | name = "async-timeout" 155 | version = "5.0.1" 156 | requires_python = ">=3.8" 157 | summary = "Timeout context manager for asyncio programs" 158 | groups = ["default"] 159 | marker = "python_version < \"3.11\"" 160 | files = [ 161 | {file = "async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c"}, 162 | {file = "async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3"}, 163 | ] 164 | 165 | [[package]] 166 | name = "asyncclick" 167 | version = "8.1.8" 168 | requires_python = ">=3.9" 169 | summary = "Composable command line interface toolkit, " 170 | groups = ["default"] 171 | dependencies = [ 172 | "anyio~=4.0", 173 | "colorama; platform_system == \"Windows\"", 174 | ] 175 | files = [ 176 | {file = "asyncclick-8.1.8-py3-none-any.whl", hash = "sha256:eb1ccb44bc767f8f0695d592c7806fdf5bd575605b4ee246ffd5fadbcfdbd7c6"}, 177 | {file = "asyncclick-8.1.8.0-py3-none-any.whl", hash = "sha256:be146a2d8075d4fe372ff4e877f23c8b5af269d16705c1948123b9415f6fd678"}, 178 | {file = "asyncclick-8.1.8.tar.gz", hash = "sha256:0f0eb0f280e04919d67cf71b9fcdfb4db2d9ff7203669c40284485c149578e4c"}, 179 | ] 180 | 181 | [[package]] 182 | name = "attrs" 183 | version = "25.1.0" 184 | requires_python = ">=3.8" 185 | summary = "Classes Without Boilerplate" 186 | groups = ["default"] 187 | files = [ 188 | {file = "attrs-25.1.0-py3-none-any.whl", hash = "sha256:c75a69e28a550a7e93789579c22aa26b0f5b83b75dc4e08fe092980051e1090a"}, 189 | {file = "attrs-25.1.0.tar.gz", hash = "sha256:1c97078a80c814273a76b2a298a932eb681c87415c11dee0a6921de7f1b02c3e"}, 190 | ] 191 | 192 | [[package]] 193 | name = "backports-tarfile" 194 | version = "1.2.0" 195 | requires_python = ">=3.8" 196 | summary = "Backport of CPython tarfile module" 197 | groups = ["default"] 198 | marker = "python_version < \"3.12\"" 199 | files = [ 200 | {file = "backports.tarfile-1.2.0-py3-none-any.whl", hash = "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34"}, 201 | {file = "backports_tarfile-1.2.0.tar.gz", hash = "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991"}, 202 | ] 203 | 204 | [[package]] 205 | name = "certifi" 206 | version = "2025.1.31" 207 | requires_python = ">=3.6" 208 | summary = "Python package for providing Mozilla's CA Bundle." 209 | groups = ["default"] 210 | files = [ 211 | {file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"}, 212 | {file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"}, 213 | ] 214 | 215 | [[package]] 216 | name = "cffi" 217 | version = "1.17.1" 218 | requires_python = ">=3.8" 219 | summary = "Foreign Function Interface for Python calling C code." 220 | groups = ["default"] 221 | marker = "platform_python_implementation != \"PyPy\" and sys_platform == \"linux\"" 222 | dependencies = [ 223 | "pycparser", 224 | ] 225 | files = [ 226 | {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, 227 | {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, 228 | {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, 229 | {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, 230 | {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, 231 | {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, 232 | {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, 233 | {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, 234 | {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, 235 | {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, 236 | {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, 237 | {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, 238 | {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, 239 | {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, 240 | {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, 241 | {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, 242 | {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, 243 | {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, 244 | {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, 245 | {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, 246 | {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, 247 | {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, 248 | {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, 249 | {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, 250 | {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, 251 | {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, 252 | {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, 253 | {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, 254 | {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, 255 | {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, 256 | {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, 257 | {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, 258 | {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, 259 | {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, 260 | {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, 261 | {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, 262 | {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, 263 | {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, 264 | {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, 265 | {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, 266 | {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, 267 | {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, 268 | {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, 269 | {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, 270 | {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, 271 | {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, 272 | {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, 273 | {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, 274 | ] 275 | 276 | [[package]] 277 | name = "charset-normalizer" 278 | version = "3.4.1" 279 | requires_python = ">=3.7" 280 | summary = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." 281 | groups = ["default"] 282 | files = [ 283 | {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, 284 | {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, 285 | {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037"}, 286 | {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f"}, 287 | {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a"}, 288 | {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a"}, 289 | {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247"}, 290 | {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408"}, 291 | {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb"}, 292 | {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d"}, 293 | {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807"}, 294 | {file = "charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f"}, 295 | {file = "charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f"}, 296 | {file = "charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125"}, 297 | {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1"}, 298 | {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3"}, 299 | {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd"}, 300 | {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00"}, 301 | {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12"}, 302 | {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77"}, 303 | {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146"}, 304 | {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd"}, 305 | {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6"}, 306 | {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8"}, 307 | {file = "charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b"}, 308 | {file = "charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76"}, 309 | {file = "charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545"}, 310 | {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7"}, 311 | {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757"}, 312 | {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa"}, 313 | {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d"}, 314 | {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"}, 315 | {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b"}, 316 | {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d"}, 317 | {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a"}, 318 | {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9"}, 319 | {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1"}, 320 | {file = "charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35"}, 321 | {file = "charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f"}, 322 | {file = "charset_normalizer-3.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41"}, 323 | {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f"}, 324 | {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2"}, 325 | {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770"}, 326 | {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4"}, 327 | {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537"}, 328 | {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496"}, 329 | {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78"}, 330 | {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7"}, 331 | {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6"}, 332 | {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294"}, 333 | {file = "charset_normalizer-3.4.1-cp39-cp39-win32.whl", hash = "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5"}, 334 | {file = "charset_normalizer-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765"}, 335 | {file = "charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85"}, 336 | {file = "charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3"}, 337 | ] 338 | 339 | [[package]] 340 | name = "click" 341 | version = "8.1.8" 342 | requires_python = ">=3.7" 343 | summary = "Composable command line interface toolkit" 344 | groups = ["default"] 345 | dependencies = [ 346 | "colorama; platform_system == \"Windows\"", 347 | "importlib-metadata; python_version < \"3.8\"", 348 | ] 349 | files = [ 350 | {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, 351 | {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, 352 | ] 353 | 354 | [[package]] 355 | name = "colorama" 356 | version = "0.4.6" 357 | requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" 358 | summary = "Cross-platform colored terminal text." 359 | groups = ["default"] 360 | marker = "platform_system == \"Windows\" or sys_platform == \"win32\"" 361 | files = [ 362 | {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, 363 | {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, 364 | ] 365 | 366 | [[package]] 367 | name = "coloredlogs" 368 | version = "15.0.1" 369 | requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 370 | summary = "Colored terminal output for Python's logging module" 371 | groups = ["default"] 372 | dependencies = [ 373 | "humanfriendly>=9.1", 374 | ] 375 | files = [ 376 | {file = "coloredlogs-15.0.1-py2.py3-none-any.whl", hash = "sha256:612ee75c546f53e92e70049c9dbfcc18c935a2b9a53b66085ce9ef6a6e5c0934"}, 377 | {file = "coloredlogs-15.0.1.tar.gz", hash = "sha256:7c991aa71a4577af2f82600d8f8f3a89f936baeaf9b50a9c197da014e5bf16b0"}, 378 | ] 379 | 380 | [[package]] 381 | name = "cryptography" 382 | version = "43.0.3" 383 | requires_python = ">=3.7" 384 | summary = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." 385 | groups = ["default"] 386 | marker = "sys_platform == \"linux\"" 387 | dependencies = [ 388 | "cffi>=1.12; platform_python_implementation != \"PyPy\"", 389 | ] 390 | files = [ 391 | {file = "cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e"}, 392 | {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e"}, 393 | {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e1ce50266f4f70bf41a2c6dc4358afadae90e2a1e5342d3c08883df1675374f"}, 394 | {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:443c4a81bb10daed9a8f334365fe52542771f25aedaf889fd323a853ce7377d6"}, 395 | {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:74f57f24754fe349223792466a709f8e0c093205ff0dca557af51072ff47ab18"}, 396 | {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9762ea51a8fc2a88b70cf2995e5675b38d93bf36bd67d91721c309df184f49bd"}, 397 | {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:81ef806b1fef6b06dcebad789f988d3b37ccaee225695cf3e07648eee0fc6b73"}, 398 | {file = "cryptography-43.0.3-cp37-abi3-win32.whl", hash = "sha256:cbeb489927bd7af4aa98d4b261af9a5bc025bd87f0e3547e11584be9e9427be2"}, 399 | {file = "cryptography-43.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:f46304d6f0c6ab8e52770addfa2fc41e6629495548862279641972b6215451cd"}, 400 | {file = "cryptography-43.0.3-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:8ac43ae87929a5982f5948ceda07001ee5e83227fd69cf55b109144938d96984"}, 401 | {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:846da004a5804145a5f441b8530b4bf35afbf7da70f82409f151695b127213d5"}, 402 | {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f996e7268af62598f2fc1204afa98a3b5712313a55c4c9d434aef49cadc91d4"}, 403 | {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f7b178f11ed3664fd0e995a47ed2b5ff0a12d893e41dd0494f406d1cf555cab7"}, 404 | {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:c2e6fc39c4ab499049df3bdf567f768a723a5e8464816e8f009f121a5a9f4405"}, 405 | {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e1be4655c7ef6e1bbe6b5d0403526601323420bcf414598955968c9ef3eb7d16"}, 406 | {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:df6b6c6d742395dd77a23ea3728ab62f98379eff8fb61be2744d4679ab678f73"}, 407 | {file = "cryptography-43.0.3-cp39-abi3-win32.whl", hash = "sha256:d56e96520b1020449bbace2b78b603442e7e378a9b3bd68de65c782db1507995"}, 408 | {file = "cryptography-43.0.3-cp39-abi3-win_amd64.whl", hash = "sha256:0c580952eef9bf68c4747774cde7ec1d85a6e61de97281f2dba83c7d2c806362"}, 409 | {file = "cryptography-43.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d03b5621a135bffecad2c73e9f4deb1a0f977b9a8ffe6f8e002bf6c9d07b918c"}, 410 | {file = "cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:a2a431ee15799d6db9fe80c82b055bae5a752bef645bba795e8e52687c69efe3"}, 411 | {file = "cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:281c945d0e28c92ca5e5930664c1cefd85efe80e5c0d2bc58dd63383fda29f83"}, 412 | {file = "cryptography-43.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f18c716be16bc1fea8e95def49edf46b82fccaa88587a45f8dc0ff6ab5d8e0a7"}, 413 | {file = "cryptography-43.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4a02ded6cd4f0a5562a8887df8b3bd14e822a90f97ac5e544c162899bc467664"}, 414 | {file = "cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:53a583b6637ab4c4e3591a15bc9db855b8d9dee9a669b550f311480acab6eb08"}, 415 | {file = "cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1ec0bcf7e17c0c5669d881b1cd38c4972fade441b27bda1051665faaa89bdcaa"}, 416 | {file = "cryptography-43.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2ce6fae5bdad59577b44e4dfed356944fbf1d925269114c28be377692643b4ff"}, 417 | {file = "cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805"}, 418 | ] 419 | 420 | [[package]] 421 | name = "decorator" 422 | version = "5.1.1" 423 | requires_python = ">=3.5" 424 | summary = "Decorators for Humans" 425 | groups = ["default"] 426 | files = [ 427 | {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, 428 | {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, 429 | ] 430 | 431 | [[package]] 432 | name = "emoji" 433 | version = "2.14.1" 434 | requires_python = ">=3.7" 435 | summary = "Emoji for Python" 436 | groups = ["default"] 437 | dependencies = [ 438 | "typing-extensions>=4.7.0; python_version < \"3.9\"", 439 | ] 440 | files = [ 441 | {file = "emoji-2.14.1-py3-none-any.whl", hash = "sha256:35a8a486c1460addb1499e3bf7929d3889b2e2841a57401903699fef595e942b"}, 442 | {file = "emoji-2.14.1.tar.gz", hash = "sha256:f8c50043d79a2c1410ebfae833ae1868d5941a67a6cd4d18377e2eb0bd79346b"}, 443 | ] 444 | 445 | [[package]] 446 | name = "exceptiongroup" 447 | version = "1.2.2" 448 | requires_python = ">=3.7" 449 | summary = "Backport of PEP 654 (exception groups)" 450 | groups = ["default"] 451 | marker = "python_version < \"3.11\"" 452 | files = [ 453 | {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, 454 | {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, 455 | ] 456 | 457 | [[package]] 458 | name = "ffmpy" 459 | version = "0.5.0" 460 | requires_python = "<4.0,>=3.8" 461 | summary = "A simple Python wrapper for FFmpeg" 462 | groups = ["default"] 463 | files = [ 464 | {file = "ffmpy-0.5.0-py3-none-any.whl", hash = "sha256:df3799cf5816daa56d4959a023630ee53c6768b66009dae6d131519ba4b80233"}, 465 | {file = "ffmpy-0.5.0.tar.gz", hash = "sha256:277e131f246d18e9dcfee9bb514c50749031c43582ce5ef82c57b51e3d3955c3"}, 466 | ] 467 | 468 | [[package]] 469 | name = "flatbuffers" 470 | version = "25.1.24" 471 | summary = "The FlatBuffers serialization format for Python" 472 | groups = ["default"] 473 | files = [ 474 | {file = "flatbuffers-25.1.24-py2.py3-none-any.whl", hash = "sha256:1abfebaf4083117225d0723087ea909896a34e3fec933beedb490d595ba24145"}, 475 | {file = "flatbuffers-25.1.24.tar.gz", hash = "sha256:e0f7b7d806c0abdf166275492663130af40c11f89445045fbef0aa3c9a8643ad"}, 476 | ] 477 | 478 | [[package]] 479 | name = "frozenlist" 480 | version = "1.5.0" 481 | requires_python = ">=3.8" 482 | summary = "A list-like structure which implements collections.abc.MutableSequence" 483 | groups = ["default"] 484 | files = [ 485 | {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5b6a66c18b5b9dd261ca98dffcb826a525334b2f29e7caa54e182255c5f6a65a"}, 486 | {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d1b3eb7b05ea246510b43a7e53ed1653e55c2121019a97e60cad7efb881a97bb"}, 487 | {file = "frozenlist-1.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:15538c0cbf0e4fa11d1e3a71f823524b0c46299aed6e10ebb4c2089abd8c3bec"}, 488 | {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e79225373c317ff1e35f210dd5f1344ff31066ba8067c307ab60254cd3a78ad5"}, 489 | {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9272fa73ca71266702c4c3e2d4a28553ea03418e591e377a03b8e3659d94fa76"}, 490 | {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:498524025a5b8ba81695761d78c8dd7382ac0b052f34e66939c42df860b8ff17"}, 491 | {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92b5278ed9d50fe610185ecd23c55d8b307d75ca18e94c0e7de328089ac5dcba"}, 492 | {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f3c8c1dacd037df16e85227bac13cca58c30da836c6f936ba1df0c05d046d8d"}, 493 | {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f2ac49a9bedb996086057b75bf93538240538c6d9b38e57c82d51f75a73409d2"}, 494 | {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e66cc454f97053b79c2ab09c17fbe3c825ea6b4de20baf1be28919460dd7877f"}, 495 | {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:5a3ba5f9a0dfed20337d3e966dc359784c9f96503674c2faf015f7fe8e96798c"}, 496 | {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6321899477db90bdeb9299ac3627a6a53c7399c8cd58d25da094007402b039ab"}, 497 | {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:76e4753701248476e6286f2ef492af900ea67d9706a0155335a40ea21bf3b2f5"}, 498 | {file = "frozenlist-1.5.0-cp310-cp310-win32.whl", hash = "sha256:977701c081c0241d0955c9586ffdd9ce44f7a7795df39b9151cd9a6fd0ce4cfb"}, 499 | {file = "frozenlist-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:189f03b53e64144f90990d29a27ec4f7997d91ed3d01b51fa39d2dbe77540fd4"}, 500 | {file = "frozenlist-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fd74520371c3c4175142d02a976aee0b4cb4a7cc912a60586ffd8d5929979b30"}, 501 | {file = "frozenlist-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2f3f7a0fbc219fb4455264cae4d9f01ad41ae6ee8524500f381de64ffaa077d5"}, 502 | {file = "frozenlist-1.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f47c9c9028f55a04ac254346e92977bf0f166c483c74b4232bee19a6697e4778"}, 503 | {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0996c66760924da6e88922756d99b47512a71cfd45215f3570bf1e0b694c206a"}, 504 | {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2fe128eb4edeabe11896cb6af88fca5346059f6c8d807e3b910069f39157869"}, 505 | {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a8ea951bbb6cacd492e3948b8da8c502a3f814f5d20935aae74b5df2b19cf3d"}, 506 | {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de537c11e4aa01d37db0d403b57bd6f0546e71a82347a97c6a9f0dcc532b3a45"}, 507 | {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c2623347b933fcb9095841f1cc5d4ff0b278addd743e0e966cb3d460278840d"}, 508 | {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cee6798eaf8b1416ef6909b06f7dc04b60755206bddc599f52232606e18179d3"}, 509 | {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f5f9da7f5dbc00a604fe74aa02ae7c98bcede8a3b8b9666f9f86fc13993bc71a"}, 510 | {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:90646abbc7a5d5c7c19461d2e3eeb76eb0b204919e6ece342feb6032c9325ae9"}, 511 | {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:bdac3c7d9b705d253b2ce370fde941836a5f8b3c5c2b8fd70940a3ea3af7f4f2"}, 512 | {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03d33c2ddbc1816237a67f66336616416e2bbb6beb306e5f890f2eb22b959cdf"}, 513 | {file = "frozenlist-1.5.0-cp311-cp311-win32.whl", hash = "sha256:237f6b23ee0f44066219dae14c70ae38a63f0440ce6750f868ee08775073f942"}, 514 | {file = "frozenlist-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:0cc974cc93d32c42e7b0f6cf242a6bd941c57c61b618e78b6c0a96cb72788c1d"}, 515 | {file = "frozenlist-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:31115ba75889723431aa9a4e77d5f398f5cf976eea3bdf61749731f62d4a4a21"}, 516 | {file = "frozenlist-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7437601c4d89d070eac8323f121fcf25f88674627505334654fd027b091db09d"}, 517 | {file = "frozenlist-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7948140d9f8ece1745be806f2bfdf390127cf1a763b925c4a805c603df5e697e"}, 518 | {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feeb64bc9bcc6b45c6311c9e9b99406660a9c05ca8a5b30d14a78555088b0b3a"}, 519 | {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:683173d371daad49cffb8309779e886e59c2f369430ad28fe715f66d08d4ab1a"}, 520 | {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7d57d8f702221405a9d9b40f9da8ac2e4a1a8b5285aac6100f3393675f0a85ee"}, 521 | {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c72000fbcc35b129cb09956836c7d7abf78ab5416595e4857d1cae8d6251a6"}, 522 | {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:000a77d6034fbad9b6bb880f7ec073027908f1b40254b5d6f26210d2dab1240e"}, 523 | {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5d7f5a50342475962eb18b740f3beecc685a15b52c91f7d975257e13e029eca9"}, 524 | {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:87f724d055eb4785d9be84e9ebf0f24e392ddfad00b3fe036e43f489fafc9039"}, 525 | {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:6e9080bb2fb195a046e5177f10d9d82b8a204c0736a97a153c2466127de87784"}, 526 | {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9b93d7aaa36c966fa42efcaf716e6b3900438632a626fb09c049f6a2f09fc631"}, 527 | {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:52ef692a4bc60a6dd57f507429636c2af8b6046db8b31b18dac02cbc8f507f7f"}, 528 | {file = "frozenlist-1.5.0-cp312-cp312-win32.whl", hash = "sha256:29d94c256679247b33a3dc96cce0f93cbc69c23bf75ff715919332fdbb6a32b8"}, 529 | {file = "frozenlist-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:8969190d709e7c48ea386db202d708eb94bdb29207a1f269bab1196ce0dcca1f"}, 530 | {file = "frozenlist-1.5.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9bbcdfaf4af7ce002694a4e10a0159d5a8d20056a12b05b45cea944a4953f972"}, 531 | {file = "frozenlist-1.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1893f948bf6681733aaccf36c5232c231e3b5166d607c5fa77773611df6dc336"}, 532 | {file = "frozenlist-1.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2b5e23253bb709ef57a8e95e6ae48daa9ac5f265637529e4ce6b003a37b2621f"}, 533 | {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f253985bb515ecd89629db13cb58d702035ecd8cfbca7d7a7e29a0e6d39af5f"}, 534 | {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04a5c6babd5e8fb7d3c871dc8b321166b80e41b637c31a995ed844a6139942b6"}, 535 | {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9fe0f1c29ba24ba6ff6abf688cb0b7cf1efab6b6aa6adc55441773c252f7411"}, 536 | {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:226d72559fa19babe2ccd920273e767c96a49b9d3d38badd7c91a0fdeda8ea08"}, 537 | {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15b731db116ab3aedec558573c1a5eec78822b32292fe4f2f0345b7f697745c2"}, 538 | {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:366d8f93e3edfe5a918c874702f78faac300209a4d5bf38352b2c1bdc07a766d"}, 539 | {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1b96af8c582b94d381a1c1f51ffaedeb77c821c690ea5f01da3d70a487dd0a9b"}, 540 | {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c03eff4a41bd4e38415cbed054bbaff4a075b093e2394b6915dca34a40d1e38b"}, 541 | {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:50cf5e7ee9b98f22bdecbabf3800ae78ddcc26e4a435515fc72d97903e8488e0"}, 542 | {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1e76bfbc72353269c44e0bc2cfe171900fbf7f722ad74c9a7b638052afe6a00c"}, 543 | {file = "frozenlist-1.5.0-cp39-cp39-win32.whl", hash = "sha256:666534d15ba8f0fda3f53969117383d5dc021266b3c1a42c9ec4855e4b58b9d3"}, 544 | {file = "frozenlist-1.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:5c28f4b5dbef8a0d8aad0d4de24d1e9e981728628afaf4ea0792f5d0939372f0"}, 545 | {file = "frozenlist-1.5.0-py3-none-any.whl", hash = "sha256:d994863bba198a4a518b467bb971c56e1db3f180a25c6cf7bb1949c267f748c3"}, 546 | {file = "frozenlist-1.5.0.tar.gz", hash = "sha256:81d5af29e61b9c8348e876d442253723928dce6433e0e76cd925cd83f1b4b817"}, 547 | ] 548 | 549 | [[package]] 550 | name = "h11" 551 | version = "0.14.0" 552 | requires_python = ">=3.7" 553 | summary = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" 554 | groups = ["default"] 555 | dependencies = [ 556 | "typing-extensions; python_version < \"3.8\"", 557 | ] 558 | files = [ 559 | {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, 560 | {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, 561 | ] 562 | 563 | [[package]] 564 | name = "httpcore" 565 | version = "1.0.7" 566 | requires_python = ">=3.8" 567 | summary = "A minimal low-level HTTP client." 568 | groups = ["default"] 569 | dependencies = [ 570 | "certifi", 571 | "h11<0.15,>=0.13", 572 | ] 573 | files = [ 574 | {file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"}, 575 | {file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"}, 576 | ] 577 | 578 | [[package]] 579 | name = "httpx" 580 | version = "0.28.1" 581 | requires_python = ">=3.8" 582 | summary = "The next generation HTTP client." 583 | groups = ["default"] 584 | dependencies = [ 585 | "anyio", 586 | "certifi", 587 | "httpcore==1.*", 588 | "idna", 589 | ] 590 | files = [ 591 | {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, 592 | {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, 593 | ] 594 | 595 | [[package]] 596 | name = "humanfriendly" 597 | version = "10.0" 598 | requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 599 | summary = "Human friendly output for text interfaces using Python" 600 | groups = ["default"] 601 | dependencies = [ 602 | "monotonic; python_version == \"2.7\"", 603 | "pyreadline3; sys_platform == \"win32\" and python_version >= \"3.8\"", 604 | "pyreadline; sys_platform == \"win32\" and python_version < \"3.8\"", 605 | ] 606 | files = [ 607 | {file = "humanfriendly-10.0-py2.py3-none-any.whl", hash = "sha256:1697e1a8a8f550fd43c2865cd84542fc175a61dcb779b6fee18cf6b6ccba1477"}, 608 | {file = "humanfriendly-10.0.tar.gz", hash = "sha256:6b0b831ce8f15f7300721aa49829fc4e83921a9a301cc7f606be6686a2288ddc"}, 609 | ] 610 | 611 | [[package]] 612 | name = "idna" 613 | version = "3.10" 614 | requires_python = ">=3.6" 615 | summary = "Internationalized Domain Names in Applications (IDNA)" 616 | groups = ["default"] 617 | files = [ 618 | {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, 619 | {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, 620 | ] 621 | 622 | [[package]] 623 | name = "imageio" 624 | version = "2.37.0" 625 | requires_python = ">=3.9" 626 | summary = "Library for reading and writing a wide range of image, video, scientific, and volumetric data formats." 627 | groups = ["default"] 628 | dependencies = [ 629 | "numpy", 630 | "pillow>=8.3.2", 631 | ] 632 | files = [ 633 | {file = "imageio-2.37.0-py3-none-any.whl", hash = "sha256:11efa15b87bc7871b61590326b2d635439acc321cf7f8ce996f812543ce10eed"}, 634 | {file = "imageio-2.37.0.tar.gz", hash = "sha256:71b57b3669666272c818497aebba2b4c5f20d5b37c81720e5e1a56d59c492996"}, 635 | ] 636 | 637 | [[package]] 638 | name = "imageio-ffmpeg" 639 | version = "0.6.0" 640 | requires_python = ">=3.9" 641 | summary = "FFMPEG wrapper for Python" 642 | groups = ["default"] 643 | files = [ 644 | {file = "imageio_ffmpeg-0.6.0-py3-none-macosx_10_9_intel.macosx_10_9_x86_64.whl", hash = "sha256:9d2baaf867088508d4a3458e61eeb30e945c4ad8016025545f66c4b5aaef0a61"}, 645 | {file = "imageio_ffmpeg-0.6.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:b1ae3173414b5fc5f538a726c4e48ea97edc0d2cdc11f103afee655c463fa742"}, 646 | {file = "imageio_ffmpeg-0.6.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1d47bebd83d2c5fc770720d211855f208af8a596c82d17730aa51e815cdee6dc"}, 647 | {file = "imageio_ffmpeg-0.6.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:c7e46fcec401dd990405049d2e2f475e2b397779df2519b544b8aab515195282"}, 648 | {file = "imageio_ffmpeg-0.6.0-py3-none-win32.whl", hash = "sha256:196faa79366b4a82f95c0f4053191d2013f4714a715780f0ad2a68ff37483cc2"}, 649 | {file = "imageio_ffmpeg-0.6.0-py3-none-win_amd64.whl", hash = "sha256:02fa47c83703c37df6bfe4896aab339013f62bf02c5ebf2dce6da56af04ffc0a"}, 650 | {file = "imageio_ffmpeg-0.6.0.tar.gz", hash = "sha256:e2556bed8e005564a9f925bb7afa4002d82770d6b08825078b7697ab88ba1755"}, 651 | ] 652 | 653 | [[package]] 654 | name = "importlib-metadata" 655 | version = "8.6.1" 656 | requires_python = ">=3.9" 657 | summary = "Read metadata from Python packages" 658 | groups = ["default"] 659 | marker = "python_version < \"3.12\"" 660 | dependencies = [ 661 | "typing-extensions>=3.6.4; python_version < \"3.8\"", 662 | "zipp>=3.20", 663 | ] 664 | files = [ 665 | {file = "importlib_metadata-8.6.1-py3-none-any.whl", hash = "sha256:02a89390c1e15fdfdc0d7c6b25cb3e62650d0494005c97d6f148bf5b9787525e"}, 666 | {file = "importlib_metadata-8.6.1.tar.gz", hash = "sha256:310b41d755445d74569f993ccfc22838295d9fe005425094fad953d7f15c8580"}, 667 | ] 668 | 669 | [[package]] 670 | name = "jaraco-classes" 671 | version = "3.4.0" 672 | requires_python = ">=3.8" 673 | summary = "Utility functions for Python class constructs" 674 | groups = ["default"] 675 | dependencies = [ 676 | "more-itertools", 677 | ] 678 | files = [ 679 | {file = "jaraco.classes-3.4.0-py3-none-any.whl", hash = "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790"}, 680 | {file = "jaraco.classes-3.4.0.tar.gz", hash = "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd"}, 681 | ] 682 | 683 | [[package]] 684 | name = "jaraco-context" 685 | version = "6.0.1" 686 | requires_python = ">=3.8" 687 | summary = "Useful decorators and context managers" 688 | groups = ["default"] 689 | dependencies = [ 690 | "backports-tarfile; python_version < \"3.12\"", 691 | ] 692 | files = [ 693 | {file = "jaraco.context-6.0.1-py3-none-any.whl", hash = "sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4"}, 694 | {file = "jaraco_context-6.0.1.tar.gz", hash = "sha256:9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3"}, 695 | ] 696 | 697 | [[package]] 698 | name = "jaraco-functools" 699 | version = "4.1.0" 700 | requires_python = ">=3.8" 701 | summary = "Functools like those found in stdlib" 702 | groups = ["default"] 703 | dependencies = [ 704 | "more-itertools", 705 | ] 706 | files = [ 707 | {file = "jaraco.functools-4.1.0-py3-none-any.whl", hash = "sha256:ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649"}, 708 | {file = "jaraco_functools-4.1.0.tar.gz", hash = "sha256:70f7e0e2ae076498e212562325e805204fc092d7b4c17e0e86c959e249701a9d"}, 709 | ] 710 | 711 | [[package]] 712 | name = "jeepney" 713 | version = "0.8.0" 714 | requires_python = ">=3.7" 715 | summary = "Low-level, pure Python DBus protocol wrapper." 716 | groups = ["default"] 717 | marker = "sys_platform == \"linux\"" 718 | files = [ 719 | {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, 720 | {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, 721 | ] 722 | 723 | [[package]] 724 | name = "keyring" 725 | version = "25.6.0" 726 | requires_python = ">=3.9" 727 | summary = "Store and access your passwords safely." 728 | groups = ["default"] 729 | dependencies = [ 730 | "SecretStorage>=3.2; sys_platform == \"linux\"", 731 | "importlib-metadata>=4.11.4; python_version < \"3.12\"", 732 | "importlib-resources; python_version < \"3.9\"", 733 | "jaraco-classes", 734 | "jaraco-context", 735 | "jaraco-functools", 736 | "jeepney>=0.4.2; sys_platform == \"linux\"", 737 | "pywin32-ctypes>=0.2.0; sys_platform == \"win32\"", 738 | ] 739 | files = [ 740 | {file = "keyring-25.6.0-py3-none-any.whl", hash = "sha256:552a3f7af126ece7ed5c89753650eec89c7eaae8617d0aa4d9ad2b75111266bd"}, 741 | {file = "keyring-25.6.0.tar.gz", hash = "sha256:0b39998aa941431eb3d9b0d4b2460bc773b9df6fed7621c2dfb291a7e0187a66"}, 742 | ] 743 | 744 | [[package]] 745 | name = "loguru" 746 | version = "0.7.3" 747 | requires_python = "<4.0,>=3.5" 748 | summary = "Python logging made (stupidly) simple" 749 | groups = ["default"] 750 | dependencies = [ 751 | "aiocontextvars>=0.2.0; python_version < \"3.7\"", 752 | "colorama>=0.3.4; sys_platform == \"win32\"", 753 | "win32-setctime>=1.0.0; sys_platform == \"win32\"", 754 | ] 755 | files = [ 756 | {file = "loguru-0.7.3-py3-none-any.whl", hash = "sha256:31a33c10c8e1e10422bfd431aeb5d351c7cf7fa671e3c4df004162264b28220c"}, 757 | {file = "loguru-0.7.3.tar.gz", hash = "sha256:19480589e77d47b8d85b2c827ad95d49bf31b0dcde16593892eb51dd18706eb6"}, 758 | ] 759 | 760 | [[package]] 761 | name = "magika" 762 | version = "0.5.1" 763 | requires_python = ">=3.8,<3.13" 764 | summary = "A tool to determine the content type of a file with deep-learning" 765 | groups = ["default"] 766 | dependencies = [ 767 | "click<9.0.0,>=8.1.3", 768 | "numpy<2.0,>=1.24; python_version >= \"3.8\" and python_version < \"3.9\"", 769 | "numpy<2.0,>=1.26; python_version >= \"3.9\" and python_version < \"3.13\"", 770 | "onnxruntime<2.0.0,>=1.17.0", 771 | "python-dotenv<2.0.0,>=1.0.1", 772 | "tabulate<0.10.0,>=0.9.0", 773 | "tqdm<5.0.0,>=4.66.2", 774 | ] 775 | files = [ 776 | {file = "magika-0.5.1-py3-none-any.whl", hash = "sha256:a4d1f64f71460f335841c13c3d16cfc2cb21e839c1898a1ae9bd5adc8d66cb2b"}, 777 | {file = "magika-0.5.1.tar.gz", hash = "sha256:43dc1153a1637327225a626a1550c0a395a1d45ea33ec1f5d46b9b080238bee0"}, 778 | ] 779 | 780 | [[package]] 781 | name = "markdown-it-py" 782 | version = "3.0.0" 783 | requires_python = ">=3.8" 784 | summary = "Python port of markdown-it. Markdown parsing, done right!" 785 | groups = ["default"] 786 | dependencies = [ 787 | "mdurl~=0.1", 788 | ] 789 | files = [ 790 | {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, 791 | {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, 792 | ] 793 | 794 | [[package]] 795 | name = "mdurl" 796 | version = "0.1.2" 797 | requires_python = ">=3.7" 798 | summary = "Markdown URL utilities" 799 | groups = ["default"] 800 | files = [ 801 | {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, 802 | {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, 803 | ] 804 | 805 | [[package]] 806 | name = "more-itertools" 807 | version = "10.6.0" 808 | requires_python = ">=3.9" 809 | summary = "More routines for operating on iterables, beyond itertools" 810 | groups = ["default"] 811 | files = [ 812 | {file = "more-itertools-10.6.0.tar.gz", hash = "sha256:2cd7fad1009c31cc9fb6a035108509e6547547a7a738374f10bd49a09eb3ee3b"}, 813 | {file = "more_itertools-10.6.0-py3-none-any.whl", hash = "sha256:6eb054cb4b6db1473f6e15fcc676a08e4732548acd47c708f0e179c2c7c01e89"}, 814 | ] 815 | 816 | [[package]] 817 | name = "moviepy" 818 | version = "2.1.2" 819 | summary = "Video editing with Python" 820 | groups = ["default"] 821 | dependencies = [ 822 | "decorator<6.0,>=4.0.2", 823 | "imageio-ffmpeg>=0.2.0", 824 | "imageio<3.0,>=2.5", 825 | "numpy>=1.25.0", 826 | "pillow<11.0,>=9.2.0", 827 | "proglog<=1.0.0", 828 | "python-dotenv>=0.10", 829 | ] 830 | files = [ 831 | {file = "moviepy-2.1.2-py3-none-any.whl", hash = "sha256:6cdc0d739110c8f347a224d72bd59eebaec010720d01eff290d37111bf545a73"}, 832 | {file = "moviepy-2.1.2.tar.gz", hash = "sha256:22c57a7472f607eaad9fe80791df67c05082e1060fb74817c4eaac68e138ee77"}, 833 | ] 834 | 835 | [[package]] 836 | name = "mpmath" 837 | version = "1.3.0" 838 | summary = "Python library for arbitrary-precision floating-point arithmetic" 839 | groups = ["default"] 840 | files = [ 841 | {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, 842 | {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, 843 | ] 844 | 845 | [[package]] 846 | name = "multidict" 847 | version = "6.1.0" 848 | requires_python = ">=3.8" 849 | summary = "multidict implementation" 850 | groups = ["default"] 851 | dependencies = [ 852 | "typing-extensions>=4.1.0; python_version < \"3.11\"", 853 | ] 854 | files = [ 855 | {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3380252550e372e8511d49481bd836264c009adb826b23fefcc5dd3c69692f60"}, 856 | {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99f826cbf970077383d7de805c0681799491cb939c25450b9b5b3ced03ca99f1"}, 857 | {file = "multidict-6.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a114d03b938376557927ab23f1e950827c3b893ccb94b62fd95d430fd0e5cf53"}, 858 | {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1c416351ee6271b2f49b56ad7f308072f6f44b37118d69c2cad94f3fa8a40d5"}, 859 | {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b5d83030255983181005e6cfbac1617ce9746b219bc2aad52201ad121226581"}, 860 | {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3e97b5e938051226dc025ec80980c285b053ffb1e25a3db2a3aa3bc046bf7f56"}, 861 | {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d618649d4e70ac6efcbba75be98b26ef5078faad23592f9b51ca492953012429"}, 862 | {file = "multidict-6.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10524ebd769727ac77ef2278390fb0068d83f3acb7773792a5080f2b0abf7748"}, 863 | {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ff3827aef427c89a25cc96ded1759271a93603aba9fb977a6d264648ebf989db"}, 864 | {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:06809f4f0f7ab7ea2cabf9caca7d79c22c0758b58a71f9d32943ae13c7ace056"}, 865 | {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f179dee3b863ab1c59580ff60f9d99f632f34ccb38bf67a33ec6b3ecadd0fd76"}, 866 | {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:aaed8b0562be4a0876ee3b6946f6869b7bcdb571a5d1496683505944e268b160"}, 867 | {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3c8b88a2ccf5493b6c8da9076fb151ba106960a2df90c2633f342f120751a9e7"}, 868 | {file = "multidict-6.1.0-cp310-cp310-win32.whl", hash = "sha256:4a9cb68166a34117d6646c0023c7b759bf197bee5ad4272f420a0141d7eb03a0"}, 869 | {file = "multidict-6.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:20b9b5fbe0b88d0bdef2012ef7dee867f874b72528cf1d08f1d59b0e3850129d"}, 870 | {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3efe2c2cb5763f2f1b275ad2bf7a287d3f7ebbef35648a9726e3b69284a4f3d6"}, 871 | {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7053d3b0353a8b9de430a4f4b4268ac9a4fb3481af37dfe49825bf45ca24156"}, 872 | {file = "multidict-6.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27e5fc84ccef8dfaabb09d82b7d179c7cf1a3fbc8a966f8274fcb4ab2eb4cadb"}, 873 | {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2b90b43e696f25c62656389d32236e049568b39320e2735d51f08fd362761b"}, 874 | {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d83a047959d38a7ff552ff94be767b7fd79b831ad1cd9920662db05fec24fe72"}, 875 | {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1a9dd711d0877a1ece3d2e4fea11a8e75741ca21954c919406b44e7cf971304"}, 876 | {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec2abea24d98246b94913b76a125e855eb5c434f7c46546046372fe60f666351"}, 877 | {file = "multidict-6.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4867cafcbc6585e4b678876c489b9273b13e9fff9f6d6d66add5e15d11d926cb"}, 878 | {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5b48204e8d955c47c55b72779802b219a39acc3ee3d0116d5080c388970b76e3"}, 879 | {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d8fff389528cad1618fb4b26b95550327495462cd745d879a8c7c2115248e399"}, 880 | {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a7a9541cd308eed5e30318430a9c74d2132e9a8cb46b901326272d780bf2d423"}, 881 | {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:da1758c76f50c39a2efd5e9859ce7d776317eb1dd34317c8152ac9251fc574a3"}, 882 | {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c943a53e9186688b45b323602298ab727d8865d8c9ee0b17f8d62d14b56f0753"}, 883 | {file = "multidict-6.1.0-cp311-cp311-win32.whl", hash = "sha256:90f8717cb649eea3504091e640a1b8568faad18bd4b9fcd692853a04475a4b80"}, 884 | {file = "multidict-6.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:82176036e65644a6cc5bd619f65f6f19781e8ec2e5330f51aa9ada7504cc1926"}, 885 | {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa"}, 886 | {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436"}, 887 | {file = "multidict-6.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761"}, 888 | {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e"}, 889 | {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef"}, 890 | {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95"}, 891 | {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925"}, 892 | {file = "multidict-6.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966"}, 893 | {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305"}, 894 | {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2"}, 895 | {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2"}, 896 | {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6"}, 897 | {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3"}, 898 | {file = "multidict-6.1.0-cp312-cp312-win32.whl", hash = "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133"}, 899 | {file = "multidict-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1"}, 900 | {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4e18b656c5e844539d506a0a06432274d7bd52a7487e6828c63a63d69185626c"}, 901 | {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a185f876e69897a6f3325c3f19f26a297fa058c5e456bfcff8015e9a27e83ae1"}, 902 | {file = "multidict-6.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab7c4ceb38d91570a650dba194e1ca87c2b543488fe9309b4212694174fd539c"}, 903 | {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e617fb6b0b6953fffd762669610c1c4ffd05632c138d61ac7e14ad187870669c"}, 904 | {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16e5f4bf4e603eb1fdd5d8180f1a25f30056f22e55ce51fb3d6ad4ab29f7d96f"}, 905 | {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c035da3f544b1882bac24115f3e2e8760f10a0107614fc9839fd232200b875"}, 906 | {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:957cf8e4b6e123a9eea554fa7ebc85674674b713551de587eb318a2df3e00255"}, 907 | {file = "multidict-6.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:483a6aea59cb89904e1ceabd2b47368b5600fb7de78a6e4a2c2987b2d256cf30"}, 908 | {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:87701f25a2352e5bf7454caa64757642734da9f6b11384c1f9d1a8e699758057"}, 909 | {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:682b987361e5fd7a139ed565e30d81fd81e9629acc7d925a205366877d8c8657"}, 910 | {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce2186a7df133a9c895dea3331ddc5ddad42cdd0d1ea2f0a51e5d161e4762f28"}, 911 | {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9f636b730f7e8cb19feb87094949ba54ee5357440b9658b2a32a5ce4bce53972"}, 912 | {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:73eae06aa53af2ea5270cc066dcaf02cc60d2994bbb2c4ef5764949257d10f43"}, 913 | {file = "multidict-6.1.0-cp39-cp39-win32.whl", hash = "sha256:1ca0083e80e791cffc6efce7660ad24af66c8d4079d2a750b29001b53ff59ada"}, 914 | {file = "multidict-6.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:aa466da5b15ccea564bdab9c89175c762bc12825f4659c11227f515cee76fa4a"}, 915 | {file = "multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506"}, 916 | {file = "multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a"}, 917 | ] 918 | 919 | [[package]] 920 | name = "numpy" 921 | version = "1.26.4" 922 | requires_python = ">=3.9" 923 | summary = "Fundamental package for array computing in Python" 924 | groups = ["default"] 925 | files = [ 926 | {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, 927 | {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, 928 | {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, 929 | {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, 930 | {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, 931 | {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, 932 | {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, 933 | {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, 934 | {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, 935 | {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, 936 | {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, 937 | {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, 938 | {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, 939 | {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, 940 | {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, 941 | {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, 942 | {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, 943 | {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, 944 | {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, 945 | {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, 946 | {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, 947 | {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, 948 | {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, 949 | {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, 950 | {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, 951 | {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, 952 | {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, 953 | {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, 954 | {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, 955 | {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, 956 | {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, 957 | {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, 958 | {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, 959 | {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, 960 | {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, 961 | {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, 962 | ] 963 | 964 | [[package]] 965 | name = "onnxruntime" 966 | version = "1.20.1" 967 | summary = "ONNX Runtime is a runtime accelerator for Machine Learning models" 968 | groups = ["default"] 969 | dependencies = [ 970 | "coloredlogs", 971 | "flatbuffers", 972 | "numpy>=1.21.6", 973 | "packaging", 974 | "protobuf", 975 | "sympy", 976 | ] 977 | files = [ 978 | {file = "onnxruntime-1.20.1-cp310-cp310-macosx_13_0_universal2.whl", hash = "sha256:e50ba5ff7fed4f7d9253a6baf801ca2883cc08491f9d32d78a80da57256a5439"}, 979 | {file = "onnxruntime-1.20.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7b2908b50101a19e99c4d4e97ebb9905561daf61829403061c1adc1b588bc0de"}, 980 | {file = "onnxruntime-1.20.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d82daaec24045a2e87598b8ac2b417b1cce623244e80e663882e9fe1aae86410"}, 981 | {file = "onnxruntime-1.20.1-cp310-cp310-win32.whl", hash = "sha256:4c4b251a725a3b8cf2aab284f7d940c26094ecd9d442f07dd81ab5470e99b83f"}, 982 | {file = "onnxruntime-1.20.1-cp310-cp310-win_amd64.whl", hash = "sha256:d3b616bb53a77a9463707bb313637223380fc327f5064c9a782e8ec69c22e6a2"}, 983 | {file = "onnxruntime-1.20.1-cp311-cp311-macosx_13_0_universal2.whl", hash = "sha256:06bfbf02ca9ab5f28946e0f912a562a5f005301d0c419283dc57b3ed7969bb7b"}, 984 | {file = "onnxruntime-1.20.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f6243e34d74423bdd1edf0ae9596dd61023b260f546ee17d701723915f06a9f7"}, 985 | {file = "onnxruntime-1.20.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5eec64c0269dcdb8d9a9a53dc4d64f87b9e0c19801d9321246a53b7eb5a7d1bc"}, 986 | {file = "onnxruntime-1.20.1-cp311-cp311-win32.whl", hash = "sha256:a19bc6e8c70e2485a1725b3d517a2319603acc14c1f1a017dda0afe6d4665b41"}, 987 | {file = "onnxruntime-1.20.1-cp311-cp311-win_amd64.whl", hash = "sha256:8508887eb1c5f9537a4071768723ec7c30c28eb2518a00d0adcd32c89dea3221"}, 988 | {file = "onnxruntime-1.20.1-cp312-cp312-macosx_13_0_universal2.whl", hash = "sha256:22b0655e2bf4f2161d52706e31f517a0e54939dc393e92577df51808a7edc8c9"}, 989 | {file = "onnxruntime-1.20.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f1f56e898815963d6dc4ee1c35fc6c36506466eff6d16f3cb9848cea4e8c8172"}, 990 | {file = "onnxruntime-1.20.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bb71a814f66517a65628c9e4a2bb530a6edd2cd5d87ffa0af0f6f773a027d99e"}, 991 | {file = "onnxruntime-1.20.1-cp312-cp312-win32.whl", hash = "sha256:bd386cc9ee5f686ee8a75ba74037750aca55183085bf1941da8efcfe12d5b120"}, 992 | {file = "onnxruntime-1.20.1-cp312-cp312-win_amd64.whl", hash = "sha256:19c2d843eb074f385e8bbb753a40df780511061a63f9def1b216bf53860223fb"}, 993 | ] 994 | 995 | [[package]] 996 | name = "packaging" 997 | version = "24.2" 998 | requires_python = ">=3.8" 999 | summary = "Core utilities for Python packages" 1000 | groups = ["default"] 1001 | files = [ 1002 | {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, 1003 | {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, 1004 | ] 1005 | 1006 | [[package]] 1007 | name = "pillow" 1008 | version = "10.4.0" 1009 | requires_python = ">=3.8" 1010 | summary = "Python Imaging Library (Fork)" 1011 | groups = ["default"] 1012 | files = [ 1013 | {file = "pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e"}, 1014 | {file = "pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d"}, 1015 | {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856"}, 1016 | {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f"}, 1017 | {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b"}, 1018 | {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc"}, 1019 | {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e"}, 1020 | {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46"}, 1021 | {file = "pillow-10.4.0-cp310-cp310-win32.whl", hash = "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984"}, 1022 | {file = "pillow-10.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141"}, 1023 | {file = "pillow-10.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1"}, 1024 | {file = "pillow-10.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c"}, 1025 | {file = "pillow-10.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be"}, 1026 | {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3"}, 1027 | {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6"}, 1028 | {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe"}, 1029 | {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319"}, 1030 | {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d"}, 1031 | {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696"}, 1032 | {file = "pillow-10.4.0-cp311-cp311-win32.whl", hash = "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496"}, 1033 | {file = "pillow-10.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91"}, 1034 | {file = "pillow-10.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22"}, 1035 | {file = "pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94"}, 1036 | {file = "pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597"}, 1037 | {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80"}, 1038 | {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca"}, 1039 | {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef"}, 1040 | {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a"}, 1041 | {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b"}, 1042 | {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9"}, 1043 | {file = "pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42"}, 1044 | {file = "pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a"}, 1045 | {file = "pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9"}, 1046 | {file = "pillow-10.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d"}, 1047 | {file = "pillow-10.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b"}, 1048 | {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd"}, 1049 | {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126"}, 1050 | {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b"}, 1051 | {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c"}, 1052 | {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1"}, 1053 | {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df"}, 1054 | {file = "pillow-10.4.0-cp39-cp39-win32.whl", hash = "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef"}, 1055 | {file = "pillow-10.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5"}, 1056 | {file = "pillow-10.4.0-cp39-cp39-win_arm64.whl", hash = "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e"}, 1057 | {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4"}, 1058 | {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da"}, 1059 | {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026"}, 1060 | {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e"}, 1061 | {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5"}, 1062 | {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885"}, 1063 | {file = "pillow-10.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5"}, 1064 | {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b"}, 1065 | {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908"}, 1066 | {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b"}, 1067 | {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8"}, 1068 | {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a"}, 1069 | {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27"}, 1070 | {file = "pillow-10.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3"}, 1071 | {file = "pillow-10.4.0.tar.gz", hash = "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06"}, 1072 | ] 1073 | 1074 | [[package]] 1075 | name = "proglog" 1076 | version = "0.1.10" 1077 | summary = "Log and progress bar manager for console, notebooks, web..." 1078 | groups = ["default"] 1079 | dependencies = [ 1080 | "tqdm", 1081 | ] 1082 | files = [ 1083 | {file = "proglog-0.1.10-py3-none-any.whl", hash = "sha256:19d5da037e8c813da480b741e3fa71fb1ac0a5b02bf21c41577c7f327485ec50"}, 1084 | {file = "proglog-0.1.10.tar.gz", hash = "sha256:658c28c9c82e4caeb2f25f488fff9ceace22f8d69b15d0c1c86d64275e4ddab4"}, 1085 | ] 1086 | 1087 | [[package]] 1088 | name = "propcache" 1089 | version = "0.2.1" 1090 | requires_python = ">=3.9" 1091 | summary = "Accelerated property cache" 1092 | groups = ["default"] 1093 | files = [ 1094 | {file = "propcache-0.2.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6b3f39a85d671436ee3d12c017f8fdea38509e4f25b28eb25877293c98c243f6"}, 1095 | {file = "propcache-0.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d51fbe4285d5db5d92a929e3e21536ea3dd43732c5b177c7ef03f918dff9f2"}, 1096 | {file = "propcache-0.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6445804cf4ec763dc70de65a3b0d9954e868609e83850a47ca4f0cb64bd79fea"}, 1097 | {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9479aa06a793c5aeba49ce5c5692ffb51fcd9a7016e017d555d5e2b0045d212"}, 1098 | {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9631c5e8b5b3a0fda99cb0d29c18133bca1e18aea9effe55adb3da1adef80d3"}, 1099 | {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3156628250f46a0895f1f36e1d4fbe062a1af8718ec3ebeb746f1d23f0c5dc4d"}, 1100 | {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b6fb63ae352e13748289f04f37868099e69dba4c2b3e271c46061e82c745634"}, 1101 | {file = "propcache-0.2.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:887d9b0a65404929641a9fabb6452b07fe4572b269d901d622d8a34a4e9043b2"}, 1102 | {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a96dc1fa45bd8c407a0af03b2d5218392729e1822b0c32e62c5bf7eeb5fb3958"}, 1103 | {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:a7e65eb5c003a303b94aa2c3852ef130230ec79e349632d030e9571b87c4698c"}, 1104 | {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:999779addc413181912e984b942fbcc951be1f5b3663cd80b2687758f434c583"}, 1105 | {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:19a0f89a7bb9d8048d9c4370c9c543c396e894c76be5525f5e1ad287f1750ddf"}, 1106 | {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1ac2f5fe02fa75f56e1ad473f1175e11f475606ec9bd0be2e78e4734ad575034"}, 1107 | {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:574faa3b79e8ebac7cb1d7930f51184ba1ccf69adfdec53a12f319a06030a68b"}, 1108 | {file = "propcache-0.2.1-cp310-cp310-win32.whl", hash = "sha256:03ff9d3f665769b2a85e6157ac8b439644f2d7fd17615a82fa55739bc97863f4"}, 1109 | {file = "propcache-0.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:2d3af2e79991102678f53e0dbf4c35de99b6b8b58f29a27ca0325816364caaba"}, 1110 | {file = "propcache-0.2.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ffc3cca89bb438fb9c95c13fc874012f7b9466b89328c3c8b1aa93cdcfadd16"}, 1111 | {file = "propcache-0.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f174bbd484294ed9fdf09437f889f95807e5f229d5d93588d34e92106fbf6717"}, 1112 | {file = "propcache-0.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:70693319e0b8fd35dd863e3e29513875eb15c51945bf32519ef52927ca883bc3"}, 1113 | {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b480c6a4e1138e1aa137c0079b9b6305ec6dcc1098a8ca5196283e8a49df95a9"}, 1114 | {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d27b84d5880f6d8aa9ae3edb253c59d9f6642ffbb2c889b78b60361eed449787"}, 1115 | {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:857112b22acd417c40fa4595db2fe28ab900c8c5fe4670c7989b1c0230955465"}, 1116 | {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf6c4150f8c0e32d241436526f3c3f9cbd34429492abddbada2ffcff506c51af"}, 1117 | {file = "propcache-0.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66d4cfda1d8ed687daa4bc0274fcfd5267873db9a5bc0418c2da19273040eeb7"}, 1118 | {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c2f992c07c0fca81655066705beae35fc95a2fa7366467366db627d9f2ee097f"}, 1119 | {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:4a571d97dbe66ef38e472703067021b1467025ec85707d57e78711c085984e54"}, 1120 | {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:bb6178c241278d5fe853b3de743087be7f5f4c6f7d6d22a3b524d323eecec505"}, 1121 | {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ad1af54a62ffe39cf34db1aa6ed1a1873bd548f6401db39d8e7cd060b9211f82"}, 1122 | {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e7048abd75fe40712005bcfc06bb44b9dfcd8e101dda2ecf2f5aa46115ad07ca"}, 1123 | {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:160291c60081f23ee43d44b08a7e5fb76681221a8e10b3139618c5a9a291b84e"}, 1124 | {file = "propcache-0.2.1-cp311-cp311-win32.whl", hash = "sha256:819ce3b883b7576ca28da3861c7e1a88afd08cc8c96908e08a3f4dd64a228034"}, 1125 | {file = "propcache-0.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:edc9fc7051e3350643ad929df55c451899bb9ae6d24998a949d2e4c87fb596d3"}, 1126 | {file = "propcache-0.2.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:081a430aa8d5e8876c6909b67bd2d937bfd531b0382d3fdedb82612c618bc41a"}, 1127 | {file = "propcache-0.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d2ccec9ac47cf4e04897619c0e0c1a48c54a71bdf045117d3a26f80d38ab1fb0"}, 1128 | {file = "propcache-0.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:14d86fe14b7e04fa306e0c43cdbeebe6b2c2156a0c9ce56b815faacc193e320d"}, 1129 | {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:049324ee97bb67285b49632132db351b41e77833678432be52bdd0289c0e05e4"}, 1130 | {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cd9a1d071158de1cc1c71a26014dcdfa7dd3d5f4f88c298c7f90ad6f27bb46d"}, 1131 | {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98110aa363f1bb4c073e8dcfaefd3a5cea0f0834c2aab23dda657e4dab2f53b5"}, 1132 | {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:647894f5ae99c4cf6bb82a1bb3a796f6e06af3caa3d32e26d2350d0e3e3faf24"}, 1133 | {file = "propcache-0.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfd3223c15bebe26518d58ccf9a39b93948d3dcb3e57a20480dfdd315356baff"}, 1134 | {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d71264a80f3fcf512eb4f18f59423fe82d6e346ee97b90625f283df56aee103f"}, 1135 | {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:e73091191e4280403bde6c9a52a6999d69cdfde498f1fdf629105247599b57ec"}, 1136 | {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3935bfa5fede35fb202c4b569bb9c042f337ca4ff7bd540a0aa5e37131659348"}, 1137 | {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f508b0491767bb1f2b87fdfacaba5f7eddc2f867740ec69ece6d1946d29029a6"}, 1138 | {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1672137af7c46662a1c2be1e8dc78cb6d224319aaa40271c9257d886be4363a6"}, 1139 | {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b74c261802d3d2b85c9df2dfb2fa81b6f90deeef63c2db9f0e029a3cac50b518"}, 1140 | {file = "propcache-0.2.1-cp312-cp312-win32.whl", hash = "sha256:d09c333d36c1409d56a9d29b3a1b800a42c76a57a5a8907eacdbce3f18768246"}, 1141 | {file = "propcache-0.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:c214999039d4f2a5b2073ac506bba279945233da8c786e490d411dfc30f855c1"}, 1142 | {file = "propcache-0.2.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6a9a8c34fb7bb609419a211e59da8887eeca40d300b5ea8e56af98f6fbbb1541"}, 1143 | {file = "propcache-0.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ae1aa1cd222c6d205853b3013c69cd04515f9d6ab6de4b0603e2e1c33221303e"}, 1144 | {file = "propcache-0.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:accb6150ce61c9c4b7738d45550806aa2b71c7668c6942f17b0ac182b6142fd4"}, 1145 | {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5eee736daafa7af6d0a2dc15cc75e05c64f37fc37bafef2e00d77c14171c2097"}, 1146 | {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7a31fc1e1bd362874863fdeed71aed92d348f5336fd84f2197ba40c59f061bd"}, 1147 | {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba4cfa1052819d16699e1d55d18c92b6e094d4517c41dd231a8b9f87b6fa681"}, 1148 | {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f089118d584e859c62b3da0892b88a83d611c2033ac410e929cb6754eec0ed16"}, 1149 | {file = "propcache-0.2.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:781e65134efaf88feb447e8c97a51772aa75e48b794352f94cb7ea717dedda0d"}, 1150 | {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31f5af773530fd3c658b32b6bdc2d0838543de70eb9a2156c03e410f7b0d3aae"}, 1151 | {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:a7a078f5d37bee6690959c813977da5291b24286e7b962e62a94cec31aa5188b"}, 1152 | {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:cea7daf9fc7ae6687cf1e2c049752f19f146fdc37c2cc376e7d0032cf4f25347"}, 1153 | {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:8b3489ff1ed1e8315674d0775dc7d2195fb13ca17b3808721b54dbe9fd020faf"}, 1154 | {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9403db39be1393618dd80c746cb22ccda168efce239c73af13c3763ef56ffc04"}, 1155 | {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5d97151bc92d2b2578ff7ce779cdb9174337390a535953cbb9452fb65164c587"}, 1156 | {file = "propcache-0.2.1-cp39-cp39-win32.whl", hash = "sha256:9caac6b54914bdf41bcc91e7eb9147d331d29235a7c967c150ef5df6464fd1bb"}, 1157 | {file = "propcache-0.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:92fc4500fcb33899b05ba73276dfb684a20d31caa567b7cb5252d48f896a91b1"}, 1158 | {file = "propcache-0.2.1-py3-none-any.whl", hash = "sha256:52277518d6aae65536e9cea52d4e7fd2f7a66f4aa2d30ed3f2fcea620ace3c54"}, 1159 | {file = "propcache-0.2.1.tar.gz", hash = "sha256:3f77ce728b19cb537714499928fe800c3dda29e8d9428778fc7c186da4c09a64"}, 1160 | ] 1161 | 1162 | [[package]] 1163 | name = "protobuf" 1164 | version = "5.29.3" 1165 | requires_python = ">=3.8" 1166 | summary = "" 1167 | groups = ["default"] 1168 | files = [ 1169 | {file = "protobuf-5.29.3-cp310-abi3-win32.whl", hash = "sha256:3ea51771449e1035f26069c4c7fd51fba990d07bc55ba80701c78f886bf9c888"}, 1170 | {file = "protobuf-5.29.3-cp310-abi3-win_amd64.whl", hash = "sha256:a4fa6f80816a9a0678429e84973f2f98cbc218cca434abe8db2ad0bffc98503a"}, 1171 | {file = "protobuf-5.29.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a8434404bbf139aa9e1300dbf989667a83d42ddda9153d8ab76e0d5dcaca484e"}, 1172 | {file = "protobuf-5.29.3-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:daaf63f70f25e8689c072cfad4334ca0ac1d1e05a92fc15c54eb9cf23c3efd84"}, 1173 | {file = "protobuf-5.29.3-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:c027e08a08be10b67c06bf2370b99c811c466398c357e615ca88c91c07f0910f"}, 1174 | {file = "protobuf-5.29.3-cp39-cp39-win32.whl", hash = "sha256:0eb32bfa5219fc8d4111803e9a690658aa2e6366384fd0851064b963b6d1f2a7"}, 1175 | {file = "protobuf-5.29.3-cp39-cp39-win_amd64.whl", hash = "sha256:6ce8cc3389a20693bfde6c6562e03474c40851b44975c9b2bf6df7d8c4f864da"}, 1176 | {file = "protobuf-5.29.3-py3-none-any.whl", hash = "sha256:0a18ed4a24198528f2333802eb075e59dea9d679ab7a6c5efb017a59004d849f"}, 1177 | {file = "protobuf-5.29.3.tar.gz", hash = "sha256:5da0f41edaf117bde316404bad1a486cb4ededf8e4a54891296f648e8e076620"}, 1178 | ] 1179 | 1180 | [[package]] 1181 | name = "pycparser" 1182 | version = "2.22" 1183 | requires_python = ">=3.8" 1184 | summary = "C parser in Python" 1185 | groups = ["default"] 1186 | marker = "platform_python_implementation != \"PyPy\" and sys_platform == \"linux\"" 1187 | files = [ 1188 | {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, 1189 | {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, 1190 | ] 1191 | 1192 | [[package]] 1193 | name = "pydantic" 1194 | version = "2.10.6" 1195 | requires_python = ">=3.8" 1196 | summary = "Data validation using Python type hints" 1197 | groups = ["default"] 1198 | dependencies = [ 1199 | "annotated-types>=0.6.0", 1200 | "pydantic-core==2.27.2", 1201 | "typing-extensions>=4.12.2", 1202 | ] 1203 | files = [ 1204 | {file = "pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584"}, 1205 | {file = "pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236"}, 1206 | ] 1207 | 1208 | [[package]] 1209 | name = "pydantic-core" 1210 | version = "2.27.2" 1211 | requires_python = ">=3.8" 1212 | summary = "Core functionality for Pydantic validation and serialization" 1213 | groups = ["default"] 1214 | dependencies = [ 1215 | "typing-extensions!=4.7.0,>=4.6.0", 1216 | ] 1217 | files = [ 1218 | {file = "pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa"}, 1219 | {file = "pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c"}, 1220 | {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7969e133a6f183be60e9f6f56bfae753585680f3b7307a8e555a948d443cc05a"}, 1221 | {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3de9961f2a346257caf0aa508a4da705467f53778e9ef6fe744c038119737ef5"}, 1222 | {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2bb4d3e5873c37bb3dd58714d4cd0b0e6238cebc4177ac8fe878f8b3aa8e74c"}, 1223 | {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:280d219beebb0752699480fe8f1dc61ab6615c2046d76b7ab7ee38858de0a4e7"}, 1224 | {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47956ae78b6422cbd46f772f1746799cbb862de838fd8d1fbd34a82e05b0983a"}, 1225 | {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:14d4a5c49d2f009d62a2a7140d3064f686d17a5d1a268bc641954ba181880236"}, 1226 | {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:337b443af21d488716f8d0b6164de833e788aa6bd7e3a39c005febc1284f4962"}, 1227 | {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:03d0f86ea3184a12f41a2d23f7ccb79cdb5a18e06993f8a45baa8dfec746f0e9"}, 1228 | {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7041c36f5680c6e0f08d922aed302e98b3745d97fe1589db0a3eebf6624523af"}, 1229 | {file = "pydantic_core-2.27.2-cp310-cp310-win32.whl", hash = "sha256:50a68f3e3819077be2c98110c1f9dcb3817e93f267ba80a2c05bb4f8799e2ff4"}, 1230 | {file = "pydantic_core-2.27.2-cp310-cp310-win_amd64.whl", hash = "sha256:e0fd26b16394ead34a424eecf8a31a1f5137094cabe84a1bcb10fa6ba39d3d31"}, 1231 | {file = "pydantic_core-2.27.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc"}, 1232 | {file = "pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7"}, 1233 | {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15"}, 1234 | {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306"}, 1235 | {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99"}, 1236 | {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459"}, 1237 | {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048"}, 1238 | {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d"}, 1239 | {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b"}, 1240 | {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474"}, 1241 | {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6"}, 1242 | {file = "pydantic_core-2.27.2-cp311-cp311-win32.whl", hash = "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c"}, 1243 | {file = "pydantic_core-2.27.2-cp311-cp311-win_amd64.whl", hash = "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc"}, 1244 | {file = "pydantic_core-2.27.2-cp311-cp311-win_arm64.whl", hash = "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4"}, 1245 | {file = "pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0"}, 1246 | {file = "pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef"}, 1247 | {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7"}, 1248 | {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934"}, 1249 | {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6"}, 1250 | {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c"}, 1251 | {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2"}, 1252 | {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4"}, 1253 | {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3"}, 1254 | {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4"}, 1255 | {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57"}, 1256 | {file = "pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc"}, 1257 | {file = "pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9"}, 1258 | {file = "pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b"}, 1259 | {file = "pydantic_core-2.27.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c10eb4f1659290b523af58fa7cffb452a61ad6ae5613404519aee4bfbf1df993"}, 1260 | {file = "pydantic_core-2.27.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef592d4bad47296fb11f96cd7dc898b92e795032b4894dfb4076cfccd43a9308"}, 1261 | {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c61709a844acc6bf0b7dce7daae75195a10aac96a596ea1b776996414791ede4"}, 1262 | {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c5f762659e47fdb7b16956c71598292f60a03aa92f8b6351504359dbdba6cf"}, 1263 | {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c9775e339e42e79ec99c441d9730fccf07414af63eac2f0e48e08fd38a64d76"}, 1264 | {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57762139821c31847cfb2df63c12f725788bd9f04bc2fb392790959b8f70f118"}, 1265 | {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d1e85068e818c73e048fe28cfc769040bb1f475524f4745a5dc621f75ac7630"}, 1266 | {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:097830ed52fd9e427942ff3b9bc17fab52913b2f50f2880dc4a5611446606a54"}, 1267 | {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:044a50963a614ecfae59bb1eaf7ea7efc4bc62f49ed594e18fa1e5d953c40e9f"}, 1268 | {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:4e0b4220ba5b40d727c7f879eac379b822eee5d8fff418e9d3381ee45b3b0362"}, 1269 | {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5e4f4bb20d75e9325cc9696c6802657b58bc1dbbe3022f32cc2b2b632c3fbb96"}, 1270 | {file = "pydantic_core-2.27.2-cp39-cp39-win32.whl", hash = "sha256:cca63613e90d001b9f2f9a9ceb276c308bfa2a43fafb75c8031c4f66039e8c6e"}, 1271 | {file = "pydantic_core-2.27.2-cp39-cp39-win_amd64.whl", hash = "sha256:77d1bca19b0f7021b3a982e6f903dcd5b2b06076def36a652e3907f596e29f67"}, 1272 | {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2bf14caea37e91198329b828eae1618c068dfb8ef17bb33287a7ad4b61ac314e"}, 1273 | {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b0cb791f5b45307caae8810c2023a184c74605ec3bcbb67d13846c28ff731ff8"}, 1274 | {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:688d3fd9fcb71f41c4c015c023d12a79d1c4c0732ec9eb35d96e3388a120dcf3"}, 1275 | {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d591580c34f4d731592f0e9fe40f9cc1b430d297eecc70b962e93c5c668f15f"}, 1276 | {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:82f986faf4e644ffc189a7f1aafc86e46ef70372bb153e7001e8afccc6e54133"}, 1277 | {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:bec317a27290e2537f922639cafd54990551725fc844249e64c523301d0822fc"}, 1278 | {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:0296abcb83a797db256b773f45773da397da75a08f5fcaef41f2044adec05f50"}, 1279 | {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0d75070718e369e452075a6017fbf187f788e17ed67a3abd47fa934d001863d9"}, 1280 | {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7e17b560be3c98a8e3aa66ce828bdebb9e9ac6ad5466fba92eb74c4c95cb1151"}, 1281 | {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c33939a82924da9ed65dab5a65d427205a73181d8098e79b6b426bdf8ad4e656"}, 1282 | {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:00bad2484fa6bda1e216e7345a798bd37c68fb2d97558edd584942aa41b7d278"}, 1283 | {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c817e2b40aba42bac6f457498dacabc568c3b7a986fc9ba7c8d9d260b71485fb"}, 1284 | {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:251136cdad0cb722e93732cb45ca5299fb56e1344a833640bf93b2803f8d1bfd"}, 1285 | {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d2088237af596f0a524d3afc39ab3b036e8adb054ee57cbb1dcf8e09da5b29cc"}, 1286 | {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d4041c0b966a84b4ae7a09832eb691a35aec90910cd2dbe7a208de59be77965b"}, 1287 | {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:8083d4e875ebe0b864ffef72a4304827015cff328a1be6e22cc850753bfb122b"}, 1288 | {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f141ee28a0ad2123b6611b6ceff018039df17f32ada8b534e6aa039545a3efb2"}, 1289 | {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7d0c8399fcc1848491f00e0314bd59fb34a9c008761bcb422a057670c3f65e35"}, 1290 | {file = "pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39"}, 1291 | ] 1292 | 1293 | [[package]] 1294 | name = "pydantic-settings" 1295 | version = "2.8.0" 1296 | requires_python = ">=3.8" 1297 | summary = "Settings management using Pydantic" 1298 | groups = ["default"] 1299 | dependencies = [ 1300 | "pydantic>=2.7.0", 1301 | "python-dotenv>=0.21.0", 1302 | ] 1303 | files = [ 1304 | {file = "pydantic_settings-2.8.0-py3-none-any.whl", hash = "sha256:c782c7dc3fb40e97b238e713c25d26f64314aece2e91abcff592fcac15f71820"}, 1305 | {file = "pydantic_settings-2.8.0.tar.gz", hash = "sha256:88e2ca28f6e68ea102c99c3c401d6c9078e68a5df600e97b43891c34e089500a"}, 1306 | ] 1307 | 1308 | [[package]] 1309 | name = "pygments" 1310 | version = "2.19.1" 1311 | requires_python = ">=3.8" 1312 | summary = "Pygments is a syntax highlighting package written in Python." 1313 | groups = ["default"] 1314 | files = [ 1315 | {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"}, 1316 | {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"}, 1317 | ] 1318 | 1319 | [[package]] 1320 | name = "pyreadline3" 1321 | version = "3.5.4" 1322 | requires_python = ">=3.8" 1323 | summary = "A python implementation of GNU readline." 1324 | groups = ["default"] 1325 | marker = "sys_platform == \"win32\" and python_version >= \"3.8\"" 1326 | files = [ 1327 | {file = "pyreadline3-3.5.4-py3-none-any.whl", hash = "sha256:eaf8e6cc3c49bcccf145fc6067ba8643d1df34d604a1ec0eccbf7a18e6d3fae6"}, 1328 | {file = "pyreadline3-3.5.4.tar.gz", hash = "sha256:8d57d53039a1c75adba8e50dd3d992b28143480816187ea5efbd5c78e6c885b7"}, 1329 | ] 1330 | 1331 | [[package]] 1332 | name = "pytelegrambotapi" 1333 | version = "4.26.0" 1334 | requires_python = ">=3.9" 1335 | summary = "Python Telegram bot api." 1336 | groups = ["default"] 1337 | dependencies = [ 1338 | "requests", 1339 | ] 1340 | files = [ 1341 | {file = "pytelegrambotapi-4.26.0-py3-none-any.whl", hash = "sha256:6a7a10571dcecc01aac917269baf4321a0518d5db1fe57b6a09b76cab2bd6b91"}, 1342 | {file = "pytelegrambotapi-4.26.0.tar.gz", hash = "sha256:ba92f6a83bf991cbf189577dbc314976032ad8a3fbe6cd631d0ccd79db8523f9"}, 1343 | ] 1344 | 1345 | [[package]] 1346 | name = "python-dotenv" 1347 | version = "1.0.1" 1348 | requires_python = ">=3.8" 1349 | summary = "Read key-value pairs from a .env file and set them as environment variables" 1350 | groups = ["default"] 1351 | files = [ 1352 | {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, 1353 | {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, 1354 | ] 1355 | 1356 | [[package]] 1357 | name = "pywin32-ctypes" 1358 | version = "0.2.3" 1359 | requires_python = ">=3.6" 1360 | summary = "A (partial) reimplementation of pywin32 using ctypes/cffi" 1361 | groups = ["default"] 1362 | marker = "sys_platform == \"win32\"" 1363 | files = [ 1364 | {file = "pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755"}, 1365 | {file = "pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8"}, 1366 | ] 1367 | 1368 | [[package]] 1369 | name = "requests" 1370 | version = "2.32.3" 1371 | requires_python = ">=3.8" 1372 | summary = "Python HTTP for Humans." 1373 | groups = ["default"] 1374 | dependencies = [ 1375 | "certifi>=2017.4.17", 1376 | "charset-normalizer<4,>=2", 1377 | "idna<4,>=2.5", 1378 | "urllib3<3,>=1.21.1", 1379 | ] 1380 | files = [ 1381 | {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, 1382 | {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, 1383 | ] 1384 | 1385 | [[package]] 1386 | name = "rich" 1387 | version = "13.9.4" 1388 | requires_python = ">=3.8.0" 1389 | summary = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" 1390 | groups = ["default"] 1391 | dependencies = [ 1392 | "markdown-it-py>=2.2.0", 1393 | "pygments<3.0.0,>=2.13.0", 1394 | "typing-extensions<5.0,>=4.0.0; python_version < \"3.11\"", 1395 | ] 1396 | files = [ 1397 | {file = "rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90"}, 1398 | {file = "rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098"}, 1399 | ] 1400 | 1401 | [[package]] 1402 | name = "secretstorage" 1403 | version = "3.3.3" 1404 | requires_python = ">=3.6" 1405 | summary = "Python bindings to FreeDesktop.org Secret Service API" 1406 | groups = ["default"] 1407 | marker = "sys_platform == \"linux\"" 1408 | dependencies = [ 1409 | "cryptography>=2.0", 1410 | "jeepney>=0.6", 1411 | ] 1412 | files = [ 1413 | {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, 1414 | {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, 1415 | ] 1416 | 1417 | [[package]] 1418 | name = "setuptools" 1419 | version = "75.8.2" 1420 | requires_python = ">=3.9" 1421 | summary = "Easily download, build, install, upgrade, and uninstall Python packages" 1422 | groups = ["default"] 1423 | files = [ 1424 | {file = "setuptools-75.8.2-py3-none-any.whl", hash = "sha256:558e47c15f1811c1fa7adbd0096669bf76c1d3f433f58324df69f3f5ecac4e8f"}, 1425 | {file = "setuptools-75.8.2.tar.gz", hash = "sha256:4880473a969e5f23f2a2be3646b2dfd84af9028716d398e46192f84bc36900d2"}, 1426 | ] 1427 | 1428 | [[package]] 1429 | name = "sniffio" 1430 | version = "1.3.1" 1431 | requires_python = ">=3.7" 1432 | summary = "Sniff out which async library your code is running under" 1433 | groups = ["default"] 1434 | files = [ 1435 | {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, 1436 | {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, 1437 | ] 1438 | 1439 | [[package]] 1440 | name = "sympy" 1441 | version = "1.13.3" 1442 | requires_python = ">=3.8" 1443 | summary = "Computer algebra system (CAS) in Python" 1444 | groups = ["default"] 1445 | dependencies = [ 1446 | "mpmath<1.4,>=1.1.0", 1447 | ] 1448 | files = [ 1449 | {file = "sympy-1.13.3-py3-none-any.whl", hash = "sha256:54612cf55a62755ee71824ce692986f23c88ffa77207b30c1368eda4a7060f73"}, 1450 | {file = "sympy-1.13.3.tar.gz", hash = "sha256:b27fd2c6530e0ab39e275fc9b683895367e51d5da91baa8d3d64db2565fec4d9"}, 1451 | ] 1452 | 1453 | [[package]] 1454 | name = "tabulate" 1455 | version = "0.9.0" 1456 | requires_python = ">=3.7" 1457 | summary = "Pretty-print tabular data" 1458 | groups = ["default"] 1459 | files = [ 1460 | {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, 1461 | {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, 1462 | ] 1463 | 1464 | [[package]] 1465 | name = "telegram-sticker-utils" 1466 | version = "0.2.23" 1467 | requires_python = "<3.13,>=3.9" 1468 | summary = "easy and fast processing of telegram stickers" 1469 | groups = ["default"] 1470 | dependencies = [ 1471 | "Pillow>=6.2.0", 1472 | "Wand>=0.6.13", 1473 | "emoji>=2.12.1", 1474 | "ffmpy>=0.3.2", 1475 | "loguru>=0.7.2", 1476 | "magika>=0.5.1", 1477 | "moviepy>=1.0.3", 1478 | "setuptools>=60.0.0", 1479 | ] 1480 | files = [ 1481 | {file = "telegram_sticker_utils-0.2.23-py3-none-any.whl", hash = "sha256:af8c1178e24928759ce097851eecf22d359f8ba35470153c95a8295f6355c96d"}, 1482 | {file = "telegram_sticker_utils-0.2.23.tar.gz", hash = "sha256:b66e7959f9ca12485bc7a6a6ae34bc17294486c567d7a0f1bfaec08922210095"}, 1483 | ] 1484 | 1485 | [[package]] 1486 | name = "tqdm" 1487 | version = "4.67.1" 1488 | requires_python = ">=3.7" 1489 | summary = "Fast, Extensible Progress Meter" 1490 | groups = ["default"] 1491 | dependencies = [ 1492 | "colorama; platform_system == \"Windows\"", 1493 | ] 1494 | files = [ 1495 | {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"}, 1496 | {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"}, 1497 | ] 1498 | 1499 | [[package]] 1500 | name = "typing-extensions" 1501 | version = "4.12.2" 1502 | requires_python = ">=3.8" 1503 | summary = "Backported and Experimental Type Hints for Python 3.8+" 1504 | groups = ["default"] 1505 | files = [ 1506 | {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, 1507 | {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, 1508 | ] 1509 | 1510 | [[package]] 1511 | name = "urllib3" 1512 | version = "2.3.0" 1513 | requires_python = ">=3.9" 1514 | summary = "HTTP library with thread-safe connection pooling, file post, and more." 1515 | groups = ["default"] 1516 | files = [ 1517 | {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"}, 1518 | {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"}, 1519 | ] 1520 | 1521 | [[package]] 1522 | name = "wand" 1523 | version = "0.6.13" 1524 | summary = "Ctypes-based simple MagickWand API binding for Python" 1525 | groups = ["default"] 1526 | files = [ 1527 | {file = "Wand-0.6.13-py2.py3-none-any.whl", hash = "sha256:e5dda0ac2204a40c29ef5c4cb310770c95d3d05c37b1379e69c94ea79d7d19c0"}, 1528 | {file = "Wand-0.6.13.tar.gz", hash = "sha256:f5013484eaf7a20eb22d1821aaefe60b50cc329722372b5f8565d46d4aaafcca"}, 1529 | ] 1530 | 1531 | [[package]] 1532 | name = "win32-setctime" 1533 | version = "1.2.0" 1534 | requires_python = ">=3.5" 1535 | summary = "A small Python utility to set file creation time on Windows" 1536 | groups = ["default"] 1537 | marker = "sys_platform == \"win32\"" 1538 | files = [ 1539 | {file = "win32_setctime-1.2.0-py3-none-any.whl", hash = "sha256:95d644c4e708aba81dc3704a116d8cbc974d70b3bdb8be1d150e36be6e9d1390"}, 1540 | {file = "win32_setctime-1.2.0.tar.gz", hash = "sha256:ae1fdf948f5640aae05c511ade119313fb6a30d7eabe25fef9764dca5873c4c0"}, 1541 | ] 1542 | 1543 | [[package]] 1544 | name = "yarl" 1545 | version = "1.18.3" 1546 | requires_python = ">=3.9" 1547 | summary = "Yet another URL library" 1548 | groups = ["default"] 1549 | dependencies = [ 1550 | "idna>=2.0", 1551 | "multidict>=4.0", 1552 | "propcache>=0.2.0", 1553 | ] 1554 | files = [ 1555 | {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7df647e8edd71f000a5208fe6ff8c382a1de8edfbccdbbfe649d263de07d8c34"}, 1556 | {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c69697d3adff5aa4f874b19c0e4ed65180ceed6318ec856ebc423aa5850d84f7"}, 1557 | {file = "yarl-1.18.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:602d98f2c2d929f8e697ed274fbadc09902c4025c5a9963bf4e9edfc3ab6f7ed"}, 1558 | {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c654d5207c78e0bd6d749f6dae1dcbbfde3403ad3a4b11f3c5544d9906969dde"}, 1559 | {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5094d9206c64181d0f6e76ebd8fb2f8fe274950a63890ee9e0ebfd58bf9d787b"}, 1560 | {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35098b24e0327fc4ebdc8ffe336cee0a87a700c24ffed13161af80124b7dc8e5"}, 1561 | {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3236da9272872443f81fedc389bace88408f64f89f75d1bdb2256069a8730ccc"}, 1562 | {file = "yarl-1.18.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2c08cc9b16f4f4bc522771d96734c7901e7ebef70c6c5c35dd0f10845270bcd"}, 1563 | {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80316a8bd5109320d38eef8833ccf5f89608c9107d02d2a7f985f98ed6876990"}, 1564 | {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c1e1cc06da1491e6734f0ea1e6294ce00792193c463350626571c287c9a704db"}, 1565 | {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fea09ca13323376a2fdfb353a5fa2e59f90cd18d7ca4eaa1fd31f0a8b4f91e62"}, 1566 | {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e3b9fd71836999aad54084906f8663dffcd2a7fb5cdafd6c37713b2e72be1760"}, 1567 | {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:757e81cae69244257d125ff31663249b3013b5dc0a8520d73694aed497fb195b"}, 1568 | {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b1771de9944d875f1b98a745bc547e684b863abf8f8287da8466cf470ef52690"}, 1569 | {file = "yarl-1.18.3-cp310-cp310-win32.whl", hash = "sha256:8874027a53e3aea659a6d62751800cf6e63314c160fd607489ba5c2edd753cf6"}, 1570 | {file = "yarl-1.18.3-cp310-cp310-win_amd64.whl", hash = "sha256:93b2e109287f93db79210f86deb6b9bbb81ac32fc97236b16f7433db7fc437d8"}, 1571 | {file = "yarl-1.18.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8503ad47387b8ebd39cbbbdf0bf113e17330ffd339ba1144074da24c545f0069"}, 1572 | {file = "yarl-1.18.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:02ddb6756f8f4517a2d5e99d8b2f272488e18dd0bfbc802f31c16c6c20f22193"}, 1573 | {file = "yarl-1.18.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:67a283dd2882ac98cc6318384f565bffc751ab564605959df4752d42483ad889"}, 1574 | {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d980e0325b6eddc81331d3f4551e2a333999fb176fd153e075c6d1c2530aa8a8"}, 1575 | {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b643562c12680b01e17239be267bc306bbc6aac1f34f6444d1bded0c5ce438ca"}, 1576 | {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c017a3b6df3a1bd45b9fa49a0f54005e53fbcad16633870104b66fa1a30a29d8"}, 1577 | {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75674776d96d7b851b6498f17824ba17849d790a44d282929c42dbb77d4f17ae"}, 1578 | {file = "yarl-1.18.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ccaa3a4b521b780a7e771cc336a2dba389a0861592bbce09a476190bb0c8b4b3"}, 1579 | {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2d06d3005e668744e11ed80812e61efd77d70bb7f03e33c1598c301eea20efbb"}, 1580 | {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:9d41beda9dc97ca9ab0b9888cb71f7539124bc05df02c0cff6e5acc5a19dcc6e"}, 1581 | {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ba23302c0c61a9999784e73809427c9dbedd79f66a13d84ad1b1943802eaaf59"}, 1582 | {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6748dbf9bfa5ba1afcc7556b71cda0d7ce5f24768043a02a58846e4a443d808d"}, 1583 | {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0b0cad37311123211dc91eadcb322ef4d4a66008d3e1bdc404808992260e1a0e"}, 1584 | {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0fb2171a4486bb075316ee754c6d8382ea6eb8b399d4ec62fde2b591f879778a"}, 1585 | {file = "yarl-1.18.3-cp311-cp311-win32.whl", hash = "sha256:61b1a825a13bef4a5f10b1885245377d3cd0bf87cba068e1d9a88c2ae36880e1"}, 1586 | {file = "yarl-1.18.3-cp311-cp311-win_amd64.whl", hash = "sha256:b9d60031cf568c627d028239693fd718025719c02c9f55df0a53e587aab951b5"}, 1587 | {file = "yarl-1.18.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1dd4bdd05407ced96fed3d7f25dbbf88d2ffb045a0db60dbc247f5b3c5c25d50"}, 1588 | {file = "yarl-1.18.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7c33dd1931a95e5d9a772d0ac5e44cac8957eaf58e3c8da8c1414de7dd27c576"}, 1589 | {file = "yarl-1.18.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:25b411eddcfd56a2f0cd6a384e9f4f7aa3efee14b188de13048c25b5e91f1640"}, 1590 | {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:436c4fc0a4d66b2badc6c5fc5ef4e47bb10e4fd9bf0c79524ac719a01f3607c2"}, 1591 | {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e35ef8683211db69ffe129a25d5634319a677570ab6b2eba4afa860f54eeaf75"}, 1592 | {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84b2deecba4a3f1a398df819151eb72d29bfeb3b69abb145a00ddc8d30094512"}, 1593 | {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00e5a1fea0fd4f5bfa7440a47eff01d9822a65b4488f7cff83155a0f31a2ecba"}, 1594 | {file = "yarl-1.18.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0e883008013c0e4aef84dcfe2a0b172c4d23c2669412cf5b3371003941f72bb"}, 1595 | {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5a3f356548e34a70b0172d8890006c37be92995f62d95a07b4a42e90fba54272"}, 1596 | {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ccd17349166b1bee6e529b4add61727d3f55edb7babbe4069b5764c9587a8cc6"}, 1597 | {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b958ddd075ddba5b09bb0be8a6d9906d2ce933aee81100db289badbeb966f54e"}, 1598 | {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c7d79f7d9aabd6011004e33b22bc13056a3e3fb54794d138af57f5ee9d9032cb"}, 1599 | {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4891ed92157e5430874dad17b15eb1fda57627710756c27422200c52d8a4e393"}, 1600 | {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ce1af883b94304f493698b00d0f006d56aea98aeb49d75ec7d98cd4a777e9285"}, 1601 | {file = "yarl-1.18.3-cp312-cp312-win32.whl", hash = "sha256:f91c4803173928a25e1a55b943c81f55b8872f0018be83e3ad4938adffb77dd2"}, 1602 | {file = "yarl-1.18.3-cp312-cp312-win_amd64.whl", hash = "sha256:7e2ee16578af3b52ac2f334c3b1f92262f47e02cc6193c598502bd46f5cd1477"}, 1603 | {file = "yarl-1.18.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:61e5e68cb65ac8f547f6b5ef933f510134a6bf31bb178be428994b0cb46c2a04"}, 1604 | {file = "yarl-1.18.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fe57328fbc1bfd0bd0514470ac692630f3901c0ee39052ae47acd1d90a436719"}, 1605 | {file = "yarl-1.18.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a440a2a624683108a1b454705ecd7afc1c3438a08e890a1513d468671d90a04e"}, 1606 | {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09c7907c8548bcd6ab860e5f513e727c53b4a714f459b084f6580b49fa1b9cee"}, 1607 | {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b4f6450109834af88cb4cc5ecddfc5380ebb9c228695afc11915a0bf82116789"}, 1608 | {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9ca04806f3be0ac6d558fffc2fdf8fcef767e0489d2684a21912cc4ed0cd1b8"}, 1609 | {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77a6e85b90a7641d2e07184df5557132a337f136250caafc9ccaa4a2a998ca2c"}, 1610 | {file = "yarl-1.18.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6333c5a377c8e2f5fae35e7b8f145c617b02c939d04110c76f29ee3676b5f9a5"}, 1611 | {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0b3c92fa08759dbf12b3a59579a4096ba9af8dd344d9a813fc7f5070d86bbab1"}, 1612 | {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:4ac515b860c36becb81bb84b667466885096b5fc85596948548b667da3bf9f24"}, 1613 | {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:045b8482ce9483ada4f3f23b3774f4e1bf4f23a2d5c912ed5170f68efb053318"}, 1614 | {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:a4bb030cf46a434ec0225bddbebd4b89e6471814ca851abb8696170adb163985"}, 1615 | {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:54d6921f07555713b9300bee9c50fb46e57e2e639027089b1d795ecd9f7fa910"}, 1616 | {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1d407181cfa6e70077df3377938c08012d18893f9f20e92f7d2f314a437c30b1"}, 1617 | {file = "yarl-1.18.3-cp39-cp39-win32.whl", hash = "sha256:ac36703a585e0929b032fbaab0707b75dc12703766d0b53486eabd5139ebadd5"}, 1618 | {file = "yarl-1.18.3-cp39-cp39-win_amd64.whl", hash = "sha256:ba87babd629f8af77f557b61e49e7c7cac36f22f871156b91e10a6e9d4f829e9"}, 1619 | {file = "yarl-1.18.3-py3-none-any.whl", hash = "sha256:b57f4f58099328dfb26c6a771d09fb20dbbae81d20cfb66141251ea063bd101b"}, 1620 | {file = "yarl-1.18.3.tar.gz", hash = "sha256:ac1801c45cbf77b6c99242eeff4fffb5e4e73a800b5c4ad4fc0be5def634d2e1"}, 1621 | ] 1622 | 1623 | [[package]] 1624 | name = "zipp" 1625 | version = "3.21.0" 1626 | requires_python = ">=3.9" 1627 | summary = "Backport of pathlib-compatible object wrapper for zip files" 1628 | groups = ["default"] 1629 | marker = "python_version < \"3.12\"" 1630 | files = [ 1631 | {file = "zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"}, 1632 | {file = "zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4"}, 1633 | ] 1634 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [project] 2 | name = "tsticker" 3 | version = "0.1.22" 4 | description = "Telegram sticker management tool" 5 | authors = [ 6 | { name = "sudoskys", email = "coldlando@hotmail.com" }, 7 | ] 8 | dependencies = [ 9 | "pytelegrambotapi>=4.21.0", 10 | "pydantic-settings>=2.3.4", 11 | "pydantic>=2.8.2", 12 | "loguru>=0.7.2", 13 | "rich>=13.7.1", 14 | "asyncclick>=8.1.7.2", 15 | "keyring>=25.2.1", 16 | "aiohttp>=3.9.5", 17 | "emoji>=2.12.1", 18 | "setuptools>=70.3.0", 19 | "telegram-sticker-utils>=0.2.23", 20 | "httpx>=0.28.1", 21 | ] 22 | requires-python = ">=3.9,<3.13" 23 | readme = "README.md" 24 | license = { text = "MIT" } 25 | 26 | [build-system] 27 | requires = ["pdm-backend"] 28 | build-backend = "pdm.backend" 29 | 30 | 31 | [tool.pdm] 32 | distribution = true 33 | 34 | 35 | [project.scripts] 36 | tsticker = "tsticker.cli:cli" -------------------------------------------------------------------------------- /src/tsticker/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sudoskys/tsticker/30902ecb08165c52fddf96f14fcf4d18d40f6fb3/src/tsticker/__init__.py -------------------------------------------------------------------------------- /src/tsticker/cli.py: -------------------------------------------------------------------------------- 1 | import atexit 2 | import datetime 3 | import os 4 | import pathlib 5 | import shutil 6 | from collections import defaultdict 7 | from typing import Literal, Optional, Text 8 | 9 | import asyncclick 10 | import keyring 11 | from magika import Magika 12 | from pydantic import ValidationError 13 | from rich.panel import Panel 14 | from rich.text import Text 15 | from telebot.async_telebot import AsyncTeleBot 16 | from telebot.types import StickerSet 17 | 18 | from tsticker.const import STICKER_DIR_NAME, SNAPSHOT_DIR_NAME, SNAPSHOT_MAX_COUNT 19 | from tsticker.core import StickerValidateInput 20 | from tsticker.core.const import SERVICE_NAME, USERNAME 21 | from tsticker.core.create import StickerIndexFile, Emote 22 | from tsticker.utils import console, Credentials, create_sticker, check_for_updates, \ 23 | close_session_sync, limited_request 24 | 25 | magika = Magika() 26 | # 注册关闭钩子 27 | atexit.register(close_session_sync) 28 | 29 | 30 | def save_credentials( 31 | token: str, 32 | owner_id: str, 33 | bot_proxy: str | None 34 | ) -> Credentials: 35 | """ 36 | Save credentials to keyring. 37 | :param token: Get it from @BotFather, e.g. 123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11 38 | :param owner_id: Owner(Human) id of sticker pack 39 | :param bot_proxy: Your bot proxy 40 | :return: Credentials 41 | """ 42 | credentials = Credentials(token=token, bot_proxy=bot_proxy, owner_id=owner_id) 43 | keyring.set_password(SERVICE_NAME, USERNAME, credentials.model_dump_json()) 44 | return credentials 45 | 46 | 47 | def get_credentials() -> Credentials | None: 48 | stored_data = keyring.get_password(SERVICE_NAME, USERNAME) 49 | if stored_data: 50 | return Credentials.model_validate_json(stored_data) 51 | return None 52 | 53 | 54 | def delete_same_name_files(sticker_table_dir: pathlib.Path): 55 | """ 56 | Delete files that have the same name but different extensions. 57 | :param sticker_table_dir: pathlib.Path 58 | :return: None 59 | """ 60 | # Check if the directory exists 61 | if not sticker_table_dir.exists(): 62 | console.print(f"Directory {sticker_table_dir} does not exist.") 63 | return 64 | # Group files by their base name 65 | files_by_name = defaultdict(list) 66 | for file in sticker_table_dir.iterdir(): 67 | if file.is_file(): 68 | files_by_name[file.stem].append(file) 69 | # Delete files that have the same name but different extensions 70 | for files in files_by_name.values(): 71 | if len(files) > 1: 72 | for file in files[1:]: 73 | console.print(f"[bold yellow]Deleting duplicate file: {file.name}[/]") 74 | file.unlink() 75 | 76 | 77 | def get_stickers_path(index_file: pathlib.Path): 78 | """ 79 | Get the path to the stickers directory. 80 | :param index_file: pathlib.Path 81 | :return: pathlib.Path 82 | :raise FileNotFoundError: if the stickers directory does not exist 83 | """ 84 | sticker_table_dir = index_file.parent.joinpath(STICKER_DIR_NAME) 85 | if not sticker_table_dir.exists(): 86 | sticker_table_dir.mkdir(exist_ok=True) 87 | if not sticker_table_dir.is_dir(): 88 | raise FileNotFoundError(f"Sticker path is not a directory: {sticker_table_dir}") 89 | return sticker_table_dir 90 | 91 | 92 | def get_snapshot_path(index_file: pathlib.Path): 93 | """ 94 | Get the path to the snapshot directory. 95 | :param index_file: pathlib.Path 96 | :return: pathlib.Path 97 | :raise FileNotFoundError: if the snapshot directory does not exist 98 | """ 99 | snapshot_dir = index_file.parent.joinpath(SNAPSHOT_DIR_NAME) 100 | if not snapshot_dir.exists(): 101 | snapshot_dir.mkdir(exist_ok=True) 102 | if not snapshot_dir.is_dir(): 103 | raise FileNotFoundError(f"Snapshot path is not a directory: {snapshot_dir}") 104 | return snapshot_dir 105 | 106 | 107 | def backup_snapshot(index_file: pathlib.Path): 108 | """ 109 | Create a backup of the stickers directory. 110 | :param index_file: pathlib.Path 111 | :return: None 112 | :raise FileNotFoundError: if the snapshot directory does not exist 113 | """ 114 | sticker_table_dir = get_stickers_path(index_file=index_file) 115 | snapshot_dir = get_snapshot_path(index_file=index_file) 116 | # 获取现有快照 117 | snapshots = sorted(snapshot_dir.glob(f"{SNAPSHOT_DIR_NAME}_*"), key=os.path.getmtime) 118 | # 如果快照超过10个,删除最旧的 119 | 120 | while len(snapshots) >= SNAPSHOT_MAX_COUNT: 121 | deleted_snapshot = snapshots.pop(0) 122 | console.print(f"[dark_orange]! Cleaning up old snapshot:[/] [gray42]{deleted_snapshot}[/]") 123 | shutil.rmtree(deleted_snapshot) 124 | # 创建新的快照 125 | timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S") 126 | new_snapshot = snapshot_dir.joinpath(f"{SNAPSHOT_DIR_NAME}_{timestamp}") 127 | shutil.copytree(sticker_table_dir, new_snapshot) 128 | console.print( 129 | f"[dark_sea_green]✔ Snapshot backup {len(snapshots) + 1}(MAX {SNAPSHOT_MAX_COUNT}) created successfully at:[/] [gray42]{new_snapshot}[/]") 130 | console.print( 131 | f"[dark_sea_green] You can restore it by copying the contents back to the stickers directory.[/]" 132 | ) 133 | 134 | 135 | @asyncclick.group() 136 | async def cli(): 137 | """TSticker CLI.""" 138 | pass 139 | 140 | 141 | @asyncclick.command() 142 | @asyncclick.option( 143 | '-t', '--token', 144 | required=True, 145 | help='Your BotToken, you can get it from @BotFather, e.g. 123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11' 146 | ) 147 | @asyncclick.option( 148 | '-u', '--user', 149 | required=True, 150 | help='Owner id of sticker pack' 151 | ) 152 | @asyncclick.option( 153 | '-p', '--proxy', 154 | required=False, 155 | help='Your bot proxy' 156 | ) 157 | async def login( 158 | token: str, 159 | user: str, 160 | proxy: str | None = None 161 | ): 162 | """Log in using a token and optional bot proxy.""" 163 | # 判断是否是 int 的 id 164 | try: 165 | int(user) 166 | except ValueError: 167 | console.print("[bold red]Invalid user id[/]") 168 | return 169 | try: 170 | save_credentials(token=token, bot_proxy=proxy, owner_id=user) 171 | except Exception as e: 172 | console.print(f"[bold red]Failed to save credentials: {e}[/]") 173 | return 174 | console.print("[bold yellow]NOTE:[/] Sticker packs created by this bot can only be managed by this bot.") 175 | console.print(f"[bold dark_green]You are now logged in.[/]") 176 | 177 | 178 | async def download_and_write_file( 179 | telegram_bot: AsyncTeleBot, 180 | file_id: str, 181 | file_unique_id: str, 182 | sticker_table_dir: pathlib.Path 183 | ): 184 | """下载文件并写入本地文件夹。""" 185 | sticker_raw = await limited_request(telegram_bot.get_file(file_id=file_id)) 186 | sticker_io = await limited_request(telegram_bot.download_file(file_path=sticker_raw.file_path)) 187 | if not sticker_io: 188 | return console.print(f"[bold red]Failed to download file: {file_unique_id}[/]") 189 | idf = magika.identify_bytes(sticker_io) 190 | content_type_label = idf.output.ct_label 191 | file_name = f"{file_unique_id}.{content_type_label}" 192 | sticker_file = sticker_table_dir.joinpath(file_name) 193 | sticker_file.write_bytes(sticker_io) 194 | return sticker_file 195 | 196 | 197 | async def download_sticker_set( 198 | pack_name: str, 199 | telegram_bot: AsyncTeleBot, 200 | download_dir: pathlib.Path 201 | ): 202 | sticker_set = await limited_request(telegram_bot.get_sticker_set(pack_name)) 203 | if not sticker_set: 204 | console.print(f"[bold red]Sticker set not found: {pack_name}[/]") 205 | return 206 | sticker_set: StickerSet 207 | sticker_table_dir = download_dir.joinpath(pack_name) 208 | sticker_table_dir.mkdir(exist_ok=True) 209 | delete_same_name_files(sticker_table_dir) 210 | total_stickers = len(sticker_set.stickers) 211 | with console.status("[bold cyan]Downloading pack...[/]", spinner='dots') as status: 212 | # 不用 asyncio.gather 是因为 Telegram 服务器会Block 213 | index = 0 214 | for sticker in sticker_set.stickers: 215 | index += 1 216 | status.update(f"[bold cyan]Downloading sticker: {sticker.file_id}...[/] {index}/{total_stickers}") 217 | await download_and_write_file( 218 | telegram_bot=telegram_bot, 219 | file_id=sticker.file_id, 220 | file_unique_id=sticker.file_unique_id, 221 | sticker_table_dir=sticker_table_dir 222 | ) 223 | console.print(f"[bold dark_green]Downloaded sticker set: {pack_name}[/]") 224 | 225 | 226 | async def sync_index( 227 | telegram_bot: AsyncTeleBot, 228 | index_file: pathlib.Path, 229 | cloud_sticker_set: StickerSet 230 | ): 231 | """ 232 | 从云端下载索引文件,同步本地索引文件 233 | :param telegram_bot: AsyncTeleBot 234 | :param index_file: 索引文件 235 | :param cloud_sticker_set: 云端的贴纸集 236 | """ 237 | try: 238 | pack = StickerIndexFile.model_validate_json(index_file.read_text()) 239 | except Exception as e: 240 | console.print(f"[bold red]Index file was corrupted: {e}[/]") 241 | return 242 | try: 243 | sticker_table_dir = get_stickers_path(index_file=index_file) 244 | except FileNotFoundError as e: 245 | console.print(f"[bold red]Sticker directory not found: {e}[/]") 246 | return 247 | delete_same_name_files(sticker_table_dir) 248 | local_files: dict[str, pathlib.Path] = { 249 | f.stem: f 250 | for f in sticker_table_dir.glob('*') 251 | } 252 | cloud_files = { 253 | sticker.file_unique_id: sticker 254 | for sticker in cloud_sticker_set.stickers 255 | } 256 | to_delete = [ 257 | local_files[ids] 258 | for ids in local_files if ids not in cloud_files 259 | ] 260 | to_validate = [ 261 | local_files[ids] 262 | for ids in local_files if ids in cloud_files 263 | ] 264 | to_download = [ 265 | ids 266 | for ids in cloud_files if ids not in local_files 267 | ] 268 | 269 | if to_delete: 270 | # 格式化列表内容 271 | file_list_text = "\n".join([f"- [bold grey42]{file_name.name}[/]" for file_name in to_delete]) 272 | # 创建 Panel 273 | panel = Panel( 274 | Text.from_markup(file_list_text), 275 | title="Cleaning Up Files", 276 | subtitle=f"Files to delete: {len(to_delete)}", 277 | style="yellow", 278 | ) 279 | console.print(panel) 280 | 281 | for file_path in to_delete: 282 | file_path.unlink() 283 | 284 | for file_path in to_validate: 285 | local_size = file_path.stat().st_size 286 | sticker_size = cloud_files[file_path.stem].file_size 287 | if local_size != sticker_size: 288 | console.print(f"[bold yellow]File size mismatch for {file_path.name}, re-downloading...[/]") 289 | file_path.unlink() 290 | to_download.append(file_path.stem) 291 | """ 292 | Telegram Server 会 Block,所以不要使用 asyncio.gather 293 | tasks = [ 294 | download_and_write_file(app, cloud_files[file_id], sticker_table_dir) 295 | for file_id in to_download 296 | ] 297 | await asyncio.gather(*tasks) 298 | """ 299 | with console.status("[bold cyan]Synchronizing index...[/]", spinner='dots') as status: 300 | # 不用 asyncio.gather 是因为 Telegram 服务器会Block 301 | index = 0 302 | for file_id in to_download: 303 | index += 1 304 | status.update(f"[bold cyan]Synchronizing indexes: {file_id}...[/] {index}/{len(to_download)}") 305 | await download_and_write_file( 306 | telegram_bot=telegram_bot, 307 | file_id=cloud_files[file_id].file_id, 308 | file_unique_id=cloud_files[file_id].file_unique_id, 309 | sticker_table_dir=sticker_table_dir 310 | ) 311 | # 更新索引文件 312 | emote_update = [] 313 | for file_id, sticker in cloud_files.items(): 314 | emote_update.append( 315 | Emote( 316 | emoji=sticker.emoji, 317 | file_id=file_id, 318 | ) 319 | ) 320 | pack.emotes = emote_update 321 | with index_file.open("w") as f: 322 | f.write(pack.model_dump_json(indent=2)) 323 | console.print(f"[bold dark_green]✔ Synchronization completed![/] [grey42]{len(to_download)} files downloaded[/]") 324 | 325 | 326 | @asyncclick.command() 327 | async def logout(): 328 | """Log out.""" 329 | keyring.delete_password(SERVICE_NAME, USERNAME) 330 | console.print("[bold yellow]✔ You are now logged out.[/]") 331 | 332 | 333 | @asyncclick.command() 334 | @asyncclick.option('-l', '--link', required=True, help='Link for downloading stickers') 335 | async def download(link: str): 336 | """Download stickers from Telegram.""" 337 | credentials = get_credentials() 338 | if not credentials: 339 | console.print("[bold red]You are not logged in. To access telegram api, you need to login first.[/]") 340 | return 341 | pack_name = link.removesuffix("/").split("/")[-1] 342 | root_download_dir = pathlib.Path(os.getcwd()) 343 | if not root_download_dir.exists(): 344 | console.print(f"[bold red]Download directory does not exist: {root_download_dir}[/]") 345 | return 346 | console.print(f"[bold cyan]Preparing to download pack: {pack_name} to {root_download_dir.as_posix()}[/]") 347 | telegram_bot = AsyncTeleBot(credentials.token) 348 | await download_sticker_set(pack_name, telegram_bot, root_download_dir) 349 | console.print("[bold dark_green]✔ Download completed![/]") 350 | 351 | 352 | @asyncclick.command() 353 | @asyncclick.option('-l', '--link', required=True, help='Link to import stickers') 354 | async def trace(link: str): 355 | """Initialize with pack name, pack title, and sticker type.""" 356 | credentials = get_credentials() 357 | if not credentials: 358 | return console.print("[bold red]You are not logged in. Please login first.[/]") 359 | with console.status("[bold cyan]Retrieving sticker set from Telegram...[/]", spinner="dots"): 360 | _pack_name = link.removesuffix("/").split("/")[-1] 361 | try: 362 | telegram_bot = AsyncTeleBot(credentials.token) 363 | cloud_sticker_set: StickerSet = await limited_request( 364 | AsyncTeleBot(credentials.token).get_sticker_set(_pack_name) 365 | ) 366 | except Exception as e: 367 | console.print( 368 | f"[bold red]Cant fetch stickers named {_pack_name}: {e}, you cant import a non-exist pack.[/]" 369 | ) 370 | return 371 | console.print( 372 | f"[bold steel_blue3]Cloud sticker with pack name:[/] {cloud_sticker_set.name}\n" 373 | f"[bold steel_blue3]Pack Title:[/] {cloud_sticker_set.title} \n" 374 | f"[bold steel_blue3]Sticker Type:[/] {cloud_sticker_set.sticker_type}" 375 | ) 376 | if not cloud_sticker_set.name.endswith("_by_" + credentials.bot_user.username): 377 | console.print( 378 | f"[bold red]You can only change sticker-set created by BOT USER now logged: @{credentials.bot_user.username} {credentials.bot_user.full_name}[/]" 379 | ) 380 | console.print(f"[bold red]The pack name should end with `_by_{credentials.bot_user.username}` [/]") 381 | return 382 | root_dir = pathlib.Path(os.getcwd()) 383 | # 尝试使用 Packname 创建文件夹 384 | try: 385 | sticker_dir = root_dir.joinpath(cloud_sticker_set.name) 386 | if sticker_dir.exists(): 387 | console.print(f"[bold red]Pack directory already exists:[/] {sticker_dir}") 388 | return 389 | sticker_dir.mkdir(exist_ok=False) 390 | except Exception as e: 391 | console.print(f"[bold red]Failed to create pack directory: {e}[/]") 392 | return 393 | console.print(f"[bold steel_blue3]Pack directory inited:[/] {sticker_dir}") 394 | index_file = sticker_dir.joinpath("index.json") 395 | index_file.write_text( 396 | StickerIndexFile.create( 397 | title=cloud_sticker_set.title, 398 | name=cloud_sticker_set.name, 399 | sticker_type=cloud_sticker_set.sticker_type, 400 | operator_id=str(credentials.bot_user.id) 401 | ).model_dump_json(indent=2) 402 | ) 403 | # 创建资源文件夹 404 | sticker_table_dir = sticker_dir.joinpath(STICKER_DIR_NAME) 405 | sticker_table_dir.mkdir(exist_ok=True) 406 | if not cloud_sticker_set: 407 | console.print(f"[bold steel_blue3] Empty pack, and index file created:[/] {index_file}") 408 | else: 409 | # 同步索引文件 410 | await sync_index(telegram_bot, index_file, cloud_sticker_set) 411 | console.print("[bold steel_blue3]Initialization completed![/]") 412 | console.print(f"\n[bold cyan]Put your stickers in {sticker_table_dir}, [/]") 413 | console.print("[bold cyan]then run 'tsticker push' to push your stickers to Telegram.[/]") 414 | 415 | 416 | @asyncclick.command() 417 | @asyncclick.option( 418 | '-s', '--sticker-type', 419 | type=asyncclick.Choice(['mask', 'regular', 'custom_emoji'], case_sensitive=False), 420 | required=False, 421 | default='regular', 422 | help='Type of the sticker (mask, regular, custom_emoji)' 423 | ) 424 | @asyncclick.option('-n', '--pack-name', required=True, help='Your pack name') 425 | @asyncclick.option('-t', '--pack-title', required=True, help='Your pack title') 426 | async def init( 427 | pack_name: str, 428 | pack_title: str, 429 | sticker_type: Literal["mask", "regular", "custom_emoji"] = "regular" 430 | ): 431 | """Initialize with pack name, pack title, and sticker type.""" 432 | credentials = get_credentials() 433 | if not credentials: 434 | console.print( 435 | Panel( 436 | "[bold red]You are not logged in. Please login first.[/]", 437 | style="red", 438 | title="Login Required", 439 | title_align="left", 440 | subtitle="Type `tsticker help` for more information.", 441 | expand=False 442 | ) 443 | ) 444 | return 445 | try: 446 | validate_input = StickerValidateInput( 447 | pack_name=pack_name, 448 | pack_title=pack_title, 449 | sticker_type=sticker_type, 450 | ) 451 | telegram_bot = AsyncTeleBot(credentials.token) 452 | except Exception as e: 453 | console.print(f"[bold red]Failed to initialize app: {e}[/]") 454 | console.print("[bold yellow]Hint: Pack name must only contain alphanumeric characters and underscores.[/]") 455 | return 456 | 457 | root_dir = pathlib.Path(os.getcwd()) 458 | # 检查根目录下是否存在索引文件 459 | if root_dir.joinpath("index.json").exists(): 460 | # 警告用户可能在一个已经初始化的目录中操作初始化 461 | console.print(Panel( 462 | "Wait a minute! " 463 | "It seems you are initializing in a directory that has [cyan]already have an index file[/].\n" 464 | f"You are now in: [cyan]{root_dir}[/]", 465 | style="blue", 466 | title="index.json Found", 467 | title_align="left", 468 | expand=False 469 | )) 470 | # 询问用户是否继续 471 | if not asyncclick.confirm("Do you want to continue?"): 472 | return 473 | try: 474 | sticker_dir = root_dir.joinpath(validate_input.pack_name) 475 | if sticker_dir.exists(): 476 | console.print( 477 | Panel( 478 | f"[bold red]Pack directory already exists:[/] {sticker_dir}", 479 | title="Directory Exists", 480 | title_align="left", 481 | style="red", 482 | expand=False) 483 | ) 484 | return 485 | sticker_dir.mkdir(exist_ok=False) 486 | except Exception as e: 487 | console.print(Panel( 488 | f"[bold red]Failed to create pack directory: {e}[/]", 489 | style="red", 490 | title="Directory Creation Failed", 491 | title_align="left", 492 | expand=False) 493 | ) 494 | return 495 | # 成功创建 Pack 目录 496 | console.print(f"[bold dark_green]✔ Pack directory initialized:[/] {sticker_dir}") 497 | # 生成索引文件和相关配置 498 | index_file = sticker_dir.joinpath("index.json") 499 | index_file_model = StickerIndexFile.create( 500 | title=validate_input.pack_title, 501 | name=StickerValidateInput.make_set_name(validate_input.pack_name, credentials.bot_user.username), 502 | sticker_type=sticker_type, 503 | operator_id=str(credentials.owner_id) 504 | ) 505 | index_file.write_text(index_file_model.model_dump_json(indent=2)) 506 | # 输出索引信息 507 | console.print(Panel( 508 | f"[bold dark_sea_green]New index created:[/]\n" 509 | f" [steel_blue3]Pack Title:[/] {index_file_model.title}\n" 510 | f" [steel_blue3]Link Name:[/] {index_file_model.name}\n" 511 | f" [steel_blue3]Sticker Type:[/] {index_file_model.sticker_type}\n" 512 | f" [steel_blue3]Bot Owner:[/] {index_file_model.operator_id}", 513 | style="grey42", 514 | title="StickerSet Info", 515 | title_align="left", 516 | expand=False 517 | )) 518 | 519 | if len(index_file_model.operator_id) != 10: 520 | console.print(Panel( 521 | "[bold yellow]Are you sure?[/] Bot Owner must be a human account ID and not a bot account ID.", 522 | style="yellow", 523 | expand=False 524 | )) 525 | 526 | # 检索贴纸包 527 | with console.status("[bold cyan]Retrieving sticker set from Telegram...[/]", spinner="dots"): 528 | try: 529 | sticker_set: Optional[StickerSet] = await limited_request( 530 | telegram_bot.get_sticker_set(index_file_model.name) 531 | ) 532 | except Exception as e: 533 | if "STICKERSET_INVALID" in str(e): 534 | sticker_set = None 535 | else: 536 | console.print(f"[bold red]Failed to retrieve sticker set {index_file_model.name}: {e}[/]") 537 | return 538 | 539 | # 处理贴纸文件夹 540 | try: 541 | sticker_table_dir = get_stickers_path(index_file=index_file) 542 | except Exception as e: 543 | console.print(f"[bold red]Error: Failed to create sticker directory: {e}[/]") 544 | return 545 | 546 | # 输出创建成功 547 | if not sticker_set: 548 | console.print(f"[dark_sea_green]✔ Empty pack, and index file created at:[/] {index_file}") 549 | else: 550 | await sync_index(telegram_bot, index_file, sticker_set) 551 | 552 | # 提示下一步操作 553 | console.print("[bold dark_green]✔ Initialization completed![/]") 554 | console.print(Panel( 555 | f"[bold dark_cyan]Put your stickers in:[/] {sticker_table_dir}\n" 556 | f"Run 'cd {pack_name}' to enter the pack directory.\n" 557 | "Then run 'tsticker push' to push your stickers to Telegram.", 558 | style="dark_cyan", 559 | title="Next Steps", 560 | title_align="left", 561 | expand=False 562 | )) 563 | 564 | 565 | async def upon_credentials() -> tuple[Optional[StickerIndexFile], Optional[pathlib.Path], Optional[AsyncTeleBot]]: 566 | credentials = get_credentials() 567 | if not credentials: 568 | console.print("[bold red]You are not logged in. Please login first.[/]") 569 | return None, None, None 570 | root = pathlib.Path(os.getcwd()) 571 | index_file = root.joinpath("index.json") 572 | if not index_file.exists(): 573 | console.print("[bold red]Index file not found. Please opt in an initialized directory.[/]") 574 | return None, None, None 575 | try: 576 | local_sticker_model = StickerIndexFile.model_validate_json(index_file.read_text()) 577 | except ValidationError as e: 578 | console.print(f"[bold red]Index file was corrupted: {e}[/]") 579 | return None, None, None 580 | try: 581 | StickerValidateInput( 582 | pack_name=local_sticker_model.name, 583 | pack_title=local_sticker_model.title, 584 | sticker_type=local_sticker_model.sticker_type, 585 | ) 586 | telegram_bot = AsyncTeleBot(credentials.token) 587 | except Exception as e: 588 | console.print(f"[bold red]Failed to create app: {e}[/]") 589 | return None, None, None 590 | return local_sticker_model, index_file, telegram_bot 591 | 592 | 593 | @asyncclick.command() 594 | async def sync(): 595 | """Overwrite local file changes using Telegram.""" 596 | local_sticker, index_file, telegram_bot = await upon_credentials() 597 | if not local_sticker or not index_file or not telegram_bot: 598 | return 599 | with console.status("[bold cyan]Retrieving sticker set from Telegram...[/]", spinner="dots"): 600 | try: 601 | now_sticker_set: Optional[StickerSet] = await limited_request( 602 | telegram_bot.get_sticker_set(local_sticker.name) 603 | ) 604 | except Exception as e: 605 | if "STICKERSET_INVALID" in str(e): 606 | now_sticker_set = None 607 | else: 608 | console.print(f"[bold red]Error: Failed to retrieve sticker set '{local_sticker.name}':[/] {e}") 609 | return 610 | if not now_sticker_set: 611 | console.print( 612 | "[bold red]Error: Sticker set not found in Telegram. It seems the sticker pack is not created yet.[/]") 613 | console.print( 614 | "[bold yellow]Hint: If you already created the sticker pack, please push it to Telegram first.[/]" 615 | ) 616 | return 617 | # 显示当前工作目标 618 | console.print(f"[bold steel_blue3]> Working on sticker pack: [/] " 619 | f"[link=https://t.me/addstickers/{local_sticker.name}]https://t.me/addstickers/{local_sticker.name}[/link]") 620 | await sync_index(telegram_bot, index_file, cloud_sticker_set=now_sticker_set) 621 | 622 | 623 | async def push_to_cloud( 624 | telegram_bot: AsyncTeleBot, 625 | index_file: pathlib.Path, 626 | cloud_sticker_set: StickerSet | None, 627 | ) -> bool: 628 | """ 629 | 推送本地文件更改到云端,如果不存在则创建。 630 | :param telegram_bot: 电报机器人 631 | :param index_file: 本地索引文件 632 | :param cloud_sticker_set: 云端的贴纸集 633 | :return: Is push successful 634 | """ 635 | try: 636 | local_sticker = StickerIndexFile.model_validate_json(index_file.read_text()) 637 | except Exception as e: 638 | console.print(f"[bold red]Index file was corrupted: {e}[/]") 639 | return False 640 | try: 641 | sticker_table_dir = get_stickers_path(index_file=index_file) 642 | except FileNotFoundError as e: 643 | console.print(f"[bold red]Sticker directory not found: {e}[/]") 644 | return False 645 | delete_same_name_files(sticker_table_dir) 646 | # 获取本地文件 647 | local_files = { 648 | f.stem: f 649 | for f in sticker_table_dir.glob('*') 650 | } 651 | if not cloud_sticker_set: 652 | # TODO 413 => 'Payload Too Large', 653 | stickers = [] 654 | _index = 0 655 | _all = len(local_files) 656 | 657 | if _all > 30: 658 | console.print(Panel( 659 | "Wait a minute! " 660 | f"You want to upload {_all} stickers at once, which is too many.\n" 661 | f"[dark_red] Telegram API does not allow oversized requests.[/]\n" 662 | f"[dark_red] Files are expected no more than [blue]30[/], please transfer the extra and retry.[/]", 663 | style="red", 664 | title=f"Too Many Stickers", 665 | title_align="left", 666 | expand=False 667 | )) 668 | return False 669 | with console.status("[bold yellow]Building sticker set...[/]", spinner='dots') as status: 670 | for sticker_file in local_files.values(): 671 | _index += 1 672 | status.update( 673 | f"[bold cyan]Creating sticker for file: {sticker_file.name}...[/] {_index}/{_all}" 674 | ) 675 | sticker = await create_sticker( 676 | sticker_type=local_sticker.sticker_type, 677 | sticker_file=sticker_file 678 | ) 679 | if not sticker: 680 | console.print(f"[bold red]Failed to create sticker for file: {sticker_file.name}, stopping...[/]") 681 | return False 682 | stickers.append(sticker) 683 | if len(stickers) > 30: 684 | console.print("[bold red]You have more than 30 stickers, which is too large to create a sticker set.[/]") 685 | return False 686 | if len(stickers) == 0: 687 | console.print( 688 | "[bold red]You have no stickers to create a sticker set. Place your stickers in the stickers folder.[/]" 689 | ) 690 | return False 691 | with console.status("[bold steel_blue3]Creating sticker set...[/]", spinner='dots'): 692 | try: 693 | success = await limited_request( 694 | telegram_bot.create_new_sticker_set( 695 | user_id=int(local_sticker.operator_id), 696 | title=local_sticker.title, 697 | name=local_sticker.name, 698 | stickers=stickers, 699 | sticker_type=local_sticker.sticker_type 700 | ) 701 | ) 702 | assert success, "Request failed" 703 | except Exception as e: 704 | if "USER_IS_BOT" in str(e): 705 | console.print(f"[bold yellow]You cant create sticker set with a bot account: {e}[/]" 706 | f"\nAre you sure ID[{local_sticker.operator_id}] is your user id not the bot id?" 707 | ) 708 | console.print(f"[bold red]Failed to create sticker set: {e}[/]") 709 | return False 710 | else: 711 | console.print( 712 | f"[bold dark_green]✔ Created sticker set: {local_sticker.title}[/] [grey42]{len(stickers)} stickers created[/]" 713 | ) 714 | return True 715 | # 获取云端文件 716 | cloud_files = { 717 | sticker.file_unique_id: sticker 718 | for sticker in cloud_sticker_set.stickers 719 | } 720 | # 本地文件中不存在的文件 721 | to_upload = [ 722 | file_id 723 | for file_id in local_files if file_id not in cloud_files 724 | ] 725 | # 云端文件中不存在的文件 726 | to_delete = [ 727 | sticker.file_id 728 | for file_id, sticker in cloud_files.items() if file_id not in local_files 729 | ] 730 | # 如果本地文件和云端文件都存在,但是文件大小不一致,重新下载 731 | to_fix = [ 732 | (file_unique_id, cloud_files[file_unique_id].file_id) 733 | for file_unique_id in local_files 734 | if file_unique_id in cloud_files and local_files[file_unique_id].stat().st_size != cloud_files[ 735 | file_unique_id].file_size 736 | ] 737 | if local_sticker.title != cloud_sticker_set.title: 738 | with console.status("[bold steel_blue3]Updating title...[/]", spinner='dots'): 739 | await limited_request( 740 | telegram_bot.set_sticker_set_title(local_sticker.name, local_sticker.title) 741 | ) 742 | console.print(f"[bold cyan]Title updated to: {local_sticker.title}[/]") 743 | if to_delete or to_upload or to_fix: 744 | console.print("[bold steel_blue3]Changes detected:[/]") 745 | console.print(f"[bold gray42]Files to delete:[/] {len(to_delete)}") 746 | console.print(f"[bold gray42]Files to upload:[/] {len(to_upload)}") 747 | console.print(f"[bold gray42]Files to fix:[/] {len(to_fix)}") 748 | # 计算最后结果是否超过 120 749 | if len(cloud_files) - len(to_delete) + len(to_upload) > 120: 750 | console.print("[bold red]Your wanted operation will exceed the limit of 120 stickers, so it's aborted.[/]") 751 | return False 752 | # 如果上传的文件超过 30 个,提示用户 753 | if len(to_upload) > 30: 754 | console.print( 755 | Panel( 756 | "Wait a minute! " 757 | "[bold yellow]You have a large number of stickers to be uploaded, are you sure you want to operate?[/]\n" 758 | "[dark_sea_green] Don't worry, if the operation fails, you can still synchronize your stickers in the cloud using 'tsticker sync'.[/]\n" 759 | "[dark_sea_green] You can also find a backup at 'snapshot' folder.[/]", 760 | style="blue", 761 | title=f"Confirm Operation", 762 | title_align="left", 763 | expand=False 764 | ) 765 | ) 766 | # 询问用户是否继续 767 | if not asyncclick.confirm("Do you want to continue?"): 768 | return False 769 | # 删除云端文件 770 | with console.status("[bold steel_blue3]Deleting stickers from telegram...[/]", spinner='dots') as status: 771 | _index = 0 772 | _all = len(to_delete) 773 | for file_id in to_delete: 774 | # 更新进度条 775 | _index += 1 776 | status.update(f"[bold steel_blue3]Deleting stickers for all users: {file_id}...[/] {_index}/{_all}") 777 | try: 778 | success = await limited_request( 779 | telegram_bot.delete_sticker_from_set(sticker=file_id) 780 | ) 781 | assert success, "Request failed" 782 | except Exception as e: 783 | console.print(f"[bold red]Failed to delete sticker: {e}[/]") 784 | else: 785 | console.print(f"[bold green]Deleted sticker: {file_id}[/]") 786 | 787 | # 上传文件到云端 788 | with console.status(f"[bold steel_blue3]Uploading sticker...[/]", spinner='dots') as status: 789 | _index = 0 790 | _all = len(to_upload) 791 | for file_name in to_upload: 792 | _index += 1 793 | status.update(f"[bold steel_blue3]Uploading sticker: {file_name}...[/] {_index}/{_all}") 794 | sticker_file = local_files[file_name] 795 | sticker = await create_sticker(sticker_type=local_sticker.sticker_type, sticker_file=sticker_file) 796 | if sticker: 797 | success = await limited_request( 798 | telegram_bot.add_sticker_to_set( 799 | user_id=int(local_sticker.operator_id), 800 | name=local_sticker.name, 801 | sticker=sticker 802 | ) 803 | ) 804 | if success: 805 | console.print(f"[bold green]Uploaded sticker: {file_name}[/]") 806 | # 删除本地文件 807 | sticker_file.unlink() 808 | else: 809 | console.print(f"[bold red]Failed to upload sticker: {file_name}[/]") 810 | else: 811 | console.print(f"[bold red]Failed to create sticker for file: {file_name}[/]") 812 | 813 | # 更新云端文件 814 | with console.status("[bold steel_blue3]Correcting stickers...[/]", spinner='dots') as status: 815 | _index = 0 816 | _all = len(to_fix) 817 | for local_file_name, cloud_file_id in to_fix: 818 | _index += 1 819 | need_delete = local_files[local_file_name] 820 | status.update( 821 | f"[bold steel_blue3]Correcting stickers: {local_file_name}: {cloud_file_id}...[/] {_index}/{_all}") 822 | try: 823 | # 删除本地文件 824 | await download_and_write_file( 825 | telegram_bot=telegram_bot, 826 | file_id=cloud_file_id, 827 | file_unique_id=local_file_name, 828 | sticker_table_dir=sticker_table_dir 829 | ) 830 | except Exception as e: 831 | console.print(f"[bold red]Failed to correct sticker: {local_file_name} {e}[/]") 832 | return False 833 | else: 834 | need_delete.unlink(missing_ok=True) 835 | console.print(f"[bold green]Corrected sticker: {local_file_name}[/]") 836 | 837 | if to_delete or to_upload or to_fix: 838 | console.print( 839 | f"[bold dark_green]✔ Changes applied![/] [gray42] {len(to_delete)} deleted, {len(to_upload)} uploaded, {len(to_fix)} fixed[/]" 840 | ) 841 | return True 842 | 843 | 844 | @asyncclick.command() 845 | async def push(): 846 | """Overwrite telegram stickers using local files.""" 847 | # 检查仓库更新 848 | await check_for_updates() 849 | """Push local file changes to Telegram.""" 850 | local_sticker, index_file, telegram_bot = await upon_credentials() 851 | if not local_sticker or not index_file or not telegram_bot: 852 | return 853 | # 获取云端文件 854 | with console.status("[bold cyan]Retrieving sticker set from Telegram...[/]", spinner="dots"): 855 | try: 856 | sticker_set: Optional[StickerSet] = await limited_request(telegram_bot.get_sticker_set(local_sticker.name)) 857 | except Exception as e: 858 | if "STICKERSET_INVALID" in str(e): 859 | sticker_set = None 860 | else: 861 | console.print(f"[bold red]Failed to get sticker set {local_sticker.name}: {e}[/]") 862 | return 863 | console.print( 864 | f"[bold steel_blue3]> Working on sticker pack:[/] [link=https://t.me/addstickers/{local_sticker.name}]https://t.me/addstickers/{local_sticker.name}[/link]" 865 | ) 866 | try: 867 | backup_snapshot(index_file) 868 | except Exception as e: 869 | console.print(f"[bold red]Failed to create backup for stickers: {e}[/]") 870 | return 871 | 872 | try: 873 | if not await push_to_cloud(telegram_bot=telegram_bot, index_file=index_file, cloud_sticker_set=sticker_set): 874 | console.print("[bold red]! Push aborted![/]") 875 | return 876 | except Exception as e: 877 | from loguru import logger 878 | logger.exception(e) 879 | console.print(f"[bold red]! Push failed: {e}[/]") 880 | return 881 | # 同步索引文件 882 | with console.status("[bold yellow]Synchronizing index...[/]", spinner='dots'): 883 | try: 884 | sticker_set: Optional[StickerSet] = await limited_request(telegram_bot.get_sticker_set(local_sticker.name)) 885 | except Exception as e: 886 | if "STICKERSET_INVALID" in str(e): 887 | sticker_set = None 888 | else: 889 | console.print(f"[bold red]Failed to get sticker set {local_sticker.name}: {e}[/]") 890 | return 891 | if sticker_set: 892 | try: 893 | await sync_index(telegram_bot=telegram_bot, index_file=index_file, cloud_sticker_set=sticker_set) 894 | except Exception as e: 895 | console.print( 896 | f"[bold dark_red]! Sync failed because {e}[/]\n" 897 | f"[bold dark_orange] Just DONT push, you can still use 'tsticker sync' to continue synchronize your stickers manually![/]" 898 | ) 899 | return 900 | console.print("[bold dark_green]✔ Push & CleanUp completed![/]") 901 | 902 | 903 | @asyncclick.command() 904 | async def show(): 905 | """Show local index file details and sticker pack sticker count.""" 906 | local_sticker, index_file, telegram_bot = await upon_credentials() 907 | # 输出索引信息 908 | if local_sticker: 909 | console.print(Panel( 910 | f" [cyan]Pack Title:[/] {local_sticker.title}\n" 911 | f" [cyan]Link Name:[/] {local_sticker.name}\n" 912 | f" [cyan]Sticker Type:[/] {local_sticker.sticker_type}\n" 913 | f" [cyan]Bot Owner:[/] {local_sticker.operator_id}", 914 | style="grey42", 915 | title="StickerSet Info", 916 | title_align="left", 917 | expand=False 918 | )) 919 | # 获取贴纸文件夹 920 | if not index_file: 921 | console.print(f"[bold dark_orange]! Index file not found[/]") 922 | if telegram_bot: 923 | # 获取云端文件 924 | with console.status("[bold cyan]Retrieving sticker set from Telegram...[/]", spinner="dots"): 925 | try: 926 | sticker_set: Optional[StickerSet] = await limited_request( 927 | telegram_bot.get_sticker_set(local_sticker.name)) 928 | except Exception as e: 929 | if "STICKERSET_INVALID" in str(e): 930 | sticker_set = None 931 | else: 932 | console.print(f"[bold red]Failed to get sticker set {local_sticker.name}: {e}[/]") 933 | return 934 | if sticker_set: 935 | console.print( 936 | f"[bold dark_green]✔ Sticker Pack exist in Telegram:[/] {sticker_set.title}\n" 937 | f"[bold green4]> Sticker count:[/] {len(sticker_set.stickers)}\n" 938 | f"[bold green4]> Sticker type:[/] {sticker_set.sticker_type}\n" 939 | f"[bold green4]> Sticker link:[/] [link=https://t.me/addstickers/{sticker_set.name}]https://t.me/addstickers/{sticker_set.name}[/link]" 940 | ) 941 | else: 942 | console.print("[bold hot_pink2]! Sticker set not created yet in Telegram[/]") 943 | 944 | 945 | cli.add_command(init) 946 | cli.add_command(login) 947 | cli.add_command(push) 948 | cli.add_command(sync) 949 | cli.add_command(trace) 950 | cli.add_command(download) 951 | cli.add_command(show) 952 | 953 | if __name__ == "__main__": 954 | cli(_anyio_backend="asyncio") 955 | -------------------------------------------------------------------------------- /src/tsticker/const.py: -------------------------------------------------------------------------------- 1 | PYPI_URL = "https://pypi.org/pypi/tsticker/json" 2 | STICKER_DIR_NAME = "stickers" 3 | SNAPSHOT_DIR_NAME = "snapshot" 4 | SNAPSHOT_MAX_COUNT = 12 5 | -------------------------------------------------------------------------------- /src/tsticker/core/__init__.py: -------------------------------------------------------------------------------- 1 | import re 2 | from typing import Literal, Optional 3 | 4 | from loguru import logger 5 | from pydantic import BaseModel, model_validator, field_validator, ConfigDict 6 | from telebot import TeleBot, logger 7 | from telebot.types import User 8 | 9 | from .create import Emote 10 | 11 | 12 | class StickerValidateInput(BaseModel): 13 | pack_name: str 14 | pack_title: str 15 | sticker_type: Literal["mask", "regular", "custom_emoji"] 16 | needs_repainting: Optional[bool] = None 17 | model_config = ConfigDict(arbitrary_types_allowed=True) 18 | 19 | @staticmethod 20 | def make_set_name(pack_name: str, username: str): 21 | if "_by_" in pack_name: 22 | return pack_name 23 | return f"{pack_name}_by_{username}" 24 | 25 | @field_validator("pack_name", mode="before") 26 | def validate_pack_name(cls, value): 27 | # 假设 pack_name 必须符合特定正则表达式 28 | pattern = r'^[a-zA-Z0-9_]+$' 29 | if not re.match(pattern, value): 30 | raise ValueError(f"Invalid pack_name '{value}': must match pattern '{pattern}'") 31 | # 禁止使用数字开头 32 | if value[0].isdigit(): 33 | raise ValueError(f"Invalid pack_name '{value}': must not start with a digit") 34 | return value 35 | 36 | @field_validator("pack_title", mode="before") 37 | def validate_pack_title(cls, value): 38 | # 假设 pack_title 的长度限制为 1 到 64 个字符 39 | if not (1 <= len(value) <= 64): 40 | raise ValueError(f"Invalid pack_title '{value}': length must be between 1 and 64 characters") 41 | return value 42 | 43 | @model_validator(mode="after") 44 | def validate_setting(self): 45 | if self.needs_repainting is not None: 46 | if self.sticker_type != "custom_emoji": 47 | logger.warning("needs_repainting is only available for custom_emoji sticker type") 48 | self.needs_repainting = None 49 | return self 50 | 51 | 52 | class AppInitError(Exception): 53 | pass 54 | 55 | 56 | def get_bot_user(bot_token: str, bot_proxy: str = None) -> User: 57 | """ 58 | Get bot user info 59 | :return: User instance 60 | :raise AppInitError: if bot token is invalid or bot username is invalid or other exceptions 61 | """ 62 | from telebot import apihelper 63 | if bot_proxy: 64 | if "socks5://" in bot_proxy: 65 | bot_proxy = bot_proxy.replace("socks5://", "socks5h://") 66 | apihelper.proxy = {'https': bot_proxy} 67 | apihelper.CONNECT_TIMEOUT = 20 68 | bot = TeleBot(bot_token) 69 | try: 70 | me = bot.get_me() 71 | assert me.id, "Bot token is invalid" 72 | assert me.username, "Bot username is invalid" 73 | except AssertionError as e: 74 | raise AppInitError(e) 75 | except Exception as e: 76 | if "404" in str(e): 77 | raise AppInitError("Bot token is invalid") 78 | raise AppInitError(e) 79 | return me 80 | -------------------------------------------------------------------------------- /src/tsticker/core/const.py: -------------------------------------------------------------------------------- 1 | SERVICE_NAME = "TStickerService" 2 | USERNAME = "telegram" 3 | -------------------------------------------------------------------------------- /src/tsticker/core/create.py: -------------------------------------------------------------------------------- 1 | import hashlib 2 | import hmac 3 | from typing import List, Literal 4 | 5 | from pydantic import BaseModel, model_validator 6 | 7 | 8 | class Emote(BaseModel): 9 | emoji: str 10 | file_id: str 11 | 12 | 13 | class StickerIndexFile(BaseModel): 14 | title: str 15 | name: str 16 | sticker_type: Literal["mask", "regular", "custom_emoji"] 17 | operator_id: str 18 | lock_ns: str 19 | emotes: List[Emote] = [] 20 | 21 | @model_validator(mode="after") 22 | def validate_lock_ns(self): 23 | expected_lock_ns = generate_lock_ns( 24 | bot_id=self.operator_id, 25 | name=self.name, 26 | sticker_type=self.sticker_type 27 | ) 28 | if not hmac.compare_digest(self.lock_ns, expected_lock_ns): 29 | raise ValueError("metadata has been tampered") 30 | return self 31 | 32 | @classmethod 33 | def create(cls, title: str, name: str, sticker_type: str, operator_id: str) -> "StickerIndexFile": 34 | lock_ns = generate_lock_ns(bot_id=operator_id, name=name, sticker_type=sticker_type) 35 | return cls( 36 | title=title, 37 | name=name, 38 | sticker_type=sticker_type, 39 | operator_id=operator_id, 40 | lock_ns=lock_ns 41 | ) 42 | 43 | 44 | def generate_lock_ns(bot_id: str, name: str, sticker_type: str) -> str: 45 | secret_key = bot_id.encode('utf-8') 46 | message = f"{name}:{sticker_type}".encode('utf-8') 47 | return hmac.new(secret_key, message, hashlib.sha256).hexdigest() 48 | -------------------------------------------------------------------------------- /src/tsticker/utils.py: -------------------------------------------------------------------------------- 1 | import asyncio 2 | import pathlib 3 | from asyncio import Semaphore 4 | from importlib import metadata 5 | from io import BytesIO 6 | from typing import Literal 7 | 8 | import emoji 9 | import httpx 10 | from pydantic import BaseModel, model_validator 11 | from rich.console import Console 12 | from telebot.asyncio_helper import session_manager 13 | from telebot.types import User, InputSticker, InputFile 14 | from telegram_sticker_utils import ImageProcessor 15 | 16 | from tsticker.const import PYPI_URL 17 | from tsticker.core import get_bot_user 18 | 19 | console = Console() 20 | 21 | semaphore = Semaphore(20) 22 | request_interval = 60 / 30 # 每个请求间隔时间为 60 秒 / 30 请求 = 2 秒 23 | 24 | 25 | async def limited_request(coro): 26 | """ 27 | limit request 28 | :param coro: 29 | :return: 30 | """ 31 | async with semaphore: 32 | result = await coro 33 | await asyncio.sleep(request_interval) 34 | return result 35 | 36 | 37 | class Credentials(BaseModel): 38 | token: str 39 | owner_id: str 40 | bot_proxy: str | None = None 41 | _bot_user: User | None = None 42 | 43 | @model_validator(mode='after') 44 | def validate_token(self): 45 | with console.status("[bold blue]Validating token...[/]", spinner='dots'): 46 | bot_user = get_bot_user(bot_token=self.token, bot_proxy=self.bot_proxy) 47 | self._bot_user = bot_user 48 | try: 49 | int(self.owner_id) 50 | except ValueError: 51 | raise ValueError("Invalid owner id") 52 | return self 53 | 54 | @property 55 | def bot_user(self) -> User: 56 | if not self._bot_user: 57 | raise ValueError("Bot user is not available") 58 | return self._bot_user 59 | 60 | 61 | def get_emojis_from_file_name(file_name: str): 62 | _result = [] 63 | emoji_name = emoji.emojize(file_name, variant="emoji_type") 64 | for _char in emoji_name: 65 | if emoji.is_emoji(_char): 66 | _result.append(_char) 67 | 68 | return _result 69 | 70 | 71 | async def create_sticker( 72 | sticker_type: Literal["mask", "regular", "custom_emoji"], 73 | sticker_file: pathlib.Path, 74 | ) -> InputSticker | None: 75 | """ 76 | Create sticker from local file by telegram_sticker_utils. 77 | First check if it is animated or static sticker, then process according to sticker type. 78 | If sticker type is custom_emoji, scale is 100, otherwise scale is 512. 79 | If sticker name is emoji, emojis is sticker name, otherwise emojis return from telegram_sticker_utils. 80 | :param sticker_type: sticker type 81 | :param sticker_file: local file 82 | :return: InputSticker | None 83 | """ 84 | if sticker_type == "custom_emoji": 85 | scale = 100 86 | else: 87 | scale = 512 88 | sticker_file_path = sticker_file.as_posix() 89 | 90 | try: 91 | emojis = get_emojis_from_file_name(sticker_file.stem) 92 | sticker = ImageProcessor.make_sticker( 93 | input_name=sticker_file.stem, 94 | input_data=sticker_file_path, 95 | scale=scale, 96 | master_edge="width" 97 | ) 98 | # If emojis is empty, use sticker emojis instead 99 | if not emojis: 100 | emojis = sticker.emojis 101 | return InputSticker( 102 | sticker=InputFile(BytesIO(sticker.data)), 103 | emoji_list=emojis, 104 | format=sticker.sticker_type 105 | ) 106 | except Exception as e: 107 | console.print(f"[bold red]Failed to create sticker because {e}[/]") 108 | return None 109 | 110 | 111 | async def check_for_updates(): 112 | try: 113 | CURRENT_VERSION = metadata.version("tsticker") 114 | # 发送 GET 请求到 PyPI API 115 | async with httpx.AsyncClient( 116 | timeout=10, headers={"User-Agent": "tsticker"} 117 | ) as client: 118 | response = await client.get(PYPI_URL) 119 | 120 | if response.status_code != 200: 121 | console.print(f"[bold green]Skipping update check: HTTP {response.status_code}[/]") 122 | return 123 | 124 | # 从 JSON 响应中提取所需的信息 125 | package_info = response.json() 126 | latest_version = package_info.get('info', {}).get('version', "") 127 | 128 | # 如果版本已是最新,直接返回 129 | if latest_version == CURRENT_VERSION: 130 | return 131 | 132 | # 获取更新说明 133 | release_notes = package_info.get('releases', {}).get(latest_version, []) 134 | release_info = release_notes[0] if release_notes else {} 135 | description = release_info.get('comment_text', '') 136 | 137 | # 打印更新版本信息 138 | console.print( 139 | f"[blue]INFO:[/] [gray42]tsticker [cyan]{CURRENT_VERSION}[/] is installed, while [cyan]{latest_version}[/] is available.[/]" 140 | ) 141 | 142 | # 如果提供了 release 的 description,显示正确信息 143 | if description: 144 | console.print(f"[blue]COMMENT:[/]\n{description}") 145 | 146 | except Exception as e: 147 | console.print(f"[blue]! Skipping update check: {type(e)}: {e}[/]") 148 | 149 | 150 | async def close_session(): 151 | if session_manager.session and not session_manager.session.closed: 152 | await session_manager.session.close() 153 | 154 | 155 | def close_session_sync(): 156 | # 由于 aexit 需要同步函数,所以必须在调用前获取事件循环 157 | loop = asyncio.new_event_loop() 158 | loop.run_until_complete(close_session()) 159 | -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sudoskys/tsticker/30902ecb08165c52fddf96f14fcf4d18d40f6fb3/tests/__init__.py --------------------------------------------------------------------------------