From 0dd83463c69259fb7920e7f93963ae8181c3771a Mon Sep 17 00:00:00 2001
From: Benex254
Date: Sun, 20 Oct 2024 11:28:39 +0300
Subject: [PATCH 01/87] docs: update readme
---
README.md | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/README.md b/README.md
index d54298f..adea0b9 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,9 @@
# **FastAnime**
- 
+ 

-
-
+
+

Welcome to **FastAnime**, anime site experience from the terminal.
@@ -132,7 +132,7 @@ pip install 'fastanime==.dev1'
### Installing the bleeding edge version
-To install the latest build which are created on every push by GitHub actions, download the [fastanime_debug_build](https://github.com/Benex254/FastAnime/actions) of your choosing from the GitHub actions page.
+To install the latest build which are created on every push by GitHub actions, download the [fastanime_debug_build](https://github.com/FastAnime/FastAnime/actions) of your choosing from the GitHub actions page.
Then:
```bash
@@ -157,7 +157,7 @@ Requirements:
To build from the source, follow these steps:
-1. Clone the repository: `git clone https://github.com/Benex254/FastAnime.git --depth 1`
+1. Clone the repository: `git clone https://github.com/FastAnime/FastAnime.git --depth 1`
2. Navigate into the folder: `cd FastAnime`
3. Then build and Install the app:
@@ -174,7 +174,7 @@ fastanime --version
> [!Tip]
>
-> Download the completions from [here](https://github.com/Benex254/FastAnime/tree/master/completions) for your shell.
+> Download the completions from [here](https://github.com/FastAnime/FastAnime/tree/master/completions) for your shell.
> To add completions:
>
> - Fish Users: `cp $FASTANIME_PATH/completions/fastanime.fish ~/.config/fish/completions/`
@@ -358,7 +358,7 @@ fastanime anilist search -f MOVIE -s FAVOURITES_DESC
For more details visit the anilist docs or just get the completions which will improve the experience.
-Like seriously **[get the completions](https://github.com/Benex254/FastAnime#completions-subcommand)** and the experience will be a 💯 💯 better.
+Like seriously **[get the completions](https://github.com/FastAnime/FastAnime#completions-subcommand)** and the experience will be a 💯 💯 better.
The following are commands you can only run if you are signed in to your AniList account:
@@ -790,7 +790,7 @@ We welcome your issues and feature requests. However, due to time constraints, w
If you wish to contribute directly, please first open an issue describing your proposed changes so it can be discussed or if you are in a rush for the feature to be merged just open a pr.
-If you find an anime title that does not correspond with a provider or is just weird just [edit the data file](https://github.com/Benex254/FastAnime/blob/master/fastanime/Utility/data.py) and open a pr or if you don't want to do that open an issue.
+If you find an anime title that does not correspond with a provider or is just weird just [edit the data file](https://github.com/FastAnime/FastAnime/blob/master/fastanime/Utility/data.py) and open a pr or if you don't want to do that open an issue.
## Receiving Support
From 719d1bd187a62d312b0dd8cb41f025d5a378b57c Mon Sep 17 00:00:00 2001
From: Benex254
Date: Fri, 8 Nov 2024 16:26:43 +0300
Subject: [PATCH 02/87] chore: update deps
---
fastanime/__init__.py | 2 +-
pyproject.toml | 29 ++---
uv.lock | 238 +++++++++++++++++++++---------------------
3 files changed, 130 insertions(+), 139 deletions(-)
diff --git a/fastanime/__init__.py b/fastanime/__init__.py
index a8502b6..76f03a7 100644
--- a/fastanime/__init__.py
+++ b/fastanime/__init__.py
@@ -6,7 +6,7 @@ if sys.version_info < (3, 10):
) # noqa: F541
-__version__ = "v2.6.9"
+__version__ = "v2.7.0"
APP_NAME = "FastAnime"
AUTHOR = "Benex254"
diff --git a/pyproject.toml b/pyproject.toml
index d663220..1db6127 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "fastanime"
-version = "2.6.9"
+version = "2.7.0"
description = "A browser anime site experience from the terminal"
license = "UNLICENSE"
readme = "README.md"
@@ -8,37 +8,24 @@ requires-python = ">=3.10"
dependencies = [
"click>=8.1.7",
"inquirerpy>=0.3.4",
+ "requests>=2.32.3",
"rich>=13.9.2",
"thefuzz>=0.22.1",
- "yt-dlp>=2024.10.7",
+ "yt-dlp[default]>=2024.10.7",
]
[project.scripts]
fastanime = 'fastanime:FastAnime'
[project.optional-dependencies]
-standard = [
- "fastapi[standard]>=0.115.0",
- "mpv>=1.0.7",
- "plyer>=2.1.0",
-]
-api = [
- "fastapi[standard]>=0.115.0",
-]
-notifications = [
- "plyer>=2.1.0",
-]
-mpv = [
- "mpv>=1.0.7",
-]
+standard = ["fastapi[standard]>=0.115.0", "mpv>=1.0.7", "plyer>=2.1.0"]
+api = ["fastapi[standard]>=0.115.0"]
+notifications = ["plyer>=2.1.0"]
+mpv = ["mpv>=1.0.7"]
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.uv]
-dev-dependencies = [
- "pyright>=1.1.384",
- "pytest>=8.3.3",
- "ruff>=0.6.9",
-]
+dev-dependencies = ["pyright>=1.1.384", "pytest>=8.3.3", "ruff>=0.6.9"]
diff --git a/uv.lock b/uv.lock
index ccf72a5..6fbd90e 100644
--- a/uv.lock
+++ b/uv.lock
@@ -310,14 +310,15 @@ wheels = [
[[package]]
name = "fastanime"
-version = "2.6.7"
+version = "2.6.9"
source = { editable = "." }
dependencies = [
{ name = "click" },
{ name = "inquirerpy" },
+ { name = "requests" },
{ name = "rich" },
{ name = "thefuzz" },
- { name = "yt-dlp" },
+ { name = "yt-dlp", extra = ["default"] },
]
[package.optional-dependencies]
@@ -353,9 +354,10 @@ requires-dist = [
{ name = "mpv", marker = "extra == 'standard'", specifier = ">=1.0.7" },
{ name = "plyer", marker = "extra == 'notifications'", specifier = ">=2.1.0" },
{ name = "plyer", marker = "extra == 'standard'", specifier = ">=2.1.0" },
+ { name = "requests", specifier = ">=2.32.3" },
{ name = "rich", specifier = ">=13.9.2" },
{ name = "thefuzz", specifier = ">=0.22.1" },
- { name = "yt-dlp", specifier = ">=2024.10.7" },
+ { name = "yt-dlp", extras = ["default"], specifier = ">=2024.10.7" },
]
[package.metadata.requires-dev]
@@ -367,16 +369,16 @@ dev = [
[[package]]
name = "fastapi"
-version = "0.115.2"
+version = "0.115.4"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "pydantic" },
{ name = "starlette" },
{ name = "typing-extensions" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/22/fa/19e3c7c9b31ac291987c82e959f36f88840bea183fa3dc3bb654669f19c1/fastapi-0.115.2.tar.gz", hash = "sha256:3995739e0b09fa12f984bce8fa9ae197b35d433750d3d312422d846e283697ee", size = 299968 }
+sdist = { url = "https://files.pythonhosted.org/packages/a9/db/5781f19bd30745885e0737ff3fdd4e63e7bc691710f9da691128bb0dc73b/fastapi-0.115.4.tar.gz", hash = "sha256:db653475586b091cb8b2fec2ac54a680ac6a158e07406e1abae31679e8826349", size = 300737 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/c9/14/bbe7776356ef01f830f8085ca3ac2aea59c73727b6ffaa757abeb7d2900b/fastapi-0.115.2-py3-none-any.whl", hash = "sha256:61704c71286579cc5a598763905928f24ee98bfcc07aabe84cfefb98812bbc86", size = 94650 },
+ { url = "https://files.pythonhosted.org/packages/99/f6/af0d1f58f86002be0cf1e2665cdd6f7a4a71cdc8a7a9438cdc9e3b5375fe/fastapi-0.115.4-py3-none-any.whl", hash = "sha256:0b504a063ffb3cf96a5e27dc1bc32c80ca743a2528574f9cdc77daa2d31b4742", size = 94732 },
]
[package.optional-dependencies]
@@ -632,11 +634,11 @@ wheels = [
[[package]]
name = "packaging"
-version = "24.1"
+version = "24.2"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/51/65/50db4dda066951078f0a96cf12f4b9ada6e4b811516bf0262c0f4f7064d4/packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", size = 148788 }
+sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/08/aa/cc0199a5f0ad350994d660967a8efb233fe0416e4639146c089643407ce6/packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124", size = 53985 },
+ { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 },
]
[[package]]
@@ -803,15 +805,15 @@ wheels = [
[[package]]
name = "pyright"
-version = "1.1.385"
+version = "1.1.388"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "nodeenv" },
{ name = "typing-extensions" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/29/ca/3238db97766ecfd6b2758fb50727a0b433e7b1bb6be0de090ed08b291fff/pyright-1.1.385.tar.gz", hash = "sha256:1bf042b8f080441534aa02101dea30f8fc2efa8f7b6f1ab05197c21317f5bfa7", size = 21971 }
+sdist = { url = "https://files.pythonhosted.org/packages/9c/83/e9867538a794638d2d20ac3ab3106a31aca1d9cfea530c9b2921809dae03/pyright-1.1.388.tar.gz", hash = "sha256:0166d19b716b77fd2d9055de29f71d844874dbc6b9d3472ccd22df91db3dfa34", size = 21939 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/e3/39/877484412a1079003a7645375b487bd7c422692f4e5b7c2030dea3e83043/pyright-1.1.385-py3-none-any.whl", hash = "sha256:e5b9a1b8d492e13004d822af94d07d235f2c7c158457293b51ab2214c8c5b375", size = 18579 },
+ { url = "https://files.pythonhosted.org/packages/03/57/7fb00363b7f267a398c5bdf4f55f3e64f7c2076b2e7d2901b3373d52b6ff/pyright-1.1.388-py3-none-any.whl", hash = "sha256:c7068e9f2c23539c6ac35fc9efac6c6c1b9aa5a0ce97a9a8a6cf0090d7cbf84c", size = 18579 },
]
[[package]]
@@ -842,11 +844,11 @@ wheels = [
[[package]]
name = "python-multipart"
-version = "0.0.12"
+version = "0.0.17"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/16/6e/7ecfe1366b9270f7f475c76fcfa28812493a6a1abd489b2433851a444f4f/python_multipart-0.0.12.tar.gz", hash = "sha256:045e1f98d719c1ce085ed7f7e1ef9d8ccc8c02ba02b5566d5f7521410ced58cb", size = 35713 }
+sdist = { url = "https://files.pythonhosted.org/packages/40/22/edea41c2d4a22e666c0c7db7acdcbf7bc8c1c1f7d3b3ca246ec982fec612/python_multipart-0.0.17.tar.gz", hash = "sha256:41330d831cae6e2f22902704ead2826ea038d0419530eadff3ea80175aec5538", size = 36452 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/f5/0b/c316262244abea7481f95f1e91d7575f3dfcf6455d56d1ffe9839c582eb1/python_multipart-0.0.12-py3-none-any.whl", hash = "sha256:43dcf96cf65888a9cd3423544dd0d75ac10f7aa0c3c28a175bbcd00c9ce1aebf", size = 23246 },
+ { url = "https://files.pythonhosted.org/packages/b4/fb/275137a799169392f1fa88fff2be92f16eee38e982720a8aaadefc4a36b2/python_multipart-0.0.17-py3-none-any.whl", hash = "sha256:15dc4f487e0a9476cc1201261188ee0940165cffc94429b6fc565c4d3045cb5d", size = 24453 },
]
[[package]]
@@ -895,76 +897,76 @@ wheels = [
[[package]]
name = "rapidfuzz"
-version = "3.10.0"
+version = "3.10.1"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/81/43/ce16df67029b8e4f528fd1b3fbe5e9fcfc6fcc16823c66349260dd93750e/rapidfuzz-3.10.0.tar.gz", hash = "sha256:6b62af27e65bb39276a66533655a2fa3c60a487b03935721c45b7809527979be", size = 57942780 }
+sdist = { url = "https://files.pythonhosted.org/packages/e1/39/e3bcb901c2746734cd70151253bf9e61c688d3c415227b08e6fbf7eb5d7f/rapidfuzz-3.10.1.tar.gz", hash = "sha256:5a15546d847a915b3f42dc79ef9b0c78b998b4e2c53b252e7166284066585979", size = 57982250 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/17/02/558443e8d2cecf243a8465a4e6167d66dedd8aff6dd91cae4b4daa4fed8a/rapidfuzz-3.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:884453860de029380dded8f3c1918af2d8eb5adf8010261645c7e5c88c2b5428", size = 1966305 },
- { url = "https://files.pythonhosted.org/packages/67/3c/999fcad4fea8ca27113f4f6dbc65978648abe6d5764eeb71e62baa319b60/rapidfuzz-3.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:718c9bd369288aca5fa929df6dbf66fdbe9768d90940a940c0b5cdc96ade4309", size = 1435501 },
- { url = "https://files.pythonhosted.org/packages/a4/b7/af0f8c6015c24f899f8e7de12258468069ad7c0a2c79544a84177e6dd95b/rapidfuzz-3.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a68e3724b7dab761c01816aaa64b0903734d999d5589daf97c14ef5cc0629a8e", size = 1423411 },
- { url = "https://files.pythonhosted.org/packages/e6/ea/bb28f8680112fbbaeb1da7f84a66addb4b90b423dd3bb5184d525068bfcb/rapidfuzz-3.10.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1af60988d47534246d9525f77288fdd9de652608a4842815d9018570b959acc6", size = 5611054 },
- { url = "https://files.pythonhosted.org/packages/8a/b5/baef2c85095b30a3032709c8b523c1bd4e9db9f630ff7e07806e99ca2e2c/rapidfuzz-3.10.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3084161fc3e963056232ef8d937449a2943852e07101f5a136c8f3cfa4119217", size = 1670385 },
- { url = "https://files.pythonhosted.org/packages/c8/bc/2e7203db3a2cf07a65d7aaf89f7deb7875d2a006f12d0d69cb6d94cd864b/rapidfuzz-3.10.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6cd67d3d017296d98ff505529104299f78433e4b8af31b55003d901a62bbebe9", size = 1687624 },
- { url = "https://files.pythonhosted.org/packages/1c/da/bfe72cc3579e798b038f41278afc56da28facad1bb580f1c6bb36882bdbe/rapidfuzz-3.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b11a127ac590fc991e8a02c2d7e1ac86e8141c92f78546f18b5c904064a0552c", size = 3135149 },
- { url = "https://files.pythonhosted.org/packages/ba/ea/9c981ca6080f7dc6298473d7a3100b845c96c4beecb0ad4c9bd080aa330a/rapidfuzz-3.10.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:aadce42147fc09dcef1afa892485311e824c050352e1aa6e47f56b9b27af4cf0", size = 2346328 },
- { url = "https://files.pythonhosted.org/packages/dc/14/9e0c4365371872311c2e5d496f41f86d3327471516db9892b726b55259b5/rapidfuzz-3.10.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b54853c2371bf0e38d67da379519deb6fbe70055efb32f6607081641af3dc752", size = 6940192 },
- { url = "https://files.pythonhosted.org/packages/d6/b6/bab329e6490ca7dd4e36b90c5185b0ce7a85c1405b7bff7179fa5d3bd9fa/rapidfuzz-3.10.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ce19887268e90ee81a3957eef5e46a70ecc000713796639f83828b950343f49e", size = 2720301 },
- { url = "https://files.pythonhosted.org/packages/21/8d/92dc0bd5387b8b4a5ecc82d710dd754008d52c83eafd48d32dda0ce076af/rapidfuzz-3.10.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:f39a2a5ded23b9b9194ec45740dce57177b80f86c6d8eba953d3ff1a25c97766", size = 3284080 },
- { url = "https://files.pythonhosted.org/packages/d3/59/414c855b545a588a9ad4d96247077f677dac951d08a62709760bc2e387ef/rapidfuzz-3.10.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0ec338d5f4ad8d9339a88a08db5c23e7f7a52c2b2a10510c48a0cef1fb3f0ddc", size = 4184678 },
- { url = "https://files.pythonhosted.org/packages/ea/00/6543ee8db94036448b74f5922553ec08bc6c3a81b44dcf86dcae0a5b7e42/rapidfuzz-3.10.0-cp310-cp310-win32.whl", hash = "sha256:56fd15ea8f4c948864fa5ebd9261c67cf7b89a1c517a0caef4df75446a7af18c", size = 1829783 },
- { url = "https://files.pythonhosted.org/packages/c1/69/95051e280220a3785b54ed1b65b2c82450fa9cd7bab8b6eea578199e48b4/rapidfuzz-3.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:43dfc5e733808962a822ff6d9c29f3039a3cfb3620706f5953e17cfe4496724c", size = 1614712 },
- { url = "https://files.pythonhosted.org/packages/83/e5/822c879f1bf1debf35f1e203de6273871366575af6864dc96aebcaa1330e/rapidfuzz-3.10.0-cp310-cp310-win_arm64.whl", hash = "sha256:ae7966f205b5a7fde93b44ca8fed37c1c8539328d7f179b1197de34eceaceb5f", size = 852448 },
- { url = "https://files.pythonhosted.org/packages/bb/b5/30cb52dffa8fd69b0f1d25b0946074135245c1ee705fb75e8dccdd6c9562/rapidfuzz-3.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bb0013795b40db5cf361e6f21ee7cda09627cf294977149b50e217d7fe9a2f03", size = 1967322 },
- { url = "https://files.pythonhosted.org/packages/7b/ac/5ea5a468184ba902cc6ef856e7134342bf9eafe832ae7af1b2b307c8e6de/rapidfuzz-3.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:69ef5b363afff7150a1fbe788007e307b9802a2eb6ad92ed51ab94e6ad2674c6", size = 1436413 },
- { url = "https://files.pythonhosted.org/packages/59/f0/c69b0d1a06486b28dca0e96fe78ecf027f791aae789b2d1623dd1317f7fe/rapidfuzz-3.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c582c46b1bb0b19f1a5f4c1312f1b640c21d78c371a6615c34025b16ee56369b", size = 1417409 },
- { url = "https://files.pythonhosted.org/packages/c3/0e/a750c2a921d7c4b13a1519b6f27a5640a7cf97b8aa15abac37cce828707e/rapidfuzz-3.10.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:288f6f6e7410cacb115fb851f3f18bf0e4231eb3f6cb5bd1cec0e7b25c4d039d", size = 5605106 },
- { url = "https://files.pythonhosted.org/packages/57/3a/ab7a902b11ed6b5810cdda9c6e20956e7313695cc704c48d66dc81889bb9/rapidfuzz-3.10.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9e29a13d2fd9be3e7d8c26c7ef4ba60b5bc7efbc9dbdf24454c7e9ebba31768", size = 1679546 },
- { url = "https://files.pythonhosted.org/packages/34/9a/1799f6e0ca7a4e0d512c21a748b8676fb926715e20aa9908018f63776e37/rapidfuzz-3.10.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea2da0459b951ee461bd4e02b8904890bd1c4263999d291c5cd01e6620177ad4", size = 1689017 },
- { url = "https://files.pythonhosted.org/packages/ed/82/5a3eb4ef6dcf757bde6d94bbc14be4e7fd30cf226f383ff00c75ec0b64c8/rapidfuzz-3.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:457827ba82261aa2ae6ac06a46d0043ab12ba7216b82d87ae1434ec0f29736d6", size = 3137260 },
- { url = "https://files.pythonhosted.org/packages/5a/07/0759f70214d87bdc03334f9da2498cb35a9ceb8ae9637578a8845efbcc9f/rapidfuzz-3.10.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5d350864269d56f51ab81ab750c9259ae5cad3152c0680baef143dcec92206a1", size = 2346716 },
- { url = "https://files.pythonhosted.org/packages/4d/8c/3749d7262c071715cbea2fb191359954289a254076ceb77447f0649fbe18/rapidfuzz-3.10.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a9b8f51e08c3f983d857c3889930af9ddecc768453822076683664772d87e374", size = 6940531 },
- { url = "https://files.pythonhosted.org/packages/11/68/60160de39f075c8c2f81a24bd778ad506b7f356e7a28c16efc83abf7bfcf/rapidfuzz-3.10.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7f3a6aa6e70fc27e4ff5c479f13cc9fc26a56347610f5f8b50396a0d344c5f55", size = 2720777 },
- { url = "https://files.pythonhosted.org/packages/61/e0/a4ba196c34787052ee48b4c86eacaee4e8d4902da64e0cc1c94f89291a53/rapidfuzz-3.10.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:803f255f10d63420979b1909ef976e7d30dec42025c9b067fc1d2040cc365a7e", size = 3278147 },
- { url = "https://files.pythonhosted.org/packages/ed/35/9c7efc53fdfd8af72ffcc179284975f11d7f06db84317c7b245708781e45/rapidfuzz-3.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2026651761bf83a0f31495cc0f70840d5c0d54388f41316e3f9cb51bd85e49a5", size = 4186017 },
- { url = "https://files.pythonhosted.org/packages/e1/83/b988895450934d379fccdf8ab1d25fd581c21b2d54e4fc2047ec0fef4e81/rapidfuzz-3.10.0-cp311-cp311-win32.whl", hash = "sha256:4df75b3ebbb8cfdb9bf8b213b168620b88fd92d0c16a8bc9f9234630b282db59", size = 1830483 },
- { url = "https://files.pythonhosted.org/packages/60/48/1bdb509cc379a15fc70bb23297ad7f11bf8c5a5f14d33fbc1a657d58f1f4/rapidfuzz-3.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:f9f0bbfb6787b97c51516f3ccf97737d504db5d239ad44527673b81f598b84ab", size = 1620641 },
- { url = "https://files.pythonhosted.org/packages/82/c7/6f23bef568c1e33e428210959e00964fec9a090f8cc084fa97d3bbfe6f54/rapidfuzz-3.10.0-cp311-cp311-win_arm64.whl", hash = "sha256:10fdad800441b9c97d471a937ba7d42625f1b530db05e572f1cb7d401d95c893", size = 853922 },
- { url = "https://files.pythonhosted.org/packages/f9/6d/5cd4c1ef9c9021e310a178a5392670e6309fb6a0baf9843d477891b2be97/rapidfuzz-3.10.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7dc87073ba3a40dd65591a2100aa71602107443bf10770579ff9c8a3242edb94", size = 1951588 },
- { url = "https://files.pythonhosted.org/packages/b5/d1/3ddea7077f2a0627deab019e8dc59c9777a90feddbc649408bd1f0a29ff2/rapidfuzz-3.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a425a0a868cf8e9c6e93e1cda4b758cdfd314bb9a4fc916c5742c934e3613480", size = 1432273 },
- { url = "https://files.pythonhosted.org/packages/54/bc/27f296de09867c902aac9864bdbbe09a1cb26d57ade701683c40a5b59e88/rapidfuzz-3.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a86d5d1d75e61df060c1e56596b6b0a4422a929dff19cc3dbfd5eee762c86b61", size = 1402762 },
- { url = "https://files.pythonhosted.org/packages/6f/54/0249d4b28b3ed3638d2d02061d422f78ddcf733baff9e8dffc5bf59e3f84/rapidfuzz-3.10.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34f213d59219a9c3ca14e94a825f585811a68ac56b4118b4dc388b5b14afc108", size = 5507014 },
- { url = "https://files.pythonhosted.org/packages/56/3c/4e25243649486ec945fedc7b973c1cc6533a39f01f7771cb62aace3515fd/rapidfuzz-3.10.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:96ad46f5f56f70fab2be9e5f3165a21be58d633b90bf6e67fc52a856695e4bcf", size = 1652082 },
- { url = "https://files.pythonhosted.org/packages/e2/ba/9e5ea2868701292f07b6357ac04333b50088a4f2b3155ccbbb95b219c788/rapidfuzz-3.10.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9178277f72d144a6c7704d7ae7fa15b7b86f0f0796f0e1049c7b4ef748a662ef", size = 1681575 },
- { url = "https://files.pythonhosted.org/packages/15/e6/28fcaedcacaf6b56e7281d67e1aba88d743c8978a12b9cebedcfcd7c31ab/rapidfuzz-3.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76a35e9e19a7c883c422ffa378e9a04bc98cb3b29648c5831596401298ee51e6", size = 3138769 },
- { url = "https://files.pythonhosted.org/packages/a9/60/ec2b616f3dd5b0a80987c8b183c45183d28a0f678e8f4aace074e2e3a341/rapidfuzz-3.10.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8a6405d34c394c65e4f73a1d300c001f304f08e529d2ed6413b46ee3037956eb", size = 2317255 },
- { url = "https://files.pythonhosted.org/packages/68/ac/8db7aa643d758b621e0e84d29b4f502b615aa751249107454de55b0fb214/rapidfuzz-3.10.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:bd393683129f446a75d8634306aed7e377627098a1286ff3af2a4f1736742820", size = 6887160 },
- { url = "https://files.pythonhosted.org/packages/92/ca/790026bfacdcf7e458bc72a18086bdd5d06a3d369f22a1ff5011ba132de0/rapidfuzz-3.10.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:b0445fa9880ead81f5a7d0efc0b9c977a947d8052c43519aceeaf56eabaf6843", size = 2686065 },
- { url = "https://files.pythonhosted.org/packages/6f/79/7e4af9d046d8315f7f42020e1c8232689603a4d9ea0f8d177dfa7c13629b/rapidfuzz-3.10.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:c50bc308fa29767ed8f53a8d33b7633a9e14718ced038ed89d41b886e301da32", size = 3241044 },
- { url = "https://files.pythonhosted.org/packages/aa/9e/778bcf792afa252f225a52f263bd7dc4042cce7436bc5a81721ac6d70276/rapidfuzz-3.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e89605afebbd2d4b045bccfdc12a14b16fe8ccbae05f64b4b4c64a97dad1c891", size = 4159434 },
- { url = "https://files.pythonhosted.org/packages/81/6e/9ed55e266d2359a1b93c204fc68d332d5254420eb30f7df860eaaaeb150c/rapidfuzz-3.10.0-cp312-cp312-win32.whl", hash = "sha256:2db9187f3acf3cd33424ecdbaad75414c298ecd1513470df7bda885dcb68cc15", size = 1812716 },
- { url = "https://files.pythonhosted.org/packages/72/95/9d4cba6535cafa8c21e58138955cadb7cb497e508cd92e7d75d7c6bdab64/rapidfuzz-3.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:50e3d0c72ea15391ba9531ead7f2068a67c5b18a6a365fef3127583aaadd1725", size = 1606635 },
- { url = "https://files.pythonhosted.org/packages/45/fb/3d0cff4cea5450be47a8dd90764f68496c2c1f5f1ef3cca3b286cf70d847/rapidfuzz-3.10.0-cp312-cp312-win_arm64.whl", hash = "sha256:9eac95b4278bd53115903d89118a2c908398ee8bdfd977ae844f1bd2b02b917c", size = 848414 },
- { url = "https://files.pythonhosted.org/packages/05/f1/552aa54764fcce4d3db6eebcba5160bf7aa15aea87a89282a67cab7aeeb9/rapidfuzz-3.10.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fe5231e8afd069c742ac5b4f96344a0fe4aff52df8e53ef87faebf77f827822c", size = 1943724 },
- { url = "https://files.pythonhosted.org/packages/9b/2f/a65c74e10c9fc2c7a5003390fc269c423554a174725fe18d11b33cf70b1e/rapidfuzz-3.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:886882367dbc985f5736356105798f2ae6e794e671fc605476cbe2e73838a9bb", size = 1426386 },
- { url = "https://files.pythonhosted.org/packages/7b/a5/a76ca37c8e6339a78944766b633fa7b82728a52fdcd5e67a934b2f04647d/rapidfuzz-3.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b33e13e537e3afd1627d421a142a12bbbe601543558a391a6fae593356842f6e", size = 1397508 },
- { url = "https://files.pythonhosted.org/packages/2c/63/4ef6acfa96baafed7fa52efe8b744de54abfee0838aa539b60045fe02816/rapidfuzz-3.10.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:094c26116d55bf9c53abd840d08422f20da78ec4c4723e5024322321caedca48", size = 5527413 },
- { url = "https://files.pythonhosted.org/packages/37/f8/00236ff2dd9bdc7561ccf6693840dd47e74bd73e6e7e974e03637e869ff8/rapidfuzz-3.10.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:545fc04f2d592e4350f59deb0818886c1b444ffba3bec535b4fbb97191aaf769", size = 1624894 },
- { url = "https://files.pythonhosted.org/packages/5e/19/1074dcc30e162c7d9f5626dbf4b686e7c15ec5d25c6201741518dcbe37ab/rapidfuzz-3.10.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:916a6abf3632e592b937c3d04c00a6efadd8fd30539cdcd4e6e4d92be7ca5d90", size = 1683238 },
- { url = "https://files.pythonhosted.org/packages/d6/66/7a6e7614a4495ebe295a8f0961562b5957ccd4e1e364a5ab0272e622fa00/rapidfuzz-3.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb6ec40cef63b1922083d33bfef2f91fc0b0bc07b5b09bfee0b0f1717d558292", size = 3118803 },
- { url = "https://files.pythonhosted.org/packages/1f/63/2eb57053c3af2e3e5e209bd30e74838eee0c384ba9dc3cd71253edb829ff/rapidfuzz-3.10.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c77a7330dd15c7eb5fd3631dc646fc96327f98db8181138766bd14d3e905f0ba", size = 2313393 },
- { url = "https://files.pythonhosted.org/packages/b7/8e/fea01820046f27e4ebf547c256e7065f7c53f0e6fa458e7a42002a39acc7/rapidfuzz-3.10.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:949b5e9eeaa4ecb4c7e9c2a4689dddce60929dd1ff9c76a889cdbabe8bbf2171", size = 6900944 },
- { url = "https://files.pythonhosted.org/packages/e3/00/7faa67320d2fcf669b4de39fd0ed45465d9106d72f2c879a462cb5ada95a/rapidfuzz-3.10.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b5363932a5aab67010ae1a6205c567d1ef256fb333bc23c27582481606be480c", size = 2677938 },
- { url = "https://files.pythonhosted.org/packages/41/6a/4abcecb5604950b8f7caba93becdb5c0220ec1ee32b4176f26c5748d7806/rapidfuzz-3.10.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:5dd6eec15b13329abe66cc241b484002ecb0e17d694491c944a22410a6a9e5e2", size = 3237492 },
- { url = "https://files.pythonhosted.org/packages/6e/a7/3e733f55907873e9ec56710f80d5fc8296ddf8f5c74b530f275c98d53e4b/rapidfuzz-3.10.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:79e7f98525b60b3c14524e0a4e1fedf7654657b6e02eb25f1be897ab097706f3", size = 4155588 },
- { url = "https://files.pythonhosted.org/packages/1f/b1/ab98a0a1511ab6695118d083bbf49afa6246fd445034be2aa13faa4914b4/rapidfuzz-3.10.0-cp313-cp313-win32.whl", hash = "sha256:d29d1b9857c65f8cb3a29270732e1591b9bacf89de9d13fa764f79f07d8f1fd2", size = 1810829 },
- { url = "https://files.pythonhosted.org/packages/59/0e/939808bf07fd1e3d809c54c03bbd4266ae197f5aca6eb1edf2c592cc57eb/rapidfuzz-3.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:fa9720e56663cc3649d62b4b5f3145e94b8f5611e8a8e1b46507777249d46aad", size = 1604489 },
- { url = "https://files.pythonhosted.org/packages/fa/51/15e04a4cccf3b4b2a93fdbe413157e0568538fd61a0fef9bd4d8accd326c/rapidfuzz-3.10.0-cp313-cp313-win_arm64.whl", hash = "sha256:eda4c661e68dddd56c8fbfe1ca35e40dd2afd973f7ebb1605f4d151edc63dff8", size = 847299 },
- { url = "https://files.pythonhosted.org/packages/9d/20/1cda42f5454a465fe276778823a54472f0aa61c28a9def1924d5380eaaa4/rapidfuzz-3.10.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f744b5eb1469bf92dd143d36570d2bdbbdc88fe5cb0b5405e53dd34f479cbd8a", size = 1862282 },
- { url = "https://files.pythonhosted.org/packages/a3/ef/fe526fcc3f5bd7c957f33416f425614835a1a209035edf2ba7ab0d9c37e0/rapidfuzz-3.10.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b67cc21a14327a0eb0f47bc3d7e59ec08031c7c55220ece672f9476e7a8068d3", size = 1370501 },
- { url = "https://files.pythonhosted.org/packages/7c/e3/ca9727768e7d2363306bd39987f881c5a80629cc402d14b17bbe9c4c0d49/rapidfuzz-3.10.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fe5783676f0afba4a522c80b15e99dbf4e393c149ab610308a8ef1f04c6bcc8", size = 1359795 },
- { url = "https://files.pythonhosted.org/packages/e1/14/06a92d5d18d51f87c297bee7ba466e974c8285e08d71dcb8f2b55696bc48/rapidfuzz-3.10.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4688862f957c8629d557d084f20b2d803f8738b6c4066802a0b1cc472e088d9", size = 5466273 },
- { url = "https://files.pythonhosted.org/packages/93/ba/33a44d2f455aa79dade45447a3a5e37fa42b0879ba6fed4539eca0aaeaad/rapidfuzz-3.10.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20bd153aacc244e4c907d772c703fea82754c4db14f8aa64d75ff81b7b8ab92d", size = 3058535 },
- { url = "https://files.pythonhosted.org/packages/22/88/a38224c3059a464e7f32115af6eb9cfae755e2a6bb1a4e95cf74227b656f/rapidfuzz-3.10.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:50484d563f8bfa723c74c944b0bb15b9e054db9c889348c8c307abcbee75ab92", size = 1544256 },
+ { url = "https://files.pythonhosted.org/packages/c9/9b/5ae9defba2dc0ccd97de080cc487195dc5648c44073d4f54f75a7d1b207a/rapidfuzz-3.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f17d9f21bf2f2f785d74f7b0d407805468b4c173fa3e52c86ec94436b338e74a", size = 1954227 },
+ { url = "https://files.pythonhosted.org/packages/c4/39/3f6c084a0d8b3e39fc46d9fee92dcb038aec90d001ff0ff445012658fd4b/rapidfuzz-3.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b31f358a70efc143909fb3d75ac6cd3c139cd41339aa8f2a3a0ead8315731f2b", size = 1427057 },
+ { url = "https://files.pythonhosted.org/packages/df/e0/87499ca83521ee23b51e3311dd9d518cc5abb42c79dcd1869687cc8f529f/rapidfuzz-3.10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f4f43f2204b56a61448ec2dd061e26fd344c404da99fb19f3458200c5874ba2", size = 1419507 },
+ { url = "https://files.pythonhosted.org/packages/7e/24/4df85f2dd2930d0aef51a9ec16f39b295619120abf317e44419f632f40df/rapidfuzz-3.10.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9d81bf186a453a2757472133b24915768abc7c3964194406ed93e170e16c21cb", size = 5635495 },
+ { url = "https://files.pythonhosted.org/packages/96/12/42cdf911896f02c780e9e194386177f90f2b36c94fe77e3d05cf5e7ebff4/rapidfuzz-3.10.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3611c8f45379a12063d70075c75134f2a8bd2e4e9b8a7995112ddae95ca1c982", size = 1681131 },
+ { url = "https://files.pythonhosted.org/packages/44/c0/8e4c19dde3504bd1027adbc7ef1a18f575bc041686cb0c5896392b12be97/rapidfuzz-3.10.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3c3b537b97ac30da4b73930fa8a4fe2f79c6d1c10ad535c5c09726612cd6bed9", size = 1683814 },
+ { url = "https://files.pythonhosted.org/packages/50/7d/8ff52a37beb75874b733ae3197345479b53a112ba504b8d8e4ea8f48467e/rapidfuzz-3.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:231ef1ec9cf7b59809ce3301006500b9d564ddb324635f4ea8f16b3e2a1780da", size = 3138346 },
+ { url = "https://files.pythonhosted.org/packages/75/93/538dd72e250f655261a53c454d9eb4ef0d4cf8e4855c765d1c8250dc9179/rapidfuzz-3.10.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ed4f3adc1294834955b7e74edd3c6bd1aad5831c007f2d91ea839e76461a5879", size = 2334973 },
+ { url = "https://files.pythonhosted.org/packages/61/83/441b5aef0a07ec3e6ea5b2f018d326a328aabe96c9e4808c8a25c39e852c/rapidfuzz-3.10.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:7b6015da2e707bf632a71772a2dbf0703cff6525732c005ad24987fe86e8ec32", size = 6950808 },
+ { url = "https://files.pythonhosted.org/packages/7b/e1/34decfa6d56c824daa75db833066ff71ab5eb61a21ec986a0ddbaf20b147/rapidfuzz-3.10.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:1b35a118d61d6f008e8e3fb3a77674d10806a8972c7b8be433d6598df4d60b01", size = 2717016 },
+ { url = "https://files.pythonhosted.org/packages/0b/8b/a210b8526929b93b7aad42ce751740743a295849dfa52b126202004c8ee9/rapidfuzz-3.10.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:bc308d79a7e877226f36bdf4e149e3ed398d8277c140be5c1fd892ec41739e6d", size = 3265607 },
+ { url = "https://files.pythonhosted.org/packages/61/24/911b0ac2199a78ff8e0f4dcc2e3a5349ecc8841864bc04658f48b9ef73ff/rapidfuzz-3.10.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f017dbfecc172e2d0c37cf9e3d519179d71a7f16094b57430dffc496a098aa17", size = 4173494 },
+ { url = "https://files.pythonhosted.org/packages/25/f3/c44a170598e28fdfce7be271da57832cbadc420b3052a418e49a808124f7/rapidfuzz-3.10.1-cp310-cp310-win32.whl", hash = "sha256:36c0e1483e21f918d0f2f26799fe5ac91c7b0c34220b73007301c4f831a9c4c7", size = 1834711 },
+ { url = "https://files.pythonhosted.org/packages/cc/a7/b74eec156c61856e2fbcc3272cdd4f9cd6cf4e8df4144e02adfda5f5ac4f/rapidfuzz-3.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:10746c1d4c8cd8881c28a87fd7ba0c9c102346dfe7ff1b0d021cdf093e9adbff", size = 1608790 },
+ { url = "https://files.pythonhosted.org/packages/41/bf/b0a575f1e2aa3c4cf01f9cd5c4b4103e093d31df8ffec272bfc5ad407f64/rapidfuzz-3.10.1-cp310-cp310-win_arm64.whl", hash = "sha256:dfa64b89dcb906835e275187569e51aa9d546a444489e97aaf2cc84011565fbe", size = 844285 },
+ { url = "https://files.pythonhosted.org/packages/fb/2c/62efddd64bcaf39c03b928784777bb614028c5975ec7465d34eded34a7f7/rapidfuzz-3.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:92958ae075c87fef393f835ed02d4fe8d5ee2059a0934c6c447ea3417dfbf0e8", size = 1954920 },
+ { url = "https://files.pythonhosted.org/packages/41/a7/f8411b9b4037d1ea6707dee975e4ed6b5358192f5ba7aa544610df5c7522/rapidfuzz-3.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ba7521e072c53e33c384e78615d0718e645cab3c366ecd3cc8cb732befd94967", size = 1427745 },
+ { url = "https://files.pythonhosted.org/packages/0d/69/ddd0192b64cb55bca40ebcae48480fab0148334b9995eb9d5bd78b7333f6/rapidfuzz-3.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00d02cbd75d283c287471b5b3738b3e05c9096150f93f2d2dfa10b3d700f2db9", size = 1409233 },
+ { url = "https://files.pythonhosted.org/packages/18/7d/0655a52c31227bf2880f28d3c01cc4f20b584210f849a1953e4c734599e5/rapidfuzz-3.10.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:efa1582a397da038e2f2576c9cd49b842f56fde37d84a6b0200ffebc08d82350", size = 5609458 },
+ { url = "https://files.pythonhosted.org/packages/0b/c5/5f18cd956fcf95cbdee054cd4f7b7042eacc1430f6682fae0859deb9694b/rapidfuzz-3.10.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f12912acee1f506f974f58de9fdc2e62eea5667377a7e9156de53241c05fdba8", size = 1675729 },
+ { url = "https://files.pythonhosted.org/packages/82/67/cf9f25a2dc02f8170c1c0b7f6d41aa39b0f28c3cd54140ec3cab315cbdf0/rapidfuzz-3.10.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666d5d8b17becc3f53447bcb2b6b33ce6c2df78792495d1fa82b2924cd48701a", size = 1678147 },
+ { url = "https://files.pythonhosted.org/packages/ac/3d/fa8444d7144129b1c67a2ba0660b44af03285fd641516ee294593d2acb91/rapidfuzz-3.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26f71582c0d62445067ee338ddad99b655a8f4e4ed517a90dcbfbb7d19310474", size = 3129309 },
+ { url = "https://files.pythonhosted.org/packages/81/f6/a9fc68b776273282d6aeaadc6330740328bac29f8746fe8cceb9155e904a/rapidfuzz-3.10.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8a2ef08b27167bcff230ffbfeedd4c4fa6353563d6aaa015d725dd3632fc3de7", size = 2339967 },
+ { url = "https://files.pythonhosted.org/packages/17/e5/f6c99fefbacef3676394b09ee66782d72710911c971c8730ef602e21fbd1/rapidfuzz-3.10.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:365e4fc1a2b95082c890f5e98489b894e6bf8c338c6ac89bb6523c2ca6e9f086", size = 6943002 },
+ { url = "https://files.pythonhosted.org/packages/ee/ab/92c97b37ee24f68e2f904d8ef658bcfa47e3caf4d8491aa8bc5314704fc4/rapidfuzz-3.10.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1996feb7a61609fa842e6b5e0c549983222ffdedaf29644cc67e479902846dfe", size = 2717032 },
+ { url = "https://files.pythonhosted.org/packages/20/f9/894a20e7856c9b29fd746ffca8f8360df8e4027b503ac5475439c043137f/rapidfuzz-3.10.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:cf654702f144beaa093103841a2ea6910d617d0bb3fccb1d1fd63c54dde2cd49", size = 3263149 },
+ { url = "https://files.pythonhosted.org/packages/db/69/2a00d3c7d29d084311b1ab0fc83ba228ce81f78e9a60f901d64c74c0f31e/rapidfuzz-3.10.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ec108bf25de674781d0a9a935030ba090c78d49def3d60f8724f3fc1e8e75024", size = 4176326 },
+ { url = "https://files.pythonhosted.org/packages/bd/27/0cef6ddfd7b163b99b40a7fb1b1c15e0c9d25ec8f528b9f0af9dc2b980a2/rapidfuzz-3.10.1-cp311-cp311-win32.whl", hash = "sha256:031f8b367e5d92f7a1e27f7322012f3c321c3110137b43cc3bf678505583ef48", size = 1835384 },
+ { url = "https://files.pythonhosted.org/packages/fc/0b/b15a8853672e6fca00d83b3a6c037c07ff16a73932a55e69488c46e6b9d7/rapidfuzz-3.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:f98f36c6a1bb9a6c8bbec99ad87c8c0e364f34761739b5ea9adf7b48129ae8cf", size = 1614933 },
+ { url = "https://files.pythonhosted.org/packages/95/8a/6057b41a8a6a2245a699c1beff62baa1021543e953e05dbdb355b953f886/rapidfuzz-3.10.1-cp311-cp311-win_arm64.whl", hash = "sha256:f1da2028cb4e41be55ee797a82d6c1cf589442504244249dfeb32efc608edee7", size = 845810 },
+ { url = "https://files.pythonhosted.org/packages/77/e9/a7981ad1a7fbe4d76aa4fbbc8f2d6aac289ab62e60173f92fd3e05619f25/rapidfuzz-3.10.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:1340b56340896bede246f612b6ecf685f661a56aabef3d2512481bfe23ac5835", size = 1938706 },
+ { url = "https://files.pythonhosted.org/packages/bd/2b/f343df6ae726d01aa31c5ff63f2a5807dfeffa671ebf2fb9be8f8b9b2026/rapidfuzz-3.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2316515169b7b5a453f0ce3adbc46c42aa332cae9f2edb668e24d1fc92b2f2bb", size = 1423814 },
+ { url = "https://files.pythonhosted.org/packages/13/07/6accf77b78772de2a5590ef7965d3b7c9997c5a92e913e525765586aa261/rapidfuzz-3.10.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e06fe6a12241ec1b72c0566c6b28cda714d61965d86569595ad24793d1ab259", size = 1393680 },
+ { url = "https://files.pythonhosted.org/packages/46/16/2a016051489f870d15f7cdcccf823ea5f474453dda5c20cf0044ed3122d5/rapidfuzz-3.10.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d99c1cd9443b19164ec185a7d752f4b4db19c066c136f028991a480720472e23", size = 5545438 },
+ { url = "https://files.pythonhosted.org/packages/97/0b/2cdafff5dcb06ed6ede6f81a2f677c1f4cc08a47a6cf16862eb62903a84b/rapidfuzz-3.10.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1d9aa156ed52d3446388ba4c2f335e312191d1ca9d1f5762ee983cf23e4ecf6", size = 1646447 },
+ { url = "https://files.pythonhosted.org/packages/97/65/20a859278192ca036ead255dda49f4eac63dd8d666b3a902d7be3afd38ac/rapidfuzz-3.10.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:54bcf4efaaee8e015822be0c2c28214815f4f6b4f70d8362cfecbd58a71188ac", size = 1672282 },
+ { url = "https://files.pythonhosted.org/packages/3c/05/b8dcfbdc8f4e3e84abf86ea13ec9595ebaf7e5375011e5d49642705704ad/rapidfuzz-3.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0c955e32afdbfdf6e9ee663d24afb25210152d98c26d22d399712d29a9b976b", size = 3126089 },
+ { url = "https://files.pythonhosted.org/packages/3f/eb/e2f5b1643cf463b1b23c36875e711cae0091f6aaa1538c025a12cba32634/rapidfuzz-3.10.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:191633722203f5b7717efcb73a14f76f3b124877d0608c070b827c5226d0b972", size = 2300501 },
+ { url = "https://files.pythonhosted.org/packages/7c/28/f3aa5d3a56cc978e73baff951549425d1a722ec3b58cacbc74c4faad2127/rapidfuzz-3.10.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:195baad28057ec9609e40385991004e470af9ef87401e24ebe72c064431524ab", size = 6903454 },
+ { url = "https://files.pythonhosted.org/packages/b8/66/ba6de8c1fe5c50230d4e0adb87dde39b143ac2a4ce959a3f8076266b1767/rapidfuzz-3.10.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0fff4a6b87c07366662b62ae994ffbeadc472e72f725923f94b72a3db49f4671", size = 2681137 },
+ { url = "https://files.pythonhosted.org/packages/e8/ca/4e9dbc9bca8cd1b933cfc6f961179f883cead90689619ec0aa1a5f075b0e/rapidfuzz-3.10.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4ffed25f9fdc0b287f30a98467493d1e1ce5b583f6317f70ec0263b3c97dbba6", size = 3230482 },
+ { url = "https://files.pythonhosted.org/packages/14/50/6484ce7091b815757d6f0c434b78b568d3e7a80b6145a2d9aadc65b16132/rapidfuzz-3.10.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d02cf8e5af89a9ac8f53c438ddff6d773f62c25c6619b29db96f4aae248177c0", size = 4147386 },
+ { url = "https://files.pythonhosted.org/packages/0b/27/9f7a0dbdd5b478790c68297b0678bc0088b9068e667878e5d1359c3ffba0/rapidfuzz-3.10.1-cp312-cp312-win32.whl", hash = "sha256:f3bb81d4fe6a5d20650f8c0afcc8f6e1941f6fecdb434f11b874c42467baded0", size = 1818115 },
+ { url = "https://files.pythonhosted.org/packages/58/b6/c5f5e8043052fdbd4aa4f41d93b0e72d089172237ed5ec42118683a9833a/rapidfuzz-3.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:aaf83e9170cb1338922ae42d320699dccbbdca8ffed07faeb0b9257822c26e24", size = 1600653 },
+ { url = "https://files.pythonhosted.org/packages/56/d3/dd84c7ed88cd4391e78b3579ecf7141ebf8b900097da2d6911db148d4bb6/rapidfuzz-3.10.1-cp312-cp312-win_arm64.whl", hash = "sha256:c5da802a0d085ad81b0f62828fb55557996c497b2d0b551bbdfeafd6d447892f", size = 840363 },
+ { url = "https://files.pythonhosted.org/packages/2f/7a/18aa6a51345e46886784e90a2c5bba62e45ee3adc554c12c3b97c297c4c3/rapidfuzz-3.10.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fc22d69a1c9cccd560a5c434c0371b2df0f47c309c635a01a913e03bbf183710", size = 1931333 },
+ { url = "https://files.pythonhosted.org/packages/6f/6a/7e34ddc3d6d751c4dba0d58b681c99f161225730e9a2fa71969d2fa1d281/rapidfuzz-3.10.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38b0dac2c8e057562b8f0d8ae5b663d2d6a28c5ab624de5b73cef9abb6129a24", size = 1417685 },
+ { url = "https://files.pythonhosted.org/packages/ca/15/93a2eafbb4cc563d72112e4717b8c6f09e9de15f5a7709b832b8c9b81196/rapidfuzz-3.10.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fde3bbb14e92ce8fcb5c2edfff72e474d0080cadda1c97785bf4822f037a309", size = 1388805 },
+ { url = "https://files.pythonhosted.org/packages/82/23/541da9279b21fc380e89e49e5acd863ba2e2b5d483eb5b6e0cfc427e4540/rapidfuzz-3.10.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9141fb0592e55f98fe9ac0f3ce883199b9c13e262e0bf40c5b18cdf926109d16", size = 5515246 },
+ { url = "https://files.pythonhosted.org/packages/f3/a0/f0e43fdaf3c3c1907aa377d3610c70b31830e4d6915b8a61b51b064fcbce/rapidfuzz-3.10.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:237bec5dd1bfc9b40bbd786cd27949ef0c0eb5fab5eb491904c6b5df59d39d3c", size = 1642160 },
+ { url = "https://files.pythonhosted.org/packages/a7/da/7091eef23291997e7c379a396eedbac66a50a145200cac86a0313286403d/rapidfuzz-3.10.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18123168cba156ab5794ea6de66db50f21bb3c66ae748d03316e71b27d907b95", size = 1664562 },
+ { url = "https://files.pythonhosted.org/packages/bd/72/417ca8b5dde3c040c1cab1d5500fd24ffdf1a397cb86e36e958acb07cd65/rapidfuzz-3.10.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b75fe506c8e02769cc47f5ab21ce3e09b6211d3edaa8f8f27331cb6988779be", size = 3106304 },
+ { url = "https://files.pythonhosted.org/packages/57/18/0877c12deb79cee67f6b8fbb662e2d038582d0e26d895ddbfdb88cea7e17/rapidfuzz-3.10.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9da82aa4b46973aaf9e03bb4c3d6977004648c8638febfc0f9d237e865761270", size = 2302688 },
+ { url = "https://files.pythonhosted.org/packages/c2/71/ca9e092c6d904f9fabadac6361e52a484165ee5970f34e4dc70a647f36f3/rapidfuzz-3.10.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c34c022d5ad564f1a5a57a4a89793bd70d7bad428150fb8ff2760b223407cdcf", size = 6893082 },
+ { url = "https://files.pythonhosted.org/packages/c3/4c/99004b6ae04ead73d1e91829a78d9708c3c707aa83c1e782ea89f1ade491/rapidfuzz-3.10.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:1e96c84d6c2a0ca94e15acb5399118fff669f4306beb98a6d8ec6f5dccab4412", size = 2669909 },
+ { url = "https://files.pythonhosted.org/packages/cb/7c/d5c93a0e497a0430b4f0bfea22e41317c22357cd557fa9aeeafb9e991d9b/rapidfuzz-3.10.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e8e154b84a311263e1aca86818c962e1fa9eefdd643d1d5d197fcd2738f88cb9", size = 3223759 },
+ { url = "https://files.pythonhosted.org/packages/d6/77/2c22f438b643524b429731492665d91d9c654144e895f0051cee78d5928d/rapidfuzz-3.10.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:335fee93188f8cd585552bb8057228ce0111bd227fa81bfd40b7df6b75def8ab", size = 4148589 },
+ { url = "https://files.pythonhosted.org/packages/bf/d3/51cc9f258b362fca8ced7c34046b66d8887551da0169c06c27ee8d2ce279/rapidfuzz-3.10.1-cp313-cp313-win32.whl", hash = "sha256:6729b856166a9e95c278410f73683957ea6100c8a9d0a8dbe434c49663689255", size = 1816180 },
+ { url = "https://files.pythonhosted.org/packages/9d/9d/a69358047742dbc94516c71c07cfab4409d490578815c875949011e3f482/rapidfuzz-3.10.1-cp313-cp313-win_amd64.whl", hash = "sha256:0e06d99ad1ad97cb2ef7f51ec6b1fedd74a3a700e4949353871cf331d07b382a", size = 1598626 },
+ { url = "https://files.pythonhosted.org/packages/48/3c/8213b3216b542f3bd43051dc5a1c44e0cd741abb97bde064e89f241c5a82/rapidfuzz-3.10.1-cp313-cp313-win_arm64.whl", hash = "sha256:8d1b7082104d596a3eb012e0549b2634ed15015b569f48879701e9d8db959dbb", size = 839138 },
+ { url = "https://files.pythonhosted.org/packages/10/34/b26f0d4144a6b1cc81fc08a6b1f3193c3bf542701621e16be758bd2b00ae/rapidfuzz-3.10.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ac4452f182243cfab30ba4668ef2de101effaedc30f9faabb06a095a8c90fd16", size = 1853061 },
+ { url = "https://files.pythonhosted.org/packages/cf/8a/4a591193b0d9e384906e2fb2ee7185c1fcc033aff619ba4a68da99581499/rapidfuzz-3.10.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:565c2bd4f7d23c32834652b27b51dd711814ab614b4e12add8476be4e20d1cf5", size = 1361953 },
+ { url = "https://files.pythonhosted.org/packages/c1/9c/7f201398ee1d40aa27c4ddd5b3e5aa184c55c578b2ddb3a1676022405784/rapidfuzz-3.10.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:187d9747149321607be4ccd6f9f366730078bed806178ec3eeb31d05545e9e8f", size = 1354430 },
+ { url = "https://files.pythonhosted.org/packages/21/2e/bacebb43935aec023e6d130de1c28e886426827613c4dc40ef5dfa7b0c0e/rapidfuzz-3.10.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:616290fb9a8fa87e48cb0326d26f98d4e29f17c3b762c2d586f2b35c1fd2034b", size = 5476826 },
+ { url = "https://files.pythonhosted.org/packages/80/29/5e0828a824a1c0cf1bbd83b0cd2fba4e3fa72354c64e82b209a2284a0e74/rapidfuzz-3.10.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:073a5b107e17ebd264198b78614c0206fa438cce749692af5bc5f8f484883f50", size = 3050806 },
+ { url = "https://files.pythonhosted.org/packages/d8/22/e0c350a394b3ff304b4ff1acfd07cbed5d8672cf2dc0252c7a84f2553088/rapidfuzz-3.10.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:39c4983e2e2ccb9732f3ac7d81617088822f4a12291d416b09b8a1eadebb3e29", size = 1538817 },
]
[[package]]
@@ -984,41 +986,41 @@ wheels = [
[[package]]
name = "rich"
-version = "13.9.2"
+version = "13.9.4"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "markdown-it-py" },
{ name = "pygments" },
{ name = "typing-extensions", marker = "python_full_version < '3.11'" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/aa/9e/1784d15b057b0075e5136445aaea92d23955aad2c93eaede673718a40d95/rich-13.9.2.tar.gz", hash = "sha256:51a2c62057461aaf7152b4d611168f93a9fc73068f8ded2790f29fe2b5366d0c", size = 222843 }
+sdist = { url = "https://files.pythonhosted.org/packages/ab/3a/0316b28d0761c6734d6bc14e770d85506c986c85ffb239e688eeaab2c2bc/rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098", size = 223149 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/67/91/5474b84e505a6ccc295b2d322d90ff6aa0746745717839ee0c5fb4fdcceb/rich-13.9.2-py3-none-any.whl", hash = "sha256:8c82a3d3f8dcfe9e734771313e606b39d8247bb6b826e196f4914b333b743cf1", size = 242117 },
+ { url = "https://files.pythonhosted.org/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90", size = 242424 },
]
[[package]]
name = "ruff"
-version = "0.7.0"
+version = "0.7.3"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/2c/c7/f3367d1da5d568192968c5c9e7f3d51fb317b9ac04828493b23d8fce8ce6/ruff-0.7.0.tar.gz", hash = "sha256:47a86360cf62d9cd53ebfb0b5eb0e882193fc191c6d717e8bef4462bc3b9ea2b", size = 3146645 }
+sdist = { url = "https://files.pythonhosted.org/packages/4b/06/09d1276df977eece383d0ed66052fc24ec4550a61f8fbc0a11200e690496/ruff-0.7.3.tar.gz", hash = "sha256:e1d1ba2e40b6e71a61b063354d04be669ab0d39c352461f3d789cac68b54a313", size = 3243664 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/48/59/a0275a0913f3539498d116046dd679cd657fe3b7caf5afe1733319414932/ruff-0.7.0-py3-none-linux_armv6l.whl", hash = "sha256:0cdf20c2b6ff98e37df47b2b0bd3a34aaa155f59a11182c1303cce79be715628", size = 10434007 },
- { url = "https://files.pythonhosted.org/packages/cd/94/da0ba5f956d04c90dd899209904210600009dcda039ce840d83eb4298c7d/ruff-0.7.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:496494d350c7fdeb36ca4ef1c9f21d80d182423718782222c29b3e72b3512737", size = 10048066 },
- { url = "https://files.pythonhosted.org/packages/57/1d/e5cc149ecc46e4f203403a79ccd170fad52d316f98b87d0f63b1945567db/ruff-0.7.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:214b88498684e20b6b2b8852c01d50f0651f3cc6118dfa113b4def9f14faaf06", size = 9711389 },
- { url = "https://files.pythonhosted.org/packages/05/67/fb7ea2c869c539725a16c5bc294e9aa34f8b1b6fe702f1d173a5da517c2b/ruff-0.7.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:630fce3fefe9844e91ea5bbf7ceadab4f9981f42b704fae011bb8efcaf5d84be", size = 10755174 },
- { url = "https://files.pythonhosted.org/packages/5f/f0/13703bc50536a0613ea3dce991116e5f0917a1f05528c6ab738b33c08d3f/ruff-0.7.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:211d877674e9373d4bb0f1c80f97a0201c61bcd1e9d045b6e9726adc42c156aa", size = 10196040 },
- { url = "https://files.pythonhosted.org/packages/99/c1/77b04ab20324ab03d333522ee55fb0f1c38e3ca0d326b4905f82ce6b6c70/ruff-0.7.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:194d6c46c98c73949a106425ed40a576f52291c12bc21399eb8f13a0f7073495", size = 11033684 },
- { url = "https://files.pythonhosted.org/packages/f2/97/f463334dc4efeea3551cd109163df15561c18a1c3ec13d51643740fd36ba/ruff-0.7.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:82c2579b82b9973a110fab281860403b397c08c403de92de19568f32f7178598", size = 11803700 },
- { url = "https://files.pythonhosted.org/packages/b4/f8/a31d40c4bb92933d376a53e7c5d0245d9b27841357e4820e96d38f54b480/ruff-0.7.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9af971fe85dcd5eaed8f585ddbc6bdbe8c217fb8fcf510ea6bca5bdfff56040e", size = 11347848 },
- { url = "https://files.pythonhosted.org/packages/83/62/0c133b35ddaf91c65c30a56718b80bdef36bfffc35684d29e3a4878e0ea3/ruff-0.7.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b641c7f16939b7d24b7bfc0be4102c56562a18281f84f635604e8a6989948914", size = 12480632 },
- { url = "https://files.pythonhosted.org/packages/46/96/464058dd1d980014fb5aa0a1254e78799efb3096fc7a4823cd66a1621276/ruff-0.7.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d71672336e46b34e0c90a790afeac8a31954fd42872c1f6adaea1dff76fd44f9", size = 10941919 },
- { url = "https://files.pythonhosted.org/packages/a0/f7/bda37ec77986a435dde44e1f59374aebf4282a5fa9cf17735315b847141f/ruff-0.7.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:ab7d98c7eed355166f367597e513a6c82408df4181a937628dbec79abb2a1fe4", size = 10745519 },
- { url = "https://files.pythonhosted.org/packages/c2/33/5f77fc317027c057b61a848020a47442a1cbf12e592df0e41e21f4d0f3bd/ruff-0.7.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:1eb54986f770f49edb14f71d33312d79e00e629a57387382200b1ef12d6a4ef9", size = 10284872 },
- { url = "https://files.pythonhosted.org/packages/ff/50/98aec292bc9537f640b8d031c55f3414bf15b6ed13b3e943fed75ac927b9/ruff-0.7.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:dc452ba6f2bb9cf8726a84aa877061a2462afe9ae0ea1d411c53d226661c601d", size = 10600334 },
- { url = "https://files.pythonhosted.org/packages/f2/85/12607ae3201423a179b8cfadc7cb1e57d02cd0135e45bd0445acb4cef327/ruff-0.7.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:4b406c2dce5be9bad59f2de26139a86017a517e6bcd2688da515481c05a2cb11", size = 11017333 },
- { url = "https://files.pythonhosted.org/packages/d4/7f/3b85a56879e705d5f46ec14daf8a439fca05c3081720fe3dc3209100922d/ruff-0.7.0-py3-none-win32.whl", hash = "sha256:f6c968509f767776f524a8430426539587d5ec5c662f6addb6aa25bc2e8195ec", size = 8570962 },
- { url = "https://files.pythonhosted.org/packages/39/9f/c5ee2b40d377354dabcc23cff47eb299de4b4d06d345068f8f8cc1eadac8/ruff-0.7.0-py3-none-win_amd64.whl", hash = "sha256:ff4aabfbaaba880e85d394603b9e75d32b0693152e16fa659a3064a85df7fce2", size = 9365544 },
- { url = "https://files.pythonhosted.org/packages/89/8b/ee1509f60148cecba644aa718f6633216784302458340311898aaf0b1bed/ruff-0.7.0-py3-none-win_arm64.whl", hash = "sha256:10842f69c245e78d6adec7e1db0a7d9ddc2fff0621d730e61657b64fa36f207e", size = 8695763 },
+ { url = "https://files.pythonhosted.org/packages/c0/56/933d433c2489e4642487b835f53dd9ff015fb3d8fa459b09bb2ce42d7c4b/ruff-0.7.3-py3-none-linux_armv6l.whl", hash = "sha256:34f2339dc22687ec7e7002792d1f50712bf84a13d5152e75712ac08be565d344", size = 10372090 },
+ { url = "https://files.pythonhosted.org/packages/20/ea/1f0a22a6bcdd3fc26c73f63a025d05bd565901b729d56bcb093c722a6c4c/ruff-0.7.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:fb397332a1879b9764a3455a0bb1087bda876c2db8aca3a3cbb67b3dbce8cda0", size = 10190037 },
+ { url = "https://files.pythonhosted.org/packages/16/74/aca75666e0d481fe394e76a8647c44ea919087748024924baa1a17371e3e/ruff-0.7.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:37d0b619546103274e7f62643d14e1adcbccb242efda4e4bdb9544d7764782e9", size = 9811998 },
+ { url = "https://files.pythonhosted.org/packages/20/a1/cf446a0d7f78ea1f0bd2b9171c11dfe746585c0c4a734b25966121eb4f5d/ruff-0.7.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d59f0c3ee4d1a6787614e7135b72e21024875266101142a09a61439cb6e38a5", size = 10620626 },
+ { url = "https://files.pythonhosted.org/packages/cd/c1/82b27d09286ae855f5d03b1ad37cf243f21eb0081732d4d7b0d658d439cb/ruff-0.7.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:44eb93c2499a169d49fafd07bc62ac89b1bc800b197e50ff4633aed212569299", size = 10177598 },
+ { url = "https://files.pythonhosted.org/packages/b9/42/c0acac22753bf74013d035a5ef6c5c4c40ad4d6686bfb3fda7c6f37d9b37/ruff-0.7.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6d0242ce53f3a576c35ee32d907475a8d569944c0407f91d207c8af5be5dae4e", size = 11171963 },
+ { url = "https://files.pythonhosted.org/packages/43/18/bb0befb7fb9121dd9009e6a72eb98e24f1bacb07c6f3ecb55f032ba98aed/ruff-0.7.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:6b6224af8b5e09772c2ecb8dc9f3f344c1aa48201c7f07e7315367f6dd90ac29", size = 11856157 },
+ { url = "https://files.pythonhosted.org/packages/5e/91/04e98d7d6e32eca9d1372be595f9abc7b7f048795e32eb2edbd8794d50bd/ruff-0.7.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c50f95a82b94421c964fae4c27c0242890a20fe67d203d127e84fbb8013855f5", size = 11440331 },
+ { url = "https://files.pythonhosted.org/packages/f5/dc/3fe99f2ce10b76d389041a1b9f99e7066332e479435d4bebcceea16caff5/ruff-0.7.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7f3eff9961b5d2644bcf1616c606e93baa2d6b349e8aa8b035f654df252c8c67", size = 12725354 },
+ { url = "https://files.pythonhosted.org/packages/43/7b/1daa712de1c5bc6cbbf9fa60e9c41cc48cda962dc6d2c4f2a224d2c3007e/ruff-0.7.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8963cab06d130c4df2fd52c84e9f10d297826d2e8169ae0c798b6221be1d1d2", size = 11010091 },
+ { url = "https://files.pythonhosted.org/packages/b6/db/1227a903587432eb569e57a95b15a4f191a71fe315cde4c0312df7bc85da/ruff-0.7.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:61b46049d6edc0e4317fb14b33bd693245281a3007288b68a3f5b74a22a0746d", size = 10610687 },
+ { url = "https://files.pythonhosted.org/packages/db/e2/dc41ee90c3085aadad4da614d310d834f641aaafddf3dfbba08210c616ce/ruff-0.7.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:10ebce7696afe4644e8c1a23b3cf8c0f2193a310c18387c06e583ae9ef284de2", size = 10254843 },
+ { url = "https://files.pythonhosted.org/packages/6f/09/5f6cac1c91542bc5bd33d40b4c13b637bf64d7bb29e091dadb01b62527fe/ruff-0.7.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:3f36d56326b3aef8eeee150b700e519880d1aab92f471eefdef656fd57492aa2", size = 10730962 },
+ { url = "https://files.pythonhosted.org/packages/d3/42/89a4b9a24ef7d00269e24086c417a006f9a3ffeac2c80f2629eb5ce140ee/ruff-0.7.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:5d024301109a0007b78d57ab0ba190087b43dce852e552734ebf0b0b85e4fb16", size = 11101907 },
+ { url = "https://files.pythonhosted.org/packages/b0/5c/efdb4777686683a8edce94ffd812783bddcd3d2454d38c5ac193fef7c500/ruff-0.7.3-py3-none-win32.whl", hash = "sha256:4ba81a5f0c5478aa61674c5a2194de8b02652f17addf8dfc40c8937e6e7d79fc", size = 8611095 },
+ { url = "https://files.pythonhosted.org/packages/bb/b8/28fbc6a4efa50178f973972d1c84b2d0a33cdc731588522ab751ac3da2f5/ruff-0.7.3-py3-none-win_amd64.whl", hash = "sha256:588a9ff2fecf01025ed065fe28809cd5a53b43505f48b69a1ac7707b1b7e4088", size = 9418283 },
+ { url = "https://files.pythonhosted.org/packages/3f/77/b587cba6febd5e2003374f37eb89633f79f161e71084f94057c8653b7fb3/ruff-0.7.3-py3-none-win_arm64.whl", hash = "sha256:1713e2c5545863cdbfe2cbce21f69ffaf37b813bfd1fb3b90dc9a6f1963f5a8c", size = 8725228 },
]
[[package]]
@@ -1041,14 +1043,14 @@ wheels = [
[[package]]
name = "starlette"
-version = "0.40.0"
+version = "0.41.2"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "anyio" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/4b/cb/244daf0d7be4508099ad5bca3cdfe8b8b5538acd719c5f397f614e569fff/starlette-0.40.0.tar.gz", hash = "sha256:1a3139688fb298ce5e2d661d37046a66ad996ce94be4d4983be019a23a04ea35", size = 2573611 }
+sdist = { url = "https://files.pythonhosted.org/packages/3e/da/1fb4bdb72ae12b834becd7e1e7e47001d32f91ec0ce8d7bc1b618d9f0bd9/starlette-0.41.2.tar.gz", hash = "sha256:9834fd799d1a87fd346deb76158668cfa0b0d56f85caefe8268e2d97c3468b62", size = 2573867 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/0a/0f/64baf7a06492e8c12f5c4b49db286787a7255195df496fc21f5fd9eecffa/starlette-0.40.0-py3-none-any.whl", hash = "sha256:c494a22fae73805376ea6bf88439783ecfba9aac88a43911b48c653437e784c4", size = 73303 },
+ { url = "https://files.pythonhosted.org/packages/54/43/f185bfd0ca1d213beb4293bed51d92254df23d8ceaf6c0e17146d508a776/starlette-0.41.2-py3-none-any.whl", hash = "sha256:fbc189474b4731cf30fcef52f18a8d070e3f3b46c6a04c97579e85e6ffca942d", size = 73259 },
]
[[package]]
@@ -1074,7 +1076,7 @@ wheels = [
[[package]]
name = "typer"
-version = "0.12.5"
+version = "0.13.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "click" },
@@ -1082,9 +1084,9 @@ dependencies = [
{ name = "shellingham" },
{ name = "typing-extensions" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/c5/58/a79003b91ac2c6890fc5d90145c662fd5771c6f11447f116b63300436bc9/typer-0.12.5.tar.gz", hash = "sha256:f592f089bedcc8ec1b974125d64851029c3b1af145f04aca64d69410f0c9b722", size = 98953 }
+sdist = { url = "https://files.pythonhosted.org/packages/e7/87/9eb07fdfa14e22ec7658b5b1147836d22df3848a22c85a4e18ed272303a5/typer-0.13.0.tar.gz", hash = "sha256:f1c7198347939361eec90139ffa0fd8b3df3a2259d5852a0f7400e476d95985c", size = 97572 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/a8/2b/886d13e742e514f704c33c4caa7df0f3b89e5a25ef8db02aa9ca3d9535d5/typer-0.12.5-py3-none-any.whl", hash = "sha256:62fe4e471711b147e3365034133904df3e235698399bc4de2b36c8579298d52b", size = 47288 },
+ { url = "https://files.pythonhosted.org/packages/18/7e/c8bfa8cbcd3ea1d25d2beb359b5c5a3f4339a7e2e5d9e3ef3e29ba3ab3b9/typer-0.13.0-py3-none-any.whl", hash = "sha256:d85fe0b777b2517cc99c8055ed735452f2659cd45e451507c76f48ce5c1d00e2", size = 44194 },
]
[[package]]
@@ -1297,9 +1299,15 @@ wheels = [
[[package]]
name = "yt-dlp"
-version = "2024.10.7"
+version = "2024.11.4"
source = { registry = "https://pypi.org/simple" }
-dependencies = [
+sdist = { url = "https://files.pythonhosted.org/packages/52/50/0014e9099a9dc3dec1da086e5eb5f861984a0512738bd3d3b63cedd82cbb/yt_dlp-2024.11.4.tar.gz", hash = "sha256:ed204c1b61bc563e134447766d1ab343173540799e13ebb953e887ce7dcf6865", size = 2900105 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/6e/e4/e45c5067a79780954b905db4a42aa83d7aaefd91e32b18ab91c77600e668/yt_dlp-2024.11.4-py3-none-any.whl", hash = "sha256:589d51ed9f154624a45c1f0ceb3d68d0d1e2031460e8dbc62139be631c20b388", size = 3165645 },
+]
+
+[package.optional-dependencies]
+default = [
{ name = "brotli", marker = "implementation_name == 'cpython'" },
{ name = "brotlicffi", marker = "implementation_name != 'cpython'" },
{ name = "certifi" },
@@ -1309,7 +1317,3 @@ dependencies = [
{ name = "urllib3" },
{ name = "websockets" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/2e/b1/08679efb4c1932dc6420deda8a89f03d7440d6462b7f61d339db2732a497/yt_dlp-2024.10.7.tar.gz", hash = "sha256:0baf1ab517c9748d7e337ced91c5543c36fc16246a9ebedac32ebf20c1998ceb", size = 2877443 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/6e/91/ecb07d66110334cdb01e94b187577af3b041897090203c9957728825d46f/yt_dlp-2024.10.7-py3-none-any.whl", hash = "sha256:9e336ae663bfd7ad3ea1c02e722747388172719efc0fc39a807dace3073aa704", size = 3149082 },
-]
From f8a5ccb8d2278d5f69234a660339b1fa8ea8c83d Mon Sep 17 00:00:00 2001
From: Benedict Xavier <81157281+Benex254@users.noreply.github.com>
Date: Fri, 8 Nov 2024 22:33:16 +0300
Subject: [PATCH 03/87] Update README.md
---
README.md | 547 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 544 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index adea0b9..5d74623 100644
--- a/README.md
+++ b/README.md
@@ -98,10 +98,10 @@ Recommended method of installation
```bash
# generally:
-uv tool install fastanime
-
-# if you want other functionality:
uv tool install fastanime[standard]
+
+# or stripped down installations:
+uv tool install fastanime
uv tool install fastanime[api]
uv tool install fastanime[mpv]
uv tool install fastanime[notifications]
@@ -663,6 +663,547 @@ fastanime serve
# specify host and port
fastanime serve --host --port
```
+An example instance is hosted by [render](https://fastanime.onrender.com/)
+
+
+Examples:
+
+**search for anime by title:**
+
+```bash
+curl 'https://fastanime.onrender.com/search?title=dragon&translation_type=sub'
+
+```
+
+
+
+Result
+
+
+```json
+{
+ "pageInfo": {
+ "total": 22839
+ },
+ "results": [
+ {
+ "id": "ju2pgynxn9o9DZvse",
+ "title": "Dragon Ball Daima",
+ "type": "Show",
+ "availableEpisodes": {
+ "sub": 5,
+ "dub": 0,
+ "raw": 0
+ }
+ },
+ {
+ "id": "qpnhxfarTHfP7kjgR",
+ "title": "My WeChat connects to the Dragon Palace",
+ "type": "Show",
+ "availableEpisodes": {
+ "sub": 26,
+ "dub": 0,
+ "raw": 0
+ }
+ },
+ {
+ "id": "8aM5BBoEGLvjG3MZm",
+ "title": "Sayounara Ryuusei, Konnichiwa Jinsei",
+ "type": "Show",
+ "availableEpisodes": {
+ "sub": 6,
+ "dub": 0,
+ "raw": 0
+ }
+ },
+ {
+ "id": "Sg9Q9FyqBnJ9qtv5n",
+ "title": "Yarinaoshi Reijou wa Ryuutei Heika wo Kouryakuchuu",
+ "type": "Show",
+ "availableEpisodes": {
+ "sub": 5,
+ "dub": 0,
+ "raw": 0
+ }
+ },
+ {
+ "id": "gF2mKbWBatQudcF6A",
+ "title": "Throne of the Dragon King",
+ "type": "Show",
+ "availableEpisodes": {
+ "sub": 3,
+ "dub": 0,
+ "raw": 0
+ }
+ },
+ {
+ "id": "SXLNNoorPifT5ZStw",
+ "title": "Shi Cao Lao Long Bei Guan Yi E Long Zhi Ming Season 2",
+ "type": "Show",
+ "availableEpisodes": {
+ "sub": 7,
+ "dub": 0,
+ "raw": 0
+ }
+ },
+ {
+ "id": "v4ZkjtyftscNzYF2A",
+ "title": "I Have a Dragon in My Body Episode122-133",
+ "type": "Show",
+ "availableEpisodes": {
+ "sub": 77,
+ "dub": 0,
+ "raw": 0
+ }
+ },
+ {
+ "id": "9RSQCRJ3d554sBzoz",
+ "title": "City Immortal Emperor: Dragon King Temple",
+ "type": "Show",
+ "availableEpisodes": {
+ "sub": 20,
+ "dub": 0,
+ "raw": 0
+ }
+ },
+ {
+ "id": "t8C6zvsdJE5JJKDLE",
+ "title": "It Turns Out I Am the Peerless Dragon God",
+ "type": "Show",
+ "availableEpisodes": {
+ "sub": 2,
+ "dub": 0,
+ "raw": 0
+ }
+ },
+ {
+ "id": "xyDt3mJieZkD76P7S",
+ "title": "Urban Hidden Dragon",
+ "type": "Show",
+ "availableEpisodes": {
+ "sub": 13,
+ "dub": 0,
+ "raw": 0
+ }
+ },
+ {
+ "id": "8PoJiTEDAswkw8b3u",
+ "title": "The Collected Animations of ICAF (2001-2006)",
+ "type": "Show",
+ "availableEpisodes": {
+ "sub": 1,
+ "dub": 0,
+ "raw": 0
+ }
+ },
+ {
+ "id": "KZeMmRSsyJgz37EmH",
+ "title": "Dragon Master",
+ "type": "Show",
+ "availableEpisodes": {
+ "sub": 1,
+ "dub": 0,
+ "raw": 0
+ }
+ },
+ {
+ "id": "7a33i9m26poonyNLg",
+ "title": "I Have a Dragon in My Body",
+ "type": "Show",
+ "availableEpisodes": {
+ "sub": 79,
+ "dub": 0,
+ "raw": 0
+ }
+ },
+ {
+ "id": "uwwvBujGRsjCQ8kKM",
+ "title": "Cong Gu Huo Niao Kaishi: Long Cheng Fengyun",
+ "type": "Show",
+ "availableEpisodes": {
+ "sub": 16,
+ "dub": 0,
+ "raw": 0
+ }
+ },
+ {
+ "id": "RoexdZwHSTDwyzEzd",
+ "title": "Super Dragon Ball Heroes Meteor Mission",
+ "type": "Show",
+ "availableEpisodes": {
+ "sub": 6,
+ "dub": 0,
+ "raw": 0
+ }
+ },
+ {
+ "id": "gAcGCcMENjbWhBnR9",
+ "title": "Dungeon Meshi",
+ "type": "Show",
+ "availableEpisodes": {
+ "sub": 24,
+ "dub": 24,
+ "raw": 0
+ }
+ },
+ {
+ "id": "ZGh2QHiaCY5T5Mhi4",
+ "title": "Long Shidai",
+ "type": "Show",
+ "availableEpisodes": {
+ "sub": 9,
+ "dub": 0,
+ "raw": 1
+ }
+ },
+ {
+ "id": "gZSHt98fQpHRfJJXw",
+ "title": "Xanadu Dragonslayer Densetsu",
+ "type": "Show",
+ "availableEpisodes": {
+ "sub": 1,
+ "dub": 0,
+ "raw": 0
+ }
+ },
+ {
+ "id": "wo8pX4Sba97mFCAkc",
+ "title": "Vanguard Dragon God",
+ "type": "Show",
+ "availableEpisodes": {
+ "sub": 86,
+ "dub": 0,
+ "raw": 0
+ }
+ },
+ {
+ "id": "rrbCftmca3Y2TEiBX",
+ "title": "Super Dragon Ball Heroes Ultra God Mission",
+ "type": "Show",
+ "availableEpisodes": {
+ "sub": 10,
+ "dub": 0,
+ "raw": 0
+ }
+ },
+ {
+ "id": "JzSeXC2WtBBhn3guN",
+ "title": "Dragon King's Son-In-Law",
+ "type": "Show",
+ "availableEpisodes": {
+ "sub": 11,
+ "dub": 0,
+ "raw": 0
+ }
+ },
+ {
+ "id": "eE3txJGGk9atw7k2v",
+ "title": "Majutsushi Orphen Hagure Tabi: Seiiki-hen",
+ "type": "Show",
+ "availableEpisodes": {
+ "sub": 12,
+ "dub": 0,
+ "raw": 0
+ }
+ },
+ {
+ "id": "4X2JbZgiQrb2PTzex",
+ "title": "Yowai 5000-nen no Soushoku Dragon, Iwarenaki Jaryuu Nintei (Japanese Dub)",
+ "type": "Show",
+ "availableEpisodes": {
+ "sub": 12,
+ "dub": 0,
+ "raw": 0
+ }
+ },
+ {
+ "id": "SHp5NFDakKjPT5nJE",
+ "title": "Starting from Gu Huoniao: Dragon City Hegemony",
+ "type": "Show",
+ "availableEpisodes": {
+ "sub": 22,
+ "dub": 0,
+ "raw": 0
+ }
+ },
+ {
+ "id": "8LgaCGrz7Gz35LRpk",
+ "title": "Yuan Zun",
+ "type": "Show",
+ "availableEpisodes": {
+ "sub": 5,
+ "dub": 0,
+ "raw": 0
+ }
+ },
+ {
+ "id": "4GKHyjFC7Dyc7fBpT",
+ "title": "Shen Ji Long Wei",
+ "type": "Show",
+ "availableEpisodes": {
+ "sub": 26,
+ "dub": 0,
+ "raw": 0
+ }
+ },
+ {
+ "id": "2PQiuXiuJoTQTdgy4",
+ "title": "Long Zu",
+ "type": "Show",
+ "availableEpisodes": {
+ "sub": 15,
+ "dub": 0,
+ "raw": 0
+ }
+ },
+ {
+ "id": "rE47AepmBFRvZ6cne",
+ "title": "Jidao Long Shen",
+ "type": "Show",
+ "availableEpisodes": {
+ "sub": 40,
+ "dub": 0,
+ "raw": 0
+ }
+ },
+ {
+ "id": "c4JcjPbRfiuoJPB4F",
+ "title": "Dragon Quest: Dai no Daibouken (2020)",
+ "type": "Show",
+ "availableEpisodes": {
+ "sub": 101,
+ "dub": 100,
+ "raw": 0
+ }
+ },
+ {
+ "id": "nGRTwG7kj5rCPiAX4",
+ "title": "Dragon Quest: Dai no Daibouken Tachiagare!! Aban no Shito",
+ "type": "Show",
+ "availableEpisodes": {
+ "sub": 1,
+ "dub": 0,
+ "raw": 0
+ }
+ },
+ {
+ "id": "6LJBjT4RzJaucdmX3",
+ "title": "Dragon Slayer Eiyuu Densetsu: Ouji no Tabidachi",
+ "type": "Show",
+ "availableEpisodes": {
+ "sub": 1,
+ "dub": 1,
+ "raw": 0
+ }
+ },
+ {
+ "id": "JKbtxdw2cRqqmZgnS",
+ "title": "Dragon Quest: Dai no Daibouken Buchiyabure!! Shinsei 6 Daishougun",
+ "type": "Show",
+ "availableEpisodes": {
+ "sub": 1,
+ "dub": 0,
+ "raw": 0
+ }
+ },
+ {
+ "id": "pn32RijEHPfuTYt4h",
+ "title": "Dragon Quest Retsuden: Roto no Monshou",
+ "type": "Show",
+ "availableEpisodes": {
+ "sub": 1,
+ "dub": 0,
+ "raw": 0
+ }
+ },
+ {
+ "id": "xHwk6oo7jaDrMG9to",
+ "title": "Dragon Fist",
+ "type": "Show",
+ "availableEpisodes": {
+ "sub": 1,
+ "dub": 0,
+ "raw": 0
+ }
+ },
+ {
+ "id": "ugFXPFQW8kvLocZgx",
+ "title": "Yowai 5000-nen no Soushoku Dragon, Iwarenaki Jaryuu Nintei",
+ "type": "Show",
+ "availableEpisodes": {
+ "sub": 12,
+ "dub": 0,
+ "raw": 0
+ }
+ },
+ {
+ "id": "qSFMEcT4SufEhLZnq",
+ "title": "Doraemon Movie 8: Nobita to Ryuu no Kishi",
+ "type": "Show",
+ "availableEpisodes": {
+ "sub": 1,
+ "dub": 0,
+ "raw": 0
+ }
+ },
+ {
+ "id": "LTzXFSmQR878MdJaS",
+ "title": "Dragon Ball Specials",
+ "type": "Show",
+ "availableEpisodes": {
+ "sub": 2,
+ "dub": 0,
+ "raw": 0
+ }
+ },
+ {
+ "id": "XuTNNzF7DfapLFMFJ",
+ "title": "Dragon Ball Super: Super Hero",
+ "type": "Show",
+ "availableEpisodes": {
+ "sub": 1,
+ "dub": 1,
+ "raw": 0
+ }
+ },
+ {
+ "id": "n4S2spjyTHXHNAMDW",
+ "title": "Shin Ikkitousen",
+ "type": "Show",
+ "availableEpisodes": {
+ "sub": 3,
+ "dub": 3,
+ "raw": 0
+ }
+ },
+ {
+ "id": "srMRCkMEJA9Rmt7do",
+ "title": "Dragon Ball Z: Atsumare! Goku World",
+ "type": "Show",
+ "availableEpisodes": {
+ "sub": 1,
+ "dub": 0,
+ "raw": 0
+ }
+ }
+ ]
+}
+```
+
+
+
+**Get anime by id:**
+
+
+```bash
+curl 'https://fastanime.onrender.com/anime/8aM5BBoEGLvjG3MZm'
+```
+
+
+
+Result
+
+
+```json
+{
+ "id": "8aM5BBoEGLvjG3MZm",
+ "title": "Sayounara Ryuusei, Konnichiwa Jinsei",
+ "availableEpisodesDetail": {
+ "sub": [
+ "6",
+ "5",
+ "4",
+ "3",
+ "2",
+ "1"
+ ],
+ "dub": [],
+ "raw": []
+ },
+ "type": null
+}
+```
+
+
+
+**Get episode streams by translation_type:**
+
+```bash
+curl 'https://fastanime.onrender.com/anime/8aM5BBoEGLvjG3MZm/watch?episode=3&translation_type=sub'
+```
+
+
+
+Result
+
+
+```json
+[
+ {
+ "server": "Yt",
+ "episode_title": "Sayounara Ryuusei, Konnichiwa Jinsei; Episode 3",
+ "headers": {
+ "Referer": "https://allanime.day/"
+ },
+ "subtitles": [],
+ "links": [
+ {
+ "link": "https://tools.fast4speed.rsvp//media9/videos/8aM5BBoEGLvjG3MZm/sub/3",
+ "quality": "1080"
+ }
+ ]
+ },
+ {
+ "server": "sharepoint",
+ "headers": {},
+ "subtitles": [],
+ "episode_title": "Sayounara Ryuusei, Konnichiwa Jinsei; Episode 3",
+ "links": [
+ {
+ "link": "https://myanime.sharepoint.com/sites/chartlousty/_layouts/15/download.aspx?share=ERpIT0CTmOVHmO8386bNGZMBf7Emtoda_3bUMzCleWhp4g",
+ "mp4": true,
+ "resolutionStr": "Mp4",
+ "src": "https://myanime.sharepoint.com/sites/chartlousty/_layouts/15/download.aspx?share=ERpIT0CTmOVHmO8386bNGZMBf7Emtoda_3bUMzCleWhp4g",
+ "quality": "1080"
+ }
+ ]
+ },
+ {
+ "server": "gogoanime",
+ "headers": {},
+ "subtitles": [],
+ "episode_title": "Sayounara Ryuusei, Konnichiwa Jinsei; Episode 3",
+ "links": [
+ {
+ "link": "https://www114.anzeat.pro/streamhls/6454b50a557e9fa52a60cfdee0b0906e/ep.3.1729188150.m3u8",
+ "hls": true,
+ "mp4": false,
+ "resolutionStr": "hls P",
+ "priority": 3,
+ "quality": "1080"
+ },
+ {
+ "link": "https://www114.anicdnstream.info/videos/hls/h1IUtAefmoWTc8hJhtr8OQ/1731106912/235294/6454b50a557e9fa52a60cfdee0b0906e/ep.3.1729188150.m3u8",
+ "hls": true,
+ "mp4": false,
+ "resolutionStr": "HLS1",
+ "priority": 2,
+ "quality": "720"
+ },
+ {
+ "link": "https://workfields.maverickki.lol/7d2473746a243c246e727276753c29297171713737322867686f65626875727463676b286f68606929706f62636975296e6a75296e374f53724763606b695152653e6e4c6e72743e495729373135373736303f373429343533343f32293032333264333667333331633f6067333467303665606263633664363f3630632963762835283731343f373e3e373336286b35733e242a2476677475634e6a75243c727473632a2462677263243c373135373634363236363636367b",
+ "hls": true,
+ "resolutionStr": "Alt",
+ "src": "https://workfields.maverickki.lol/7d2473746a243c246e727276753c29297171713737322867686f65626875727463676b286f68606929706f62636975296e6a75296e374f53724763606b695152653e6e4c6e72743e495729373135373736303f373429343533343f32293032333264333667333331633f6067333467303665606263633664363f3630632963762835283731343f373e3e373336286b35733e242a2476677475634e6a75243c727473632a2462677263243c373135373634363236363636367b",
+ "priority": 1,
+ "quality": "480"
+ }
+ ]
+ }
+]
+```
+
+
### MPV specific commands
From 75026d4fc565bab798758661ce617f2d8328194c Mon Sep 17 00:00:00 2001
From: Benex254
Date: Sat, 9 Nov 2024 00:09:04 +0300
Subject: [PATCH 04/87] feat(api): add watch endpoint
---
fastanime/api/__init__.py | 68 +++++++++++++++++++++++++++++++++++++++
1 file changed, 68 insertions(+)
diff --git a/fastanime/api/__init__.py b/fastanime/api/__init__.py
index f43c6a1..97fca11 100644
--- a/fastanime/api/__init__.py
+++ b/fastanime/api/__init__.py
@@ -1,11 +1,15 @@
from typing import Literal
from fastapi import FastAPI
+from requests import post
+from thefuzz import fuzz
from ..AnimeProvider import AnimeProvider
+from ..Utility.data import anime_normalizer
app = FastAPI()
anime_provider = AnimeProvider("allanime", "true", "true")
+ANILIST_ENDPOINT = "https://graphql.anilist.co"
@app.get("/search")
@@ -23,3 +27,67 @@ def get_episode_streams(
anime_id: str, episode: str, translation_type: Literal["sub", "dub"]
):
return anime_provider.get_episode_streams(anime_id, episode, translation_type)
+
+
+def get_anime_by_anilist_id(anilist_id: int):
+ query = f"""
+ query {{
+ Media(id: {anilist_id}) {{
+ id
+ title {{
+ romaji
+ english
+ native
+ }}
+ synonyms
+ episodes
+ duration
+ }}
+ }}
+ """
+ response = post(ANILIST_ENDPOINT, json={"query": query}).json()
+ return response["data"]["Media"]
+
+
+@app.get("/watch/{anilist_id}")
+def get_episode_streams_by_anilist_id(
+ anilist_id: int, episode: str, translation_type: Literal["sub", "dub"]
+):
+ anime = get_anime_by_anilist_id(anilist_id)
+ if not anime:
+ return
+ if search_results := anime_provider.search_for_anime(
+ str(anime["title"]["romaji"] or anime["title"]["english"]), translation_type
+ ):
+ if not search_results["results"]:
+ return
+
+ def match_title(possible_user_requested_anime_title):
+ possible_user_requested_anime_title = anime_normalizer.get(
+ possible_user_requested_anime_title, possible_user_requested_anime_title
+ )
+ title_a = str(anime["title"]["romaji"])
+ title_b = str(anime["title"]["english"])
+ percentage_ratio = max(
+ *[
+ fuzz.ratio(
+ title.lower(), possible_user_requested_anime_title.lower()
+ )
+ for title in anime["synonyms"]
+ ],
+ fuzz.ratio(
+ title_a.lower(), possible_user_requested_anime_title.lower()
+ ),
+ fuzz.ratio(
+ title_b.lower(), possible_user_requested_anime_title.lower()
+ ),
+ )
+ return percentage_ratio
+
+ provider_anime = max(
+ search_results["results"], key=lambda x: match_title(x["title"])
+ )
+ anime_provider.get_anime(provider_anime["id"])
+ return anime_provider.get_episode_streams(
+ provider_anime["id"], episode, translation_type
+ )
From bc86be8c93128c56d8f658fcb4a9687658cfc36d Mon Sep 17 00:00:00 2001
From: Benex254
Date: Sat, 9 Nov 2024 00:10:27 +0300
Subject: [PATCH 05/87] chore: bump version
---
fastanime/__init__.py | 2 +-
pyproject.toml | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/fastanime/__init__.py b/fastanime/__init__.py
index 76f03a7..ffd6808 100644
--- a/fastanime/__init__.py
+++ b/fastanime/__init__.py
@@ -6,7 +6,7 @@ if sys.version_info < (3, 10):
) # noqa: F541
-__version__ = "v2.7.0"
+__version__ = "v2.7.1"
APP_NAME = "FastAnime"
AUTHOR = "Benex254"
diff --git a/pyproject.toml b/pyproject.toml
index 1db6127..ff4ea64 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "fastanime"
-version = "2.7.0"
+version = "2.7.1"
description = "A browser anime site experience from the terminal"
license = "UNLICENSE"
readme = "README.md"
From 1a8a187de6fb2679e94d94cc8a58045b26ca9d94 Mon Sep 17 00:00:00 2001
From: Benex254
Date: Sat, 9 Nov 2024 00:27:49 +0300
Subject: [PATCH 06/87] docs: update readme
---
README.md | 105 ++++++++++++++++++++++++++++++++++++++++++++++++------
1 file changed, 95 insertions(+), 10 deletions(-)
diff --git a/README.md b/README.md
index 5d74623..6bb15e7 100644
--- a/README.md
+++ b/README.md
@@ -663,8 +663,8 @@ fastanime serve
# specify host and port
fastanime serve --host --port
```
-An example instance is hosted by [render](https://fastanime.onrender.com/)
+An example instance is hosted by [render](https://fastanime.onrender.com/)
Examples:
@@ -1094,7 +1094,6 @@ Result
**Get anime by id:**
-
```bash
curl 'https://fastanime.onrender.com/anime/8aM5BBoEGLvjG3MZm'
```
@@ -1109,14 +1108,7 @@ Result
"id": "8aM5BBoEGLvjG3MZm",
"title": "Sayounara Ryuusei, Konnichiwa Jinsei",
"availableEpisodesDetail": {
- "sub": [
- "6",
- "5",
- "4",
- "3",
- "2",
- "1"
- ],
+ "sub": ["6", "5", "4", "3", "2", "1"],
"dub": [],
"raw": []
},
@@ -1205,6 +1197,99 @@ Result
+**Get Episode Streams by AniList Id:**
+
+```bash
+curl 'https://fastanime.onrender.com/watch/269?episode=1&translation_type=dub'
+```
+
+
+
+Results
+
+
+```json
+[
+ {
+ "server": "gogoanime",
+ "headers": {},
+ "subtitles": [],
+ "episode_title": "Bleach; Episode 1",
+ "links": [
+ {
+ "link": "https://www032.anzeat.pro/streamhls/f643f0c19d5bee9f1c3aed888eee75d6/ep.1.1709258176.m3u8",
+ "hls": true,
+ "mp4": false,
+ "resolutionStr": "hls P",
+ "priority": 3,
+ "quality": "1080"
+ },
+ {
+ "link": "https://www032.anicdnstream.info/videos/hls/WEJ7719z_r37wHYpaOsTqQ/1731115258/76805/f643f0c19d5bee9f1c3aed888eee75d6/ep.1.1709258176.m3u8",
+ "hls": true,
+ "mp4": false,
+ "resolutionStr": "HLS1",
+ "priority": 2,
+ "quality": "720"
+ },
+ {
+ "link": "https://workfields.maverickki.lol/7d2473746a243c246e727276753c29297171713635342867686f65626875727463676b286f68606929706f62636975296e6a752951434c3131373f7c59743531714e5f76674975527757293731353737373334333e2931303e36332960303235603665373f62336463633f603765356763623e3e3e636363313362302963762837283731363f34333e373130286b35733e242a2476677475634e6a75243c727473632a2462677263243c373135373634363236363636367b",
+ "hls": true,
+ "resolutionStr": "Alt",
+ "src": "https://workfields.maverickki.lol/7d2473746a243c246e727276753c29297171713635342867686f65626875727463676b286f68606929706f62636975296e6a752951434c3131373f7c59743531714e5f76674975527757293731353737373334333e2931303e36332960303235603665373f62336463633f603765356763623e3e3e636363313362302963762837283731363f34333e373130286b35733e242a2476677475634e6a75243c727473632a2462677263243c373135373634363236363636367b",
+ "priority": 1,
+ "quality": "480"
+ }
+ ]
+ },
+ {
+ "server": "Yt",
+ "episode_title": "Bleach; Episode 1",
+ "headers": {
+ "Referer": "https://allanime.day/"
+ },
+ "subtitles": [],
+ "links": [
+ {
+ "link": "https://tools.fast4speed.rsvp//media3/videos/XqKvkSEty5koms32i/dub/1",
+ "quality": "1080"
+ }
+ ]
+ },
+ {
+ "server": "wixmp",
+ "headers": {},
+ "subtitles": [],
+ "episode_title": "Bleach; Episode 1",
+ "links": [
+ {
+ "link": "https://repackager.wixmp.com/video.wixstatic.com/video/eba0c8_706b389e50f94fe5bf8c72e2f10c545e/,720p,480p,/mp4/file.mp4.urlset/master.m3u8",
+ "hls": true,
+ "resolutionStr": "Hls",
+ "quality": "1080"
+ }
+ ]
+ },
+ {
+ "server": "sharepoint",
+ "headers": {},
+ "subtitles": [],
+ "episode_title": "Bleach; Episode 1",
+ "links": [
+ {
+ "link": "https://myanime.sharepoint.com/sites/anime/_layouts/15/download.aspx?share=EaNJF1eTtptGovmPAcR3_7QBH1gFepgMcBpL5YfyEM5Uhw",
+ "mp4": true,
+ "resolutionStr": "Mp4",
+ "src": "https://myanime.sharepoint.com/sites/anime/_layouts/15/download.aspx?share=EaNJF1eTtptGovmPAcR3_7QBH1gFepgMcBpL5YfyEM5Uhw",
+ "quality": "1080"
+ }
+ ]
+ }
+]
+```
+
+
+
### MPV specific commands
The project now allows on the fly media controls directly from mpv. This means you can go to the next or previous episode without the window ever closing thus offering a seamless experience.
From 8248dc53df2078bd2176c51b9196f71516b51148 Mon Sep 17 00:00:00 2001
From: benex
Date: Sun, 10 Nov 2024 12:05:32 +0300
Subject: [PATCH 07/87] fix: text preview not showing on windows
---
fastanime/cli/interfaces/utils.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/fastanime/cli/interfaces/utils.py b/fastanime/cli/interfaces/utils.py
index 84af8a0..492175f 100644
--- a/fastanime/cli/interfaces/utils.py
+++ b/fastanime/cli/interfaces/utils.py
@@ -65,7 +65,7 @@ def save_image_from_url(url: str, file_name: str):
file_name: filename to use
"""
image = requests.get(url)
- with open(f"{IMAGES_CACHE_DIR}/{file_name}.png", "wb") as f:
+ with open(os.path.join(IMAGES_CACHE_DIR,f"{file_name}.png"), "wb") as f:
f.write(image.content)
@@ -76,7 +76,7 @@ def save_info_from_str(info: str, file_name: str):
info: the information anilist has on the anime
file_name: the filename to use
"""
- with open(f"{ANIME_INFO_CACHE_DIR}/{file_name}", "w") as f:
+ with open(os.path.join(ANIME_INFO_CACHE_DIR,file_name,), "w",encoding="utf-8") as f:
f.write(info)
From 56dd25df8dd810bdc10197f479b15c2d7370afaf Mon Sep 17 00:00:00 2001
From: benex
Date: Sun, 10 Nov 2024 12:06:17 +0300
Subject: [PATCH 08/87] refactor(cli): update config options
This commit updates the configuration options in the CLI module. Specifically, it modifies the "image_previews" option to be platform-dependent, setting it to "True" for non-Windows platforms and "False" for Windows. Additionally, it sets the "normalize_titles" option to "True". These changes improve the behavior and user experience of the CLI.
---
fastanime/cli/config.py | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/fastanime/cli/config.py b/fastanime/cli/config.py
index a46718e..ec1398f 100644
--- a/fastanime/cli/config.py
+++ b/fastanime/cli/config.py
@@ -9,6 +9,7 @@ from ..constants import (
USER_DATA_PATH,
USER_VIDEOS_DIR,
USER_WATCH_HISTORY_PATH,
+ S_PLATFORM
)
from ..libs.rofi import Rofi
@@ -40,8 +41,8 @@ class Config(object):
"force_window": "immediate",
"format": "best[height<=1080]/bestvideo[height<=1080]+bestaudio/best",
"icons": "false",
- "image_previews": "true",
- "normalize_titles": "true",
+ "image_previews": "True" if S_PLATFORM != "win32" else "False",
+ "normalize_titles": "True",
"notification_duration": "2",
"player": "mpv",
"preferred_history": "local",
From 714533d8450711849eb69ba621a65038a7769ff0 Mon Sep 17 00:00:00 2001
From: benex
Date: Sun, 10 Nov 2024 12:06:44 +0300
Subject: [PATCH 09/87] refactor(cli): update config options and set fastanime
config environs
---
fastanime/cli/interfaces/anilist_interfaces.py | 2 ++
1 file changed, 2 insertions(+)
diff --git a/fastanime/cli/interfaces/anilist_interfaces.py b/fastanime/cli/interfaces/anilist_interfaces.py
index 5c63b04..aa60b8d 100644
--- a/fastanime/cli/interfaces/anilist_interfaces.py
+++ b/fastanime/cli/interfaces/anilist_interfaces.py
@@ -1591,6 +1591,8 @@ def fastanime_main_menu(
else:
config.load_config()
+ config.set_fastanime_config_environs()
+
config.anime_provider.provider = config.provider
config.anime_provider.lazyload_provider(config.provider)
From f1c352d4ff614dd3be2453044c14ae567ffc4030 Mon Sep 17 00:00:00 2001
From: benex
Date: Sun, 10 Nov 2024 12:29:46 +0300
Subject: [PATCH 10/87] chore: bump version (v2.7.2)
---
fastanime/__init__.py | 2 +-
pyproject.toml | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/fastanime/__init__.py b/fastanime/__init__.py
index ffd6808..dec9734 100644
--- a/fastanime/__init__.py
+++ b/fastanime/__init__.py
@@ -6,7 +6,7 @@ if sys.version_info < (3, 10):
) # noqa: F541
-__version__ = "v2.7.1"
+__version__ = "v2.7.2"
APP_NAME = "FastAnime"
AUTHOR = "Benex254"
diff --git a/pyproject.toml b/pyproject.toml
index ff4ea64..85cfa35 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "fastanime"
-version = "2.7.1"
+version = "2.7.2"
description = "A browser anime site experience from the terminal"
license = "UNLICENSE"
readme = "README.md"
From 6b3ca236dd220653f123f8fb5c3864b50ae2ee02 Mon Sep 17 00:00:00 2001
From: Benex254
Date: Mon, 11 Nov 2024 12:47:28 +0300
Subject: [PATCH 11/87] fix: auto next episode
---
.../cli/interfaces/anilist_interfaces.py | 67 ++++++++++++-------
1 file changed, 43 insertions(+), 24 deletions(-)
diff --git a/fastanime/cli/interfaces/anilist_interfaces.py b/fastanime/cli/interfaces/anilist_interfaces.py
index aa60b8d..e14e680 100644
--- a/fastanime/cli/interfaces/anilist_interfaces.py
+++ b/fastanime/cli/interfaces/anilist_interfaces.py
@@ -593,22 +593,18 @@ def provider_anime_episode_servers_menu(
# this will try to update the episode to be the next episode if delta has reached a specific threshhold
# this update will only apply locally
# the remote(anilist) is only updated when its certain you are going to open the player
- available_episodes: list[str] = sorted(
- fastanime_runtime_state.provider_available_episodes, key=float
- )
if stop_time == "0" or total_time == "0":
# increment the episodes
- next_episode = available_episodes.index(current_episode_number) + 1
- if next_episode >= len(available_episodes):
- next_episode = len(available_episodes) - 1
- episode = available_episodes[next_episode]
+ # next_episode = available_episodes.index(current_episode_number) + 1
+ # if next_episode >= len(available_episodes):
+ # next_episode = len(available_episodes) - 1
+ # episode = available_episodes[next_episode]
+ pass
else:
percentage_completion_of_episode = calculate_percentage_completion(
stop_time, total_time
)
- if percentage_completion_of_episode < config.episode_complete_at:
- episode = current_episode_number
- else:
+ if percentage_completion_of_episode > config.episode_complete_at:
# -- update anilist progress if user --
remote_progress = (
fastanime_runtime_state.selected_anime_anilist["mediaListEntry"] or {}
@@ -634,16 +630,16 @@ def provider_anime_episode_servers_menu(
)
# increment the episodes
- next_episode = available_episodes.index(current_episode_number) + 1
- if next_episode >= len(available_episodes):
- next_episode = len(available_episodes) - 1
- episode = available_episodes[next_episode]
- stop_time = "0"
- total_time = "0"
+ # next_episode = available_episodes.index(current_episode_number) + 1
+ # if next_episode >= len(available_episodes):
+ # next_episode = len(available_episodes) - 1
+ # episode = available_episodes[next_episode]
+ # stop_time = "0"
+ # total_time = "0"
config.media_list_track(
anime_id_anilist,
- episode_no=episode,
+ episode_no=current_episode_number,
episode_stopped_at=stop_time,
episode_total_length=total_time,
progress_tracking=fastanime_runtime_state.progress_tracking,
@@ -678,7 +674,7 @@ def provider_anime_episodes_menu(
)
# prompt for episode number
- total_episodes = sorted(
+ available_episodes = sorted(
provider_anime["availableEpisodesDetail"][translation_type], key=float
)
current_episode_number = ""
@@ -689,7 +685,7 @@ def provider_anime_episodes_menu(
# will be preferred over remote
if (
user_watch_history.get(str(anime_id_anilist), {}).get("episode_no")
- in total_episodes
+ in available_episodes
):
if (
config.preferred_history == "local"
@@ -698,6 +694,29 @@ def provider_anime_episodes_menu(
current_episode_number = user_watch_history[str(anime_id_anilist)][
"episode_no"
]
+
+ stop_time = user_watch_history.get(str(anime_id_anilist), {}).get(
+ "episode_stopped_at", "0"
+ )
+ total_time = user_watch_history.get(str(anime_id_anilist), {}).get(
+ "episode_total_length", "0"
+ )
+ if stop_time != "0" or total_time != "0":
+ percentage_completion_of_episode = calculate_percentage_completion(
+ stop_time, total_time
+ )
+ if percentage_completion_of_episode > config.episode_complete_at:
+ # increment the episodes
+ next_episode = (
+ available_episodes.index(current_episode_number) + 1
+ )
+ if next_episode >= len(available_episodes):
+ next_episode = len(available_episodes) - 1
+ episode = available_episodes[next_episode]
+ stop_time = "0"
+ total_time = "0"
+ current_episode_number = episode
+
else:
current_episode_number = str(
(selected_anime_anilist["mediaListEntry"] or {"progress": 0}).get(
@@ -715,7 +734,7 @@ def provider_anime_episodes_menu(
"progress"
)
)
- if current_episode_number not in total_episodes:
+ if current_episode_number not in available_episodes:
current_episode_number = ""
print(
f"[bold cyan]Continuing from Episode:[/] [bold]{current_episode_number}[/]"
@@ -725,8 +744,8 @@ def provider_anime_episodes_menu(
current_episode_number = ""
# prompt for episode number if not set
- if not current_episode_number or current_episode_number not in total_episodes:
- choices = [*total_episodes, "Back"]
+ if not current_episode_number or current_episode_number not in available_episodes:
+ choices = [*available_episodes, "Back"]
preview = None
if config.preview:
from .utils import get_fzf_episode_preview
@@ -735,7 +754,7 @@ def provider_anime_episodes_menu(
if e:
eps = range(0, e + 1)
else:
- eps = total_episodes
+ eps = available_episodes
preview = get_fzf_episode_preview(
fastanime_runtime_state.selected_anime_anilist, eps
)
@@ -764,7 +783,7 @@ def provider_anime_episodes_menu(
# )
# update runtime data
- fastanime_runtime_state.provider_available_episodes = total_episodes
+ fastanime_runtime_state.provider_available_episodes = available_episodes
fastanime_runtime_state.provider_current_episode_number = current_episode_number
# next interface
From 912c8674cf98e5e2e9f2995310fb0fd508271880 Mon Sep 17 00:00:00 2001
From: Benex254
Date: Mon, 11 Nov 2024 12:51:46 +0300
Subject: [PATCH 12/87] refactor(player): remove unnecessary orint statement
---
fastanime/cli/utils/mpv.py | 1 -
1 file changed, 1 deletion(-)
diff --git a/fastanime/cli/utils/mpv.py b/fastanime/cli/utils/mpv.py
index 7a872cc..e7a0396 100644
--- a/fastanime/cli/utils/mpv.py
+++ b/fastanime/cli/utils/mpv.py
@@ -37,7 +37,6 @@ def stream_video(MPV, url, mpv_args, custom_args):
# Check if the process has terminated
retcode = process.poll()
if retcode is not None:
- print("Finshed at: ", last_time)
break
except Exception as e:
From 8119eef263d3f9bc459f003211865c4946479e04 Mon Sep 17 00:00:00 2001
From: Benex254
Date: Mon, 11 Nov 2024 12:52:26 +0300
Subject: [PATCH 13/87] docs(readme): update table of contents
---
README.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/README.md b/README.md
index 6bb15e7..466f4f1 100644
--- a/README.md
+++ b/README.md
@@ -38,6 +38,7 @@ Heavily inspired by [animdl](https://github.com/justfoolingaround/animdl), [jerr
- [**FastAnime**](#fastanime)
- [Installation](#installation)
- [Installation using your favourite package manager](#installation-using-your-favourite-package-manager)
+ - [Using uv](#using-uv)
- [Using pipx](#using-pipx)
- [Using pip](#using-pip)
- [Installing the bleeding edge version](#installing-the-bleeding-edge-version)
@@ -56,6 +57,7 @@ Heavily inspired by [animdl](https://github.com/justfoolingaround/animdl), [jerr
- [cache subcommand](#cache-subcommand)
- [update subcommand](#update-subcommand)
- [completions subcommand](#completions-subcommand)
+ - [fastanime serve](#fastanime-serve)
- [MPV specific commands](#mpv-specific-commands)
- [Key Bindings](#key-bindings)
- [Script Messages](#script-messages)
From 29cc6cad09de84201786b1c3e9b8dfc8a57527c5 Mon Sep 17 00:00:00 2001
From: Benex254
Date: Mon, 11 Nov 2024 12:56:09 +0300
Subject: [PATCH 14/87] build: pyinstaller spec
---
pyinstaller.spec | 65 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 65 insertions(+)
create mode 100644 pyinstaller.spec
diff --git a/pyinstaller.spec b/pyinstaller.spec
new file mode 100644
index 0000000..2fe8a05
--- /dev/null
+++ b/pyinstaller.spec
@@ -0,0 +1,65 @@
+# -*- mode: python ; coding: utf-8 -*-
+from PyInstaller.utils.hooks import collect_data_files, collect_submodules
+
+block_cipher = None
+
+# Collect all required data files
+datas = [
+ ('fastanime/assets/*', 'fastanime/assets'),
+]
+
+# Collect all required hidden imports
+hiddenimports = [
+ 'click',
+ 'rich',
+ 'requests',
+ 'yt_dlp',
+ 'python_mpv',
+ 'fuzzywuzzy',
+ 'fastanime',
+] + collect_submodules('fastanime')
+
+a = Analysis(
+ ['./fastanime/fastanime.py'], # Changed entry point
+ pathex=[],
+ binaries=[],
+ datas=datas,
+ hiddenimports=hiddenimports,
+ hookspath=[],
+ hooksconfig={},
+ runtime_hooks=[],
+ excludes=[],
+ win_no_prefer_redirects=False,
+ win_private_assemblies=False,
+ cipher=block_cipher,
+ strip=True, # Strip debug information
+ optimize=2 # Optimize bytecode noarchive=False
+)
+
+pyz = PYZ(
+ a.pure,
+ a.zipped_data,
+ optimize=2 # Optimize bytecode cipher=block_cipher
+)
+
+exe = EXE(
+ pyz,
+ a.scripts,
+ a.binaries,
+ a.zipfiles,
+ a.datas,
+ [],
+ name='fastanime',
+ debug=False,
+ bootloader_ignore_signals=False,
+ strip=True,
+ upx=True,
+ upx_exclude=[],
+ runtime_tmpdir=None,
+ console=True,
+ disable_windowed_traceback=False,
+ target_arch=None,
+ codesign_identity=None,
+ entitlements_file=None,
+ icon='fastanime/assets/logo.ico'
+)
From 8d4b71e0c8881d89b35ad2359d20d94b1593ad2a Mon Sep 17 00:00:00 2001
From: Benex254
Date: Mon, 11 Nov 2024 12:56:26 +0300
Subject: [PATCH 15/87] feat: add entry point for pyinstaller executable
---
fastanime/fastanime.py | 14 ++++++++++++++
1 file changed, 14 insertions(+)
create mode 100755 fastanime/fastanime.py
diff --git a/fastanime/fastanime.py b/fastanime/fastanime.py
new file mode 100755
index 0000000..28f1419
--- /dev/null
+++ b/fastanime/fastanime.py
@@ -0,0 +1,14 @@
+#!/usr/bin/env python3
+import os
+import sys
+
+# Add the application root directory to Python path
+if getattr(sys, "frozen", False):
+ application_path = os.path.dirname(sys.executable)
+ sys.path.insert(0, application_path)
+
+# Import and run the main application
+from fastanime import FastAnime
+
+if __name__ == "__main__":
+ FastAnime()
From 653b2cf4ebab73ca7f04f0018a1baa9dfcc495e8 Mon Sep 17 00:00:00 2001
From: Benex254
Date: Mon, 11 Nov 2024 12:56:58 +0300
Subject: [PATCH 16/87] chore: add pyinstaller as dev dep
---
pyproject.toml | 7 +++-
uv.lock | 93 +++++++++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 98 insertions(+), 2 deletions(-)
diff --git a/pyproject.toml b/pyproject.toml
index 85cfa35..320fac1 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -28,4 +28,9 @@ requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.uv]
-dev-dependencies = ["pyright>=1.1.384", "pytest>=8.3.3", "ruff>=0.6.9"]
+dev-dependencies = [
+ "pyinstaller>=6.11.1",
+ "pyright>=1.1.384",
+ "pytest>=8.3.3",
+ "ruff>=0.6.9",
+]
diff --git a/uv.lock b/uv.lock
index 6fbd90e..06c364c 100644
--- a/uv.lock
+++ b/uv.lock
@@ -5,6 +5,15 @@ resolution-markers = [
"python_full_version >= '3.13'",
]
+[[package]]
+name = "altgraph"
+version = "0.17.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/de/a8/7145824cf0b9e3c28046520480f207df47e927df83aa9555fb47f8505922/altgraph-0.17.4.tar.gz", hash = "sha256:1b5afbb98f6c4dcadb2e2ae6ab9fa994bbb8c1d75f4fa96d340f9437ae454406", size = 48418 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/4d/3f/3bc3f1d83f6e4a7fcb834d3720544ca597590425be5ba9db032b2bf322a2/altgraph-0.17.4-py2.py3-none-any.whl", hash = "sha256:642743b4750de17e655e6711601b077bc6598dbfa3ba5fa2b2a35ce12b508dff", size = 21212 },
+]
+
[[package]]
name = "annotated-types"
version = "0.7.0"
@@ -310,7 +319,7 @@ wheels = [
[[package]]
name = "fastanime"
-version = "2.6.9"
+version = "2.7.1"
source = { editable = "." }
dependencies = [
{ name = "click" },
@@ -339,6 +348,7 @@ standard = [
[package.dev-dependencies]
dev = [
+ { name = "pyinstaller" },
{ name = "pyright" },
{ name = "pytest" },
{ name = "ruff" },
@@ -362,6 +372,7 @@ requires-dist = [
[package.metadata.requires-dev]
dev = [
+ { name = "pyinstaller", specifier = ">=6.11.1" },
{ name = "pyright", specifier = ">=1.1.384" },
{ name = "pytest", specifier = ">=8.3.3" },
{ name = "ruff", specifier = ">=0.6.9" },
@@ -526,6 +537,18 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d", size = 133271 },
]
+[[package]]
+name = "macholib"
+version = "1.16.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "altgraph" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/95/ee/af1a3842bdd5902ce133bd246eb7ffd4375c38642aeb5dc0ae3a0329dfa2/macholib-1.16.3.tar.gz", hash = "sha256:07ae9e15e8e4cd9a788013d81f5908b3609aa76f9b1421bae9c4d7606ec86a30", size = 59309 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d1/5d/c059c180c84f7962db0aeae7c3b9303ed1d73d76f2bfbc32bc231c8be314/macholib-1.16.3-py2.py3-none-any.whl", hash = "sha256:0e315d7583d38b8c77e815b1ecbdbf504a8258d8b3e17b61165c6feb60d18f2c", size = 38094 },
+]
+
[[package]]
name = "markdown-it-py"
version = "3.0.0"
@@ -641,6 +664,15 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 },
]
+[[package]]
+name = "pefile"
+version = "2023.2.7"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/78/c5/3b3c62223f72e2360737fd2a57c30e5b2adecd85e70276879609a7403334/pefile-2023.2.7.tar.gz", hash = "sha256:82e6114004b3d6911c77c3953e3838654b04511b8b66e8583db70c65998017dc", size = 74854 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/55/26/d0ad8b448476d0a1e8d3ea5622dc77b916db84c6aa3cb1e1c0965af948fc/pefile-2023.2.7-py3-none-any.whl", hash = "sha256:da185cd2af68c08a6cd4481f7325ed600a88f6a813bad9dea07ab3ef73d8d8d6", size = 71791 },
+]
+
[[package]]
name = "pfzy"
version = "0.3.4"
@@ -803,6 +835,47 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a", size = 1205513 },
]
+[[package]]
+name = "pyinstaller"
+version = "6.11.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "altgraph" },
+ { name = "macholib", marker = "sys_platform == 'darwin'" },
+ { name = "packaging" },
+ { name = "pefile", marker = "sys_platform == 'win32'" },
+ { name = "pyinstaller-hooks-contrib" },
+ { name = "pywin32-ctypes", marker = "sys_platform == 'win32'" },
+ { name = "setuptools" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/55/d4/54f5f5c73b803e6256ea97ffc6ba8a305d9a5f57f85f9b00b282512bf18a/pyinstaller-6.11.1.tar.gz", hash = "sha256:491dfb4d9d5d1d9650d9507daec1ff6829527a254d8e396badd60a0affcb72ef", size = 4249772 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/96/15/b0f1c0985ee32fcd2f6ad9a486ef94e4db3fef9af025a3655e76cb708009/pyinstaller-6.11.1-py3-none-macosx_10_13_universal2.whl", hash = "sha256:44e36172de326af6d4e7663b12f71dbd34e2e3e02233e181e457394423daaf03", size = 991780 },
+ { url = "https://files.pythonhosted.org/packages/fd/0f/9f54cb18abe2b1d89051bc9214c0cb40d7b5f4049c151c315dacc067f4a2/pyinstaller-6.11.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:6d12c45a29add78039066a53fb05967afaa09a672426072b13816fe7676abfc4", size = 711739 },
+ { url = "https://files.pythonhosted.org/packages/32/f7/79d10830780eff8339bfa793eece1df4b2459e35a712fc81983e8536cc29/pyinstaller-6.11.1-py3-none-manylinux2014_i686.whl", hash = "sha256:ddc0fddd75f07f7e423da1f0822e389a42af011f9589e0269b87e0d89aa48c1f", size = 714053 },
+ { url = "https://files.pythonhosted.org/packages/25/f7/9961ef02cdbd2dbb1b1a215292656bd0ea72a83aafd8fb6373513849711e/pyinstaller-6.11.1-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:0d6475559c4939f0735122989611d7f739ed3bf02f666ce31022928f7a7e4fda", size = 719133 },
+ { url = "https://files.pythonhosted.org/packages/6f/4d/7f854842a1ce798de762a0b0bc5d5a4fc26ad06164a98575dc3c54abed1f/pyinstaller-6.11.1-py3-none-manylinux2014_s390x.whl", hash = "sha256:e21c7806e34f40181e7606926a14579f848bfb1dc52cbca7eea66eccccbfe977", size = 709591 },
+ { url = "https://files.pythonhosted.org/packages/7f/e0/00d29fc90c3ba50620c61554e26ebb4d764569507be7cd1c8794aa696f9a/pyinstaller-6.11.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:32c742a24fe65d0702958fadf4040f76de85859c26bec0008766e5dbabc5b68f", size = 710068 },
+ { url = "https://files.pythonhosted.org/packages/3e/57/d14b44a69f068d2caaee49d15e45f9fa0f37c6a2d2ad778c953c1722a1ca/pyinstaller-6.11.1-py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:208c0ef6dab0837a0a273ea32d1a3619a208e3d1fe3fec3785eea71a77fd00ce", size = 714439 },
+ { url = "https://files.pythonhosted.org/packages/88/01/256824bb57ca208099c86c2fb289f888ca7732580e91ced48fa14e5903b2/pyinstaller-6.11.1-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:ad84abf465bcda363c1d54eafa76745d77b6a8a713778348377dc98d12a452f7", size = 710457 },
+ { url = "https://files.pythonhosted.org/packages/7c/f0/98c9138f5f0ff17462f1ad6d712dcfa643b9a283d6238d464d8145bc139d/pyinstaller-6.11.1-py3-none-win32.whl", hash = "sha256:2e8365276c5131c9bef98e358fbc305e4022db8bedc9df479629d6414021956a", size = 1280261 },
+ { url = "https://files.pythonhosted.org/packages/7d/08/f43080614b3e8bce481d4dfd580e579497c7dcdaf87656d9d2ad912e5796/pyinstaller-6.11.1-py3-none-win_amd64.whl", hash = "sha256:7ac83c0dc0e04357dab98c487e74ad2adb30e7eb186b58157a8faf46f1fa796f", size = 1340482 },
+ { url = "https://files.pythonhosted.org/packages/ed/56/953c6594cb66e249563854c9cc04ac5a055c6c99d1614298feeaeaa9b87e/pyinstaller-6.11.1-py3-none-win_arm64.whl", hash = "sha256:35e6b8077d240600bb309ed68bb0b1453fd2b7ab740b66d000db7abae6244423", size = 1267519 },
+]
+
+[[package]]
+name = "pyinstaller-hooks-contrib"
+version = "2024.10"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "packaging" },
+ { name = "setuptools" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/73/6a/9d0057e312b85fbd17a79e1c1955d115fd9bbc78b85bab757777c8ef2307/pyinstaller_hooks_contrib-2024.10.tar.gz", hash = "sha256:8a46655e5c5b0186b5e527399118a9b342f10513eb1425c483fa4f6d02e8800c", size = 140592 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a9/64/445861ee7a5fd32874c0f6cfe8222aacc8feda22539332e0d8ff50dadec6/pyinstaller_hooks_contrib-2024.10-py3-none-any.whl", hash = "sha256:ad47db0e153683b4151e10d231cb91f2d93c85079e78d76d9e0f57ac6c8a5e10", size = 338417 },
+]
+
[[package]]
name = "pyright"
version = "1.1.388"
@@ -851,6 +924,15 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/b4/fb/275137a799169392f1fa88fff2be92f16eee38e982720a8aaadefc4a36b2/python_multipart-0.0.17-py3-none-any.whl", hash = "sha256:15dc4f487e0a9476cc1201261188ee0940165cffc94429b6fc565c4d3045cb5d", size = 24453 },
]
+[[package]]
+name = "pywin32-ctypes"
+version = "0.2.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/85/9f/01a1a99704853cb63f253eea009390c88e7131c67e66a0a02099a8c917cb/pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755", size = 29471 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8", size = 30756 },
+]
+
[[package]]
name = "pyyaml"
version = "6.0.2"
@@ -1023,6 +1105,15 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/3f/77/b587cba6febd5e2003374f37eb89633f79f161e71084f94057c8653b7fb3/ruff-0.7.3-py3-none-win_arm64.whl", hash = "sha256:1713e2c5545863cdbfe2cbce21f69ffaf37b813bfd1fb3b90dc9a6f1963f5a8c", size = 8725228 },
]
+[[package]]
+name = "setuptools"
+version = "75.3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/ed/22/a438e0caa4576f8c383fa4d35f1cc01655a46c75be358960d815bfbb12bd/setuptools-75.3.0.tar.gz", hash = "sha256:fba5dd4d766e97be1b1681d98712680ae8f2f26d7881245f2ce9e40714f1a686", size = 1351577 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/90/12/282ee9bce8b58130cb762fbc9beabd531549952cac11fc56add11dcb7ea0/setuptools-75.3.0-py3-none-any.whl", hash = "sha256:f2504966861356aa38616760c0f66568e535562374995367b4e69c7143cf6bcd", size = 1251070 },
+]
+
[[package]]
name = "shellingham"
version = "1.5.4"
From 441d1e5e6c41ab6222e563d72ce65a1b77bd2ba6 Mon Sep 17 00:00:00 2001
From: Benex254
Date: Mon, 11 Nov 2024 12:57:50 +0300
Subject: [PATCH 17/87] chore: bump version (v2.7.3)
---
fastanime/__init__.py | 2 +-
pyproject.toml | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/fastanime/__init__.py b/fastanime/__init__.py
index dec9734..834b6c3 100644
--- a/fastanime/__init__.py
+++ b/fastanime/__init__.py
@@ -6,7 +6,7 @@ if sys.version_info < (3, 10):
) # noqa: F541
-__version__ = "v2.7.2"
+__version__ = "v2.7.3"
APP_NAME = "FastAnime"
AUTHOR = "Benex254"
diff --git a/pyproject.toml b/pyproject.toml
index 320fac1..f579cc7 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "fastanime"
-version = "2.7.2"
+version = "2.7.3"
description = "A browser anime site experience from the terminal"
license = "UNLICENSE"
readme = "README.md"
From ed3064e3b1423a26bd9a3ca485012751c008f083 Mon Sep 17 00:00:00 2001
From: benex
Date: Wed, 13 Nov 2024 20:53:18 +0300
Subject: [PATCH 18/87] feat(anime_provider): add yugen provider
---
fastanime/Utility/data.py | 1 +
fastanime/libs/anime_provider/__init__.py | 1 +
fastanime/libs/anime_provider/yugen/api.py | 216 ++++++++++++++++++
.../libs/anime_provider/yugen/constants.py | 5 +
4 files changed, 223 insertions(+)
create mode 100644 fastanime/libs/anime_provider/yugen/api.py
create mode 100644 fastanime/libs/anime_provider/yugen/constants.py
diff --git a/fastanime/Utility/data.py b/fastanime/Utility/data.py
index e59735e..1f4b94f 100644
--- a/fastanime/Utility/data.py
+++ b/fastanime/Utility/data.py
@@ -14,6 +14,7 @@ anime_normalizer_raw = {
"hianime": {"My Star": "Oshi no Ko"},
"animepahe": {"Azumanga Daiou The Animation": "Azumanga Daioh"},
"nyaa": {},
+ "yugen": {},
}
diff --git a/fastanime/libs/anime_provider/__init__.py b/fastanime/libs/anime_provider/__init__.py
index 669bf14..f4212c1 100644
--- a/fastanime/libs/anime_provider/__init__.py
+++ b/fastanime/libs/anime_provider/__init__.py
@@ -7,5 +7,6 @@ anime_sources = {
"animepahe": "api.AnimePaheApi",
"hianime": "api.HiAnimeApi",
"nyaa": "api.NyaaApi",
+ "yugen": "api.YugenApi"
}
SERVERS_AVAILABLE = [*ALLANIME_SERVERS, *ANIMEPAHE_SERVERS, *HIANIME_SERVERS]
diff --git a/fastanime/libs/anime_provider/yugen/api.py b/fastanime/libs/anime_provider/yugen/api.py
new file mode 100644
index 0000000..4749bc0
--- /dev/null
+++ b/fastanime/libs/anime_provider/yugen/api.py
@@ -0,0 +1,216 @@
+import base64
+from itertools import cycle
+from yt_dlp.utils import (
+ get_element_text_and_html_by_tag,
+ get_elements_text_and_html_by_attribute,
+ extract_attributes,
+ get_element_by_attribute,
+)
+import re
+
+from yt_dlp.utils.traversal import get_element_html_by_attribute
+from .constants import YUGEN_ENDPOINT, SEARCH_URL
+from ..decorators import debug_provider
+from ..base_provider import AnimeProvider
+
+
+# ** Adapted from anipy-cli **
+class YugenApi(AnimeProvider):
+ """
+ Provides a fast and effective interface to YugenApi site.
+ """
+
+ PROVIDER = "yugen"
+ api_endpoint = YUGEN_ENDPOINT
+ # HEADERS = {
+ # "Referer": ALLANIME_REFERER,
+ # }
+
+ @debug_provider(PROVIDER.upper())
+ def search_for_anime(
+ self,
+ user_query: str,
+ translation_type: str = "sub",
+ nsfw=True,
+ unknown=True,
+ **kwargs,
+ ):
+ results = []
+ has_next = True
+ page = 0
+ while has_next:
+ page += 1
+ response = self.session.get(
+ SEARCH_URL, params={"q": user_query, "page": page}
+ )
+ search_results = response.json()
+ has_next = search_results["hasNext"]
+
+ results_html = search_results["query"]
+ anime = get_elements_text_and_html_by_attribute(
+ "class", "anime-meta", results_html, tag="a"
+ )
+ id_regex = re.compile(r"(\d+)\/([^\/]+)")
+ for _a in anime:
+ if not _a:
+ continue
+ a = extract_attributes(_a[1])
+
+ if not a:
+ continue
+ uri = a["href"]
+ identifier = id_regex.search(uri) # pyright:ignore
+ if identifier is None:
+ continue
+
+ if len(identifier.groups()) != 2:
+ continue
+
+ identifier = base64.b64encode(
+ f"{identifier.group(1)}/{identifier.group(2)}".encode()
+ ).decode()
+
+ anime_title = a["title"]
+ languages = {"sub": 1, "dub": 0}
+ excl = get_element_by_attribute(
+ "class", "ani-exclamation", _a[1], tag="div"
+ )
+ if excl is not None:
+ if "dub" in excl.lower():
+ languages["dub"] = 1
+ #
+ results.append(
+ {
+ "id": identifier,
+ "title": anime_title,
+ "availableEpisodes": languages,
+ }
+ )
+
+ page += 1
+
+ return {
+ "pageInfo": {"total": len(results)},
+ "results": results,
+ }
+
+ @debug_provider(PROVIDER.upper())
+ def get_anime(self, anime_id: str, **kwargs):
+ identifier = base64.b64decode(anime_id).decode()
+ response = self.session.get(f"{YUGEN_ENDPOINT}/anime/{identifier}")
+ html_page = response.text
+ data_map = {
+ "id": anime_id,
+ "title": None,
+ "poster": None,
+ "genres": [],
+ "synopsis": None,
+ "release_year": None,
+ "status": None,
+ "otherTitles": [],
+ "availableEpisodesDetail": {},
+ }
+
+ sub_match = re.search(
+ r'Episodes
(\d+)',
+ html_page,
+ )
+
+ if sub_match:
+ eps = int(sub_match.group(1))
+ data_map["availableEpisodesDetail"]["sub"] = list(map(str,range(1, eps + 1)))
+
+ dub_match = re.search(
+ r'Episodes \(Dub\)
(\d+)',
+ html_page,
+ )
+
+ if dub_match:
+ eps = int(dub_match.group(1))
+ data_map["availableEpisodesDetail"]["dub"] = list(map(str,range(1, eps + 1)))
+
+ name = get_element_text_and_html_by_tag("h1", html_page)
+ if name is not None:
+ data_map["title"] = name[0].strip()
+
+ synopsis = get_element_by_attribute("class", "description", html_page, tag="p")
+ if synopsis is not None:
+ data_map["synopsis"] = synopsis
+
+ # FIXME: This is not working because ytdl is too strict on also getting a closing tag
+ try:
+ image = get_element_html_by_attribute(
+ "class", "cover", html_page, tag="img"
+ )
+ img_attrs = extract_attributes(image)
+ if img_attrs is not None:
+ data_map["image"] = img_attrs.get("src")
+ except Exception:
+ pass
+
+ data = get_elements_text_and_html_by_attribute(
+ "class", "data", html_page, tag="div"
+ )
+ for d in data:
+ title = get_element_text_and_html_by_tag("div", d[1])
+ desc = get_element_text_and_html_by_tag("span", d[1])
+ if title is None or desc is None:
+ continue
+ title = title[0]
+ desc = desc[0]
+ if title in ["Native", "Romaji"]:
+ data_map["alternative_names"].append(desc)
+ elif title == "Synonyms":
+ data_map["alternative_names"].extend(desc.split(","))
+ elif title == "Premiered":
+ try:
+ data_map["release_year"] = int(desc.split()[-1])
+ except (ValueError, TypeError):
+ pass
+ elif title == "Status":
+ data_map["status"] = title
+ elif title == "Genres":
+ data_map["genres"].extend([g.strip() for g in desc.split(",")])
+
+ return data_map
+
+ @debug_provider(PROVIDER.upper())
+ def get_episode_streams(
+ self, anime_id, episode_number: str, translation_type="sub"
+ ):
+ """get the streams of an episode
+
+ Args:
+ translation_type ([TODO:parameter]): [TODO:description]
+ anime: [TODO:description]
+ episode_number: [TODO:description]
+
+ Yields:
+ [TODO:description]
+ """
+
+ identifier = base64.b64decode(anime_id).decode()
+
+ id_num, anime_title = identifier.split("/")
+ if translation_type == "dub":
+ video_query = f"{id_num}|{episode_number}|dub"
+ else:
+ video_query = f"{id_num}|{episode_number}"
+ #
+
+ res = self.session.post(
+ f"{YUGEN_ENDPOINT}/api/embed/",
+ data={
+ "id": base64.b64encode(video_query.encode()).decode(),
+ "ac": "0",
+ },
+ headers={"x-requested-with": "XMLHttpRequest"},
+ )
+ res = res.json()
+ yield {
+ "server": "gogoanime",
+ "episode_title": f"{anime_title}; Episode {episode_number}",
+ "headers": {},
+ "subtitles": [],
+ "links": [{"quality": quality, "link": link} for quality,link in zip(cycle(["1080","720","480","360"]),res["hls"])],
+ }
diff --git a/fastanime/libs/anime_provider/yugen/constants.py b/fastanime/libs/anime_provider/yugen/constants.py
new file mode 100644
index 0000000..3c18cd8
--- /dev/null
+++ b/fastanime/libs/anime_provider/yugen/constants.py
@@ -0,0 +1,5 @@
+
+YUGEN_ENDPOINT: str = "https://yugenanime.tv"
+
+SEARCH_URL = YUGEN_ENDPOINT + "/api/discover/"
+SERVERS_AVAILABLE = ["gogoanime"]
From 92059cd5edd799bb1d0ab89c3c1d784938518e0a Mon Sep 17 00:00:00 2001
From: Benedict Xavier <81157281+Benex254@users.noreply.github.com>
Date: Sat, 16 Nov 2024 12:01:55 +0300
Subject: [PATCH 19/87] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 466f4f1..c736a23 100644
--- a/README.md
+++ b/README.md
@@ -96,7 +96,7 @@ With the following extras available:
#### Using uv
-Recommended method of installation
+Recommended method of installation is using [uv](https://docs.astral.sh/uv/).
```bash
# generally:
From fe0fa9757678f2986caeee803763ac92d32afd4f Mon Sep 17 00:00:00 2001
From: benex
Date: Fri, 15 Nov 2024 07:27:17 +0300
Subject: [PATCH 20/87] fix(player): workaround weird problem with mpv in nixos
---
fastanime/cli/utils/mpv.py | 90 ++++++++++++++++++++------------------
1 file changed, 48 insertions(+), 42 deletions(-)
diff --git a/fastanime/cli/utils/mpv.py b/fastanime/cli/utils/mpv.py
index e7a0396..5e7e540 100644
--- a/fastanime/cli/utils/mpv.py
+++ b/fastanime/cli/utils/mpv.py
@@ -1,49 +1,65 @@
import re
+import os
import shutil
import subprocess
+import logging
+import time
-from fastanime.constants import S_PLATFORM
+from ...constants import S_PLATFORM
+
+logger = logging.getLogger(__name__)
def stream_video(MPV, url, mpv_args, custom_args):
- process = subprocess.Popen(
- [MPV, url, *mpv_args, *custom_args],
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE,
- text=True,
- )
-
- last_time = None
- av_time_pattern = re.compile(r"AV: ([0-9:]*) / ([0-9:]*) \(([0-9]*)%\)")
last_time = "0"
total_time = "0"
+ if os.environ.get("FASTANIME_DISABLE_MPV_POPEN", "0") == "0":
+ process = subprocess.Popen(
+ [
+ MPV,
+ url,
+ *mpv_args,
+ *custom_args,
+ "--no-terminal",
+ ],
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE,
+ text=True,
+ bufsize=1,
+ encoding="utf-8",
+ )
- try:
- while True:
- if not process.stderr:
- continue
- output = process.stderr.readline()
+ av_time_pattern = re.compile(r"AV: ([0-9:]*) / ([0-9:]*) \(([0-9]*)%\)")
- if output:
- # Match the timestamp in the output
- match = av_time_pattern.search(output.strip())
- if match:
- current_time = match.group(1)
- total_time = match.group(2)
- match.group(3)
- last_time = current_time
- # print(f"Current stream time: {current_time}, Total time: {total_time}, Progress: {percentage}%")
+ try:
+ while True:
+ if not process.stderr:
+ time.sleep(0.1)
+ continue
+ output = process.stderr.readline()
- # Check if the process has terminated
- retcode = process.poll()
- if retcode is not None:
- break
+ if output:
+ # Match the timestamp in the output
+ match = av_time_pattern.search(output.strip())
+ if match:
+ current_time = match.group(1)
+ total_time = match.group(2)
+ match.group(3)
+ last_time = current_time
- except Exception as e:
- print(f"An error occurred: {e}")
- finally:
- process.terminate()
+ # Check if the process has terminated
+ retcode = process.poll()
+ if retcode is not None:
+ break
+ except Exception as e:
+ print(f"An error occurred: {e}")
+ logger.error(f"An error occurred: {e}")
+ finally:
+ process.terminate()
+ process.wait()
+ else:
+ subprocess.run([MPV, url, *mpv_args, *custom_args])
return last_time, total_time
@@ -183,13 +199,3 @@ def run_mpv(
mpv_args.append(f"--ytdl-format={ytdl_format}")
stop_time, total_time = stream_video(MPV, link, mpv_args, custom_args)
return stop_time, total_time
-
-
-# Example usage
-if __name__ == "__main__":
- run_mpv(
- "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
- "Example Video",
- "--fullscreen",
- "--volume=50",
- )
From aa8b91aed3ed290d31ea31b18769121dc38c721f Mon Sep 17 00:00:00 2001
From: benex
Date: Sat, 16 Nov 2024 21:22:44 +0300
Subject: [PATCH 21/87] chore: remove unnecessary yt-dlp extras
---
pyproject.toml | 10 +--
uv.lock | 209 +------------------------------------------------
2 files changed, 8 insertions(+), 211 deletions(-)
diff --git a/pyproject.toml b/pyproject.toml
index f579cc7..798d20f 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -11,7 +11,7 @@ dependencies = [
"requests>=2.32.3",
"rich>=13.9.2",
"thefuzz>=0.22.1",
- "yt-dlp[default]>=2024.10.7",
+ "yt-dlp>=2024.10.7",
]
[project.scripts]
@@ -29,8 +29,8 @@ build-backend = "hatchling.build"
[tool.uv]
dev-dependencies = [
- "pyinstaller>=6.11.1",
- "pyright>=1.1.384",
- "pytest>=8.3.3",
- "ruff>=0.6.9",
+ "pyinstaller>=6.11.1",
+ "pyright>=1.1.384",
+ "pytest>=8.3.3",
+ "ruff>=0.6.9",
]
diff --git a/uv.lock b/uv.lock
index 06c364c..eee0fc1 100644
--- a/uv.lock
+++ b/uv.lock
@@ -38,98 +38,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/e4/f5/f2b75d2fc6f1a260f340f0e7c6a060f4dd2961cc16884ed851b0d18da06a/anyio-4.6.2.post1-py3-none-any.whl", hash = "sha256:6d170c36fba3bdd840c73d3868c1e777e33676a69c3a72cf0a0d5d6d8009b61d", size = 90377 },
]
-[[package]]
-name = "brotli"
-version = "1.1.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/2f/c2/f9e977608bdf958650638c3f1e28f85a1b075f075ebbe77db8555463787b/Brotli-1.1.0.tar.gz", hash = "sha256:81de08ac11bcb85841e440c13611c00b67d3bf82698314928d0b676362546724", size = 7372270 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/6d/3a/dbf4fb970c1019a57b5e492e1e0eae745d32e59ba4d6161ab5422b08eefe/Brotli-1.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e1140c64812cb9b06c922e77f1c26a75ec5e3f0fb2bf92cc8c58720dec276752", size = 873045 },
- { url = "https://files.pythonhosted.org/packages/dd/11/afc14026ea7f44bd6eb9316d800d439d092c8d508752055ce8d03086079a/Brotli-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c8fd5270e906eef71d4a8d19b7c6a43760c6abcfcc10c9101d14eb2357418de9", size = 446218 },
- { url = "https://files.pythonhosted.org/packages/36/83/7545a6e7729db43cb36c4287ae388d6885c85a86dd251768a47015dfde32/Brotli-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ae56aca0402a0f9a3431cddda62ad71666ca9d4dc3a10a142b9dce2e3c0cda3", size = 2903872 },
- { url = "https://files.pythonhosted.org/packages/32/23/35331c4d9391fcc0f29fd9bec2c76e4b4eeab769afbc4b11dd2e1098fb13/Brotli-1.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:43ce1b9935bfa1ede40028054d7f48b5469cd02733a365eec8a329ffd342915d", size = 2941254 },
- { url = "https://files.pythonhosted.org/packages/3b/24/1671acb450c902edb64bd765d73603797c6c7280a9ada85a195f6b78c6e5/Brotli-1.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:7c4855522edb2e6ae7fdb58e07c3ba9111e7621a8956f481c68d5d979c93032e", size = 2857293 },
- { url = "https://files.pythonhosted.org/packages/d5/00/40f760cc27007912b327fe15bf6bfd8eaecbe451687f72a8abc587d503b3/Brotli-1.1.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:38025d9f30cf4634f8309c6874ef871b841eb3c347e90b0851f63d1ded5212da", size = 3002385 },
- { url = "https://files.pythonhosted.org/packages/b8/cb/8aaa83f7a4caa131757668c0fb0c4b6384b09ffa77f2fba9570d87ab587d/Brotli-1.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e6a904cb26bfefc2f0a6f240bdf5233be78cd2488900a2f846f3c3ac8489ab80", size = 2911104 },
- { url = "https://files.pythonhosted.org/packages/bc/c4/65456561d89d3c49f46b7fbeb8fe6e449f13bdc8ea7791832c5d476b2faf/Brotli-1.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a37b8f0391212d29b3a91a799c8e4a2855e0576911cdfb2515487e30e322253d", size = 2809981 },
- { url = "https://files.pythonhosted.org/packages/05/1b/cf49528437bae28abce5f6e059f0d0be6fecdcc1d3e33e7c54b3ca498425/Brotli-1.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e84799f09591700a4154154cab9787452925578841a94321d5ee8fb9a9a328f0", size = 2935297 },
- { url = "https://files.pythonhosted.org/packages/81/ff/190d4af610680bf0c5a09eb5d1eac6e99c7c8e216440f9c7cfd42b7adab5/Brotli-1.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f66b5337fa213f1da0d9000bc8dc0cb5b896b726eefd9c6046f699b169c41b9e", size = 2930735 },
- { url = "https://files.pythonhosted.org/packages/80/7d/f1abbc0c98f6e09abd3cad63ec34af17abc4c44f308a7a539010f79aae7a/Brotli-1.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5dab0844f2cf82be357a0eb11a9087f70c5430b2c241493fc122bb6f2bb0917c", size = 2933107 },
- { url = "https://files.pythonhosted.org/packages/34/ce/5a5020ba48f2b5a4ad1c0522d095ad5847a0be508e7d7569c8630ce25062/Brotli-1.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e4fe605b917c70283db7dfe5ada75e04561479075761a0b3866c081d035b01c1", size = 2845400 },
- { url = "https://files.pythonhosted.org/packages/44/89/fa2c4355ab1eecf3994e5a0a7f5492c6ff81dfcb5f9ba7859bd534bb5c1a/Brotli-1.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:1e9a65b5736232e7a7f91ff3d02277f11d339bf34099a56cdab6a8b3410a02b2", size = 3031985 },
- { url = "https://files.pythonhosted.org/packages/af/a4/79196b4a1674143d19dca400866b1a4d1a089040df7b93b88ebae81f3447/Brotli-1.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:58d4b711689366d4a03ac7957ab8c28890415e267f9b6589969e74b6e42225ec", size = 2927099 },
- { url = "https://files.pythonhosted.org/packages/e9/54/1c0278556a097f9651e657b873ab08f01b9a9ae4cac128ceb66427d7cd20/Brotli-1.1.0-cp310-cp310-win32.whl", hash = "sha256:be36e3d172dc816333f33520154d708a2657ea63762ec16b62ece02ab5e4daf2", size = 333172 },
- { url = "https://files.pythonhosted.org/packages/f7/65/b785722e941193fd8b571afd9edbec2a9b838ddec4375d8af33a50b8dab9/Brotli-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:0c6244521dda65ea562d5a69b9a26120769b7a9fb3db2fe9545935ed6735b128", size = 357255 },
- { url = "https://files.pythonhosted.org/packages/96/12/ad41e7fadd5db55459c4c401842b47f7fee51068f86dd2894dd0dcfc2d2a/Brotli-1.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a3daabb76a78f829cafc365531c972016e4aa8d5b4bf60660ad8ecee19df7ccc", size = 873068 },
- { url = "https://files.pythonhosted.org/packages/95/4e/5afab7b2b4b61a84e9c75b17814198ce515343a44e2ed4488fac314cd0a9/Brotli-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c8146669223164fc87a7e3de9f81e9423c67a79d6b3447994dfb9c95da16e2d6", size = 446244 },
- { url = "https://files.pythonhosted.org/packages/9d/e6/f305eb61fb9a8580c525478a4a34c5ae1a9bcb12c3aee619114940bc513d/Brotli-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30924eb4c57903d5a7526b08ef4a584acc22ab1ffa085faceb521521d2de32dd", size = 2906500 },
- { url = "https://files.pythonhosted.org/packages/3e/4f/af6846cfbc1550a3024e5d3775ede1e00474c40882c7bf5b37a43ca35e91/Brotli-1.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ceb64bbc6eac5a140ca649003756940f8d6a7c444a68af170b3187623b43bebf", size = 2943950 },
- { url = "https://files.pythonhosted.org/packages/b3/e7/ca2993c7682d8629b62630ebf0d1f3bb3d579e667ce8e7ca03a0a0576a2d/Brotli-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a469274ad18dc0e4d316eefa616d1d0c2ff9da369af19fa6f3daa4f09671fd61", size = 2918527 },
- { url = "https://files.pythonhosted.org/packages/b3/96/da98e7bedc4c51104d29cc61e5f449a502dd3dbc211944546a4cc65500d3/Brotli-1.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:524f35912131cc2cabb00edfd8d573b07f2d9f21fa824bd3fb19725a9cf06327", size = 2845489 },
- { url = "https://files.pythonhosted.org/packages/e8/ef/ccbc16947d6ce943a7f57e1a40596c75859eeb6d279c6994eddd69615265/Brotli-1.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5b3cc074004d968722f51e550b41a27be656ec48f8afaeeb45ebf65b561481dd", size = 2914080 },
- { url = "https://files.pythonhosted.org/packages/80/d6/0bd38d758d1afa62a5524172f0b18626bb2392d717ff94806f741fcd5ee9/Brotli-1.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:19c116e796420b0cee3da1ccec3b764ed2952ccfcc298b55a10e5610ad7885f9", size = 2813051 },
- { url = "https://files.pythonhosted.org/packages/14/56/48859dd5d129d7519e001f06dcfbb6e2cf6db92b2702c0c2ce7d97e086c1/Brotli-1.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:510b5b1bfbe20e1a7b3baf5fed9e9451873559a976c1a78eebaa3b86c57b4265", size = 2938172 },
- { url = "https://files.pythonhosted.org/packages/3d/77/a236d5f8cd9e9f4348da5acc75ab032ab1ab2c03cc8f430d24eea2672888/Brotli-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a1fd8a29719ccce974d523580987b7f8229aeace506952fa9ce1d53a033873c8", size = 2933023 },
- { url = "https://files.pythonhosted.org/packages/f1/87/3b283efc0f5cb35f7f84c0c240b1e1a1003a5e47141a4881bf87c86d0ce2/Brotli-1.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c247dd99d39e0338a604f8c2b3bc7061d5c2e9e2ac7ba9cc1be5a69cb6cd832f", size = 2935871 },
- { url = "https://files.pythonhosted.org/packages/f3/eb/2be4cc3e2141dc1a43ad4ca1875a72088229de38c68e842746b342667b2a/Brotli-1.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1b2c248cd517c222d89e74669a4adfa5577e06ab68771a529060cf5a156e9757", size = 2847784 },
- { url = "https://files.pythonhosted.org/packages/66/13/b58ddebfd35edde572ccefe6890cf7c493f0c319aad2a5badee134b4d8ec/Brotli-1.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:2a24c50840d89ded6c9a8fdc7b6ed3692ed4e86f1c4a4a938e1e92def92933e0", size = 3034905 },
- { url = "https://files.pythonhosted.org/packages/84/9c/bc96b6c7db824998a49ed3b38e441a2cae9234da6fa11f6ed17e8cf4f147/Brotli-1.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f31859074d57b4639318523d6ffdca586ace54271a73ad23ad021acd807eb14b", size = 2929467 },
- { url = "https://files.pythonhosted.org/packages/e7/71/8f161dee223c7ff7fea9d44893fba953ce97cf2c3c33f78ba260a91bcff5/Brotli-1.1.0-cp311-cp311-win32.whl", hash = "sha256:39da8adedf6942d76dc3e46653e52df937a3c4d6d18fdc94a7c29d263b1f5b50", size = 333169 },
- { url = "https://files.pythonhosted.org/packages/02/8a/fece0ee1057643cb2a5bbf59682de13f1725f8482b2c057d4e799d7ade75/Brotli-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:aac0411d20e345dc0920bdec5548e438e999ff68d77564d5e9463a7ca9d3e7b1", size = 357253 },
- { url = "https://files.pythonhosted.org/packages/5c/d0/5373ae13b93fe00095a58efcbce837fd470ca39f703a235d2a999baadfbc/Brotli-1.1.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:32d95b80260d79926f5fab3c41701dbb818fde1c9da590e77e571eefd14abe28", size = 815693 },
- { url = "https://files.pythonhosted.org/packages/8e/48/f6e1cdf86751300c288c1459724bfa6917a80e30dbfc326f92cea5d3683a/Brotli-1.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b760c65308ff1e462f65d69c12e4ae085cff3b332d894637f6273a12a482d09f", size = 422489 },
- { url = "https://files.pythonhosted.org/packages/06/88/564958cedce636d0f1bed313381dfc4b4e3d3f6015a63dae6146e1b8c65c/Brotli-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:316cc9b17edf613ac76b1f1f305d2a748f1b976b033b049a6ecdfd5612c70409", size = 873081 },
- { url = "https://files.pythonhosted.org/packages/58/79/b7026a8bb65da9a6bb7d14329fd2bd48d2b7f86d7329d5cc8ddc6a90526f/Brotli-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:caf9ee9a5775f3111642d33b86237b05808dafcd6268faa492250e9b78046eb2", size = 446244 },
- { url = "https://files.pythonhosted.org/packages/e5/18/c18c32ecea41b6c0004e15606e274006366fe19436b6adccc1ae7b2e50c2/Brotli-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70051525001750221daa10907c77830bc889cb6d865cc0b813d9db7fefc21451", size = 2906505 },
- { url = "https://files.pythonhosted.org/packages/08/c8/69ec0496b1ada7569b62d85893d928e865df29b90736558d6c98c2031208/Brotli-1.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7f4bf76817c14aa98cc6697ac02f3972cb8c3da93e9ef16b9c66573a68014f91", size = 2944152 },
- { url = "https://files.pythonhosted.org/packages/ab/fb/0517cea182219d6768113a38167ef6d4eb157a033178cc938033a552ed6d/Brotli-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0c5516f0aed654134a2fc936325cc2e642f8a0e096d075209672eb321cff408", size = 2919252 },
- { url = "https://files.pythonhosted.org/packages/c7/53/73a3431662e33ae61a5c80b1b9d2d18f58dfa910ae8dd696e57d39f1a2f5/Brotli-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c3020404e0b5eefd7c9485ccf8393cfb75ec38ce75586e046573c9dc29967a0", size = 2845955 },
- { url = "https://files.pythonhosted.org/packages/55/ac/bd280708d9c5ebdbf9de01459e625a3e3803cce0784f47d633562cf40e83/Brotli-1.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4ed11165dd45ce798d99a136808a794a748d5dc38511303239d4e2363c0695dc", size = 2914304 },
- { url = "https://files.pythonhosted.org/packages/76/58/5c391b41ecfc4527d2cc3350719b02e87cb424ef8ba2023fb662f9bf743c/Brotli-1.1.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4093c631e96fdd49e0377a9c167bfd75b6d0bad2ace734c6eb20b348bc3ea180", size = 2814452 },
- { url = "https://files.pythonhosted.org/packages/c7/4e/91b8256dfe99c407f174924b65a01f5305e303f486cc7a2e8a5d43c8bec3/Brotli-1.1.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e4c4629ddad63006efa0ef968c8e4751c5868ff0b1c5c40f76524e894c50248", size = 2938751 },
- { url = "https://files.pythonhosted.org/packages/5a/a6/e2a39a5d3b412938362bbbeba5af904092bf3f95b867b4a3eb856104074e/Brotli-1.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:861bf317735688269936f755fa136a99d1ed526883859f86e41a5d43c61d8966", size = 2933757 },
- { url = "https://files.pythonhosted.org/packages/13/f0/358354786280a509482e0e77c1a5459e439766597d280f28cb097642fc26/Brotli-1.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:87a3044c3a35055527ac75e419dfa9f4f3667a1e887ee80360589eb8c90aabb9", size = 2936146 },
- { url = "https://files.pythonhosted.org/packages/80/f7/daf538c1060d3a88266b80ecc1d1c98b79553b3f117a485653f17070ea2a/Brotli-1.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c5529b34c1c9d937168297f2c1fde7ebe9ebdd5e121297ff9c043bdb2ae3d6fb", size = 2848055 },
- { url = "https://files.pythonhosted.org/packages/ad/cf/0eaa0585c4077d3c2d1edf322d8e97aabf317941d3a72d7b3ad8bce004b0/Brotli-1.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ca63e1890ede90b2e4454f9a65135a4d387a4585ff8282bb72964fab893f2111", size = 3035102 },
- { url = "https://files.pythonhosted.org/packages/d8/63/1c1585b2aa554fe6dbce30f0c18bdbc877fa9a1bf5ff17677d9cca0ac122/Brotli-1.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e79e6520141d792237c70bcd7a3b122d00f2613769ae0cb61c52e89fd3443839", size = 2930029 },
- { url = "https://files.pythonhosted.org/packages/5f/3b/4e3fd1893eb3bbfef8e5a80d4508bec17a57bb92d586c85c12d28666bb13/Brotli-1.1.0-cp312-cp312-win32.whl", hash = "sha256:5f4d5ea15c9382135076d2fb28dde923352fe02951e66935a9efaac8f10e81b0", size = 333276 },
- { url = "https://files.pythonhosted.org/packages/3d/d5/942051b45a9e883b5b6e98c041698b1eb2012d25e5948c58d6bf85b1bb43/Brotli-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:906bc3a79de8c4ae5b86d3d75a8b77e44404b0f4261714306e3ad248d8ab0951", size = 357255 },
- { url = "https://files.pythonhosted.org/packages/0a/9f/fb37bb8ffc52a8da37b1c03c459a8cd55df7a57bdccd8831d500e994a0ca/Brotli-1.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8bf32b98b75c13ec7cf774164172683d6e7891088f6316e54425fde1efc276d5", size = 815681 },
- { url = "https://files.pythonhosted.org/packages/06/b3/dbd332a988586fefb0aa49c779f59f47cae76855c2d00f450364bb574cac/Brotli-1.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7bc37c4d6b87fb1017ea28c9508b36bbcb0c3d18b4260fcdf08b200c74a6aee8", size = 422475 },
- { url = "https://files.pythonhosted.org/packages/bb/80/6aaddc2f63dbcf2d93c2d204e49c11a9ec93a8c7c63261e2b4bd35198283/Brotli-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c0ef38c7a7014ffac184db9e04debe495d317cc9c6fb10071f7fefd93100a4f", size = 2906173 },
- { url = "https://files.pythonhosted.org/packages/ea/1d/e6ca79c96ff5b641df6097d299347507d39a9604bde8915e76bf026d6c77/Brotli-1.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91d7cc2a76b5567591d12c01f019dd7afce6ba8cba6571187e21e2fc418ae648", size = 2943803 },
- { url = "https://files.pythonhosted.org/packages/ac/a3/d98d2472e0130b7dd3acdbb7f390d478123dbf62b7d32bda5c830a96116d/Brotli-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a93dde851926f4f2678e704fadeb39e16c35d8baebd5252c9fd94ce8ce68c4a0", size = 2918946 },
- { url = "https://files.pythonhosted.org/packages/c4/a5/c69e6d272aee3e1423ed005d8915a7eaa0384c7de503da987f2d224d0721/Brotli-1.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f0db75f47be8b8abc8d9e31bc7aad0547ca26f24a54e6fd10231d623f183d089", size = 2845707 },
- { url = "https://files.pythonhosted.org/packages/58/9f/4149d38b52725afa39067350696c09526de0125ebfbaab5acc5af28b42ea/Brotli-1.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6967ced6730aed543b8673008b5a391c3b1076d834ca438bbd70635c73775368", size = 2936231 },
- { url = "https://files.pythonhosted.org/packages/5a/5a/145de884285611838a16bebfdb060c231c52b8f84dfbe52b852a15780386/Brotli-1.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7eedaa5d036d9336c95915035fb57422054014ebdeb6f3b42eac809928e40d0c", size = 2848157 },
- { url = "https://files.pythonhosted.org/packages/50/ae/408b6bfb8525dadebd3b3dd5b19d631da4f7d46420321db44cd99dcf2f2c/Brotli-1.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:d487f5432bf35b60ed625d7e1b448e2dc855422e87469e3f450aa5552b0eb284", size = 3035122 },
- { url = "https://files.pythonhosted.org/packages/af/85/a94e5cfaa0ca449d8f91c3d6f78313ebf919a0dbd55a100c711c6e9655bc/Brotli-1.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:832436e59afb93e1836081a20f324cb185836c617659b07b129141a8426973c7", size = 2930206 },
- { url = "https://files.pythonhosted.org/packages/c2/f0/a61d9262cd01351df22e57ad7c34f66794709acab13f34be2675f45bf89d/Brotli-1.1.0-cp313-cp313-win32.whl", hash = "sha256:43395e90523f9c23a3d5bdf004733246fba087f2948f87ab28015f12359ca6a0", size = 333804 },
- { url = "https://files.pythonhosted.org/packages/7e/c1/ec214e9c94000d1c1974ec67ced1c970c148aa6b8d8373066123fc3dbf06/Brotli-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:9011560a466d2eb3f5a6e4929cf4a09be405c64154e12df0dd72713f6500e32b", size = 358517 },
-]
-
-[[package]]
-name = "brotlicffi"
-version = "1.1.0.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "cffi" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/95/9d/70caa61192f570fcf0352766331b735afa931b4c6bc9a348a0925cc13288/brotlicffi-1.1.0.0.tar.gz", hash = "sha256:b77827a689905143f87915310b93b273ab17888fd43ef350d4832c4a71083c13", size = 465192 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/a2/11/7b96009d3dcc2c931e828ce1e157f03824a69fb728d06bfd7b2fc6f93718/brotlicffi-1.1.0.0-cp37-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9b7ae6bd1a3f0df532b6d67ff674099a96d22bc0948955cb338488c31bfb8851", size = 453786 },
- { url = "https://files.pythonhosted.org/packages/d6/e6/a8f46f4a4ee7856fbd6ac0c6fb0dc65ed181ba46cd77875b8d9bbe494d9e/brotlicffi-1.1.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19ffc919fa4fc6ace69286e0a23b3789b4219058313cf9b45625016bf7ff996b", size = 2911165 },
- { url = "https://files.pythonhosted.org/packages/be/20/201559dff14e83ba345a5ec03335607e47467b6633c210607e693aefac40/brotlicffi-1.1.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9feb210d932ffe7798ee62e6145d3a757eb6233aa9a4e7db78dd3690d7755814", size = 2927895 },
- { url = "https://files.pythonhosted.org/packages/cd/15/695b1409264143be3c933f708a3f81d53c4a1e1ebbc06f46331decbf6563/brotlicffi-1.1.0.0-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84763dbdef5dd5c24b75597a77e1b30c66604725707565188ba54bab4f114820", size = 2851834 },
- { url = "https://files.pythonhosted.org/packages/b4/40/b961a702463b6005baf952794c2e9e0099bde657d0d7e007f923883b907f/brotlicffi-1.1.0.0-cp37-abi3-win32.whl", hash = "sha256:1b12b50e07c3911e1efa3a8971543e7648100713d4e0971b13631cce22c587eb", size = 341731 },
- { url = "https://files.pythonhosted.org/packages/1c/fa/5408a03c041114ceab628ce21766a4ea882aa6f6f0a800e04ee3a30ec6b9/brotlicffi-1.1.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:994a4f0681bb6c6c3b0925530a1926b7a189d878e6e5e38fae8efa47c5d9c613", size = 366783 },
- { url = "https://files.pythonhosted.org/packages/e5/3b/bd4f3d2bcf2306ae66b0346f5b42af1962480b200096ffc7abc3bd130eca/brotlicffi-1.1.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2e4aeb0bd2540cb91b069dbdd54d458da8c4334ceaf2d25df2f4af576d6766ca", size = 397397 },
- { url = "https://files.pythonhosted.org/packages/54/10/1fd57864449360852c535c2381ee7120ba8f390aa3869df967c44ca7eba1/brotlicffi-1.1.0.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b7b0033b0d37bb33009fb2fef73310e432e76f688af76c156b3594389d81391", size = 379698 },
- { url = "https://files.pythonhosted.org/packages/e5/95/15aa422aa6450e6556e54a5fd1650ff59f470aed77ac739aa90ab63dc611/brotlicffi-1.1.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54a07bb2374a1eba8ebb52b6fafffa2afd3c4df85ddd38fcc0511f2bb387c2a8", size = 378635 },
- { url = "https://files.pythonhosted.org/packages/6c/a7/f254e13b2cb43337d6d99a4ec10394c134e41bfda8a2eff15b75627f4a3d/brotlicffi-1.1.0.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7901a7dc4b88f1c1475de59ae9be59799db1007b7d059817948d8e4f12e24e35", size = 385719 },
- { url = "https://files.pythonhosted.org/packages/72/a9/0971251c4427c14b2a827dba3d910d4d3330dabf23d4278bf6d06a978847/brotlicffi-1.1.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ce01c7316aebc7fce59da734286148b1d1b9455f89cf2c8a4dfce7d41db55c2d", size = 361760 },
-]
-
[[package]]
name = "certifi"
version = "2024.8.30"
@@ -139,63 +47,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/12/90/3c9ff0512038035f59d279fddeb79f5f1eccd8859f06d6163c58798b9487/certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", size = 167321 },
]
-[[package]]
-name = "cffi"
-version = "1.17.1"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "pycparser" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/90/07/f44ca684db4e4f08a3fdc6eeb9a0d15dc6883efc7b8c90357fdbf74e186c/cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14", size = 182191 },
- { url = "https://files.pythonhosted.org/packages/08/fd/cc2fedbd887223f9f5d170c96e57cbf655df9831a6546c1727ae13fa977a/cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67", size = 178592 },
- { url = "https://files.pythonhosted.org/packages/de/cc/4635c320081c78d6ffc2cab0a76025b691a91204f4aa317d568ff9280a2d/cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382", size = 426024 },
- { url = "https://files.pythonhosted.org/packages/b6/7b/3b2b250f3aab91abe5f8a51ada1b717935fdaec53f790ad4100fe2ec64d1/cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702", size = 448188 },
- { url = "https://files.pythonhosted.org/packages/d3/48/1b9283ebbf0ec065148d8de05d647a986c5f22586b18120020452fff8f5d/cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3", size = 455571 },
- { url = "https://files.pythonhosted.org/packages/40/87/3b8452525437b40f39ca7ff70276679772ee7e8b394934ff60e63b7b090c/cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6", size = 436687 },
- { url = "https://files.pythonhosted.org/packages/8d/fb/4da72871d177d63649ac449aec2e8a29efe0274035880c7af59101ca2232/cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17", size = 446211 },
- { url = "https://files.pythonhosted.org/packages/ab/a0/62f00bcb411332106c02b663b26f3545a9ef136f80d5df746c05878f8c4b/cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8", size = 461325 },
- { url = "https://files.pythonhosted.org/packages/36/83/76127035ed2e7e27b0787604d99da630ac3123bfb02d8e80c633f218a11d/cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e", size = 438784 },
- { url = "https://files.pythonhosted.org/packages/21/81/a6cd025db2f08ac88b901b745c163d884641909641f9b826e8cb87645942/cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be", size = 461564 },
- { url = "https://files.pythonhosted.org/packages/f8/fe/4d41c2f200c4a457933dbd98d3cf4e911870877bd94d9656cc0fcb390681/cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c", size = 171804 },
- { url = "https://files.pythonhosted.org/packages/d1/b6/0b0f5ab93b0df4acc49cae758c81fe4e5ef26c3ae2e10cc69249dfd8b3ab/cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15", size = 181299 },
- { url = "https://files.pythonhosted.org/packages/6b/f4/927e3a8899e52a27fa57a48607ff7dc91a9ebe97399b357b85a0c7892e00/cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", size = 182264 },
- { url = "https://files.pythonhosted.org/packages/6c/f5/6c3a8efe5f503175aaddcbea6ad0d2c96dad6f5abb205750d1b3df44ef29/cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", size = 178651 },
- { url = "https://files.pythonhosted.org/packages/94/dd/a3f0118e688d1b1a57553da23b16bdade96d2f9bcda4d32e7d2838047ff7/cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", size = 445259 },
- { url = "https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", size = 469200 },
- { url = "https://files.pythonhosted.org/packages/1c/a0/a4fa9f4f781bda074c3ddd57a572b060fa0df7655d2a4247bbe277200146/cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", size = 477235 },
- { url = "https://files.pythonhosted.org/packages/62/12/ce8710b5b8affbcdd5c6e367217c242524ad17a02fe5beec3ee339f69f85/cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", size = 459721 },
- { url = "https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", size = 467242 },
- { url = "https://files.pythonhosted.org/packages/1a/52/d9a0e523a572fbccf2955f5abe883cfa8bcc570d7faeee06336fbd50c9fc/cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", size = 477999 },
- { url = "https://files.pythonhosted.org/packages/44/74/f2a2460684a1a2d00ca799ad880d54652841a780c4c97b87754f660c7603/cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", size = 454242 },
- { url = "https://files.pythonhosted.org/packages/f8/4a/34599cac7dfcd888ff54e801afe06a19c17787dfd94495ab0c8d35fe99fb/cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b", size = 478604 },
- { url = "https://files.pythonhosted.org/packages/34/33/e1b8a1ba29025adbdcda5fb3a36f94c03d771c1b7b12f726ff7fef2ebe36/cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", size = 171727 },
- { url = "https://files.pythonhosted.org/packages/3d/97/50228be003bb2802627d28ec0627837ac0bf35c90cf769812056f235b2d1/cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", size = 181400 },
- { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178 },
- { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840 },
- { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803 },
- { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850 },
- { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729 },
- { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256 },
- { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424 },
- { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568 },
- { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736 },
- { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448 },
- { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976 },
- { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989 },
- { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802 },
- { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792 },
- { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893 },
- { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810 },
- { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200 },
- { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447 },
- { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358 },
- { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469 },
- { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475 },
- { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009 },
-]
-
[[package]]
name = "charset-normalizer"
version = "3.4.0"
@@ -319,7 +170,7 @@ wheels = [
[[package]]
name = "fastanime"
-version = "2.7.1"
+version = "2.7.3"
source = { editable = "." }
dependencies = [
{ name = "click" },
@@ -327,7 +178,7 @@ dependencies = [
{ name = "requests" },
{ name = "rich" },
{ name = "thefuzz" },
- { name = "yt-dlp", extra = ["default"] },
+ { name = "yt-dlp" },
]
[package.optional-dependencies]
@@ -367,7 +218,7 @@ requires-dist = [
{ name = "requests", specifier = ">=2.32.3" },
{ name = "rich", specifier = ">=13.9.2" },
{ name = "thefuzz", specifier = ">=0.22.1" },
- { name = "yt-dlp", extras = ["default"], specifier = ">=2024.10.7" },
+ { name = "yt-dlp", specifier = ">=2024.10.7" },
]
[package.metadata.requires-dev]
@@ -637,15 +488,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/aa/3f/d835556e34804cd0078507ed0f8a550f15d2861b875656193dd3451b720b/mpv-1.0.7-py3-none-any.whl", hash = "sha256:520fb134c18185b69c7fce4aa3514f14371028022d92eb193818e9fefb1e9fe8", size = 45257 },
]
-[[package]]
-name = "mutagen"
-version = "1.47.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/81/e6/64bc71b74eef4b68e61eb921dcf72dabd9e4ec4af1e11891bbd312ccbb77/mutagen-1.47.0.tar.gz", hash = "sha256:719fadef0a978c31b4cf3c956261b3c58b6948b32023078a2117b1de09f0fc99", size = 1274186 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/b0/7a/620f945b96be1f6ee357d211d5bf74ab1b7fe72a9f1525aafbfe3aee6875/mutagen-1.47.0-py3-none-any.whl", hash = "sha256:edd96f50c5907a9539d8e5bba7245f62c9f520aef333d13392a79a4f70aca719", size = 194391 },
-]
-
[[package]]
name = "nodeenv"
version = "1.9.1"
@@ -712,39 +554,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/a9/6a/fd08d94654f7e67c52ca30523a178b3f8ccc4237fce4be90d39c938a831a/prompt_toolkit-3.0.48-py3-none-any.whl", hash = "sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e", size = 386595 },
]
-[[package]]
-name = "pycparser"
-version = "2.22"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 },
-]
-
-[[package]]
-name = "pycryptodomex"
-version = "3.21.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/11/dc/e66551683ade663b5f07d7b3bc46434bf703491dbd22ee12d1f979ca828f/pycryptodomex-3.21.0.tar.gz", hash = "sha256:222d0bd05381dd25c32dd6065c071ebf084212ab79bab4599ba9e6a3e0009e6c", size = 4818543 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/22/5e/99f217d9881eead69607a2248dd7bbdf610837d7f5ad53f45a6cb71bbbfb/pycryptodomex-3.21.0-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:34325b84c8b380675fd2320d0649cdcbc9cf1e0d1526edbe8fce43ed858cdc7e", size = 2499490 },
- { url = "https://files.pythonhosted.org/packages/ce/8f/4d0e2a859a6470289d64e39b419f01d2494dfa2e4995342d50f6c2834237/pycryptodomex-3.21.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:103c133d6cd832ae7266feb0a65b69e3a5e4dbbd6f3a3ae3211a557fd653f516", size = 1638037 },
- { url = "https://files.pythonhosted.org/packages/0c/9e/6e748c1fa814c956d356f93cf7192b19487ca56fc9e2a0bcde2bbc057601/pycryptodomex-3.21.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77ac2ea80bcb4b4e1c6a596734c775a1615d23e31794967416afc14852a639d3", size = 2172279 },
- { url = "https://files.pythonhosted.org/packages/46/3f/f5bef92b11750af9e3516d4e69736eeeff20a2818d34611508bef5a7b381/pycryptodomex-3.21.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9aa0cf13a1a1128b3e964dc667e5fe5c6235f7d7cfb0277213f0e2a783837cc2", size = 2258130 },
- { url = "https://files.pythonhosted.org/packages/de/4d/f0c65afd64ce435fd0547187ce6f99dfb37cdde16b05b57bca9f5c06966e/pycryptodomex-3.21.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:46eb1f0c8d309da63a2064c28de54e5e614ad17b7e2f88df0faef58ce192fc7b", size = 2297719 },
- { url = "https://files.pythonhosted.org/packages/1c/6a/2a1a101b0345ee70376ba93df8de6c8c01aac8341fda02970800873456a7/pycryptodomex-3.21.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:cc7e111e66c274b0df5f4efa679eb31e23c7545d702333dfd2df10ab02c2a2ce", size = 2164079 },
- { url = "https://files.pythonhosted.org/packages/3d/00/90a15f16c234815b660303c2d7266b41b401ea2605f3a90373e9d425e39f/pycryptodomex-3.21.0-cp36-abi3-musllinux_1_2_i686.whl", hash = "sha256:770d630a5c46605ec83393feaa73a9635a60e55b112e1fb0c3cea84c2897aa0a", size = 2333060 },
- { url = "https://files.pythonhosted.org/packages/61/74/49f5d20c514ccc631b940cc9dfec45dcce418dc84a98463a2e2ebec33904/pycryptodomex-3.21.0-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:52e23a0a6e61691134aa8c8beba89de420602541afaae70f66e16060fdcd677e", size = 2257982 },
- { url = "https://files.pythonhosted.org/packages/92/4b/d33ef74e2cc0025a259936661bb53432c5bbbadc561c5f2e023bcd73ce4c/pycryptodomex-3.21.0-cp36-abi3-win32.whl", hash = "sha256:a3d77919e6ff56d89aada1bd009b727b874d464cb0e2e3f00a49f7d2e709d76e", size = 1779052 },
- { url = "https://files.pythonhosted.org/packages/5b/be/7c991840af1184009fc86267160948350d1bf875f153c97bb471ad944e40/pycryptodomex-3.21.0-cp36-abi3-win_amd64.whl", hash = "sha256:b0e9765f93fe4890f39875e6c90c96cb341767833cfa767f41b490b506fa9ec0", size = 1816307 },
- { url = "https://files.pythonhosted.org/packages/af/ac/24125ad36778914a36f08d61ba5338cb9159382c638d9761ee19c8de822c/pycryptodomex-3.21.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:feaecdce4e5c0045e7a287de0c4351284391fe170729aa9182f6bd967631b3a8", size = 1694999 },
- { url = "https://files.pythonhosted.org/packages/93/73/be7a54a5903508070e5508925ba94493a1f326cfeecfff750e3eb250ea28/pycryptodomex-3.21.0-pp27-pypy_73-win32.whl", hash = "sha256:365aa5a66d52fd1f9e0530ea97f392c48c409c2f01ff8b9a39c73ed6f527d36c", size = 1769437 },
- { url = "https://files.pythonhosted.org/packages/e5/9f/39a6187f3986841fa6a9f35c6fdca5030ef73ff708b45a993813a51d7d10/pycryptodomex-3.21.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:3efddfc50ac0ca143364042324046800c126a1d63816d532f2e19e6f2d8c0c31", size = 1619607 },
- { url = "https://files.pythonhosted.org/packages/f8/70/60bb08e9e9841b18d4669fb69d84b64ce900aacd7eb0ebebd4c7b9bdecd3/pycryptodomex-3.21.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0df2608682db8279a9ebbaf05a72f62a321433522ed0e499bc486a6889b96bf3", size = 1653571 },
- { url = "https://files.pythonhosted.org/packages/c9/6f/191b73509291c5ff0dddec9cc54797b1d73303c12b2e4017b24678e57099/pycryptodomex-3.21.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5823d03e904ea3e53aebd6799d6b8ec63b7675b5d2f4a4bd5e3adcb512d03b37", size = 1691548 },
- { url = "https://files.pythonhosted.org/packages/2d/c7/a0d3356f3074ac548afefa515ff46f3bea011deca607faf1c09b26dd5330/pycryptodomex-3.21.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:27e84eeff24250ffec32722334749ac2a57a5fd60332cd6a0680090e7c42877e", size = 1792099 },
-]
-
[[package]]
name = "pydantic"
version = "2.9.2"
@@ -1396,15 +1205,3 @@ sdist = { url = "https://files.pythonhosted.org/packages/52/50/0014e9099a9dc3dec
wheels = [
{ url = "https://files.pythonhosted.org/packages/6e/e4/e45c5067a79780954b905db4a42aa83d7aaefd91e32b18ab91c77600e668/yt_dlp-2024.11.4-py3-none-any.whl", hash = "sha256:589d51ed9f154624a45c1f0ceb3d68d0d1e2031460e8dbc62139be631c20b388", size = 3165645 },
]
-
-[package.optional-dependencies]
-default = [
- { name = "brotli", marker = "implementation_name == 'cpython'" },
- { name = "brotlicffi", marker = "implementation_name != 'cpython'" },
- { name = "certifi" },
- { name = "mutagen" },
- { name = "pycryptodomex" },
- { name = "requests" },
- { name = "urllib3" },
- { name = "websockets" },
-]
From 7b11e0a301340b4aa4f96fedb7fd2b0ba05cc91f Mon Sep 17 00:00:00 2001
From: benex
Date: Sat, 16 Nov 2024 21:32:37 +0300
Subject: [PATCH 22/87] feat: add rofi-theme-preview option
---
fastanime/cli/__init__.py | 8 ++++++++
fastanime/cli/config.py | 10 +++++++++-
fastanime/libs/rofi/__init__.py | 5 +++--
3 files changed, 20 insertions(+), 3 deletions(-)
diff --git a/fastanime/cli/__init__.py b/fastanime/cli/__init__.py
index 43bffde..b837f33 100644
--- a/fastanime/cli/__init__.py
+++ b/fastanime/cli/__init__.py
@@ -158,6 +158,9 @@ signal.signal(signal.SIGINT, handle_exit)
@click.option("--sub", help="Set the translation type to sub", is_flag=True)
@click.option("--rofi", help="Use rofi for the ui", is_flag=True)
@click.option("--rofi-theme", help="Rofi theme to use", type=click.Path())
+@click.option(
+ "--rofi-theme-preview", help="Rofi theme to use for previews", type=click.Path()
+)
@click.option(
"--rofi-theme-confirm",
help="Rofi theme to use for the confirm prompt",
@@ -210,6 +213,7 @@ def run_cli(
sub,
rofi,
rofi_theme,
+ rofi_theme_preview,
rofi_theme_confirm,
rofi_theme_input,
use_python_mpv,
@@ -325,6 +329,10 @@ def run_cli(
if rofi:
from ..libs.rofi import Rofi
+ if rofi_theme_preview:
+ ctx.obj.rofi_theme_preview = rofi_theme_preview
+ Rofi.rofi_theme_preview = rofi_theme_preview
+
if rofi_theme:
ctx.obj.rofi_theme = rofi_theme
Rofi.rofi_theme = rofi_theme
diff --git a/fastanime/cli/config.py b/fastanime/cli/config.py
index ec1398f..4e23a51 100644
--- a/fastanime/cli/config.py
+++ b/fastanime/cli/config.py
@@ -9,7 +9,7 @@ from ..constants import (
USER_DATA_PATH,
USER_VIDEOS_DIR,
USER_WATCH_HISTORY_PATH,
- S_PLATFORM
+ S_PLATFORM,
)
from ..libs.rofi import Rofi
@@ -52,6 +52,7 @@ class Config(object):
"quality": "1080",
"recent": "50",
"rofi_theme": "",
+ "rofi_theme_preview": "",
"rofi_theme_confirm": "",
"rofi_theme_input": "",
"server": "top",
@@ -105,10 +106,12 @@ class Config(object):
self.rofi_theme_confirm = self.get_rofi_theme_confirm()
self.rofi_theme_input = self.get_rofi_theme_input()
self.rofi_theme = self.get_rofi_theme()
+ self.rofi_theme_preview = self.get_rofi_theme_preview()
Rofi.rofi_theme_confirm = self.rofi_theme_confirm
Rofi.rofi_theme_input = self.rofi_theme_input
Rofi.rofi_theme = self.rofi_theme
+ Rofi.rofi_theme_preview = self.rofi_theme_preview
self.server = self.get_server()
self.skip = self.get_skip()
@@ -235,6 +238,9 @@ class Config(object):
def get_rofi_theme(self):
return self.configparser.get("general", "rofi_theme")
+ def get_rofi_theme_preview(self):
+ return self.configparser.get("general", "rofi_theme_preview")
+
def get_rofi_theme_input(self):
return self.configparser.get("general", "rofi_theme_input")
@@ -380,6 +386,8 @@ use_rofi = {self.use_rofi}
# by the way i recommend getting the rofi themes from this project;
rofi_theme = {self.rofi_theme}
+rofi_theme = {self.rofi_theme_preview}
+
rofi_theme_input = {self.rofi_theme_input}
rofi_theme_confirm = {self.rofi_theme_confirm}
diff --git a/fastanime/libs/rofi/__init__.py b/fastanime/libs/rofi/__init__.py
index bef920d..4492eeb 100644
--- a/fastanime/libs/rofi/__init__.py
+++ b/fastanime/libs/rofi/__init__.py
@@ -11,6 +11,7 @@ class RofiApi:
ROFI_EXECUTABLE = which("rofi")
rofi_theme = ""
+ rofi_theme_preview = ""
rofi_theme_confirm = ""
rofi_theme_input = ""
@@ -21,8 +22,8 @@ class RofiApi:
raise Exception("Rofi not found")
args = [self.ROFI_EXECUTABLE]
- if self.rofi_theme:
- args.extend(["-no-config", "-theme", self.rofi_theme])
+ if self.rofi_theme_preview:
+ args.extend(["-no-config", "-theme", self.rofi_theme_preview])
args.extend(["-p", f"{prompt_text.title()}", "-i", "-show-icons", "-dmenu"])
result = subprocess.run(
args,
From 02e35b66cb4ddf584ce829f4eff3aa2e29eea97a Mon Sep 17 00:00:00 2001
From: benex
Date: Sat, 16 Nov 2024 22:06:28 +0300
Subject: [PATCH 23/87] fix: implement another way to get timestamps from mpv
due to issues on nixos
---
fastanime/cli/config.py | 16 ++++++++++++++++
fastanime/cli/utils/mpv.py | 20 ++++++++++++++------
2 files changed, 30 insertions(+), 6 deletions(-)
diff --git a/fastanime/cli/config.py b/fastanime/cli/config.py
index 4e23a51..3e4bd8f 100644
--- a/fastanime/cli/config.py
+++ b/fastanime/cli/config.py
@@ -35,6 +35,7 @@ class Config(object):
"continue_from_history": "True",
"default_media_list_tracking": "None",
"downloads_dir": USER_VIDEOS_DIR,
+ "disable_mpv_popen": "True",
"episode_complete_at": "80",
"ffmpegthumbnailer_seek_time": "-1",
"force_forward_tracking": "true",
@@ -80,11 +81,17 @@ class Config(object):
if os.path.exists(USER_CONFIG_PATH):
self.configparser.read(USER_CONFIG_PATH, encoding="utf-8")
+ # TODO: rewrite all this removing the useless functions
+ # hate technical debt
+ # why did i do this lol
self.auto_next = self.get_auto_next()
self.auto_select = self.get_auto_select()
self.cache_requests = self.get_cache_requests()
self.continue_from_history = self.get_continue_from_history()
self.default_media_list_tracking = self.get_default_media_list_tracking()
+ self.disable_mpv_popen = self.configparser.getboolean(
+ "stream", "disable_mpv_popen"
+ )
self.downloads_dir = self.get_downloads_dir()
self.episode_complete_at = self.get_episode_complete_at()
self.ffmpegthumbnailer_seek_time = self.get_ffmpegthumnailer_seek_time()
@@ -514,6 +521,15 @@ episode_complete_at = {self.episode_complete_at}
# or just switch to arch linux
use_python_mpv = {self.use_python_mpv}
+
+# whether to use popen to get the timestamps for continue_from_history
+# implemented because popen does not work for some reason in nixos
+# if you are on nixos and you have a solution to this problem please share
+# i will be glad to hear it 😄
+# So for now ignore this option
+# and anyways the new method of getting timestamps is better
+disable_mpv_popen = {self.disable_mpv_popen}
+
# force mpv window
# the default 'immediate' just makes mpv to open the window even if the video has not yet loaded
# done for asthetics
diff --git a/fastanime/cli/utils/mpv.py b/fastanime/cli/utils/mpv.py
index 5e7e540..eeb5db7 100644
--- a/fastanime/cli/utils/mpv.py
+++ b/fastanime/cli/utils/mpv.py
@@ -9,11 +9,13 @@ from ...constants import S_PLATFORM
logger = logging.getLogger(__name__)
+mpv_av_time_pattern = re.compile(r"AV: ([0-9:]*) / ([0-9:]*) \(([0-9]*)%\)")
+
def stream_video(MPV, url, mpv_args, custom_args):
last_time = "0"
total_time = "0"
- if os.environ.get("FASTANIME_DISABLE_MPV_POPEN", "0") == "0":
+ if os.environ.get("FASTANIME_DISABLE_MPV_POPEN", "False") == "False":
process = subprocess.Popen(
[
MPV,
@@ -29,8 +31,6 @@ def stream_video(MPV, url, mpv_args, custom_args):
encoding="utf-8",
)
- av_time_pattern = re.compile(r"AV: ([0-9:]*) / ([0-9:]*) \(([0-9]*)%\)")
-
try:
while True:
if not process.stderr:
@@ -40,11 +40,10 @@ def stream_video(MPV, url, mpv_args, custom_args):
if output:
# Match the timestamp in the output
- match = av_time_pattern.search(output.strip())
+ match = mpv_av_time_pattern.search(output.strip())
if match:
current_time = match.group(1)
total_time = match.group(2)
- match.group(3)
last_time = current_time
# Check if the process has terminated
@@ -59,7 +58,16 @@ def stream_video(MPV, url, mpv_args, custom_args):
process.terminate()
process.wait()
else:
- subprocess.run([MPV, url, *mpv_args, *custom_args])
+ proc = subprocess.run(
+ [MPV, url, *mpv_args, *custom_args], capture_output=True, text=True
+ )
+ if proc.stdout:
+ for line in reversed(proc.stdout.split("\n")):
+ match = mpv_av_time_pattern.search(line.strip())
+ if match:
+ last_time = match.group(1)
+ total_time = match.group(2)
+ break
return last_time, total_time
From d62f580d7a14996aecf876c7d0fa685b387454c1 Mon Sep 17 00:00:00 2001
From: benex
Date: Sat, 16 Nov 2024 22:09:32 +0300
Subject: [PATCH 24/87] docs: update readme
---
README.md | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/README.md b/README.md
index c736a23..c72e524 100644
--- a/README.md
+++ b/README.md
@@ -1219,7 +1219,7 @@ Results
"episode_title": "Bleach; Episode 1",
"links": [
{
- "link": "https://www032.anzeat.pro/streamhls/f643f0c19d5bee9f1c3aed888eee75d6/ep.1.1709258176.m3u8",
+ "link": "",
"hls": true,
"mp4": false,
"resolutionStr": "hls P",
@@ -1227,7 +1227,7 @@ Results
"quality": "1080"
},
{
- "link": "https://www032.anicdnstream.info/videos/hls/WEJ7719z_r37wHYpaOsTqQ/1731115258/76805/f643f0c19d5bee9f1c3aed888eee75d6/ep.1.1709258176.m3u8",
+ "link": "",
"hls": true,
"mp4": false,
"resolutionStr": "HLS1",
@@ -1235,10 +1235,10 @@ Results
"quality": "720"
},
{
- "link": "https://workfields.maverickki.lol/7d2473746a243c246e727276753c29297171713635342867686f65626875727463676b286f68606929706f62636975296e6a752951434c3131373f7c59743531714e5f76674975527757293731353737373334333e2931303e36332960303235603665373f62336463633f603765356763623e3e3e636363313362302963762837283731363f34333e373130286b35733e242a2476677475634e6a75243c727473632a2462677263243c373135373634363236363636367b",
+ "link": "",
"hls": true,
"resolutionStr": "Alt",
- "src": "https://workfields.maverickki.lol/7d2473746a243c246e727276753c29297171713635342867686f65626875727463676b286f68606929706f62636975296e6a752951434c3131373f7c59743531714e5f76674975527757293731353737373334333e2931303e36332960303235603665373f62336463633f603765356763623e3e3e636363313362302963762837283731363f34333e373130286b35733e242a2476677475634e6a75243c727473632a2462677263243c373135373634363236363636367b",
+ "src": "",
"priority": 1,
"quality": "480"
}
@@ -1253,7 +1253,7 @@ Results
"subtitles": [],
"links": [
{
- "link": "https://tools.fast4speed.rsvp//media3/videos/XqKvkSEty5koms32i/dub/1",
+ "link": "",
"quality": "1080"
}
]
@@ -1265,7 +1265,7 @@ Results
"episode_title": "Bleach; Episode 1",
"links": [
{
- "link": "https://repackager.wixmp.com/video.wixstatic.com/video/eba0c8_706b389e50f94fe5bf8c72e2f10c545e/,720p,480p,/mp4/file.mp4.urlset/master.m3u8",
+ "link": "",
"hls": true,
"resolutionStr": "Hls",
"quality": "1080"
@@ -1279,10 +1279,10 @@ Results
"episode_title": "Bleach; Episode 1",
"links": [
{
- "link": "https://myanime.sharepoint.com/sites/anime/_layouts/15/download.aspx?share=EaNJF1eTtptGovmPAcR3_7QBH1gFepgMcBpL5YfyEM5Uhw",
+ "link": "",
"mp4": true,
"resolutionStr": "Mp4",
- "src": "https://myanime.sharepoint.com/sites/anime/_layouts/15/download.aspx?share=EaNJF1eTtptGovmPAcR3_7QBH1gFepgMcBpL5YfyEM5Uhw",
+ "src": "",
"quality": "1080"
}
]
From 3ac4e1ac7172b8b707b5a43e5e399a6460c791e1 Mon Sep 17 00:00:00 2001
From: benex
Date: Sat, 16 Nov 2024 22:10:15 +0300
Subject: [PATCH 25/87] chore: bump version (v2.7.4)
---
fastanime/__init__.py | 2 +-
pyproject.toml | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/fastanime/__init__.py b/fastanime/__init__.py
index 834b6c3..efef70c 100644
--- a/fastanime/__init__.py
+++ b/fastanime/__init__.py
@@ -6,7 +6,7 @@ if sys.version_info < (3, 10):
) # noqa: F541
-__version__ = "v2.7.3"
+__version__ = "v2.7.4"
APP_NAME = "FastAnime"
AUTHOR = "Benex254"
diff --git a/pyproject.toml b/pyproject.toml
index 798d20f..8d2a227 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "fastanime"
-version = "2.7.3"
+version = "2.7.4"
description = "A browser anime site experience from the terminal"
license = "UNLICENSE"
readme = "README.md"
From 0b3615c9f50967badb24e5cd890e747a0744dfb5 Mon Sep 17 00:00:00 2001
From: benex
Date: Sat, 16 Nov 2024 22:46:19 +0300
Subject: [PATCH 26/87] feat: add default rofi themes
---
fastanime/assets/rofi_theme.rasi | 84 ++++++++++++++++
fastanime/assets/rofi_theme_confirm.rasi | 55 ++++++++++
fastanime/assets/rofi_theme_input.rasi | 55 ++++++++++
fastanime/assets/rofi_theme_preview.rasi | 122 +++++++++++++++++++++++
fastanime/cli/config.py | 11 +-
5 files changed, 322 insertions(+), 5 deletions(-)
create mode 100644 fastanime/assets/rofi_theme.rasi
create mode 100644 fastanime/assets/rofi_theme_confirm.rasi
create mode 100644 fastanime/assets/rofi_theme_input.rasi
create mode 100644 fastanime/assets/rofi_theme_preview.rasi
diff --git a/fastanime/assets/rofi_theme.rasi b/fastanime/assets/rofi_theme.rasi
new file mode 100644
index 0000000..779078b
--- /dev/null
+++ b/fastanime/assets/rofi_theme.rasi
@@ -0,0 +1,84 @@
+// https://github.com/Wraient/curd/blob/main/rofi/selectanime.rasi
+// Go give there project a star!
+// Was too lazy to make my own preview, so I just used theirs
+
+
+configuration {
+ font: "Sans 12";
+ line-margin: 10;
+ display-drun: "";
+}
+
+* {
+ background: #000000; /* Black background for everything */
+ background-alt: #000000; /* Ensures no alternation */
+ foreground: #CCCCCC;
+ selected: #3584E4;
+ active: #2E7D32;
+ urgent: #C62828;
+}
+
+window {
+ fullscreen: false;
+ background-color: rgba(0, 0, 0, 1); /* Solid black background */
+}
+
+mainbox {
+ padding: 50px 100px;
+ background-color: rgba(0, 0, 0, 1); /* Ensures black background fills entire main area */
+ children: [inputbar, listview];
+ spacing: 20px;
+}
+
+inputbar {
+ background-color: #333333; /* Dark gray background for input bar */
+ padding: 8px;
+ border-radius: 8px;
+ children: [prompt, entry];
+}
+
+prompt {
+ enabled: true;
+ padding: 8px;
+ background-color: @selected;
+ text-color: #000000;
+ border-radius: 4px;
+}
+
+entry {
+ padding: 8px;
+ background-color: #444444; /* Slightly lighter gray for visibility */
+ text-color: #FFFFFF; /* White text to make typing visible */
+ placeholder: "Search...";
+ placeholder-color: rgba(255, 255, 255, 0.5);
+ border-radius: 6px;
+}
+
+listview {
+ layout: vertical;
+ spacing: 8px;
+ lines: 10;
+ background-color: @background; /* Consistent black background for list items */
+}
+
+element {
+ padding: 12px;
+ border-radius: 4px;
+ background-color: @background; /* Uniform color for each list item */
+ text-color: @foreground;
+}
+
+element normal.normal {
+ background-color: @background; /* Ensures no alternating color */
+}
+
+element selected.normal {
+ background-color: @selected;
+ text-color: #FFFFFF;
+}
+
+element-text {
+ background-color: transparent;
+ text-color: inherit;
+ vertical-align: 0.5;
+}
diff --git a/fastanime/assets/rofi_theme_confirm.rasi b/fastanime/assets/rofi_theme_confirm.rasi
new file mode 100644
index 0000000..2c5425e
--- /dev/null
+++ b/fastanime/assets/rofi_theme_confirm.rasi
@@ -0,0 +1,55 @@
+// https://github.com/Wraient/curd/blob/main/rofi/userinput.rasi
+// Go give there project a star!
+// Was too lazy to make my own preview, so I just used theirs
+
+configuration {
+ font: "Sans 12";
+}
+
+* {
+ background-color: rgba(0, 0, 0, 0.7);
+ text-color: #FFFFFF;
+}
+
+window {
+ fullscreen: true;
+ transparency: "real";
+ background-color: @background-color;
+}
+
+mainbox {
+ children: [ message, listview, inputbar ];
+ padding: 40% 30%;
+}
+
+message {
+ border: 0;
+ padding: 10px;
+ margin: 0 0 20px 0;
+ font: "Sans Bold 24"; /* Increased font size and made it bold */
+}
+
+inputbar {
+ children: [ prompt, entry ];
+ background-color: rgba(255, 255, 255, 0.1);
+ padding: 8px;
+ border-radius: 4px;
+}
+
+prompt {
+ padding: 8px;
+}
+
+entry {
+ padding: 8px;
+}
+
+listview {
+ lines: 0;
+}
+
+/* Style for the message text specifically */
+textbox {
+ horizontal-align: 0.5; /* Center the text */
+ font: "Sans Bold 24"; /* Match message font */
+}
diff --git a/fastanime/assets/rofi_theme_input.rasi b/fastanime/assets/rofi_theme_input.rasi
new file mode 100644
index 0000000..2c5425e
--- /dev/null
+++ b/fastanime/assets/rofi_theme_input.rasi
@@ -0,0 +1,55 @@
+// https://github.com/Wraient/curd/blob/main/rofi/userinput.rasi
+// Go give there project a star!
+// Was too lazy to make my own preview, so I just used theirs
+
+configuration {
+ font: "Sans 12";
+}
+
+* {
+ background-color: rgba(0, 0, 0, 0.7);
+ text-color: #FFFFFF;
+}
+
+window {
+ fullscreen: true;
+ transparency: "real";
+ background-color: @background-color;
+}
+
+mainbox {
+ children: [ message, listview, inputbar ];
+ padding: 40% 30%;
+}
+
+message {
+ border: 0;
+ padding: 10px;
+ margin: 0 0 20px 0;
+ font: "Sans Bold 24"; /* Increased font size and made it bold */
+}
+
+inputbar {
+ children: [ prompt, entry ];
+ background-color: rgba(255, 255, 255, 0.1);
+ padding: 8px;
+ border-radius: 4px;
+}
+
+prompt {
+ padding: 8px;
+}
+
+entry {
+ padding: 8px;
+}
+
+listview {
+ lines: 0;
+}
+
+/* Style for the message text specifically */
+textbox {
+ horizontal-align: 0.5; /* Center the text */
+ font: "Sans Bold 24"; /* Match message font */
+}
diff --git a/fastanime/assets/rofi_theme_preview.rasi b/fastanime/assets/rofi_theme_preview.rasi
new file mode 100644
index 0000000..d1ea8c8
--- /dev/null
+++ b/fastanime/assets/rofi_theme_preview.rasi
@@ -0,0 +1,122 @@
+// Based on https://github.com/Wraient/curd/blob/main/rofi/selectanimepreview.rasi
+// Go give there project a star!
+// Was too lazy to make my own preview, so I just used theirs
+
+// Colours
+* {
+ background-color: transparent;
+ background: #1D2330;
+ background-transparent: #1D2330A0;
+ text-color: #BBBBBB;
+ text-color-selected: #FFFFFF;
+ primary: #BB77BB;
+ important: #BF616A;
+}
+
+configuration {
+ font: "Roboto 17";
+ show-icons: true;
+}
+
+window {
+ fullscreen: true;
+ height: 100%;
+ width: 100%;
+ transparency: "real";
+ background-color: @background-transparent;
+ border: 0px;
+ border-color: @primary;
+}
+
+mainbox {
+ children: [prompt, inputbar-box, listview];
+ padding: 0px;
+}
+
+prompt {
+ width: 100%;
+ margin: 10px 0px 0px 30px;
+ text-color: @important;
+ font: "Roboto Bold 27";
+}
+
+listview {
+ layout: vertical;
+ padding: 60px;
+ dynamic: true;
+ columns: 7;
+ spacing: 20px;
+ horizontal-align: center; /* Center the list items */
+}
+
+inputbar-box {
+ children: [dummy, inputbar, dummy];
+ orientation: horizontal;
+ expand: false;
+}
+
+inputbar {
+ children: [textbox-prompt, entry];
+ margin: 0px;
+ background-color: @primary;
+ border: 4px;
+ border-color: @primary;
+ border-radius: 8px;
+}
+
+textbox-prompt {
+ text-color: @background;
+ horizontal-align: 0.5;
+ vertical-align: 0.5;
+ expand: false;
+}
+
+entry {
+ expand: false;
+ padding: 8px;
+ margin: -6px;
+ horizontal-align: 0;
+ width: 300;
+ background-color: @background;
+ border: 6px;
+ border-color: @primary;
+ border-radius: 8px;
+ cursor: text;
+}
+
+element {
+ children: [dummy, element-box, dummy];
+ padding: 5px;
+ orientation: vertical;
+ border: 0px;
+ border-radius: 16px;
+ background-color: transparent; /* Default background */
+}
+
+element selected {
+ background-color: @primary; /* Solid color for selected item */
+}
+
+element-box {
+ children: [element-icon, element-text];
+ orientation: vertical;
+ expand: false;
+ cursor: pointer;
+}
+
+element-icon {
+ padding: 10px;
+ cursor: inherit;
+ size: 33%;
+ margin: 10px;
+}
+
+element-text {
+ horizontal-align: 0.5;
+ cursor: inherit;
+ text-color: @text-color;
+}
+
+element-text selected {
+ text-color: @text-color-selected;
+}
diff --git a/fastanime/cli/config.py b/fastanime/cli/config.py
index 3e4bd8f..b0fa0bc 100644
--- a/fastanime/cli/config.py
+++ b/fastanime/cli/config.py
@@ -8,6 +8,7 @@ from ..constants import (
USER_CONFIG_PATH,
USER_DATA_PATH,
USER_VIDEOS_DIR,
+ ASSETS_DIR,
USER_WATCH_HISTORY_PATH,
S_PLATFORM,
)
@@ -52,10 +53,10 @@ class Config(object):
"provider": "allanime",
"quality": "1080",
"recent": "50",
- "rofi_theme": "",
- "rofi_theme_preview": "",
- "rofi_theme_confirm": "",
- "rofi_theme_input": "",
+ "rofi_theme": os.path.join(ASSETS_DIR, "rofi_theme.rasi"),
+ "rofi_theme_preview": os.path.join(ASSETS_DIR, "rofi_theme_preview.rasi"),
+ "rofi_theme_confirm": os.path.join(ASSETS_DIR, "rofi_theme_confirm.rasi"),
+ "rofi_theme_input": os.path.join(ASSETS_DIR, "rofi_theme_input.rasi"),
"server": "top",
"skip": "false",
"sort_by": "search match",
@@ -393,7 +394,7 @@ use_rofi = {self.use_rofi}
# by the way i recommend getting the rofi themes from this project;
rofi_theme = {self.rofi_theme}
-rofi_theme = {self.rofi_theme_preview}
+rofi_theme_preview = {self.rofi_theme_preview}
rofi_theme_input = {self.rofi_theme_input}
From c65a1a2815595c76bcba4aebcfcae59d0dbcfc84 Mon Sep 17 00:00:00 2001
From: benex
Date: Sat, 16 Nov 2024 22:47:04 +0300
Subject: [PATCH 27/87] feat: by default check for updates when any command is
ran
---
fastanime/cli/__init__.py | 11 +++++++++++
fastanime/cli/app_updater.py | 3 ++-
fastanime/cli/config.py | 7 +++++++
3 files changed, 20 insertions(+), 1 deletion(-)
diff --git a/fastanime/cli/__init__.py b/fastanime/cli/__init__.py
index b837f33..24a02ad 100644
--- a/fastanime/cli/__init__.py
+++ b/fastanime/cli/__init__.py
@@ -226,6 +226,17 @@ def run_cli(
from .config import Config
ctx.obj = Config()
+ if ctx.obj.check_for_updates:
+ from .app_updater import check_for_updates
+ import time
+
+ is_latest = check_for_updates()
+ if not is_latest:
+ print(
+ "You are running an older version of fastanime please update to get the latest features"
+ )
+ time.sleep(10)
+
ctx.obj.manga = manga
if log:
import logging
diff --git a/fastanime/cli/app_updater.py b/fastanime/cli/app_updater.py
index 579dd85..0ef8cf9 100644
--- a/fastanime/cli/app_updater.py
+++ b/fastanime/cli/app_updater.py
@@ -45,8 +45,9 @@ def check_for_updates():
return (is_latest, release_json)
else:
+ print("Failed to check for updates")
print(request.text)
- return (False, {})
+ return (True, {})
def is_git_repo(author, repository):
diff --git a/fastanime/cli/config.py b/fastanime/cli/config.py
index b0fa0bc..a970f97 100644
--- a/fastanime/cli/config.py
+++ b/fastanime/cli/config.py
@@ -33,6 +33,7 @@ class Config(object):
"auto_next": "False",
"auto_select": "True",
"cache_requests": "true",
+ "check_for_updates": "True",
"continue_from_history": "True",
"default_media_list_tracking": "None",
"downloads_dir": USER_VIDEOS_DIR,
@@ -88,6 +89,7 @@ class Config(object):
self.auto_next = self.get_auto_next()
self.auto_select = self.get_auto_select()
self.cache_requests = self.get_cache_requests()
+ self.check_for_updates = self.configparser.get("general", "check_for_updates")
self.continue_from_history = self.get_continue_from_history()
self.default_media_list_tracking = self.get_default_media_list_tracking()
self.disable_mpv_popen = self.configparser.getboolean(
@@ -346,6 +348,11 @@ icons = {self.icons}
# this also applies to episode titles
normalize_titles = {self.normalize_titles}
+# whether to check for updates every time you run the script [True/False]
+# this is useful for keeping your script up to date
+# cause there are always new features being added 😄
+check_for_updates = {self.check_for_updates}
+
# can be [allanime, animepahe, hianime]
# allanime is the most realible
# animepahe provides different links to streams of different quality so a quality can be selected reliably with --quality option
From 3b35e801997b482c79e94fca4d41f8c4cfc0e239 Mon Sep 17 00:00:00 2001
From: benex
Date: Sat, 16 Nov 2024 22:47:19 +0300
Subject: [PATCH 28/87] chore: update lock file
---
uv.lock | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/uv.lock b/uv.lock
index eee0fc1..b83899e 100644
--- a/uv.lock
+++ b/uv.lock
@@ -170,7 +170,7 @@ wheels = [
[[package]]
name = "fastanime"
-version = "2.7.3"
+version = "2.7.4"
source = { editable = "." }
dependencies = [
{ name = "click" },
From d32b7e917f992bdba42cdb0c8c5cea8d47f537c6 Mon Sep 17 00:00:00 2001
From: benex
Date: Sat, 16 Nov 2024 22:47:31 +0300
Subject: [PATCH 29/87] chore: bump version (v2.7.5)
---
fastanime/__init__.py | 2 +-
pyproject.toml | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/fastanime/__init__.py b/fastanime/__init__.py
index efef70c..541a792 100644
--- a/fastanime/__init__.py
+++ b/fastanime/__init__.py
@@ -6,7 +6,7 @@ if sys.version_info < (3, 10):
) # noqa: F541
-__version__ = "v2.7.4"
+__version__ = "v2.7.5"
APP_NAME = "FastAnime"
AUTHOR = "Benex254"
diff --git a/pyproject.toml b/pyproject.toml
index 8d2a227..915fa8f 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "fastanime"
-version = "2.7.4"
+version = "2.7.5"
description = "A browser anime site experience from the terminal"
license = "UNLICENSE"
readme = "README.md"
From f015305e7ca0daf628c4ef847d8296d0db8dbb3a Mon Sep 17 00:00:00 2001
From: benex
Date: Sun, 17 Nov 2024 14:27:32 +0300
Subject: [PATCH 30/87] chore: add shell.nix
---
shell.nix | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
create mode 100644 shell.nix
diff --git a/shell.nix b/shell.nix
new file mode 100644
index 0000000..fb0a86b
--- /dev/null
+++ b/shell.nix
@@ -0,0 +1,18 @@
+let
+ pkgs = import {};
+in pkgs.mkShell {
+ packages = [
+ (pkgs.python3.withPackages (python-pkgs: [
+ python-pkgs.yt-dlp
+ python-pkgs.dbus-python
+ python-pkgs.requests
+ python-pkgs.rich
+ python-pkgs.click
+ python-pkgs.inquirerpy
+ python-pkgs.mpv
+ python-pkgs.fastapi
+ python-pkgs.thefuzz
+ python-pkgs.plyer
+ ]))
+ ];
+}
From bda4b2dbe1bf7590acd79d93becbfa289a1abc31 Mon Sep 17 00:00:00 2001
From: benex
Date: Sun, 17 Nov 2024 14:27:41 +0300
Subject: [PATCH 31/87] chore: add flake.nix
---
flake.nix | 40 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 40 insertions(+)
create mode 100644 flake.nix
diff --git a/flake.nix b/flake.nix
new file mode 100644
index 0000000..a171894
--- /dev/null
+++ b/flake.nix
@@ -0,0 +1,40 @@
+{
+ description = "A command-line interface for browsing anime";
+
+ inputs = {
+ nixpkgs.url = "github:NixOS/nixpkgs";
+ };
+
+ outputs = { self, nixpkgs }: {
+ # Generate packages for all supported systems
+ packages = nixpkgs.lib.genAttrs nixpkgs.lib.systems.supportedSystems (system: let
+ pkgs = import nixpkgs { inherit system; };
+ in pkgs.python3Packages.buildPythonApplication {
+ pname = "fastanime";
+ version = "2.7.5";
+
+ # Path to your project source
+ src = ./.;
+
+ # Specify runtime dependencies
+ propagatedBuildInputs = with pkgs.python3Packages; [
+ click, rich, inquirerpy, requests, thefuzz, plyer, fastapi,yt-dlp, mpv,dbus-python
+ ];
+
+ # CLI entry point (matches your pyproject.toml or setup.py configuration)
+ # Example: Entry point defined as `console_scripts` in pyproject.toml
+ entryPoints = {
+ "console_scripts" = {
+ fastanime = "fastanime:FastAnime";
+ };
+ };
+
+ meta = with pkgs.lib; {
+ description = "A command-line interface for browsing anime";
+ license = licenses.unlicense;
+ maintainers = [ maintainers.Benex254 ];
+ platforms = platforms.all; # Cross-platform compatibility
+ };
+ });
+ };
+}
From 634ef6febf6ce7adca7fa130ad6246c740419e92 Mon Sep 17 00:00:00 2001
From: benex
Date: Sun, 17 Nov 2024 14:28:02 +0300
Subject: [PATCH 32/87] chore: update lock file
---
uv.lock | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/uv.lock b/uv.lock
index b83899e..4e117a6 100644
--- a/uv.lock
+++ b/uv.lock
@@ -170,7 +170,7 @@ wheels = [
[[package]]
name = "fastanime"
-version = "2.7.4"
+version = "2.7.5"
source = { editable = "." }
dependencies = [
{ name = "click" },
From 0ed51e05cc86d46987d60c1491ace88f42ebd042 Mon Sep 17 00:00:00 2001
From: benex
Date: Sun, 17 Nov 2024 17:23:41 +0300
Subject: [PATCH 33/87] chore: fix error is in flake.nix
---
flake.nix | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/flake.nix b/flake.nix
index a171894..eb3863f 100644
--- a/flake.nix
+++ b/flake.nix
@@ -18,7 +18,16 @@
# Specify runtime dependencies
propagatedBuildInputs = with pkgs.python3Packages; [
- click, rich, inquirerpy, requests, thefuzz, plyer, fastapi,yt-dlp, mpv,dbus-python
+ click
+ rich
+ inquirerpy
+ requests
+ thefuzz
+ plyer
+ fastapi
+ yt-dlp
+ mpv
+ dbus-python
];
# CLI entry point (matches your pyproject.toml or setup.py configuration)
From 15555759dc23b6199523989e9e1f408e6df4eb0b Mon Sep 17 00:00:00 2001
From: benex
Date: Sun, 17 Nov 2024 18:45:17 +0300
Subject: [PATCH 34/87] feat: ask user if they want to update on new release
---
fastanime/cli/__init__.py | 30 ++++++++++++++++++++++++------
1 file changed, 24 insertions(+), 6 deletions(-)
diff --git a/fastanime/cli/__init__.py b/fastanime/cli/__init__.py
index 24a02ad..6bc27cf 100644
--- a/fastanime/cli/__init__.py
+++ b/fastanime/cli/__init__.py
@@ -228,14 +228,32 @@ def run_cli(
ctx.obj = Config()
if ctx.obj.check_for_updates:
from .app_updater import check_for_updates
- import time
- is_latest = check_for_updates()
+ is_latest, github_release_data = check_for_updates()
if not is_latest:
- print(
- "You are running an older version of fastanime please update to get the latest features"
- )
- time.sleep(10)
+ from rich.console import Console
+ from rich.markdown import Markdown
+ from .app_updater import update_app
+ from rich.prompt import Confirm
+
+ def _print_release(release_data):
+ console = Console()
+ body = Markdown(release_data["body"])
+ tag = github_release_data["tag_name"]
+ tag_title = release_data["name"]
+ github_page_url = release_data["html_url"]
+ console.print(f"Release Page: {github_page_url}")
+ console.print(f"Tag: {tag}")
+ console.print(f"Title: {tag_title}")
+ console.print(body)
+
+ if Confirm.ask(
+ "A new version of fastanime is available, would you like to update?"
+ ):
+ _, release_json = update_app()
+ print("Successfully updated")
+ _print_release(release_json)
+ exit(0)
ctx.obj.manga = manga
if log:
From 1e5c039ece864b4285b628f12aede7d3da0dbe18 Mon Sep 17 00:00:00 2001
From: benex
Date: Sun, 17 Nov 2024 18:45:32 +0300
Subject: [PATCH 35/87] chore: update flake.nix
---
flake.nix | 58 +++++++++++++++++++++++++++----------------------------
1 file changed, 29 insertions(+), 29 deletions(-)
diff --git a/flake.nix b/flake.nix
index eb3863f..e39b981 100644
--- a/flake.nix
+++ b/flake.nix
@@ -1,49 +1,49 @@
{
- description = "A command-line interface for browsing anime";
+ description = "FastAnime Project Flake";
inputs = {
- nixpkgs.url = "github:NixOS/nixpkgs";
+ nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
+ flake-utils.url = "github:numtide/flake-utils";
};
- outputs = { self, nixpkgs }: {
- # Generate packages for all supported systems
- packages = nixpkgs.lib.genAttrs nixpkgs.lib.systems.supportedSystems (system: let
+ outputs = { self, nixpkgs, flake-utils }: flake-utils.lib.eachDefaultSystem (system:
+ let
pkgs = import nixpkgs { inherit system; };
- in pkgs.python3Packages.buildPythonApplication {
- pname = "fastanime";
- version = "2.7.5";
- # Path to your project source
- src = ./.;
+ python = pkgs.python310;
+ pythonPackages = python.pkgs;
+ fastanimeEnv = pythonPackages.buildPythonApplication {
+ pname = "fastanime";
+ version = "2.7.5";
- # Specify runtime dependencies
- propagatedBuildInputs = with pkgs.python3Packages; [
+ src = ./.;
+
+ # Add runtime dependencies
+ propagatedBuildInputs = with pythonPackages; [
click
- rich
inquirerpy
requests
+ rich
thefuzz
- plyer
- fastapi
yt-dlp
- mpv
dbus-python
- ];
+ hatchling
+ ];
- # CLI entry point (matches your pyproject.toml or setup.py configuration)
- # Example: Entry point defined as `console_scripts` in pyproject.toml
- entryPoints = {
- "console_scripts" = {
- fastanime = "fastanime:FastAnime";
- };
+ # Ensure compatibility with the pyproject.toml
+ format = "pyproject";
};
- meta = with pkgs.lib; {
- description = "A command-line interface for browsing anime";
- license = licenses.unlicense;
- maintainers = [ maintainers.Benex254 ];
- platforms = platforms.all; # Cross-platform compatibility
+ in
+ {
+ packages.default = fastanimeEnv;
+
+ # DevShell for development
+ devShells.default = pkgs.mkShell {
+ buildInputs = [
+ fastanimeEnv
+ pythonPackages.hatchling
+ ];
};
});
- };
}
From 54044f95275fe6adf1029f2ec25eda43cad51c1e Mon Sep 17 00:00:00 2001
From: benex
Date: Sun, 17 Nov 2024 18:46:42 +0300
Subject: [PATCH 36/87] chore: bump version (v2.7.6)
---
fastanime/__init__.py | 2 +-
pyproject.toml | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/fastanime/__init__.py b/fastanime/__init__.py
index 541a792..1949eaa 100644
--- a/fastanime/__init__.py
+++ b/fastanime/__init__.py
@@ -6,7 +6,7 @@ if sys.version_info < (3, 10):
) # noqa: F541
-__version__ = "v2.7.5"
+__version__ = "v2.7.6"
APP_NAME = "FastAnime"
AUTHOR = "Benex254"
diff --git a/pyproject.toml b/pyproject.toml
index 915fa8f..96fc8d7 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "fastanime"
-version = "2.7.5"
+version = "2.7.6"
description = "A browser anime site experience from the terminal"
license = "UNLICENSE"
readme = "README.md"
From af94cd7eb566a8ef8b6021ec088a6da7e091e65c Mon Sep 17 00:00:00 2001
From: benex
Date: Sun, 17 Nov 2024 20:07:46 +0300
Subject: [PATCH 37/87] fix: recent anime
---
fastanime/cli/config.py | 2 +-
fastanime/cli/interfaces/anilist_interfaces.py | 7 +++++--
2 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/fastanime/cli/config.py b/fastanime/cli/config.py
index a970f97..0c4d743 100644
--- a/fastanime/cli/config.py
+++ b/fastanime/cli/config.py
@@ -155,7 +155,7 @@ class Config(object):
def update_recent(self, recent_anime: list):
recent_anime_ids = []
_recent_anime = []
- for anime in recent_anime[::-1]:
+ for anime in recent_anime:
if (
anime["id"] not in recent_anime_ids
and len(recent_anime_ids) <= self.recent
diff --git a/fastanime/cli/interfaces/anilist_interfaces.py b/fastanime/cli/interfaces/anilist_interfaces.py
index e14e680..8c4b340 100644
--- a/fastanime/cli/interfaces/anilist_interfaces.py
+++ b/fastanime/cli/interfaces/anilist_interfaces.py
@@ -542,8 +542,8 @@ def provider_anime_episode_servers_menu(
if config.recent:
config.update_recent(
[
- *config.user_data["recent_anime"],
fastanime_runtime_state.selected_anime_anilist,
+ *config.user_data["recent_anime"],
]
)
print("Updating recent anime...")
@@ -1590,7 +1590,10 @@ def fastanime_main_menu(
return AniList.search(id_in=watch_history, sort="TRENDING_DESC")
def _recent():
- return (True, {"data": {"Page": {"media": config.user_data["recent_anime"]}}})
+ return (
+ True,
+ {"data": {"Page": {"media": config.user_data["recent_anime"]}}},
+ )
# WARNING: Will probably be depracated
def _anime_list():
From bdd3aae399e8add5c969dfd19530615ce7c90157 Mon Sep 17 00:00:00 2001
From: benex
Date: Sun, 17 Nov 2024 20:08:08 +0300
Subject: [PATCH 38/87] chore: update lockfile
---
uv.lock | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/uv.lock b/uv.lock
index 4e117a6..d2c5718 100644
--- a/uv.lock
+++ b/uv.lock
@@ -170,7 +170,7 @@ wheels = [
[[package]]
name = "fastanime"
-version = "2.7.5"
+version = "2.7.6"
source = { editable = "." }
dependencies = [
{ name = "click" },
From 0d27b8f6525ef69fcee78f90e9a9273d2c908dd4 Mon Sep 17 00:00:00 2001
From: benex
Date: Sun, 17 Nov 2024 20:08:37 +0300
Subject: [PATCH 39/87] chore: bump version (v2.7.7)
---
fastanime/__init__.py | 2 +-
pyproject.toml | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/fastanime/__init__.py b/fastanime/__init__.py
index 1949eaa..c5f1190 100644
--- a/fastanime/__init__.py
+++ b/fastanime/__init__.py
@@ -6,7 +6,7 @@ if sys.version_info < (3, 10):
) # noqa: F541
-__version__ = "v2.7.6"
+__version__ = "v2.7.7"
APP_NAME = "FastAnime"
AUTHOR = "Benex254"
diff --git a/pyproject.toml b/pyproject.toml
index 96fc8d7..339e7eb 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "fastanime"
-version = "2.7.6"
+version = "2.7.7"
description = "A browser anime site experience from the terminal"
license = "UNLICENSE"
readme = "README.md"
From bb481fe21a168a01e8a3e3c736d908a4620e5be2 Mon Sep 17 00:00:00 2001
From: Benjamin Kaylor
Date: Sun, 17 Nov 2024 16:21:56 -0700
Subject: [PATCH 40/87] fix for nix flake
---
flake.lock | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++
pyproject.toml | 2 +-
2 files changed, 62 insertions(+), 1 deletion(-)
create mode 100644 flake.lock
diff --git a/flake.lock b/flake.lock
new file mode 100644
index 0000000..09983e1
--- /dev/null
+++ b/flake.lock
@@ -0,0 +1,61 @@
+{
+ "nodes": {
+ "flake-utils": {
+ "inputs": {
+ "systems": "systems"
+ },
+ "locked": {
+ "lastModified": 1731533236,
+ "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
+ "owner": "numtide",
+ "repo": "flake-utils",
+ "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
+ "type": "github"
+ },
+ "original": {
+ "owner": "numtide",
+ "repo": "flake-utils",
+ "type": "github"
+ }
+ },
+ "nixpkgs": {
+ "locked": {
+ "lastModified": 1731676054,
+ "narHash": "sha256-OZiZ3m8SCMfh3B6bfGC/Bm4x3qc1m2SVEAlkV6iY7Yg=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "5e4fbfb6b3de1aa2872b76d49fafc942626e2add",
+ "type": "github"
+ },
+ "original": {
+ "owner": "NixOS",
+ "ref": "nixos-unstable",
+ "repo": "nixpkgs",
+ "type": "github"
+ }
+ },
+ "root": {
+ "inputs": {
+ "flake-utils": "flake-utils",
+ "nixpkgs": "nixpkgs"
+ }
+ },
+ "systems": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ }
+ },
+ "root": "root",
+ "version": 7
+}
diff --git a/pyproject.toml b/pyproject.toml
index 339e7eb..2cf6077 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -9,7 +9,7 @@ dependencies = [
"click>=8.1.7",
"inquirerpy>=0.3.4",
"requests>=2.32.3",
- "rich>=13.9.2",
+ "rich>=13.8.1",
"thefuzz>=0.22.1",
"yt-dlp>=2024.10.7",
]
From 4928ff5b7407a4f35b236e92bd28a1835160f661 Mon Sep 17 00:00:00 2001
From: Benjamin Kaylor
Date: Mon, 18 Nov 2024 03:20:55 -0700
Subject: [PATCH 41/87] undo pyproject.toml edit
---
pyproject.toml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pyproject.toml b/pyproject.toml
index 2cf6077..339e7eb 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -9,7 +9,7 @@ dependencies = [
"click>=8.1.7",
"inquirerpy>=0.3.4",
"requests>=2.32.3",
- "rich>=13.8.1",
+ "rich>=13.9.2",
"thefuzz>=0.22.1",
"yt-dlp>=2024.10.7",
]
From 54cc830c353c9e5df06118c830c69a3840a2d0ce Mon Sep 17 00:00:00 2001
From: Benjamin Kaylor
Date: Mon, 18 Nov 2024 03:23:32 -0700
Subject: [PATCH 42/87] sed flake preBuild
---
flake.nix | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/flake.nix b/flake.nix
index e39b981..bd5a5ec 100644
--- a/flake.nix
+++ b/flake.nix
@@ -18,6 +18,10 @@
src = ./.;
+ preBuild = ''
+ sed -i 's/rich>=13.9.2/rich>=13.8.1/' pyproject.toml
+ '';
+
# Add runtime dependencies
propagatedBuildInputs = with pythonPackages; [
click
From a14645b5631901e628e767441193cfab82b76bbf Mon Sep 17 00:00:00 2001
From: Benedict Xavier <81157281+Benex254@users.noreply.github.com>
Date: Mon, 18 Nov 2024 15:17:32 +0300
Subject: [PATCH 43/87] Update README.md
---
README.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index c72e524..4e1d106 100644
--- a/README.md
+++ b/README.md
@@ -1431,5 +1431,6 @@ For inquiries, join our [Discord Server](https://discord.gg/HBEmAwvbHV).
## Supporting the Project
+More pr's less issues 🙃
-Show your support by starring our GitHub repository or [buying us a coffee](https://ko-fi.com/benex254).
+Show your support by starring the GitHub repository or [buying me a coffee](https://ko-fi.com/benex254).
From 5ac6c45fdf6d74c61f0b44c12988d1740e0497f3 Mon Sep 17 00:00:00 2001
From: benex
Date: Mon, 18 Nov 2024 17:06:21 +0300
Subject: [PATCH 44/87] fix(allanime_provider): give all the servers the
referer header
---
fastanime/libs/anime_provider/allanime/api.py | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/fastanime/libs/anime_provider/allanime/api.py b/fastanime/libs/anime_provider/allanime/api.py
index e9b4e38..d44bd4a 100644
--- a/fastanime/libs/anime_provider/allanime/api.py
+++ b/fastanime/libs/anime_provider/allanime/api.py
@@ -233,7 +233,7 @@ class AllAnimeAPI(AnimeProvider):
logger.debug("allanime:Found streams from gogoanime")
return {
"server": "gogoanime",
- "headers": {},
+ "headers": {"Referer": f"https://{ALLANIME_BASE}/"},
"subtitles": [],
"episode_title": (
allanime_episode["notes"] or f"{anime_title}"
@@ -245,7 +245,7 @@ class AllAnimeAPI(AnimeProvider):
logger.debug("allanime:Found streams from wetransfer")
return {
"server": "wetransfer",
- "headers": {},
+ "headers": {"Referer": f"https://{ALLANIME_BASE}/"},
"subtitles": [],
"episode_title": (
allanime_episode["notes"] or f"{anime_title}"
@@ -257,7 +257,7 @@ class AllAnimeAPI(AnimeProvider):
logger.debug("allanime:Found streams from sharepoint")
return {
"server": "sharepoint",
- "headers": {},
+ "headers": {"Referer": f"https://{ALLANIME_BASE}/"},
"subtitles": [],
"episode_title": (
allanime_episode["notes"] or f"{anime_title}"
@@ -269,7 +269,7 @@ class AllAnimeAPI(AnimeProvider):
logger.debug("allanime:Found streams from dropbox")
return {
"server": "dropbox",
- "headers": {},
+ "headers": {"Referer": f"https://{ALLANIME_BASE}/"},
"subtitles": [],
"episode_title": (
allanime_episode["notes"] or f"{anime_title}"
@@ -281,7 +281,7 @@ class AllAnimeAPI(AnimeProvider):
logger.debug("allanime:Found streams from wixmp")
return {
"server": "wixmp",
- "headers": {},
+ "headers": {"Referer": f"https://{ALLANIME_BASE}/"},
"subtitles": [],
"episode_title": (
allanime_episode["notes"] or f"{anime_title}"
From cfbbabf898575027fa8c2e9e5ca1b568e4ed320f Mon Sep 17 00:00:00 2001
From: benex
Date: Mon, 18 Nov 2024 17:06:41 +0300
Subject: [PATCH 45/87] chore: update uv.lock
---
uv.lock | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/uv.lock b/uv.lock
index d2c5718..bcd2ab6 100644
--- a/uv.lock
+++ b/uv.lock
@@ -170,7 +170,7 @@ wheels = [
[[package]]
name = "fastanime"
-version = "2.7.6"
+version = "2.7.7"
source = { editable = "." }
dependencies = [
{ name = "click" },
From 30babf2d69206d5f10fd8ae1a1bc4e5812bedace Mon Sep 17 00:00:00 2001
From: benex
Date: Mon, 18 Nov 2024 17:09:56 +0300
Subject: [PATCH 46/87] feat(cli): alert the user that the cli is checking for
updates
---
fastanime/cli/__init__.py | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/fastanime/cli/__init__.py b/fastanime/cli/__init__.py
index 6bc27cf..21c9159 100644
--- a/fastanime/cli/__init__.py
+++ b/fastanime/cli/__init__.py
@@ -229,6 +229,11 @@ def run_cli(
if ctx.obj.check_for_updates:
from .app_updater import check_for_updates
+ print("Checking for updates...")
+ print("So you can enjoy the latest features and bug fixes")
+ print(
+ "You can disable this by setting check_for_updates to False in the config"
+ )
is_latest, github_release_data = check_for_updates()
if not is_latest:
from rich.console import Console
From 2d3509ccc1664373221b18efa99393e56bf27a47 Mon Sep 17 00:00:00 2001
From: benex
Date: Mon, 18 Nov 2024 17:10:26 +0300
Subject: [PATCH 47/87] chore: bump version (v2.7.8)
---
fastanime/__init__.py | 2 +-
pyproject.toml | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/fastanime/__init__.py b/fastanime/__init__.py
index c5f1190..e04b5db 100644
--- a/fastanime/__init__.py
+++ b/fastanime/__init__.py
@@ -6,7 +6,7 @@ if sys.version_info < (3, 10):
) # noqa: F541
-__version__ = "v2.7.7"
+__version__ = "v2.7.8"
APP_NAME = "FastAnime"
AUTHOR = "Benex254"
diff --git a/pyproject.toml b/pyproject.toml
index 339e7eb..631b2d7 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "fastanime"
-version = "2.7.7"
+version = "2.7.8"
description = "A browser anime site experience from the terminal"
license = "UNLICENSE"
readme = "README.md"
From 2c5c28f29568fb9a232f3bd794ae2784a1f0c091 Mon Sep 17 00:00:00 2001
From: benex
Date: Mon, 18 Nov 2024 18:15:29 +0300
Subject: [PATCH 48/87] refactor(config): remove useless functions
---
fastanime/cli/config.py | 262 +++++++++++++++-------------------------
1 file changed, 98 insertions(+), 164 deletions(-)
diff --git a/fastanime/cli/config.py b/fastanime/cli/config.py
index 0c4d743..c07c6aa 100644
--- a/fastanime/cli/config.py
+++ b/fastanime/cli/config.py
@@ -83,56 +83,70 @@ class Config(object):
if os.path.exists(USER_CONFIG_PATH):
self.configparser.read(USER_CONFIG_PATH, encoding="utf-8")
- # TODO: rewrite all this removing the useless functions
- # hate technical debt
- # why did i do this lol
- self.auto_next = self.get_auto_next()
- self.auto_select = self.get_auto_select()
- self.cache_requests = self.get_cache_requests()
- self.check_for_updates = self.configparser.get("general", "check_for_updates")
- self.continue_from_history = self.get_continue_from_history()
- self.default_media_list_tracking = self.get_default_media_list_tracking()
+ # get the configuration
+ self.auto_next = self.configparser.getboolean("stream", "auto_next")
+ self.auto_select = self.configparser.getboolean("stream", "auto_select")
+ self.cache_requests = self.configparser.getboolean("general", "cache_requests")
+ self.check_for_updates = self.configparser.getboolean(
+ "general", "check_for_updates"
+ )
+ self.continue_from_history = self.configparser.getboolean(
+ "stream", "continue_from_history"
+ )
+ self.default_media_list_tracking = self.configparser.get(
+ "general", "default_media_list_tracking"
+ )
self.disable_mpv_popen = self.configparser.getboolean(
"stream", "disable_mpv_popen"
)
- self.downloads_dir = self.get_downloads_dir()
- self.episode_complete_at = self.get_episode_complete_at()
- self.ffmpegthumbnailer_seek_time = self.get_ffmpegthumnailer_seek_time()
- self.force_forward_tracking = self.get_force_forward_tracking()
- self.force_window = self.get_force_window()
- self.format = self.get_format()
- self.icons = self.get_icons()
- self.image_previews = self.get_image_previews()
- self.normalize_titles = self.get_normalize_titles()
- self.notification_duration = self.get_notification_duration()
- self.player = self.get_player()
- self.preferred_history = self.get_preferred_history()
- self.preferred_language = self.get_preferred_language()
- self.preview = self.get_preview()
- self.provider = self.get_provider()
- self.quality = self.get_quality()
+ self.downloads_dir = self.configparser.get("general", "downloads_dir")
+ self.episode_complete_at = self.configparser.getint(
+ "stream", "episode_complete_at"
+ )
+ self.ffmpegthumbnailer_seek_time = self.configparser.getint(
+ "general", "ffmpegthumbnailer_seek_time"
+ )
+ self.force_forward_tracking = self.configparser.getboolean(
+ "general", "force_forward_tracking"
+ )
+ self.force_window = self.configparser.get("stream", "force_window")
+ self.format = self.configparser.get("stream", "format")
+ self.icons = self.configparser.getboolean("general", "icons")
+ self.image_previews = self.configparser.getboolean("general", "image_previews")
+ self.normalize_titles = self.configparser.getboolean(
+ "general", "normalize_titles"
+ )
+ self.notification_duration = self.configparser.getint(
+ "general", "notification_duration"
+ )
+ self.player = self.configparser.get("stream", "player")
+ self.preferred_history = self.configparser.get("stream", "preferred_history")
+ self.preferred_language = self.configparser.get("general", "preferred_language")
+ self.preview = self.configparser.getboolean("general", "preview")
+ self.provider = self.configparser.get("general", "provider")
+ self.quality = self.configparser.get("stream", "quality")
+ self.recent = self.configparser.getint("general", "recent")
+ self.rofi_theme_confirm = self.configparser.get("general", "rofi_theme_confirm")
+ self.rofi_theme_input = self.configparser.get("general", "rofi_theme_input")
+ self.rofi_theme = self.configparser.get("general", "rofi_theme")
+ self.rofi_theme_preview = self.configparser.get("general", "rofi_theme_preview")
+ self.server = self.configparser.get("stream", "server")
+ self.skip = self.configparser.getboolean("stream", "skip")
+ self.sort_by = self.configparser.get("anilist", "sort_by")
+ self.sub_lang = self.configparser.get("general", "sub_lang")
+ self.translation_type = self.configparser.get("stream", "translation_type")
+ self.use_fzf = self.configparser.getboolean("general", "use_fzf")
+ self.use_python_mpv = self.configparser.getboolean("stream", "use_python_mpv")
+ self.use_rofi = self.configparser.getboolean("general", "use_rofi")
+ self.use_persistent_provider_store = self.configparser.getboolean(
+ "general", "use_persistent_provider_store"
+ )
- self.recent = self.get_recent()
- self.rofi_theme_confirm = self.get_rofi_theme_confirm()
- self.rofi_theme_input = self.get_rofi_theme_input()
- self.rofi_theme = self.get_rofi_theme()
- self.rofi_theme_preview = self.get_rofi_theme_preview()
-
- Rofi.rofi_theme_confirm = self.rofi_theme_confirm
- Rofi.rofi_theme_input = self.rofi_theme_input
Rofi.rofi_theme = self.rofi_theme
+ Rofi.rofi_theme_input = self.rofi_theme_input
+ Rofi.rofi_theme_confirm = self.rofi_theme_confirm
Rofi.rofi_theme_preview = self.rofi_theme_preview
- self.server = self.get_server()
- self.skip = self.get_skip()
- self.sort_by = self.get_sort_by()
- self.sub_lang = self.get_sub_lang()
- self.translation_type = self.get_translation_type()
- self.use_fzf = self.get_use_fzf()
- self.use_python_mpv = self.get_use_mpv_mod()
- self.use_rofi = self.get_use_rofi()
- self.use_persistent_provider_store = self.get_use_persistent_provider_store()
-
# ---- setup user data ------
self.anime_list: list = self.user_data.get("animelist", [])
self.user: dict = self.user_data.get("user", {})
@@ -208,116 +222,6 @@ class Config(object):
with open(USER_DATA_PATH, "w") as f:
json.dump(self.user_data, f)
- # getters for user configuration
-
- # --- general section ---
- def get_provider(self):
- return self.configparser.get("general", "provider")
-
- def get_ffmpegthumnailer_seek_time(self):
- return self.configparser.getint("general", "ffmpegthumbnailer_seek_time")
-
- def get_preferred_language(self):
- return self.configparser.get("general", "preferred_language")
-
- def get_sub_lang(self):
- return self.configparser.get("general", "sub_lang")
-
- def get_downloads_dir(self):
- return self.configparser.get("general", "downloads_dir")
-
- def get_icons(self):
- return self.configparser.getboolean("general", "icons")
-
- def get_image_previews(self):
- return self.configparser.getboolean("general", "image_previews")
-
- def get_preview(self):
- return self.configparser.getboolean("general", "preview")
-
- def get_use_fzf(self):
- return self.configparser.getboolean("general", "use_fzf")
-
- def get_use_persistent_provider_store(self):
- return self.configparser.getboolean("general", "use_persistent_provider_store")
-
- # rofi conifiguration
- def get_use_rofi(self):
- return self.configparser.getboolean("general", "use_rofi")
-
- def get_rofi_theme(self):
- return self.configparser.get("general", "rofi_theme")
-
- def get_rofi_theme_preview(self):
- return self.configparser.get("general", "rofi_theme_preview")
-
- def get_rofi_theme_input(self):
- return self.configparser.get("general", "rofi_theme_input")
-
- def get_rofi_theme_confirm(self):
- return self.configparser.get("general", "rofi_theme_confirm")
-
- def get_force_forward_tracking(self):
- return self.configparser.getboolean("general", "force_forward_tracking")
-
- def get_cache_requests(self):
- return self.configparser.getboolean("general", "cache_requests")
-
- def get_default_media_list_tracking(self):
- return self.configparser.get("general", "default_media_list_tracking")
-
- def get_normalize_titles(self):
- return self.configparser.getboolean("general", "normalize_titles")
-
- def get_recent(self):
- return self.configparser.getint("general", "recent")
-
- # --- stream section ---
- def get_skip(self):
- return self.configparser.getboolean("stream", "skip")
-
- def get_auto_next(self):
- return self.configparser.getboolean("stream", "auto_next")
-
- def get_auto_select(self):
- return self.configparser.getboolean("stream", "auto_select")
-
- def get_continue_from_history(self):
- return self.configparser.getboolean("stream", "continue_from_history")
-
- def get_use_mpv_mod(self):
- return self.configparser.getboolean("stream", "use_python_mpv")
-
- def get_notification_duration(self):
- return self.configparser.getint("general", "notification_duration")
-
- def get_episode_complete_at(self):
- return self.configparser.getint("stream", "episode_complete_at")
-
- def get_force_window(self):
- return self.configparser.get("stream", "force_window")
-
- def get_translation_type(self):
- return self.configparser.get("stream", "translation_type")
-
- def get_preferred_history(self):
- return self.configparser.get("stream", "preferred_history")
-
- def get_quality(self):
- return self.configparser.get("stream", "quality")
-
- def get_server(self):
- return self.configparser.get("stream", "server")
-
- def get_format(self):
- return self.configparser.get("stream", "format")
-
- def get_player(self):
- return self.configparser.get("stream", "player")
-
- def get_sort_by(self):
- return self.configparser.get("anilist", "sort_by")
-
def update_config(self, section: str, key: str, value: str):
self.configparser.set(section, key, value)
with open(USER_CONFIG_PATH, "w") as config:
@@ -336,9 +240,11 @@ class Config(object):
[general]
# whether to show the icons in the tui [True/False]
# more like emojis
-# by the way if you have any recommendations to which should be used where please
+# by the way if you have any recommendations
+# to which should be used where please
# don't hesitate to share your opinion
-# cause it's a lot of work to look for the right one for each menu option
+# cause it's a lot of work
+# to look for the right one for each menu option
# be sure to also give the replacement emoji
icons = {self.icons}
@@ -353,10 +259,20 @@ normalize_titles = {self.normalize_titles}
# cause there are always new features being added 😄
check_for_updates = {self.check_for_updates}
-# can be [allanime, animepahe, hianime]
+# can be [allanime, animepahe, hianime, nyaa, yugen]
# allanime is the most realible
# animepahe provides different links to streams of different quality so a quality can be selected reliably with --quality option
-# hianime which is now hianime usually provides subs in different languuages and its servers are generally faster
+# hianime usually provides subs in different languuages and its servers are generally faster
+# NOTE: currently they are encrypting the video links
+# though am working on it
+# however, you can still get the links to the subs
+# with ```fastanime grab``` command
+# yugen meh
+# nyaa those who prefer torrents, though not reliable due to auto selection of results
+# as most of the data in nyaa is not structured
+# though works relatively well for new anime
+# esp with subsplease and horriblesubs
+# oh and you should have webtorrent cli to use this
provider = {self.provider}
# Display language [english, romaji]
@@ -377,6 +293,10 @@ downloads_dir = {self.downloads_dir}
preview = {self.preview}
# whether to show images in the preview [true/false]
+# windows users just swtich to linux 😄
+# cause even if you enable it
+# it won't look pretty
+# so forget it exists 🤣
image_previews = {self.image_previews}
# the time to seek when using ffmpegthumbnailer [-1 to 100]
@@ -394,11 +314,13 @@ use_fzf = {self.use_fzf}
# though if you want it to be your sole interface even when fastanime is run directly from the terminal
use_rofi = {self.use_rofi}
-# rofi themes to use
+# rofi themes to use
# the values of this option is the path to the rofi config files to use
-# i choose to split it into three since it gives the best look and feel
+# i choose to split it into 4 since it gives the best look and feel
# you can refer to the rofi demo on github to see for your self
-# by the way i recommend getting the rofi themes from this project;
+# i need help designing the default rofi themes
+# if you fancy yourself a rofi ricer please contribute to making
+# the default theme better
rofi_theme = {self.rofi_theme}
rofi_theme_preview = {self.rofi_theme_preview}
@@ -414,7 +336,7 @@ notification_duration = {self.notification_duration}
# used when the provider gives subs of different languages
# currently its the case for:
# hianime
-# the values for this option are the short names for countries
+# the values for this option are the short names for languages
# regex is used to determine what you selected
sub_lang = {self.sub_lang}
@@ -478,6 +400,7 @@ translation_type = {self.translation_type}
# allanime: [dropbox, sharepoint, wetransfer, gogoanime, wixmp]
# animepahe: [kwik]
# hianime: [HD1, HD2, StreamSB, StreamTape]
+# yugen: [gogoanime]
# 'top' can also be used as a value for this option
# 'top' will cause fastanime to auto select the first server it sees
# this saves on resources and is faster since not all servers are being fetched
@@ -495,14 +418,23 @@ auto_next = {self.auto_next}
# that are there own preference rather than the official names
# But 99% of the time will be accurate
# if this happens just turn of auto_select in the menus or from the commandline and manually select the correct anime title
-# and then please open an issue at <> highlighting the normalized title and the title given by the provider for the anime you wished to watch
-# or even better edit this file <> and open a pull request
+# and then please open an issue
+# highlighting the normalized title
+# and the title given by the provider for the anime you wished to watch
+# or even better edit this file
+# and open a pull request
+# prefrably, so you can give me a small break
+# of doing everything 😄
+# and its always nice to see people contributing
+# to projects they love and use
auto_select = {self.auto_select}
# whether to skip the opening and ending theme songs [True/False]
# NOTE: requires ani-skip to be in path
# for python-mpv users am planning to create this functionality n python without the use of an external script
# so its disabled for now
+# and anyways Dan Da Dan
+# taught as the importance of letting it flow 🙃
skip = {self.skip}
# at what percentage progress should the episode be considered as completed [0-100]
@@ -514,7 +446,8 @@ episode_complete_at = {self.episode_complete_at}
# whether to use python-mpv [True/False]
# to enable superior control over the player
# adding more options to it
-# Enable this one and you will be wonder why you did not discover fastanime sooner
+# Enable this one and you will be wonder
+# why you did not discover fastanime sooner 🙃
# Since you basically don't have to close the player window
# to go to the next or previous episode, switch servers,
# change translation type or change to a given episode x
@@ -568,6 +501,7 @@ player = {self.player}
# since we may not always have the time to immediately implement the changes
#
# HOPE YOU ENJOY FASTANIME AND BE SURE TO STAR THE PROJECT ON GITHUB
+# https://github.com/Benex254/FastAnime
#
"""
return current_config_state
From 02e7fdff6f082e5e39d9a9bfe1ffb5823d1b351f Mon Sep 17 00:00:00 2001
From: benex
Date: Mon, 18 Nov 2024 18:15:41 +0300
Subject: [PATCH 49/87] chore: update lock file
---
uv.lock | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/uv.lock b/uv.lock
index bcd2ab6..dc151bb 100644
--- a/uv.lock
+++ b/uv.lock
@@ -170,7 +170,7 @@ wheels = [
[[package]]
name = "fastanime"
-version = "2.7.7"
+version = "2.7.8"
source = { editable = "." }
dependencies = [
{ name = "click" },
From 320376d2e8c8e1981a4bc9fd8aa3c61e0e98266e Mon Sep 17 00:00:00 2001
From: benex
Date: Mon, 18 Nov 2024 18:19:21 +0300
Subject: [PATCH 50/87] chore: bump version (v2.7.9)
---
fastanime/__init__.py | 2 +-
pyproject.toml | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/fastanime/__init__.py b/fastanime/__init__.py
index e04b5db..4919f79 100644
--- a/fastanime/__init__.py
+++ b/fastanime/__init__.py
@@ -6,7 +6,7 @@ if sys.version_info < (3, 10):
) # noqa: F541
-__version__ = "v2.7.8"
+__version__ = "v2.7.9"
APP_NAME = "FastAnime"
AUTHOR = "Benex254"
diff --git a/pyproject.toml b/pyproject.toml
index 631b2d7..6750e7a 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "fastanime"
-version = "2.7.8"
+version = "2.7.9"
description = "A browser anime site experience from the terminal"
license = "UNLICENSE"
readme = "README.md"
From 871d5cf758bf204c302d65b9c616c4860ad356ec Mon Sep 17 00:00:00 2001
From: benex
Date: Mon, 18 Nov 2024 20:04:22 +0300
Subject: [PATCH 51/87] chore: add result to .gitignore
---
.gitignore | 1 +
1 file changed, 1 insertion(+)
diff --git a/.gitignore b/.gitignore
index 6d4b622..93da86b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -176,3 +176,4 @@ app/View/SearchScreen/.search_screen.py.un~
app/View/SearchScreen/search_screen.py~
app/user_data.json
.buildozer
+result
From 0f248b11194907c2e656a9953c4a8a67949a5c68 Mon Sep 17 00:00:00 2001
From: benex
Date: Mon, 18 Nov 2024 20:04:57 +0300
Subject: [PATCH 52/87] chore: update flake.nix to include external deps and
all python deps
---
flake.nix | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/flake.nix b/flake.nix
index bd5a5ec..aa41315 100644
--- a/flake.nix
+++ b/flake.nix
@@ -10,11 +10,11 @@
let
pkgs = import nixpkgs { inherit system; };
- python = pkgs.python310;
+ python = pkgs.python312;
pythonPackages = python.pkgs;
fastanimeEnv = pythonPackages.buildPythonApplication {
pname = "fastanime";
- version = "2.7.5";
+ version = "2.7.9";
src = ./.;
@@ -32,6 +32,9 @@
yt-dlp
dbus-python
hatchling
+ plyer
+ mpv
+ fastapi
];
# Ensure compatibility with the pyproject.toml
@@ -47,6 +50,10 @@
buildInputs = [
fastanimeEnv
pythonPackages.hatchling
+ pkgs.mpv
+ pkgs.libmpv
+ pkgs.fzf
+ pkgs.rofi
];
};
});
From 050365302a2a7839b11cde878c3873896705c69c Mon Sep 17 00:00:00 2001
From: benex
Date: Mon, 18 Nov 2024 20:10:21 +0300
Subject: [PATCH 53/87] chore: bump flake.nix
---
flake.nix | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/flake.nix b/flake.nix
index aa41315..76f47b5 100644
--- a/flake.nix
+++ b/flake.nix
@@ -14,7 +14,7 @@
pythonPackages = python.pkgs;
fastanimeEnv = pythonPackages.buildPythonApplication {
pname = "fastanime";
- version = "2.7.9";
+ version = "2.8.0";
src = ./.;
From 031dfbb9b561d8c39db24c59efaa957f05761200 Mon Sep 17 00:00:00 2001
From: Piradata <16529503+piradata@users.noreply.github.com>
Date: Tue, 19 Nov 2024 00:15:47 -0300
Subject: [PATCH 54/87] Update README.md typo
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 4e1d106..672dd58 100644
--- a/README.md
+++ b/README.md
@@ -201,7 +201,7 @@ The only required external dependency, unless you won't be streaming, is [MPV](h
- [webtorrent-cli](https://github.com/webtorrent/webtorrent-cli) used when the provider is nyaa
- [ffmpeg](https://www.ffmpeg.org/) is required to be in your path environment variables to properly download [hls](https://www.cloudflare.com/en-gb/learning/video/what-is-http-live-streaming/) streams.
- [fzf](https://github.com/junegunn/fzf) 🔥 which is used as a better alternative to the ui.
-- [rofi](https://github.com/davatorium/rofi) 🔥 which is used as another alternative ui + the the desktop entry ui
+- [rofi](https://github.com/davatorium/rofi) 🔥 which is used as another alternative ui + the desktop entry ui
- [chafa](https://github.com/hpjansson/chafa) currently the best cross platform and cross terminal image viewer for the terminal.
- [icat](https://sw.kovidgoyal.net/kitty/kittens/icat/) an image viewer that only works in [kitty terminal](https://sw.kovidgoyal.net/kitty/), which is currently the best terminal in my opinion, and by far the best image renderer for the terminal thanks to kitty's terminal graphics protocol. Its terminal graphics is so op that you can [run a browser on it](https://github.com/chase/awrit?tab=readme-ov-file)!!
- [bash](https://www.gnu.org/software/bash/) is used as the preview script language.
From 327c50d290d323d5dc11272f0498abfba92fc8b9 Mon Sep 17 00:00:00 2001
From: Atticus Helvig
Date: Mon, 18 Nov 2024 20:32:38 -0700
Subject: [PATCH 55/87] Update README.md
---
README.md | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/README.md b/README.md
index 4e1d106..956a003 100644
--- a/README.md
+++ b/README.md
@@ -100,13 +100,13 @@ Recommended method of installation is using [uv](https://docs.astral.sh/uv/).
```bash
# generally:
-uv tool install fastanime[standard]
+uv tool install "fastanime[standard]"
# or stripped down installations:
uv tool install fastanime
-uv tool install fastanime[api]
-uv tool install fastanime[mpv]
-uv tool install fastanime[notifications]
+uv tool install "fastanime[api]"
+uv tool install "fastanime[mpv]"
+uv tool install "fastanime[notifications]"
```
From b9051bc79241bc77e4f8c3edd2af9dd70333a2ee Mon Sep 17 00:00:00 2001
From: Benedict Xavier <81157281+Benex254@users.noreply.github.com>
Date: Tue, 19 Nov 2024 08:01:23 +0300
Subject: [PATCH 56/87] Create DISCLAIMER.md
---
DISCLAIMER.md | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 50 insertions(+)
create mode 100644 DISCLAIMER.md
diff --git a/DISCLAIMER.md b/DISCLAIMER.md
new file mode 100644
index 0000000..d11aae0
--- /dev/null
+++ b/DISCLAIMER.md
@@ -0,0 +1,50 @@
+Disclaimer
+
+
+
+
This project: animdl
+
+
+
+The core aim of this project is to co-relate automation and efficiency to extract what is provided to a user on the internet. All content available through the project is hosted by external non-affiliated sources.
+
+
+
+All content served through this project is publicly accessible. If your site is listed in this project, the code is pretty much public. Take necessary measures to counter the exploits used to extract content in your site.
+
+Think of this project as your normal browser, but a bit more straight-forward and specific. While an average browser makes hundreds of requests to get everything from a site, this project goes on to only make requests associated with getting the content served by the sites.
+
+
+
+This project is to be used at the user's own risk, based on their government and laws.
+
+This project has no control on the content it is serving, using copyrighted content from the providers is not going to be accounted for by the developer. It is the user's own risk.
+
+
+
+
+
+
+DMCA and Copyright Infrigements
+
+
+
+
+
+A browser is a tool, and the maliciousness of the tool is directly based on the user.
+
+
+
+This project uses client-side content access mechanisms. Hence, the copyright infrigements or DMCA in this project's regards are to be forwarded to the associated site by the associated notifier of any such claims. This is one of the main reasons the sites are listed in this project.
+
+Do not harass the developer. Any personal information about the developer is intentionally not made public. Exploiting such information without consent in regards to this topic will lead to legal actions by the developer themselves.
+
+
+
+Contacting the developer
+
+
+
+Begin by making a GitHub issue or sending an email to kr.justfoolingaround@gmail.com.
+
+
From 4fa1c45eb2054ceeb802a9078410b0b6fafe4d89 Mon Sep 17 00:00:00 2001
From: Benedict Xavier <81157281+Benex254@users.noreply.github.com>
Date: Tue, 19 Nov 2024 08:02:41 +0300
Subject: [PATCH 57/87] Update DISCLAIMER.md
---
DISCLAIMER.md | 12 +-----------
1 file changed, 1 insertion(+), 11 deletions(-)
diff --git a/DISCLAIMER.md b/DISCLAIMER.md
index d11aae0..1f27055 100644
--- a/DISCLAIMER.md
+++ b/DISCLAIMER.md
@@ -2,7 +2,7 @@
-
This project: animdl
+This project: fastanime
@@ -38,13 +38,3 @@ A browser is a tool, and the maliciousness of the tool is directly based on the
This project uses client-side content access mechanisms. Hence, the copyright infrigements or DMCA in this project's regards are to be forwarded to the associated site by the associated notifier of any such claims. This is one of the main reasons the sites are listed in this project.
Do not harass the developer. Any personal information about the developer is intentionally not made public. Exploiting such information without consent in regards to this topic will lead to legal actions by the developer themselves.
-
-
-
-Contacting the developer
-
-
-
-Begin by making a GitHub issue or sending an email to kr.justfoolingaround@gmail.com.
-
-
From 95cb2bd78c9914eed87cb5de68cd69efdc9d823f Mon Sep 17 00:00:00 2001
From: Benedict Xavier <81157281+Benex254@users.noreply.github.com>
Date: Tue, 19 Nov 2024 08:03:33 +0300
Subject: [PATCH 58/87] Update README.md
---
README.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index f67066e..e5b8b74 100644
--- a/README.md
+++ b/README.md
@@ -70,7 +70,8 @@ Heavily inspired by [animdl](https://github.com/justfoolingaround/animdl), [jerr
> [!IMPORTANT]
>
-> This project currently scrapes allanime, hianime and animepahe, nyaa. The site is in the public domain and can be accessed by any one with a browser.
+> This project currently scrapes allanime, hianime and animepahe, nyaa and by no means does the project own any servers.
+> [DISCLAIMER](https://github.com/Benex254/FastAnime/blob/master/DISCLAIMER.md)
## Installation
From 3928b77506739c12200ec1cf6ffb742950c2b2c1 Mon Sep 17 00:00:00 2001
From: Benedict Xavier <81157281+Benex254@users.noreply.github.com>
Date: Tue, 19 Nov 2024 08:17:44 +0300
Subject: [PATCH 59/87] Update README.md
---
README.md | 37 +++++++++++++++++++++++--------------
1 file changed, 23 insertions(+), 14 deletions(-)
diff --git a/README.md b/README.md
index e5b8b74..325927f 100644
--- a/README.md
+++ b/README.md
@@ -1,12 +1,22 @@
-# **FastAnime**
+
+
FastAnime
+
+
+
 




+
+
+
+
+
+
+
-Welcome to **FastAnime**, anime site experience from the terminal.

@@ -601,7 +611,7 @@ fastanime config --view
> [!Note]
>
-> If it opens [vim](https://www.vim.org/download.php) you can exit by typing `:q` .
+> If it opens [vim](https://www.vim.org/download.php) you can exit by typing `:q` 😉.
#### cache subcommand
@@ -1143,7 +1153,7 @@ Result
"subtitles": [],
"links": [
{
- "link": "https://tools.fast4speed.rsvp//media9/videos/8aM5BBoEGLvjG3MZm/sub/3",
+ "link": "",
"quality": "1080"
}
]
@@ -1155,10 +1165,10 @@ Result
"episode_title": "Sayounara Ryuusei, Konnichiwa Jinsei; Episode 3",
"links": [
{
- "link": "https://myanime.sharepoint.com/sites/chartlousty/_layouts/15/download.aspx?share=ERpIT0CTmOVHmO8386bNGZMBf7Emtoda_3bUMzCleWhp4g",
+ "link": "",
"mp4": true,
"resolutionStr": "Mp4",
- "src": "https://myanime.sharepoint.com/sites/chartlousty/_layouts/15/download.aspx?share=ERpIT0CTmOVHmO8386bNGZMBf7Emtoda_3bUMzCleWhp4g",
+ "src": "",
"quality": "1080"
}
]
@@ -1170,7 +1180,7 @@ Result
"episode_title": "Sayounara Ryuusei, Konnichiwa Jinsei; Episode 3",
"links": [
{
- "link": "https://www114.anzeat.pro/streamhls/6454b50a557e9fa52a60cfdee0b0906e/ep.3.1729188150.m3u8",
+ "link": "",
"hls": true,
"mp4": false,
"resolutionStr": "hls P",
@@ -1178,7 +1188,7 @@ Result
"quality": "1080"
},
{
- "link": "https://www114.anicdnstream.info/videos/hls/h1IUtAefmoWTc8hJhtr8OQ/1731106912/235294/6454b50a557e9fa52a60cfdee0b0906e/ep.3.1729188150.m3u8",
+ "link": "",
"hls": true,
"mp4": false,
"resolutionStr": "HLS1",
@@ -1186,10 +1196,10 @@ Result
"quality": "720"
},
{
- "link": "https://workfields.maverickki.lol/7d2473746a243c246e727276753c29297171713737322867686f65626875727463676b286f68606929706f62636975296e6a75296e374f53724763606b695152653e6e4c6e72743e495729373135373736303f373429343533343f32293032333264333667333331633f6067333467303665606263633664363f3630632963762835283731343f373e3e373336286b35733e242a2476677475634e6a75243c727473632a2462677263243c373135373634363236363636367b",
+ "link": "",
"hls": true,
"resolutionStr": "Alt",
- "src": "https://workfields.maverickki.lol/7d2473746a243c246e727276753c29297171713737322867686f65626875727463676b286f68606929706f62636975296e6a75296e374f53724763606b695152653e6e4c6e72743e495729373135373736303f373429343533343f32293032333264333667333331633f6067333467303665606263633664363f3630632963762835283731343f373e3e373336286b35733e242a2476677475634e6a75243c727473632a2462677263243c373135373634363236363636367b",
+ "src": "",
"priority": 1,
"quality": "480"
}
@@ -1415,11 +1425,10 @@ player = mpv
## Contributing
-We welcome your issues and feature requests. However, due to time constraints, we currently do not plan to add another provider.
+We welcome your issues and feature requests. However, due to time constraints, I currently do not plan to add another provider.
+But if you are willing to add one yourself pr's are welcome.
-If you wish to contribute directly, please first open an issue describing your proposed changes so it can be discussed or if you are in a rush for the feature to be merged just open a pr.
-
-If you find an anime title that does not correspond with a provider or is just weird just [edit the data file](https://github.com/FastAnime/FastAnime/blob/master/fastanime/Utility/data.py) and open a pr or if you don't want to do that open an issue.
+If you find an anime title that does not correspond with a provider or is just weird just [edit the data file](https://github.com/FastAnime/FastAnime/blob/master/fastanime/Utility/data.py) and open a pr, i will ignore issues 😝.
## Receiving Support
From eb513dfe0ed18e9419b93d3f6173b2c9079932d5 Mon Sep 17 00:00:00 2001
From: Benedict Xavier <81157281+Benex254@users.noreply.github.com>
Date: Tue, 19 Nov 2024 08:23:45 +0300
Subject: [PATCH 60/87] Update README.md
---
README.md | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 325927f..1658ec4 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,11 @@
FastAnime
-
+
+
+ Browse anime from the terminal
+
+
 
From 933112a52b09c5ca42e3fc3d6a3ce070339489aa Mon Sep 17 00:00:00 2001
From: Benedict Xavier <81157281+Benex254@users.noreply.github.com>
Date: Tue, 19 Nov 2024 08:34:23 +0300
Subject: [PATCH 61/87] Update README.md
---
README.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 1658ec4..a844eb3 100644
--- a/README.md
+++ b/README.md
@@ -84,7 +84,8 @@ Heavily inspired by [animdl](https://github.com/justfoolingaround/animdl), [jerr
> [!IMPORTANT]
>
-> This project currently scrapes allanime, hianime and animepahe, nyaa and by no means does the project own any servers.
+> This project currently scrapes allanime, hianime, nyaa and animepahe
+> The developer(s) of this application does not have any affiliation with the content providers available, and this application hosts zero content.
> [DISCLAIMER](https://github.com/Benex254/FastAnime/blob/master/DISCLAIMER.md)
## Installation
From 81690a80154a07a2192b39b9221c4a92b976d2c1 Mon Sep 17 00:00:00 2001
From: Benedict Xavier <81157281+Benex254@users.noreply.github.com>
Date: Tue, 19 Nov 2024 08:37:26 +0300
Subject: [PATCH 62/87] Update README.md
---
README.md | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/README.md b/README.md
index a844eb3..63bf94c 100644
--- a/README.md
+++ b/README.md
@@ -81,13 +81,6 @@ Heavily inspired by [animdl](https://github.com/justfoolingaround/animdl), [jerr
- [Receiving Support](#receiving-support)
- [Supporting the Project](#supporting-the-project)
-
-> [!IMPORTANT]
->
-> This project currently scrapes allanime, hianime, nyaa and animepahe
-> The developer(s) of this application does not have any affiliation with the content providers available, and this application hosts zero content.
-> [DISCLAIMER](https://github.com/Benex254/FastAnime/blob/master/DISCLAIMER.md)
-
## Installation

@@ -1449,3 +1442,10 @@ For inquiries, join our [Discord Server](https://discord.gg/HBEmAwvbHV).
More pr's less issues 🙃
Show your support by starring the GitHub repository or [buying me a coffee](https://ko-fi.com/benex254).
+
+## Disclaimer
+> [!IMPORTANT]
+>
+> This project currently scrapes allanime, hianime, nyaa, yugen and animepahe.
+> The developer(s) of this application does not have any affiliation with the content providers available, and this application hosts zero content.
+> [DISCLAIMER](https://github.com/Benex254/FastAnime/blob/master/DISCLAIMER.md)
From bd03866f5e0520d321e6e6ea844b82ad2af8bcd9 Mon Sep 17 00:00:00 2001
From: Benedict Xavier <81157281+Benex254@users.noreply.github.com>
Date: Tue, 19 Nov 2024 08:40:09 +0300
Subject: [PATCH 63/87] Update README.md
---
README.md | 1 -
1 file changed, 1 deletion(-)
diff --git a/README.md b/README.md
index 63bf94c..1118130 100644
--- a/README.md
+++ b/README.md
@@ -45,7 +45,6 @@
-Heavily inspired by [animdl](https://github.com/justfoolingaround/animdl), [jerry](https://github.com/justchokingaround/jerry/tree/main),[magic-tape](https://gitlab.com/christosangel/magic-tape/-/tree/main?ref_type=heads) and [ani-cli](https://github.com/pystardust/ani-cli).
From 8737aea74654bde1d0cb4e6883f76435effa1710 Mon Sep 17 00:00:00 2001
From: benex
Date: Tue, 19 Nov 2024 10:04:57 +0300
Subject: [PATCH 64/87] fix(player): set character encoding for compatibility
with windows
---
fastanime/cli/utils/mpv.py | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/fastanime/cli/utils/mpv.py b/fastanime/cli/utils/mpv.py
index eeb5db7..92f3822 100644
--- a/fastanime/cli/utils/mpv.py
+++ b/fastanime/cli/utils/mpv.py
@@ -59,7 +59,10 @@ def stream_video(MPV, url, mpv_args, custom_args):
process.wait()
else:
proc = subprocess.run(
- [MPV, url, *mpv_args, *custom_args], capture_output=True, text=True
+ [MPV, url, *mpv_args, *custom_args],
+ capture_output=True,
+ text=True,
+ encoding="utf-8",
)
if proc.stdout:
for line in reversed(proc.stdout.split("\n")):
@@ -97,7 +100,7 @@ def run_mpv(
time.sleep(120)
return "0", "0"
cmd = [WEBTORRENT_CLI, link, f"--{player}"]
- subprocess.run(cmd)
+ subprocess.run(cmd, encoding="utf-8")
return "0", "0"
if player == "vlc":
VLC = shutil.which("vlc")
@@ -148,7 +151,7 @@ def run_mpv(
if title:
args.append("--video-title")
args.append(title)
- subprocess.run(args)
+ subprocess.run(args, encoding="utf-8")
return "0", "0"
else:
# Determine if mpv is available
From 1d5c3016fcce6ab93077944df42bc78d0fe4d315 Mon Sep 17 00:00:00 2001
From: benex
Date: Tue, 19 Nov 2024 10:05:16 +0300
Subject: [PATCH 65/87] chore: update lock file
---
uv.lock | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/uv.lock b/uv.lock
index dc151bb..2422255 100644
--- a/uv.lock
+++ b/uv.lock
@@ -170,7 +170,7 @@ wheels = [
[[package]]
name = "fastanime"
-version = "2.7.8"
+version = "2.7.9"
source = { editable = "." }
dependencies = [
{ name = "click" },
From dc58fc8536cacee2cb74ec8f1e89a88e2c3aeadf Mon Sep 17 00:00:00 2001
From: benex
Date: Tue, 19 Nov 2024 10:06:57 +0300
Subject: [PATCH 66/87] chore: bump version (v2.8.0)
---
fastanime/__init__.py | 2 +-
pyproject.toml | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/fastanime/__init__.py b/fastanime/__init__.py
index 4919f79..3affbe9 100644
--- a/fastanime/__init__.py
+++ b/fastanime/__init__.py
@@ -6,7 +6,7 @@ if sys.version_info < (3, 10):
) # noqa: F541
-__version__ = "v2.7.9"
+__version__ = "v2.8.0"
APP_NAME = "FastAnime"
AUTHOR = "Benex254"
diff --git a/pyproject.toml b/pyproject.toml
index 6750e7a..74e149b 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "fastanime"
-version = "2.7.9"
+version = "2.8.0"
description = "A browser anime site experience from the terminal"
license = "UNLICENSE"
readme = "README.md"
From 9ce5bc3c7609c5fc01c0b1eba59659ff36abd828 Mon Sep 17 00:00:00 2001
From: Benex <81157281+Benex254@users.noreply.github.com>
Date: Tue, 19 Nov 2024 11:38:33 +0300
Subject: [PATCH 67/87] Update README.md
---
README.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/README.md b/README.md
index 1118130..eca3e60 100644
--- a/README.md
+++ b/README.md
@@ -13,6 +13,7 @@



+
From 53a2d953f860ee4142f9d89f7c30b97b9935c4a4 Mon Sep 17 00:00:00 2001
From: benex
Date: Tue, 19 Nov 2024 14:05:53 +0300
Subject: [PATCH 68/87] feat: enable customization of the preview window
---
fastanime/cli/interfaces/utils.py | 19 +++++++++++++++----
fastanime/cli/utils/utils.py | 2 +-
2 files changed, 16 insertions(+), 5 deletions(-)
diff --git a/fastanime/cli/interfaces/utils.py b/fastanime/cli/interfaces/utils.py
index 492175f..4f28e8e 100644
--- a/fastanime/cli/interfaces/utils.py
+++ b/fastanime/cli/interfaces/utils.py
@@ -46,8 +46,12 @@ def aniskip(mal_id: int, episode: str):
# NOTE: May change this to a temp dir but there were issues so later
WORKING_DIR = APP_CACHE_DIR # tempfile.gettempdir()
-HEADER_COLOR = 215, 0, 95
-SEPARATOR_COLOR = 208, 208, 208
+_HEADER_COLOR = os.environ.get("FASTANIME_PREVIEW_HEADER_COLOR", "215,0,95").split(",")
+HEADER_COLOR = _HEADER_COLOR[0], _HEADER_COLOR[1], _HEADER_COLOR[2]
+_SEPARATOR_COLOR = os.environ.get(
+ "FASTANIME_PREVIEW_SEPARATOR_COLOR", "208,208,208"
+).split(",")
+SEPARATOR_COLOR = _SEPARATOR_COLOR[0], _SEPARATOR_COLOR[1], _SEPARATOR_COLOR[2]
SINGLE_QUOTE = "'"
IMAGES_CACHE_DIR = os.path.join(WORKING_DIR, "images")
if not os.path.exists(IMAGES_CACHE_DIR):
@@ -65,7 +69,7 @@ def save_image_from_url(url: str, file_name: str):
file_name: filename to use
"""
image = requests.get(url)
- with open(os.path.join(IMAGES_CACHE_DIR,f"{file_name}.png"), "wb") as f:
+ with open(os.path.join(IMAGES_CACHE_DIR, f"{file_name}.png"), "wb") as f:
f.write(image.content)
@@ -76,7 +80,14 @@ def save_info_from_str(info: str, file_name: str):
info: the information anilist has on the anime
file_name: the filename to use
"""
- with open(os.path.join(ANIME_INFO_CACHE_DIR,file_name,), "w",encoding="utf-8") as f:
+ with open(
+ os.path.join(
+ ANIME_INFO_CACHE_DIR,
+ file_name,
+ ),
+ "w",
+ encoding="utf-8",
+ ) as f:
f.write(info)
diff --git a/fastanime/cli/utils/utils.py b/fastanime/cli/utils/utils.py
index dee03a9..86c34fe 100644
--- a/fastanime/cli/utils/utils.py
+++ b/fastanime/cli/utils/utils.py
@@ -108,7 +108,7 @@ def format_bytes_to_human(num_of_bytes: float, suffix: str = "B"):
return f"{num_of_bytes:.1f}Yi{suffix}"
-def get_true_fg(string: str, r: int, g: int, b: int, bold: bool = True) -> str:
+def get_true_fg(string: str, r, g, b, bold: bool = True) -> str:
"""Custom helper function that enables colored text in the terminal
Args:
From 799e1f06819d2ade66c025ea06e71a1e5c541d25 Mon Sep 17 00:00:00 2001
From: benex
Date: Tue, 19 Nov 2024 14:06:30 +0300
Subject: [PATCH 69/87] fix(updater): handle no internet
---
fastanime/cli/app_updater.py | 20 ++++++++++++--------
1 file changed, 12 insertions(+), 8 deletions(-)
diff --git a/fastanime/cli/app_updater.py b/fastanime/cli/app_updater.py
index 0ef8cf9..907d6ad 100644
--- a/fastanime/cli/app_updater.py
+++ b/fastanime/cli/app_updater.py
@@ -15,14 +15,18 @@ API_URL = f"https://api.{GIT_REPO}/repos/{AUTHOR}/{APP_NAME}/releases/latest"
def check_for_updates():
USER_AGENT = f"{APP_NAME} user"
- request = requests.get(
- API_URL,
- headers={
- "User-Agent": USER_AGENT,
- "X-GitHub-Api-Version": "2022-11-28",
- "Accept": "application/vnd.github+json",
- },
- )
+ try:
+ request = requests.get(
+ API_URL,
+ headers={
+ "User-Agent": USER_AGENT,
+ "X-GitHub-Api-Version": "2022-11-28",
+ "Accept": "application/vnd.github+json",
+ },
+ )
+ except Exception:
+ print("You are not connected to the internet")
+ return True, {}
if request.status_code == 200:
release_json = request.json()
From fb5f51eea5e61a7ea855c9402dc0b5d587c078cb Mon Sep 17 00:00:00 2001
From: benex
Date: Tue, 19 Nov 2024 14:06:53 +0300
Subject: [PATCH 70/87] feat(config): add customization options
---
fastanime/cli/config.py | 51 ++++++++++++++++++++++++++++++++++
fastanime/libs/fzf/__init__.py | 15 ++++++++--
2 files changed, 63 insertions(+), 3 deletions(-)
diff --git a/fastanime/cli/config.py b/fastanime/cli/config.py
index c07c6aa..892ad47 100644
--- a/fastanime/cli/config.py
+++ b/fastanime/cli/config.py
@@ -3,6 +3,7 @@ import logging
import os
from configparser import ConfigParser
from typing import TYPE_CHECKING
+from ..libs.fzf import FZF_DEFAULT_OPTS, HEADER
from ..constants import (
USER_CONFIG_PATH,
@@ -42,6 +43,9 @@ class Config(object):
"ffmpegthumbnailer_seek_time": "-1",
"force_forward_tracking": "true",
"force_window": "immediate",
+ "fzf_opts": FZF_DEFAULT_OPTS,
+ "header_color": "95,135,175",
+ "header_ascii_art": HEADER,
"format": "best[height<=1080]/bestvideo[height<=1080]+bestaudio/best",
"icons": "false",
"image_previews": "True" if S_PLATFORM != "win32" else "False",
@@ -51,6 +55,8 @@ class Config(object):
"preferred_history": "local",
"preferred_language": "english",
"preview": "False",
+ "preview_header_color": "215,0,95",
+ "preview_separator_color": "208,208,208",
"provider": "allanime",
"quality": "1080",
"recent": "50",
@@ -111,6 +117,9 @@ class Config(object):
)
self.force_window = self.configparser.get("stream", "force_window")
self.format = self.configparser.get("stream", "format")
+ self.fzf_opts = self.configparser.get("general", "fzf_opts")
+ self.header_color = self.configparser.get("general", "header_color")
+ self.header_ascii_art = self.configparser.get("general", "header_ascii_art")
self.icons = self.configparser.getboolean("general", "icons")
self.image_previews = self.configparser.getboolean("general", "image_previews")
self.normalize_titles = self.configparser.getboolean(
@@ -123,6 +132,12 @@ class Config(object):
self.preferred_history = self.configparser.get("stream", "preferred_history")
self.preferred_language = self.configparser.get("general", "preferred_language")
self.preview = self.configparser.getboolean("general", "preview")
+ self.preview_separator_color = self.configparser.get(
+ "general", "preview_separator_color"
+ )
+ self.preview_header_color = self.configparser.get(
+ "general", "preview_header_color"
+ )
self.provider = self.configparser.get("general", "provider")
self.quality = self.configparser.get("stream", "quality")
self.recent = self.configparser.getint("general", "recent")
@@ -147,6 +162,8 @@ class Config(object):
Rofi.rofi_theme_confirm = self.rofi_theme_confirm
Rofi.rofi_theme_preview = self.rofi_theme_preview
+ os.environ["FZF_DEFAULT_OPTS"] = self.fzf_opts
+
# ---- setup user data ------
self.anime_list: list = self.user_data.get("animelist", [])
self.user: dict = self.user_data.get("user", {})
@@ -228,6 +245,8 @@ class Config(object):
self.configparser.write(config)
def __repr__(self):
+ new_line = "\n"
+ tab = "\t"
current_config_state = f"""\
#
# ███████╗░█████╗░░██████╗████████╗░█████╗░███╗░░██╗██╗███╗░░░███╗███████╗ ░█████╗░░█████╗░███╗░░██╗███████╗██╗░██████╗░
@@ -238,6 +257,37 @@ class Config(object):
# ╚═╝░░░░░╚═╝░░╚═╝╚═════╝░░░░╚═╝░░░╚═╝░░╚═╝╚═╝░░╚══╝╚═╝╚═╝░░░░░╚═╝╚══════╝ ░╚════╝░░╚════╝░╚═╝░░╚══╝╚═╝░░░░░╚═╝░╚═════╝░
#
[general]
+# well recently somebody made a post @unixporn subreddit
+# the rice contained fastanime in preview mode
+# Did not even realise you rice with it
+# or i would have cross-posted
+# 'A new way to rice'
+# and immediately one of the mods removed it
+# am not sure why though
+# cause the preview is actually pretty good looking.
+# just like you would use fastfetch or cava
+# as means to protest against this injustice i have addded
+# the following
+# for you all ricers out there
+# and be sure to post a rice with fastanime on it
+# if you also think this is unfair
+
+# for the preview pane
+preview_separator_color = {self.preview_separator_color}
+
+preview_header_color = {self.preview_header_color}
+
+# for the header
+# be sure to indent
+header_ascii_art = {new_line.join([tab+line for line in self.header_ascii_art.split(new_line)])}
+
+header_color = {self.header_color}
+
+# to be passed to fzf
+# may break it down further for now just pass the options as is
+# be sure to indent
+fzf_opts = {new_line.join([tab+line for line in self.fzf_opts.split(new_line)])}
+
# whether to show the icons in the tui [True/False]
# more like emojis
# by the way if you have any recommendations
@@ -296,6 +346,7 @@ preview = {self.preview}
# windows users just swtich to linux 😄
# cause even if you enable it
# it won't look pretty
+# just be satisfied with the text previews
# so forget it exists 🤣
image_previews = {self.image_previews}
diff --git a/fastanime/libs/fzf/__init__.py b/fastanime/libs/fzf/__init__.py
index 6489893..9b2a887 100644
--- a/fastanime/libs/fzf/__init__.py
+++ b/fastanime/libs/fzf/__init__.py
@@ -41,8 +41,8 @@ class FZF:
stdout: [TODO:attribute]
"""
- if not os.getenv("FZF_DEFAULT_OPTS"):
- os.environ["FZF_DEFAULT_OPTS"] = FZF_DEFAULT_OPTS
+ # if not os.getenv("FZF_DEFAULT_OPTS"):
+ # os.environ["FZF_DEFAULT_OPTS"] = FZF_DEFAULT_OPTS
FZF_EXECUTABLE = shutil.which("fzf")
default_options = [
"--cycle",
@@ -157,10 +157,18 @@ class FZF:
Returns:
[TODO:return]
"""
+ _HEADER_COLOR = os.environ.get("FASTANIME_HEADER_COLOR", "215,0,95").split(",")
+ header = os.environ.get("FASTANIME_HEADER_ASCII_ART", HEADER)
+ header = "\n".join(
+ [
+ f"\033[38;2;{_HEADER_COLOR[0]};{_HEADER_COLOR[1]};{_HEADER_COLOR[2]};m{line}\033[0m"
+ for line in header.split("\n")
+ ]
+ )
_commands = [
*self.default_options,
"--header",
- HEADER,
+ header,
"--header-first",
"--prompt",
f"{prompt.title()}: ",
@@ -182,6 +190,7 @@ class FZF:
print(info)
input("Enter to try again")
return self.run(fzf_input, prompt, header, preview, expect, validator)
+ # os.environ["FZF_DEFAULT_OPTS"] = ""
return result
From bafd04b78882e51b84983c5d57076408b4e37cff Mon Sep 17 00:00:00 2001
From: benex
Date: Tue, 19 Nov 2024 14:07:01 +0300
Subject: [PATCH 71/87] chore: update lock file
---
uv.lock | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/uv.lock b/uv.lock
index 2422255..74ec73b 100644
--- a/uv.lock
+++ b/uv.lock
@@ -170,7 +170,7 @@ wheels = [
[[package]]
name = "fastanime"
-version = "2.7.9"
+version = "2.8.0"
source = { editable = "." }
dependencies = [
{ name = "click" },
From 0b1a27b2234c44e8c4941b366bc9b411cfbfcd02 Mon Sep 17 00:00:00 2001
From: benex
Date: Tue, 19 Nov 2024 14:08:42 +0300
Subject: [PATCH 72/87] chore: bump version (v2.8.1)
---
fastanime/__init__.py | 2 +-
pyproject.toml | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/fastanime/__init__.py b/fastanime/__init__.py
index 3affbe9..7193d36 100644
--- a/fastanime/__init__.py
+++ b/fastanime/__init__.py
@@ -6,7 +6,7 @@ if sys.version_info < (3, 10):
) # noqa: F541
-__version__ = "v2.8.0"
+__version__ = "v2.8.1"
APP_NAME = "FastAnime"
AUTHOR = "Benex254"
diff --git a/pyproject.toml b/pyproject.toml
index 74e149b..ad02445 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "fastanime"
-version = "2.8.0"
+version = "2.8.1"
description = "A browser anime site experience from the terminal"
license = "UNLICENSE"
readme = "README.md"
From 050ba740b8201ebc7db32e4e35e02f643baaf47e Mon Sep 17 00:00:00 2001
From: she11sh0cked <22623152+she11sh0cked@users.noreply.github.com>
Date: Tue, 19 Nov 2024 15:24:55 +0100
Subject: [PATCH 73/87] fix(cli): prevent update check during completions
---
fastanime/cli/__init__.py | 2 +-
tests/test_all_commands.py | 8 ++++++++
2 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/fastanime/cli/__init__.py b/fastanime/cli/__init__.py
index 21c9159..be4c294 100644
--- a/fastanime/cli/__init__.py
+++ b/fastanime/cli/__init__.py
@@ -226,7 +226,7 @@ def run_cli(
from .config import Config
ctx.obj = Config()
- if ctx.obj.check_for_updates:
+ if ctx.obj.check_for_updates and ctx.invoked_subcommand != "completions":
from .app_updater import check_for_updates
print("Checking for updates...")
diff --git a/tests/test_all_commands.py b/tests/test_all_commands.py
index b508761..0a129b7 100644
--- a/tests/test_all_commands.py
+++ b/tests/test_all_commands.py
@@ -1,5 +1,6 @@
import pytest
from click.testing import CliRunner
+from unittest.mock import patch
from fastanime.cli import run_cli
@@ -147,3 +148,10 @@ def test_anilist_upcoming_help(runner: CliRunner):
def test_anilist_watching_help(runner: CliRunner):
result = runner.invoke(run_cli, ["anilist", "watching", "--help"])
assert result.exit_code == 0
+
+
+def test_check_for_updates_not_called_on_completions(runner):
+ with patch('fastanime.cli.app_updater.check_for_updates') as mock_check_for_updates:
+ result = runner.invoke(run_cli, ["completions"])
+ assert result.exit_code == 0
+ mock_check_for_updates.assert_not_called()
From 8f2795843aa089e8266cdb28355edf90df6d29aa Mon Sep 17 00:00:00 2001
From: Benex <81157281+Benex254@users.noreply.github.com>
Date: Tue, 19 Nov 2024 19:03:53 +0300
Subject: [PATCH 74/87] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index eca3e60..fc9f29c 100644
--- a/README.md
+++ b/README.md
@@ -1440,7 +1440,7 @@ For inquiries, join our [Discord Server](https://discord.gg/HBEmAwvbHV).
## Supporting the Project
More pr's less issues 🙃
-
+Those who contribute at least five times will be able to make changes to the repo without my review.
Show your support by starring the GitHub repository or [buying me a coffee](https://ko-fi.com/benex254).
## Disclaimer
From e3437e066a1d6e9ac091772e71e088520ff9de7b Mon Sep 17 00:00:00 2001
From: Benex <81157281+Benex254@users.noreply.github.com>
Date: Tue, 19 Nov 2024 19:18:49 +0300
Subject: [PATCH 75/87] Update README.md
---
README.md | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/README.md b/README.md
index fc9f29c..f6902b5 100644
--- a/README.md
+++ b/README.md
@@ -25,6 +25,15 @@

+
+
+ Screenshots
+
+
+ 
+
+
+
fzf mode
From 886bc4d01189fe3be49f7e615b04691464a97831 Mon Sep 17 00:00:00 2001
From: Benex <81157281+Benex254@users.noreply.github.com>
Date: Tue, 19 Nov 2024 19:23:51 +0300
Subject: [PATCH 76/87] Update README.md
---
README.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index f6902b5..e6d8597 100644
--- a/README.md
+++ b/README.md
@@ -27,7 +27,7 @@
- Screenshots
+ My Rice

@@ -1450,6 +1450,7 @@ For inquiries, join our [Discord Server](https://discord.gg/HBEmAwvbHV).
## Supporting the Project
More pr's less issues 🙃
Those who contribute at least five times will be able to make changes to the repo without my review.
+
Show your support by starring the GitHub repository or [buying me a coffee](https://ko-fi.com/benex254).
## Disclaimer
From 21704cbbea25b70a8affa9fe4c545d7457d9178a Mon Sep 17 00:00:00 2001
From: Gand0rf
Date: Tue, 19 Nov 2024 14:00:06 -0500
Subject: [PATCH 77/87] Updated chafa call
---
fastanime/cli/utils/print_img.py | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/fastanime/cli/utils/print_img.py b/fastanime/cli/utils/print_img.py
index 836ab56..e2f5879 100644
--- a/fastanime/cli/utils/print_img.py
+++ b/fastanime/cli/utils/print_img.py
@@ -24,4 +24,10 @@ def print_img(url: str):
print("Error fetching image")
return
img_bytes = res.content
+ """
+ Change made in call to chafa. Chafa dev dropped abilty
+ to pull from urls. Keeping old line here just in case.
+
subprocess.run([EXECUTABLE, url, "--size=15x15"], input=img_bytes)
+ """
+ subprocess.run([EXECUTABLE, "--size=15x15"], input=img_bytes)
From 67b59305c43a562f389fe3edd84a114916ee78b1 Mon Sep 17 00:00:00 2001
From: Benex <81157281+Benex254@users.noreply.github.com>
Date: Thu, 21 Nov 2024 07:43:53 +0300
Subject: [PATCH 78/87] Update README.md
---
README.md | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/README.md b/README.md
index e6d8597..ecc2eb1 100644
--- a/README.md
+++ b/README.md
@@ -101,6 +101,13 @@
The app can run wherever python can run. So all you need to have is python installed on your device.
On android you can use [termux](https://github.com/termux/termux-app).
If you have any difficulty consult for help on the [discord channel](https://discord.gg/HBEmAwvbHV)
+### Installation on nixos
+
+
+
+```bash
+nix profile install github:Benex254/fastanime
+```
### Installation using your favourite package manager
From a17588d02cf2fa11a56cff4774af78c8d4122e38 Mon Sep 17 00:00:00 2001
From: benex
Date: Thu, 21 Nov 2024 09:40:15 +0300
Subject: [PATCH 79/87] fix(interfaces): episode previews
---
fastanime/cli/interfaces/utils.py | 34 ++++++++++++++++++++-----------
1 file changed, 22 insertions(+), 12 deletions(-)
diff --git a/fastanime/cli/interfaces/utils.py b/fastanime/cli/interfaces/utils.py
index 4f28e8e..dc412b6 100644
--- a/fastanime/cli/interfaces/utils.py
+++ b/fastanime/cli/interfaces/utils.py
@@ -103,7 +103,6 @@ def write_search_results(
titles: sanitized anime titles
workers:number of threads to use defaults to as many as possible
"""
- # NOTE: Will probably make this a configuraable option
# use concurency to download and write as fast as possible
with concurrent.futures.ThreadPoolExecutor(max_workers=workers) as executor:
future_to_task = {}
@@ -285,7 +284,7 @@ def get_fzf_episode_preview(
anilist_results: the anilist results from an anilist action
"""
- HEADER_COLOR = 215, 0, 95
+ # HEADER_COLOR = 215, 0, 95
import re
def _worker():
@@ -293,18 +292,16 @@ def get_fzf_episode_preview(
with concurrent.futures.ThreadPoolExecutor(max_workers=workers) as executor:
# load the jobs
future_to_url = {}
+
for episode in episodes:
episode_title = ""
image_url = ""
for episode_detail in anilist_result["streamingEpisodes"]:
- if re.match(f"Episode {episode} ", episode_detail["title"]):
+ if re.match(f".*Episode {episode} .*", episode_detail["title"]):
episode_title = episode_detail["title"]
image_url = episode_detail["thumbnail"]
if episode_title and image_url:
- # actual link to download image from
- if not image_url:
- continue
future_to_url[
executor.submit(save_image_from_url, image_url, episode)
] = image_url
@@ -315,13 +312,25 @@ def get_fzf_episode_preview(
echo -n -e "{get_true_fg("─",*SEPARATOR_COLOR,bold=False)}"
((ll++))
done
- echo "{get_true_fg('Anime Title:',*HEADER_COLOR)} {(anilist_result['title']['romaji'] or anilist_result['title']['english']).replace('"',SINGLE_QUOTE)}"
- echo "{get_true_fg('Episode Title:',*HEADER_COLOR)} {str(episode_title).replace('"',SINGLE_QUOTE)}"
+ echo "{get_true_fg('Anime Title(eng):',*HEADER_COLOR)} {('' or anilist_result['title']['english']).replace('"',SINGLE_QUOTE)}"
+ echo "{get_true_fg('Anime Title(jp):',*HEADER_COLOR)} {(anilist_result['title']['romaji'] or '').replace('"',SINGLE_QUOTE)}"
+
+ ll=2
+ while [ $ll -le $FZF_PREVIEW_COLUMNS ];do
+ echo -n -e "{get_true_fg("─",*SEPARATOR_COLOR,bold=False)}"
+ ((ll++))
+ done
+ echo "{str(episode_title).replace('"',SINGLE_QUOTE)}"
+ ll=2
+ while [ $ll -le $FZF_PREVIEW_COLUMNS ];do
+ echo -n -e "{get_true_fg("─",*SEPARATOR_COLOR,bold=False)}"
+ ((ll++))
+ done
"""
)
future_to_url[
- executor.submit(save_info_from_str, template, episode)
- ] = episode_title
+ executor.submit(save_info_from_str, template, str(episode))
+ ] = str(episode)
# execute the jobs
for future in concurrent.futures.as_completed(future_to_url):
@@ -371,14 +380,15 @@ def get_fzf_episode_preview(
)
else:
preview = """
+ title={}
%s
show_image_previews="%s"
if [ $show_image_previews = "true" ];then
- if [ -s %s/{} ]; then fzf-preview %s/{}
+ if [ -s %s/${title}.png ]; then fzf-preview %s/${title}.png
else echo Loading...
fi
fi
- if [ -s %s/{} ]; then source %s/{}
+ if [ -f %s/${title} ]; then source %s/${title}
else echo Loading...
fi
""" % (
From e67eeda492103b9105216324d31ce0b6ca9ebfe5 Mon Sep 17 00:00:00 2001
From: benex
Date: Thu, 21 Nov 2024 09:41:08 +0300
Subject: [PATCH 80/87] feat(updater): add ability to update on nix
---
fastanime/cli/app_updater.py | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/fastanime/cli/app_updater.py b/fastanime/cli/app_updater.py
index 907d6ad..0bb7eed 100644
--- a/fastanime/cli/app_updater.py
+++ b/fastanime/cli/app_updater.py
@@ -4,6 +4,7 @@ import shlex
import shutil
import subprocess
import sys
+import os
import requests
from rich import print
@@ -88,7 +89,14 @@ def update_app(force=False):
tag_name = release_json["tag_name"]
print("[cyan]Updating app to version %s[/]" % tag_name)
- if is_git_repo(AUTHOR, APP_NAME):
+ if os.path.exists("/nix/store") and os.path.exists("/run/current-system"):
+ NIX = shutil.which("nix")
+ if not NIX:
+ print("[red]Cannot find nix, it looks like your system is broken.[/]")
+ return False, release_json
+
+ process = subprocess.run([NIX, "profile", "upgrade", APP_NAME.lower()])
+ elif is_git_repo(AUTHOR, APP_NAME):
GIT_EXECUTABLE = shutil.which("git")
args = [
GIT_EXECUTABLE,
From defdfc5a47740cd4dba6bbbbdffbaae429a2cda6 Mon Sep 17 00:00:00 2001
From: benex
Date: Thu, 21 Nov 2024 09:41:27 +0300
Subject: [PATCH 81/87] refactor: update todo
---
fastanime/AnimeProvider.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/fastanime/AnimeProvider.py b/fastanime/AnimeProvider.py
index 51f669b..5fb7064 100644
--- a/fastanime/AnimeProvider.py
+++ b/fastanime/AnimeProvider.py
@@ -15,7 +15,7 @@ if TYPE_CHECKING:
logger = logging.getLogger(__name__)
-# TODO: improve performance of this class and add cool features like auto retry
+# TODO: add cool features like auto retry
class AnimeProvider:
"""Class that manages all anime sources adding some extra functionality to them.
Attributes:
From f70d2ac8afb0df52221647571955c0c190b462a3 Mon Sep 17 00:00:00 2001
From: benex
Date: Thu, 21 Nov 2024 09:54:20 +0300
Subject: [PATCH 82/87] feat(make_release): update to include nix files
---
make_release | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/make_release b/make_release
index 7de6b37..13d839d 100755
--- a/make_release
+++ b/make_release
@@ -5,7 +5,12 @@ VERSION=$1
[ "$VERSION" = "current" ] && fastanime --version && exit 0
sed -i "s/^version.*/version = \"$VERSION\"/" "$CLI_DIR/pyproject.toml" &&
sed -i "s/__version__.*/__version__ = \"v$VERSION\"/" "$CLI_DIR/fastanime/__init__.py" &&
- git stage "$CLI_DIR/pyproject.toml" "$CLI_DIR/fastanime/__init__.py" &&
+ sed -i "s/version = .*/version = \"$VERSION\";/" "$CLI_DIR/flake.nix" &&
+ git stage "$CLI_DIR/pyproject.toml" "$CLI_DIR/fastanime/__init__.py" "$CLI_DIR/flake.nix" &&
git commit -m "chore: bump version (v$VERSION)" &&
+ nix flake lock &&
+ uv lock &&
+ git stage "$CLI_DIR/flake.lock" "$CLI_DIR/uv.lock" &&
+ git commit -m "chore: update lock files" &&
git push &&
gh release create "v$VERSION"
From 7bc6b14b5f8bb0dc6e31a795e79f82e197236e03 Mon Sep 17 00:00:00 2001
From: benex
Date: Thu, 21 Nov 2024 10:29:00 +0300
Subject: [PATCH 83/87] docs: update config file docs
---
fastanime/cli/config.py | 70 ++++++++++++++++-------------------------
1 file changed, 27 insertions(+), 43 deletions(-)
diff --git a/fastanime/cli/config.py b/fastanime/cli/config.py
index 892ad47..ef56893 100644
--- a/fastanime/cli/config.py
+++ b/fastanime/cli/config.py
@@ -257,21 +257,7 @@ class Config(object):
# ╚═╝░░░░░╚═╝░░╚═╝╚═════╝░░░░╚═╝░░░╚═╝░░╚═╝╚═╝░░╚══╝╚═╝╚═╝░░░░░╚═╝╚══════╝ ░╚════╝░░╚════╝░╚═╝░░╚══╝╚═╝░░░░░╚═╝░╚═════╝░
#
[general]
-# well recently somebody made a post @unixporn subreddit
-# the rice contained fastanime in preview mode
-# Did not even realise you rice with it
-# or i would have cross-posted
-# 'A new way to rice'
-# and immediately one of the mods removed it
-# am not sure why though
-# cause the preview is actually pretty good looking.
-# just like you would use fastfetch or cava
-# as means to protest against this injustice i have addded
-# the following
-# for you all ricers out there
-# and be sure to post a rice with fastanime on it
-# if you also think this is unfair
-
+# Can you rice it?
# for the preview pane
preview_separator_color = {self.preview_separator_color}
@@ -284,7 +270,6 @@ header_ascii_art = {new_line.join([tab+line for line in self.header_ascii_art.sp
header_color = {self.header_color}
# to be passed to fzf
-# may break it down further for now just pass the options as is
# be sure to indent
fzf_opts = {new_line.join([tab+line for line in self.fzf_opts.split(new_line)])}
@@ -336,8 +321,8 @@ downloads_dir = {self.downloads_dir}
# whether to show a preview window when using fzf or rofi [True/False]
# the preview requires you have a commandline image viewer as documented in the README
-# this is only when usinf fzf
-# if you dont care about image previews it doesnt matter
+# this is only when using fzf or rofi
+# if you dont care about image and text previews it doesnt matter
# though its awesome
# try it and you will see
preview = {self.preview}
@@ -352,8 +337,10 @@ image_previews = {self.image_previews}
# the time to seek when using ffmpegthumbnailer [-1 to 100]
# -1 means random and is the default
-# ffmpegthumbnailer is used to generate previews and you can select at what time in the video to extract an image
+# ffmpegthumbnailer is used to generate previews
+# and you can select at what time in the video to extract an image
# random makes things quite exciting cause you never no at what time it will extract the image from
+# used by the ```fastanime downloads``` command
ffmpegthumbnailer_seek_time = {self.ffmpegthumbnailer_seek_time}
# whether to use fzf as the interface for the anilist command and others. [True/False]
@@ -438,9 +425,12 @@ continue_from_history = {self.continue_from_history}
# which history to use [local/remote]
# local history means it will just use the watch history stored locally in your device
-# the file that stores it is called watch_history.json and is stored next to your config file
-# remote means it ignores the last episode stored locally and instead uses the one in your anilist anime list
-# this config option is useful if you want to overwrite your local history or import history covered from another device or platform
+# the file that stores it is called watch_history.json
+# and is stored next to your config file
+# remote means it ignores the last episode stored locally
+# and instead uses the one in your anilist anime list
+# this config option is useful if you want to overwrite your local history
+# or import history covered from another device or platform
# since remote history will take precendence over whats available locally
preferred_history = {self.preferred_history}
@@ -468,16 +458,13 @@ auto_next = {self.auto_next}
# this is because the providers sometime use non-standard names
# that are there own preference rather than the official names
# But 99% of the time will be accurate
-# if this happens just turn of auto_select in the menus or from the commandline and manually select the correct anime title
-# and then please open an issue
-# highlighting the normalized title
-# and the title given by the provider for the anime you wished to watch
-# or even better edit this file
-# and open a pull request
-# prefrably, so you can give me a small break
-# of doing everything 😄
-# and its always nice to see people contributing
-# to projects they love and use
+# if this happens just turn off auto_select in the menus or from the commandline
+# and manually select the correct anime title
+# edit this file
+# and to the dictionary of the provider
+# the provider title (key) and their corresponding anilist names (value)
+# and then please open a pr
+# issues on the same will be ignored and then closed 😆
auto_select = {self.auto_select}
# whether to skip the opening and ending theme songs [True/False]
@@ -497,7 +484,7 @@ episode_complete_at = {self.episode_complete_at}
# whether to use python-mpv [True/False]
# to enable superior control over the player
# adding more options to it
-# Enable this one and you will be wonder
+# Enabling this option and you will ask yourself
# why you did not discover fastanime sooner 🙃
# Since you basically don't have to close the player window
# to go to the next or previous episode, switch servers,
@@ -510,13 +497,13 @@ episode_complete_at = {self.episode_complete_at}
# personally it took me quite sometime to figure it out
# this is because of how windows handles shared libraries
# so just ask when you find yourself stuck
-# or just switch to arch linux
+# or just switch to nixos 😄
use_python_mpv = {self.use_python_mpv}
# whether to use popen to get the timestamps for continue_from_history
-# implemented because popen does not work for some reason in nixos
-# if you are on nixos and you have a solution to this problem please share
+# implemented because popen does not work for some reason in nixos and apparently on mac as well
+# if you are on nixos or mac and you have a solution to this problem please share
# i will be glad to hear it 😄
# So for now ignore this option
# and anyways the new method of getting timestamps is better
@@ -543,17 +530,14 @@ format = {self.format}
# since you will miss out on some features if you use the others
player = {self.player}
-# NOTE:
-# if you have any trouble setting up your config
-# please don't be afraid to ask in our discord
-# plus if there are any errors, improvements or suggestions please tell us in the discord
-# or help us by contributing
-# we appreciate all the help we can get
-# since we may not always have the time to immediately implement the changes
#
# HOPE YOU ENJOY FASTANIME AND BE SURE TO STAR THE PROJECT ON GITHUB
# https://github.com/Benex254/FastAnime
#
+# Also join the discord server
+# where the anime tech community lives :)
+# https://discord.gg/C4rhMA4mmK
+#
"""
return current_config_state
From d763445f7268d76eebdbd7c20b05b312232f174a Mon Sep 17 00:00:00 2001
From: benex
Date: Thu, 21 Nov 2024 10:30:03 +0300
Subject: [PATCH 84/87] chore: bump version (v2.8.2)
---
fastanime/__init__.py | 2 +-
flake.nix | 2 +-
pyproject.toml | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/fastanime/__init__.py b/fastanime/__init__.py
index 7193d36..b3d80f0 100644
--- a/fastanime/__init__.py
+++ b/fastanime/__init__.py
@@ -6,7 +6,7 @@ if sys.version_info < (3, 10):
) # noqa: F541
-__version__ = "v2.8.1"
+__version__ = "v2.8.2"
APP_NAME = "FastAnime"
AUTHOR = "Benex254"
diff --git a/flake.nix b/flake.nix
index 76f47b5..3f2d81a 100644
--- a/flake.nix
+++ b/flake.nix
@@ -14,7 +14,7 @@
pythonPackages = python.pkgs;
fastanimeEnv = pythonPackages.buildPythonApplication {
pname = "fastanime";
- version = "2.8.0";
+ version = "2.8.2";
src = ./.;
diff --git a/pyproject.toml b/pyproject.toml
index ad02445..74ffa62 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "fastanime"
-version = "2.8.1"
+version = "2.8.2"
description = "A browser anime site experience from the terminal"
license = "UNLICENSE"
readme = "README.md"
From 779705310226cc913a13606a5c187ab6fb99fab1 Mon Sep 17 00:00:00 2001
From: benex
Date: Thu, 21 Nov 2024 10:30:06 +0300
Subject: [PATCH 85/87] chore: update lock files
---
uv.lock | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/uv.lock b/uv.lock
index 74ec73b..ff63f79 100644
--- a/uv.lock
+++ b/uv.lock
@@ -170,7 +170,7 @@ wheels = [
[[package]]
name = "fastanime"
-version = "2.8.0"
+version = "2.8.2"
source = { editable = "." }
dependencies = [
{ name = "click" },
From b6eebb97368230c76b199a78062810051f0649dd Mon Sep 17 00:00:00 2001
From: Benex <81157281+Benex254@users.noreply.github.com>
Date: Thu, 21 Nov 2024 10:43:19 +0300
Subject: [PATCH 86/87] Update README.md
---
README.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/README.md b/README.md
index ecc2eb1..870bc31 100644
--- a/README.md
+++ b/README.md
@@ -32,6 +32,8 @@

+
+
From 59abafbe1637d0490c50d926acde99a2ff19dea4 Mon Sep 17 00:00:00 2001
From: Benex <81157281+Benex254@users.noreply.github.com>
Date: Thu, 21 Nov 2024 13:16:56 +0300
Subject: [PATCH 87/87] Update README.md
---
README.md | 3 +++
1 file changed, 3 insertions(+)
diff --git a/README.md b/README.md
index 870bc31..bd4575b 100644
--- a/README.md
+++ b/README.md
@@ -34,6 +34,9 @@

+**Without preview images enabled:**
+
+