From 390bf91f68a1c14a34830e33ff13e21d70000c99 Mon Sep 17 00:00:00 2001 From: "guorong.zheng" <360996299@qq.com> Date: Mon, 18 Nov 2024 09:52:29 +0800 Subject: [PATCH 01/37] fix:open_empty_category change(#564) --- tkinter_ui/default.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tkinter_ui/default.py b/tkinter_ui/default.py index 0da7131..89ea30b 100644 --- a/tkinter_ui/default.py +++ b/tkinter_ui/default.py @@ -480,7 +480,7 @@ class DefaultUI: def update_open_empty_category(self): config.set( - "Settings", "update_open_empty_category", str(self.open_url_info_var.get()) + "Settings", "open_empty_category", str(self.open_empty_category_var.get()) ) def update_ipv_type(self, event): From 8a884aa34e42024341bd0ca0deaa20f0a436d91e Mon Sep 17 00:00:00 2001 From: "guorong.zheng" <360996299@qq.com> Date: Mon, 18 Nov 2024 10:24:29 +0800 Subject: [PATCH 02/37] fix:UnicodeDecodeError(#567) --- main.py | 8 ++++++-- utils/constants.py | 2 ++ utils/tools.py | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/main.py b/main.py index a75188f..428821a 100644 --- a/main.py +++ b/main.py @@ -1,5 +1,6 @@ import asyncio from utils.config import config +import utils.constants as constants from utils.channel import ( get_channel_items, append_total_data, @@ -56,8 +57,11 @@ def show_log(): user_log_file = "output/" + ( "user_result.log" if os.path.exists("config/user_config.ini") else "result.log" ) - with open(user_log_file, "r", encoding="utf-8") as file: - content = file.read() + if os.path.exists(user_log_file): + with open(user_log_file, "r", encoding="utf-8") as file: + content = file.read() + else: + content = constants.waiting_tip return render_template_string( "
{{ content }}", content=content, diff --git a/utils/constants.py b/utils/constants.py index 97a667b..56e4733 100644 --- a/utils/constants.py +++ b/utils/constants.py @@ -94,3 +94,5 @@ ipv6_proxy = "http://www.ipv6proxy.net/go.php?u=" foodie_url = "http://www.foodieguide.com/iptvsearch/" foodie_hotel_url = "http://www.foodieguide.com/iptvsearch/hoteliptv.php" + +waiting_tip = "🔍️正在更新,请耐心等待更新完成..." diff --git a/utils/tools.py b/utils/tools.py index 8ed74d8..b370451 100644 --- a/utils/tools.py +++ b/utils/tools.py @@ -392,7 +392,7 @@ def get_result_file_content(show_result=False): with open(user_final_file, "r", encoding="utf-8") as file: content = file.read() else: - content = "🔍️正在更新,请耐心等待更新完成..." + content = constants.waiting_tip return render_template_string( "
{{ content }}", content=content, From 912e13c72789bdf2cb2625c031bdd172d4c156a3 Mon Sep 17 00:00:00 2001 From: "guorong.zheng" <360996299@qq.com> Date: Mon, 18 Nov 2024 10:58:00 +0800 Subject: [PATCH 03/37] feat:arm v7/v8 (#562) --- .github/workflows/main.yml | 4 ++-- Pipfile | 4 +++- README.md | 4 ++-- README_en.md | 4 ++-- docs/tutorial.md | 2 +- docs/tutorial_en.md | 2 +- 6 files changed, 11 insertions(+), 9 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index d50a29a..0eed1ae 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -65,8 +65,8 @@ jobs: run: pip3 install --user pipenv - name: Install dependecies run: pipenv --python 3.8 && pipenv install - - name: Build - run: pipenv run build + - name: Update + run: pipenv run dev - name: Commit and push if changed run: | git config --local user.email "github-actions[bot]@users.noreply.github.com" diff --git a/Pipfile b/Pipfile index c7fd52d..5950953 100644 --- a/Pipfile +++ b/Pipfile @@ -4,9 +4,11 @@ url = "https://mirrors.aliyun.com/pypi/simple" verify_ssl = true [scripts] -build = "python main.py" +dev = "python main.py" ui = "python tkinter_ui/tkinter_ui.py" multicast_tmp = "python updates/multicast/update_tmp.py" +docker_build_driver = "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7,linux/arm/v8 --build-arg APP_WORKDIR=/tv-driver --build-arg INSTALL_CHROMIUM=true -t guovern/tv-driver . --push" +docker_build_requests = "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7,linux/arm/v8 --build-arg APP_WORKDIR=/tv-requests -t guovern/tv-requests . --push" [dev-packages] diff --git a/README.md b/README.md index b5f73fa..cb02e9e 100644 --- a/README.md +++ b/README.md @@ -91,7 +91,7 @@ - ✅ 接口测速验效,响应时间、分辨率优先级,过滤无效接口 - ✅ 偏好设置:IPv6、接口来源排序优先级与数量配置、接口白名单 - ✅ 定时执行,北京时间每日 6:00 与 18:00 执行更新 -- ✅ 支持多种运行方式:工作流、命令行、GUI 软件、Docker(amd64/arm64) +- ✅ 支持多种运行方式:工作流、命令行、GUI 软件、Docker(amd64/arm64/arm v7/arm v8) - ✨ 更多功能请见[配置参数](./docs/config.md) ## 🔗 最新结果 @@ -133,7 +133,7 @@ pipenv install ``` ```python -pipenv run build +pipenv run dev ``` ### 方式三:GUI 软件 diff --git a/README_en.md b/README_en.md index 4c84e61..2a9deb4 100644 --- a/README_en.md +++ b/README_en.md @@ -91,7 +91,7 @@ - ✅ Interface speed testing and verification, with priority on response time and resolution, filtering out ineffective interfaces - ✅ Preferences: IPv6, priority and quantity of interface source sorting, and interface whitelist - ✅ Scheduled execution at 6:00 AM and 18:00 PM Beijing time daily -- ✅ Supports various execution methods: workflows, command line, GUI software, Docker(amd64/arm64) +- ✅ Supports various execution methods: workflows, command line, GUI software, Docker(amd64/arm64/arm v7/arm v8) - ✨ For more features, see [Config parameter](./docs/config_en.md) ## 🔗 Latest results @@ -133,7 +133,7 @@ pipenv install ``` ```python -pipenv run build +pipenv run dev ``` ### Method 3: GUI Software diff --git a/docs/tutorial.md b/docs/tutorial.md index 8b7d24d..f62b18a 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -176,7 +176,7 @@ https://mirror.ghproxy.com/raw.githubusercontent.com/您的github用户名/仓 项目目录下打开终端 CMD 依次运行以下命令: pip install pipenv pipenv install -pipenv run build +pipenv run dev ``` ### 方式三:GUI 软件 diff --git a/docs/tutorial_en.md b/docs/tutorial_en.md index 24f29df..5a785a0 100644 --- a/docs/tutorial_en.md +++ b/docs/tutorial_en.md @@ -173,7 +173,7 @@ Please download and install Python from the official site. During installation, Open a CMD terminal in the project directory and run the following commands in sequence: pip install pipenv pipenv install -pipenv run build +pipenv run dev ``` ### Method 3: GUI Software From cae851ad843e6702fdbc580d8b5e292fbf650617 Mon Sep 17 00:00:00 2001 From: "guorong.zheng" <360996299@qq.com> Date: Mon, 18 Nov 2024 18:06:19 +0800 Subject: [PATCH 04/37] feat:yt_dlp --- .github/workflows/main.yml | 6 +- .github/workflows/release.yml | 4 +- Pipfile | 3 +- Pipfile.lock | 779 ++++++++++++++++------------------ main.py | 2 +- utils/channel.py | 53 +-- utils/speed.py | 113 ++--- 7 files changed, 447 insertions(+), 513 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 0eed1ae..49aac0b 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -24,10 +24,10 @@ jobs: - uses: actions/checkout@v3 with: ref: ${{ env.BRANCH_NAME }} - - name: Run with setup-python 3.8 + - name: Run with setup-python 3.13 uses: actions/setup-python@v4 with: - python-version: '3.8' + python-version: '3.13' update-environment: true cache: 'pipenv' - name: Check open_driver config @@ -64,7 +64,7 @@ jobs: - name: Install pipenv run: pip3 install --user pipenv - name: Install dependecies - run: pipenv --python 3.8 && pipenv install + run: pipenv --python 3.13 && pipenv install - name: Update run: pipenv run dev - name: Commit and push if changed diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8b2960e..bd6d1df 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -14,7 +14,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v4 with: - python-version: '3.8' + python-version: '3.13' update-environment: true cache: 'pipenv' @@ -22,7 +22,7 @@ jobs: run: pip3 install --user pipenv - name: Install dependencies with pipenv - run: pipenv --python 3.8 && pipenv install + run: pipenv --python 3.13 && pipenv install - name: Install PyInstaller run: pipenv install pyinstaller diff --git a/Pipfile b/Pipfile index 5950953..52b44ce 100644 --- a/Pipfile +++ b/Pipfile @@ -25,6 +25,7 @@ opencc-python-reimplemented = "*" fake-useragent = "*" gunicorn = "*" pillow = "*" +yt-dlp = "*" [requires] -python_version = "3.8" +python_version = "3.13" diff --git a/Pipfile.lock b/Pipfile.lock index 7ecbb29..553f137 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,11 +1,11 @@ { "_meta": { "hash": { - "sha256": "4994f2cbe9741de06fc53c1d04fed07e22eb5dd155a564ab324e9bbe54008c81" + "sha256": "d9a281a6c42302c03ab3f3bb4665c2fd6a2913d2d42269ec3eca044053a2523c" }, "pipfile-spec": 6, "requires": { - "python_version": "3.8" + "python_version": "3.13" }, "sources": [ { @@ -26,101 +26,86 @@ }, "aiohttp": { "hashes": [ - "sha256:007ec22fbc573e5eb2fb7dec4198ef8f6bf2fe4ce20020798b2eb5d0abda6138", - "sha256:00819de9e45d42584bed046314c40ea7e9aea95411b38971082cad449392b08c", - "sha256:01948b1d570f83ee7bbf5a60ea2375a89dfb09fd419170e7f5af029510033d24", - "sha256:038f514fe39e235e9fef6717fbf944057bfa24f9b3db9ee551a7ecf584b5b480", - "sha256:03a42ac7895406220124c88911ebee31ba8b2d24c98507f4a8bf826b2937c7f2", - "sha256:05646ebe6b94cc93407b3bf34b9eb26c20722384d068eb7339de802154d61bc5", - "sha256:0631dd7c9f0822cc61c88586ca76d5b5ada26538097d0f1df510b082bad3411a", - "sha256:0b00807e2605f16e1e198f33a53ce3c4523114059b0c09c337209ae55e3823a8", - "sha256:0e1b370d8007c4ae31ee6db7f9a2fe801a42b146cec80a86766e7ad5c4a259cf", - "sha256:15ecd889a709b0080f02721255b3f80bb261c2293d3c748151274dfea93ac871", - "sha256:1b66ccafef7336a1e1f0e389901f60c1d920102315a56df85e49552308fc0486", - "sha256:1bbb122c557a16fafc10354b9d99ebf2f2808a660d78202f10ba9d50786384b9", - "sha256:1eb89d3d29adaf533588f209768a9c02e44e4baf832b08118749c5fad191781d", - "sha256:258c5dd01afc10015866114e210fb7365f0d02d9d059c3c3415382ab633fcbcb", - "sha256:2609e9ab08474702cc67b7702dbb8a80e392c54613ebe80db7e8dbdb79837c68", - "sha256:274cfa632350225ce3fdeb318c23b4a10ec25c0e2c880eff951a3842cf358ac1", - "sha256:28529e08fde6f12eba8677f5a8608500ed33c086f974de68cc65ab218713a59d", - "sha256:2b606353da03edcc71130b52388d25f9a30a126e04caef1fd637e31683033abd", - "sha256:30ca7c3b94708a9d7ae76ff281b2f47d8eaf2579cd05971b5dc681db8caac6e1", - "sha256:333cf6cf8e65f6a1e06e9eb3e643a0c515bb850d470902274239fea02033e9a8", - "sha256:3455522392fb15ff549d92fbf4b73b559d5e43dc522588f7eb3e54c3f38beee7", - "sha256:362f641f9071e5f3ee6f8e7d37d5ed0d95aae656adf4ef578313ee585b585959", - "sha256:3bcd391d083f636c06a68715e69467963d1f9600f85ef556ea82e9ef25f043f7", - "sha256:3dffb610a30d643983aeb185ce134f97f290f8935f0abccdd32c77bed9388b42", - "sha256:3fe407bf93533a6fa82dece0e74dbcaaf5d684e5a51862887f9eaebe6372cd79", - "sha256:413251f6fcf552a33c981c4709a6bba37b12710982fec8e558ae944bfb2abd38", - "sha256:438cd072f75bb6612f2aca29f8bd7cdf6e35e8f160bc312e49fbecab77c99e3a", - "sha256:4470c73c12cd9109db8277287d11f9dd98f77fc54155fc71a7738a83ffcc8ea8", - "sha256:45c3b868724137f713a38376fef8120c166d1eadd50da1855c112fe97954aed8", - "sha256:486f7aabfa292719a2753c016cc3a8f8172965cabb3ea2e7f7436c7f5a22a151", - "sha256:4f05e9727ce409358baa615dbeb9b969db94324a79b5a5cea45d39bdb01d82e6", - "sha256:50aed5155f819873d23520919e16703fc8925e509abbb1a1491b0087d1cd969e", - "sha256:50edbcad60d8f0e3eccc68da67f37268b5144ecc34d59f27a02f9611c1d4eec7", - "sha256:54ca74df1be3c7ca1cf7f4c971c79c2daf48d9aa65dea1a662ae18926f5bc8ce", - "sha256:578a4b875af3e0daaf1ac6fa983d93e0bbfec3ead753b6d6f33d467100cdc67b", - "sha256:597a079284b7ee65ee102bc3a6ea226a37d2b96d0418cc9047490f231dc09fe8", - "sha256:59bb3c54aa420521dc4ce3cc2c3fe2ad82adf7b09403fa1f48ae45c0cbde6628", - "sha256:5c6a5b8c7926ba5d8545c7dd22961a107526562da31a7a32fa2456baf040939f", - "sha256:64f6c17757251e2b8d885d728b6433d9d970573586a78b78ba8929b0f41d045a", - "sha256:679abe5d3858b33c2cf74faec299fda60ea9de62916e8b67e625d65bf069a3b7", - "sha256:741a46d58677d8c733175d7e5aa618d277cd9d880301a380fd296975a9cdd7bc", - "sha256:7789050d9e5d0c309c706953e5e8876e38662d57d45f936902e176d19f1c58ab", - "sha256:77abf6665ae54000b98b3c742bc6ea1d1fb31c394bcabf8b5d2c1ac3ebfe7f3b", - "sha256:79019094f87c9fb44f8d769e41dbb664d6e8fcfd62f665ccce36762deaa0e911", - "sha256:7b06b7843929e41a94ea09eb1ce3927865387e3e23ebe108e0d0d09b08d25be9", - "sha256:7e338c0523d024fad378b376a79faff37fafb3c001872a618cde1d322400a572", - "sha256:7ea7ffc6d6d6f8a11e6f40091a1040995cdff02cfc9ba4c2f30a516cb2633554", - "sha256:8105fd8a890df77b76dd3054cddf01a879fc13e8af576805d667e0fa0224c35d", - "sha256:84afcdea18eda514c25bc68b9af2a2b1adea7c08899175a51fe7c4fb6d551257", - "sha256:9294bbb581f92770e6ed5c19559e1e99255e4ca604a22c5c6397b2f9dd3ee42c", - "sha256:93429602396f3383a797a2a70e5f1de5df8e35535d7806c9f91df06f297e109b", - "sha256:9627cc1a10c8c409b5822a92d57a77f383b554463d1884008e051c32ab1b3742", - "sha256:998f3bd3cfc95e9424a6acd7840cbdd39e45bc09ef87533c006f94ac47296090", - "sha256:9c72109213eb9d3874f7ac8c0c5fa90e072d678e117d9061c06e30c85b4cf0e6", - "sha256:9fc1500fd2a952c5c8e3b29aaf7e3cc6e27e9cfc0a8819b3bce48cc1b849e4cc", - "sha256:a3f00003de6eba42d6e94fabb4125600d6e484846dbf90ea8e48a800430cc142", - "sha256:a45d85cf20b5e0d0aa5a8dca27cce8eddef3292bc29d72dcad1641f4ed50aa16", - "sha256:a7d8d14fe962153fc681f6366bdec33d4356f98a3e3567782aac1b6e0e40109a", - "sha256:a8fa23fe62c436ccf23ff930149c047f060c7126eae3ccea005f0483f27b2e28", - "sha256:aa6658732517ddabe22c9036479eabce6036655ba87a0224c612e1ae6af2087e", - "sha256:aafc8ee9b742ce75044ae9a4d3e60e3d918d15a4c2e08a6c3c3e38fa59b92d94", - "sha256:ab5a5a0c7a7991d90446a198689c0535be89bbd6b410a1f9a66688f0880ec026", - "sha256:acd48d5b80ee80f9432a165c0ac8cbf9253eaddb6113269a5e18699b33958dbb", - "sha256:ad7593bb24b2ab09e65e8a1d385606f0f47c65b5a2ae6c551db67d6653e78c28", - "sha256:baa42524a82f75303f714108fea528ccacf0386af429b69fff141ffef1c534f9", - "sha256:bdfcf6443637c148c4e1a20c48c566aa694fa5e288d34b20fcdc58507882fed3", - "sha256:be7443669ae9c016b71f402e43208e13ddf00912f47f623ee5994e12fc7d4b3f", - "sha256:c02a30b904282777d872266b87b20ed8cc0d1501855e27f831320f471d54d983", - "sha256:c1277cd707c465cd09572a774559a3cc7c7a28802eb3a2a9472588f062097205", - "sha256:c30a0eafc89d28e7f959281b58198a9fa5e99405f716c0289b7892ca345fe45f", - "sha256:c5ce2ce7c997e1971b7184ee37deb6ea9922ef5163c6ee5aa3c274b05f9e12fa", - "sha256:c823bc3971c44ab93e611ab1a46b1eafeae474c0c844aff4b7474287b75fe49c", - "sha256:ce0cdc074d540265bfeb31336e678b4e37316849d13b308607efa527e981f5c2", - "sha256:d1720b4f14c78a3089562b8875b53e36b51c97c51adc53325a69b79b4b48ebcb", - "sha256:d183cf9c797a5291e8301790ed6d053480ed94070637bfaad914dd38b0981f67", - "sha256:d9010c31cd6fa59438da4e58a7f19e4753f7f264300cd152e7f90d4602449762", - "sha256:d9e5e4a85bdb56d224f412d9c98ae4cbd032cc4f3161818f692cd81766eee65a", - "sha256:da1dee8948d2137bb51fbb8a53cce6b1bcc86003c6b42565f008438b806cccd8", - "sha256:df9270660711670e68803107d55c2b5949c2e0f2e4896da176e1ecfc068b974a", - "sha256:e00e3505cd80440f6c98c6d69269dcc2a119f86ad0a9fd70bccc59504bebd68a", - "sha256:e48d5021a84d341bcaf95c8460b152cfbad770d28e5fe14a768988c461b821bc", - "sha256:e7f8b04d83483577fd9200461b057c9f14ced334dcb053090cea1da9c8321a91", - "sha256:edfe3341033a6b53a5c522c802deb2079eee5cbfbb0af032a55064bd65c73a23", - "sha256:ef9c33cc5cbca35808f6c74be11eb7f5f6b14d2311be84a15b594bd3e58b5527", - "sha256:f2d4324a98062be0525d16f768a03e0bbb3b9fe301ceee99611dc9a7953124e6", - "sha256:f3935f82f6f4a3820270842e90456ebad3af15810cf65932bd24da4463bc0a4c", - "sha256:f614ab0c76397661b90b6851a030004dac502e48260ea10f2441abd2207fbcc7", - "sha256:f7db54c7914cc99d901d93a34704833568d86c20925b2762f9fa779f9cd2e70f", - "sha256:fbc6264158392bad9df19537e872d476f7c57adf718944cc1e4495cbabf38e2a", - "sha256:fe2fb38c2ed905a2582948e2de560675e9dfbee94c6d5ccdb1301c6d0a5bf092", - "sha256:ffe595f10566f8276b76dc3a11ae4bb7eba1aac8ddd75811736a15b0d5311414" + "sha256:08ebe7a1d6c1e5ca766d68407280d69658f5f98821c2ba6c41c63cabfed159af", + "sha256:0a90a0dc4b054b5af299a900bf950fe8f9e3e54322bc405005f30aa5cacc5c98", + "sha256:0cba0b8d25aa2d450762f3dd6df85498f5e7c3ad0ddeb516ef2b03510f0eea32", + "sha256:0ebdf5087e2ce903d8220cc45dcece90c2199ae4395fd83ca616fcc81010db2c", + "sha256:10a5f91c319d9d4afba812f72984816b5fcd20742232ff7ecc1610ffbf3fc64d", + "sha256:122768e3ae9ce74f981b46edefea9c6e5a40aea38aba3ac50168e6370459bf20", + "sha256:14eb6c628432720e41b4fab1ada879d56cfe7034159849e083eb536b4c2afa99", + "sha256:177b000efaf8d2f7012c649e8aee5b0bf488677b1162be5e7511aa4f9d567607", + "sha256:1c2496182e577042e0e07a328d91c949da9e77a2047c7291071e734cd7a6e780", + "sha256:1e33a7eddcd07545ccf5c3ab230f60314a17dc33e285475e8405e26e21f02660", + "sha256:2793d3297f3e49015140e6d3ea26142c967e07998e2fb00b6ee8d041138fbc4e", + "sha256:2914061f5ca573f990ec14191e6998752fa8fe50d518e3405410353c3f44aa5d", + "sha256:2adb967454e10e69478ba4a8d8afbba48a7c7a8619216b7c807f8481cc66ddfb", + "sha256:2b02a68b9445c70d7f5c8b578c5f5e5866b1d67ca23eb9e8bc8658ae9e3e2c74", + "sha256:3129151378f858cdc4a0a4df355c9a0d060ab49e2eea7e62e9f085bac100551b", + "sha256:32334f35824811dd20a12cc90825d000e6b50faaeaa71408d42269151a66140d", + "sha256:33af11eca7bb0f5c6ffaf5e7d9d2336c2448f9c6279b93abdd6f3c35f9ee321f", + "sha256:34f37c59b12bc3afc52bab6fcd9cd3be82ff01c4598a84cbea934ccb3a9c54a0", + "sha256:3666c750b73ce463a413692e3a57c60f7089e2d9116a2aa5a0f0eaf2ae325148", + "sha256:374baefcb1b6275f350da605951f5f02487a9bc84a574a7d5b696439fabd49a3", + "sha256:382f853516664d2ebfc75dc01da4a10fdef5edcb335fe7b45cf471ce758ecb18", + "sha256:3b1f4844909321ef2c1cee50ddeccbd6018cd8c8d1ddddda3f553e94a5859497", + "sha256:3f617a48b70f4843d54f52440ea1e58da6bdab07b391a3a6aed8d3b311a4cc04", + "sha256:435f7a08d8aa42371a94e7c141205a9cb092ba551084b5e0c57492e6673601a3", + "sha256:44b69c69c194ffacbc50165911cf023a4b1b06422d1e1199d3aea82eac17004e", + "sha256:486273d3b5af75a80c31c311988931bdd2a4b96a74d5c7f422bad948f99988ef", + "sha256:4a23475d8d5c56e447b7752a1e2ac267c1f723f765e406c81feddcd16cdc97bc", + "sha256:4c979fc92aba66730b66099cd5becb42d869a26c0011119bc1c2478408a8bf7a", + "sha256:4d7fad8c456d180a6d2f44c41cfab4b80e2e81451815825097db48b8293f59d5", + "sha256:50e0aee4adc9abcd2109c618a8d1b2c93b85ac277b24a003ab147d91e068b06d", + "sha256:556564d89e2f4a6e8fe000894c03e4e84cf0b6cfa5674e425db122633ee244d1", + "sha256:5587da333b7d280a312715b843d43e734652aa382cba824a84a67c81f75b338b", + "sha256:57993f406ce3f114b2a6756d7809be3ffd0cc40f33e8f8b9a4aa1b027fd4e3eb", + "sha256:5d6e069b882c1fdcbe5577dc4be372eda705180197140577a4cddb648c29d22e", + "sha256:5d878a0186023ac391861958035174d0486f3259cabf8fd94e591985468da3ea", + "sha256:5d90b5a3b0f32a5fecf5dd83d828713986c019585f5cddf40d288ff77f366615", + "sha256:5e9a766c346b2ed7e88937919d84ed64b4ef489dad1d8939f806ee52901dc142", + "sha256:64e8f5178958a9954043bc8cd10a5ae97352c3f2fc99aa01f2aebb0026010910", + "sha256:66e58a2e8c7609a3545c4b38fb8b01a6b8346c4862e529534f7674c5265a97b8", + "sha256:68d1f46f9387db3785508f5225d3acbc5825ca13d9c29f2b5cce203d5863eb79", + "sha256:6ad9a7d2a3a0f235184426425f80bd3b26c66b24fd5fddecde66be30c01ebe6e", + "sha256:6e8e19a80ba194db5c06915a9df23c0c06e0e9ca9a4db9386a6056cca555a027", + "sha256:73a664478ae1ea011b5a710fb100b115ca8b2146864fa0ce4143ff944df714b8", + "sha256:766d0ebf8703d28f854f945982aa09224d5a27a29594c70d921c43c3930fe7ac", + "sha256:783741f534c14957fbe657d62a34b947ec06db23d45a2fd4a8aeb73d9c84d7e6", + "sha256:79efd1ee3827b2f16797e14b1e45021206c3271249b4d0025014466d416d7413", + "sha256:83a70e22e0f6222effe7f29fdeba6c6023f9595e59a0479edacfbd7de4b77bb7", + "sha256:85de9904bc360fd29a98885d2bfcbd4e02ab33c53353cb70607f2bea2cb92468", + "sha256:8d954ba0eae7f33884d27dc00629ca4389d249eb8d26ca07c30911257cae8c96", + "sha256:9075313f8e41b481e4cb10af405054564b0247dc335db5398ed05f8ec38787e2", + "sha256:97fba98fc5d9ccd3d33909e898d00f2494d6a9eec7cbda3d030632e2c8bb4d00", + "sha256:994cb893936dd2e1803655ae8667a45066bfd53360b148e22b4e3325cc5ea7a3", + "sha256:9aa4e68f1e4f303971ec42976fb170204fb5092de199034b57199a1747e78a2d", + "sha256:9b6d15adc9768ff167614ca853f7eeb6ee5f1d55d5660e3af85ce6744fed2b82", + "sha256:9bbb2dbc2701ab7e9307ca3a8fa4999c5b28246968e0a0202a5afabf48a42e22", + "sha256:9c8d1db4f65bbc9d75b7b271d68fb996f1c8c81a525263862477d93611856c2d", + "sha256:a7b0a1618060e3f5aa73d3526ca2108a16a1b6bf86612cd0bb2ddcbef9879d06", + "sha256:afa55e863224e664a782effa62245df73fdfc55aee539bed6efacf35f6d4e4b7", + "sha256:b339d91ac9060bd6ecdc595a82dc151045e5d74f566e0864ef3f2ba0887fec42", + "sha256:b470de64d17156c37e91effc109d3b032b39867000e2c126732fe01d034441f9", + "sha256:b4ec8afd362356b8798c8caa806e91deb3f0602d8ffae8e91d2d3ced2a90c35e", + "sha256:c28c1677ea33ccb8b14330560094cc44d3ff4fad617a544fd18beb90403fe0f1", + "sha256:c681f34e2814bc6e1eef49752b338061b94a42c92734d0be9513447d3f83718c", + "sha256:cccb2937bece1310c5c0163d0406aba170a2e5fb1f0444d7b0e7fdc9bd6bb713", + "sha256:cdc6f8dce09281ae534eaf08a54f0d38612398375f28dad733a8885f3bf9b978", + "sha256:d23854e5867650d40cba54d49956aad8081452aa80b2cf0d8c310633f4f48510", + "sha256:d2d942421cf3a1d1eceae8fa192f1fbfb74eb9d3e207d35ad2696bd2ce2c987c", + "sha256:d2f991c18132f3e505c108147925372ffe4549173b7c258cf227df1c5977a635", + "sha256:d3a2bcf6c81639a165da93469e1e0aff67c956721f3fa9c0560f07dd1e505116", + "sha256:d84930b4145991214602372edd7305fc76b700220db79ac0dd57d3afd0f0a1ca", + "sha256:de3b4d5fb5d69749104b880a157f38baeea7765c93d9cd3837cedd5b84729e10", + "sha256:e57a10aacedcf24666f4c90d03e599f71d172d1c5e00dcf48205c445806745b0", + "sha256:f1d06c8fd8b453c3e553c956bd3b8395100401060430572174bb7876dd95ad49", + "sha256:f833a80d9de9307d736b6af58c235b17ef7f90ebea7b9c49cd274dec7a66a2f1", + "sha256:fb0544a0e8294a5a5e20d3cacdaaa9a911d7c0a9150f5264aef36e7d8fdfa07e", + "sha256:ff5d22eece44528023254b595c670dfcf9733ac6af74c4b6cb4f6a784dc3870c" ], "index": "aliyun", - "markers": "python_version >= '3.8'", - "version": "==3.10.10" + "markers": "python_version >= '3.9'", + "version": "==3.11.2" }, "aiosignal": { "hashes": [ @@ -139,12 +124,12 @@ }, "async-timeout": { "hashes": [ - "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f", - "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028" + "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c", + "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3" ], "index": "aliyun", - "markers": "python_version >= '3.7'", - "version": "==4.0.3" + "markers": "python_version >= '3.8'", + "version": "==5.0.1" }, "attrs": { "hashes": [ @@ -164,11 +149,11 @@ }, "blinker": { "hashes": [ - "sha256:1779309f71bf239144b9399d06ae925637cf6634cf6bd131104184531bf67c01", - "sha256:8f77b09d3bf7c795e969e9486f39c2c5e9c39d4ee07424be2bc594ece9642d83" + "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf", + "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc" ], - "markers": "python_version >= '3.8'", - "version": "==1.8.2" + "markers": "python_version >= '3.9'", + "version": "==1.9.0" }, "bs4": { "hashes": [ @@ -183,7 +168,6 @@ "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9" ], - "index": "aliyun", "markers": "python_version >= '3.6'", "version": "==2024.8.30" }, @@ -257,7 +241,7 @@ "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87", "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b" ], - "markers": "os_name == 'nt' and implementation_name != 'pypy'", + "markers": "python_version >= '3.8'", "version": "==1.17.1" }, "charset-normalizer": { @@ -386,17 +370,9 @@ "sha256:96e0137fb3ab6b56576b4638116d77c59f3e0565f4ea081172e4721c722afa92", "sha256:bc3a1efa0b297242dcd0757e2e83d358bcd18bda77735e493aa89a634e74c9bf" ], - "markers": "platform_system == 'Windows'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", "version": "==0.4.6" }, - "exceptiongroup": { - "hashes": [ - "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b", - "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc" - ], - "markers": "python_version < '3.11'", - "version": "==1.2.2" - }, "fake-useragent": { "hashes": [ "sha256:57415096557c8a4e23b62a375c21c55af5fd4ba30549227f562d2c4f5b60e3b3", @@ -407,12 +383,12 @@ }, "flask": { "hashes": [ - "sha256:34e815dfaa43340d1d15a5c3a02b8476004037eb4840b34910c6e21679d288f3", - "sha256:ceb27b0af3823ea2737928a4d99d125a06175b8512c445cbd9a9ce200ef76842" + "sha256:5f873c5184c897c8d9d1b05df1e3d01b14910ce69607a117bd3277098a5836ac", + "sha256:d667207822eb83f1c4b50949b1623c8fc8d51f2341d65f72e1a1815397551136" ], "index": "aliyun", - "markers": "python_version >= '3.8'", - "version": "==3.0.3" + "markers": "python_version >= '3.9'", + "version": "==3.1.0" }, "frozenlist": { "hashes": [ @@ -537,22 +513,6 @@ "markers": "python_version >= '3.6'", "version": "==3.10" }, - "importlib-metadata": { - "hashes": [ - "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b", - "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7" - ], - "markers": "python_version < '3.10'", - "version": "==8.5.0" - }, - "importlib-resources": { - "hashes": [ - "sha256:980862a1d16c9e147a59603677fa2aa5fd82b87f223b6cb870695bcfce830065", - "sha256:ac29d5f956f01d5e4bb63102a5a19957f1b9175e45649977264a1416783bb717" - ], - "markers": "python_version < '3.10'", - "version": "==6.4.5" - }, "itsdangerous": { "hashes": [ "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef", @@ -571,69 +531,70 @@ }, "markupsafe": { "hashes": [ - "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf", - "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff", - "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f", - "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3", - "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532", - "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f", - "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617", - "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df", - "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4", - "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906", - "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f", - "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4", - "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8", - "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371", - "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2", - "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465", - "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52", - "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6", - "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169", - "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad", - "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2", - "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0", - "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029", - "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f", - "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a", - "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced", - "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5", - "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c", - "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf", - "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9", - "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb", - "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad", - "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3", - "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1", - "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46", - "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc", - "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a", - "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee", - "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900", - "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5", - "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea", - "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f", - "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5", - "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e", - "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a", - "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f", - "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50", - "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a", - "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", - "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4", - "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff", - "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2", - "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46", - "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b", - "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf", - "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5", - "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5", - "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab", - "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd", - "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68" + "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", + "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", + "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0", + "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", + "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", + "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13", + "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", + "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", + "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", + "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", + "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0", + "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b", + "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579", + "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", + "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", + "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff", + "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", + "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", + "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", + "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb", + "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", + "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", + "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a", + "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", + "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a", + "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", + "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8", + "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", + "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", + "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144", + "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f", + "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", + "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", + "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", + "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", + "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158", + "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", + "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", + "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", + "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171", + "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", + "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", + "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", + "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d", + "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", + "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", + "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", + "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", + "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29", + "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", + "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", + "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c", + "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", + "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", + "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", + "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a", + "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178", + "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", + "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", + "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", + "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50" ], - "markers": "python_version >= '3.7'", - "version": "==2.1.5" + "markers": "python_version >= '3.9'", + "version": "==3.0.2" }, "multidict": { "hashes": [ @@ -751,106 +712,101 @@ }, "packaging": { "hashes": [ - "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", - "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124" + "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", + "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f" ], "markers": "python_version >= '3.8'", - "version": "==24.1" + "version": "==24.2" }, "pefile": { "hashes": [ "sha256:82e6114004b3d6911c77c3953e3838654b04511b8b66e8583db70c65998017dc", "sha256:da185cd2af68c08a6cd4481f7325ed600a88f6a813bad9dea07ab3ef73d8d8d6" ], - "markers": "sys_platform == 'win32'", + "markers": "python_full_version >= '3.6.0'", "version": "==2023.2.7" }, "pillow": { "hashes": [ - "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885", - "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea", - "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df", - "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5", - "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c", - "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d", - "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd", - "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06", - "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908", - "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a", - "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be", - "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0", - "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b", - "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80", - "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a", - "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e", - "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9", - "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696", - "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b", - "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309", - "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e", - "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab", - "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d", - "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060", - "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d", - "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d", - "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4", - "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3", - "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6", - "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb", - "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94", - "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b", - "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496", - "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0", - "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319", - "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b", - "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856", - "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef", - "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680", - "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b", - "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42", - "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e", - "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597", - "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a", - "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8", - "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3", - "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736", - "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da", - "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126", - "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd", - "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5", - "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b", - "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026", - "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b", - "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc", - "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46", - "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2", - "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c", - "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe", - "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984", - "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a", - "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70", - "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca", - "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b", - "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91", - "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3", - "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84", - "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1", - "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5", - "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be", - "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f", - "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc", - "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9", - "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e", - "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141", - "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef", - "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22", - "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27", - "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e", - "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1" + "sha256:00177a63030d612148e659b55ba99527803288cea7c75fb05766ab7981a8c1b7", + "sha256:006bcdd307cc47ba43e924099a038cbf9591062e6c50e570819743f5607404f5", + "sha256:084a07ef0821cfe4858fe86652fffac8e187b6ae677e9906e192aafcc1b69903", + "sha256:0ae08bd8ffc41aebf578c2af2f9d8749d91f448b3bfd41d7d9ff573d74f2a6b2", + "sha256:0e038b0745997c7dcaae350d35859c9715c71e92ffb7e0f4a8e8a16732150f38", + "sha256:1187739620f2b365de756ce086fdb3604573337cc28a0d3ac4a01ab6b2d2a6d2", + "sha256:16095692a253047fe3ec028e951fa4221a1f3ed3d80c397e83541a3037ff67c9", + "sha256:1a61b54f87ab5786b8479f81c4b11f4d61702830354520837f8cc791ebba0f5f", + "sha256:1c1d72714f429a521d8d2d018badc42414c3077eb187a59579f28e4270b4b0fc", + "sha256:1e2688958a840c822279fda0086fec1fdab2f95bf2b717b66871c4ad9859d7e8", + "sha256:20ec184af98a121fb2da42642dea8a29ec80fc3efbaefb86d8fdd2606619045d", + "sha256:21a0d3b115009ebb8ac3d2ebec5c2982cc693da935f4ab7bb5c8ebe2f47d36f2", + "sha256:224aaa38177597bb179f3ec87eeefcce8e4f85e608025e9cfac60de237ba6316", + "sha256:2679d2258b7f1192b378e2893a8a0a0ca472234d4c2c0e6bdd3380e8dfa21b6a", + "sha256:27a7860107500d813fcd203b4ea19b04babe79448268403172782754870dac25", + "sha256:290f2cc809f9da7d6d622550bbf4c1e57518212da51b6a30fe8e0a270a5b78bd", + "sha256:2e46773dc9f35a1dd28bd6981332fd7f27bec001a918a72a79b4133cf5291dba", + "sha256:3107c66e43bda25359d5ef446f59c497de2b5ed4c7fdba0894f8d6cf3822dafc", + "sha256:375b8dd15a1f5d2feafff536d47e22f69625c1aa92f12b339ec0b2ca40263273", + "sha256:45c566eb10b8967d71bf1ab8e4a525e5a93519e29ea071459ce517f6b903d7fa", + "sha256:499c3a1b0d6fc8213519e193796eb1a86a1be4b1877d678b30f83fd979811d1a", + "sha256:4ad70c4214f67d7466bea6a08061eba35c01b1b89eaa098040a35272a8efb22b", + "sha256:4b60c9520f7207aaf2e1d94de026682fc227806c6e1f55bba7606d1c94dd623a", + "sha256:5178952973e588b3f1360868847334e9e3bf49d19e169bbbdfaf8398002419ae", + "sha256:52a2d8323a465f84faaba5236567d212c3668f2ab53e1c74c15583cf507a0291", + "sha256:598b4e238f13276e0008299bd2482003f48158e2b11826862b1eb2ad7c768b97", + "sha256:5bd2d3bdb846d757055910f0a59792d33b555800813c3b39ada1829c372ccb06", + "sha256:5c39ed17edea3bc69c743a8dd3e9853b7509625c2462532e62baa0732163a904", + "sha256:5d203af30149ae339ad1b4f710d9844ed8796e97fda23ffbc4cc472968a47d0b", + "sha256:5ddbfd761ee00c12ee1be86c9c0683ecf5bb14c9772ddbd782085779a63dd55b", + "sha256:607bbe123c74e272e381a8d1957083a9463401f7bd01287f50521ecb05a313f8", + "sha256:61b887f9ddba63ddf62fd02a3ba7add935d053b6dd7d58998c630e6dbade8527", + "sha256:6619654954dc4936fcff82db8eb6401d3159ec6be81e33c6000dfd76ae189947", + "sha256:674629ff60030d144b7bca2b8330225a9b11c482ed408813924619c6f302fdbb", + "sha256:6ec0d5af64f2e3d64a165f490d96368bb5dea8b8f9ad04487f9ab60dc4bb6003", + "sha256:6f4dba50cfa56f910241eb7f883c20f1e7b1d8f7d91c750cd0b318bad443f4d5", + "sha256:70fbbdacd1d271b77b7721fe3cdd2d537bbbd75d29e6300c672ec6bb38d9672f", + "sha256:72bacbaf24ac003fea9bff9837d1eedb6088758d41e100c1552930151f677739", + "sha256:7326a1787e3c7b0429659e0a944725e1b03eeaa10edd945a86dead1913383944", + "sha256:73853108f56df97baf2bb8b522f3578221e56f646ba345a372c78326710d3830", + "sha256:73e3a0200cdda995c7e43dd47436c1548f87a30bb27fb871f352a22ab8dcf45f", + "sha256:75acbbeb05b86bc53cbe7b7e6fe00fbcf82ad7c684b3ad82e3d711da9ba287d3", + "sha256:8069c5179902dcdce0be9bfc8235347fdbac249d23bd90514b7a47a72d9fecf4", + "sha256:846e193e103b41e984ac921b335df59195356ce3f71dcfd155aa79c603873b84", + "sha256:8594f42df584e5b4bb9281799698403f7af489fba84c34d53d1c4bfb71b7c4e7", + "sha256:86510e3f5eca0ab87429dd77fafc04693195eec7fd6a137c389c3eeb4cfb77c6", + "sha256:8853a3bf12afddfdf15f57c4b02d7ded92c7a75a5d7331d19f4f9572a89c17e6", + "sha256:88a58d8ac0cc0e7f3a014509f0455248a76629ca9b604eca7dc5927cc593c5e9", + "sha256:8ba470552b48e5835f1d23ecb936bb7f71d206f9dfeee64245f30c3270b994de", + "sha256:8c676b587da5673d3c75bd67dd2a8cdfeb282ca38a30f37950511766b26858c4", + "sha256:8ec4a89295cd6cd4d1058a5e6aec6bf51e0eaaf9714774e1bfac7cfc9051db47", + "sha256:94f3e1780abb45062287b4614a5bc0874519c86a777d4a7ad34978e86428b8dd", + "sha256:9a0f748eaa434a41fccf8e1ee7a3eed68af1b690e75328fd7a60af123c193b50", + "sha256:a5629742881bcbc1f42e840af185fd4d83a5edeb96475a575f4da50d6ede337c", + "sha256:a65149d8ada1055029fcb665452b2814fe7d7082fcb0c5bed6db851cb69b2086", + "sha256:b3c5ac4bed7519088103d9450a1107f76308ecf91d6dabc8a33a2fcfb18d0fba", + "sha256:b4fd7bd29610a83a8c9b564d457cf5bd92b4e11e79a4ee4716a63c959699b306", + "sha256:bcd1fb5bb7b07f64c15618c89efcc2cfa3e95f0e3bcdbaf4642509de1942a699", + "sha256:c12b5ae868897c7338519c03049a806af85b9b8c237b7d675b8c5e089e4a618e", + "sha256:c26845094b1af3c91852745ae78e3ea47abf3dbcd1cf962f16b9a5fbe3ee8488", + "sha256:c6a660307ca9d4867caa8d9ca2c2658ab685de83792d1876274991adec7b93fa", + "sha256:c809a70e43c7977c4a42aefd62f0131823ebf7dd73556fa5d5950f5b354087e2", + "sha256:c8b2351c85d855293a299038e1f89db92a2f35e8d2f783489c6f0b2b5f3fe8a3", + "sha256:cb929ca942d0ec4fac404cbf520ee6cac37bf35be479b970c4ffadf2b6a1cad9", + "sha256:d2c0a187a92a1cb5ef2c8ed5412dd8d4334272617f532d4ad4de31e0495bd923", + "sha256:d69bfd8ec3219ae71bcde1f942b728903cad25fafe3100ba2258b973bd2bc1b2", + "sha256:daffdf51ee5db69a82dd127eabecce20729e21f7a3680cf7cbb23f0829189790", + "sha256:e58876c91f97b0952eb766123bfef372792ab3f4e3e1f1a2267834c2ab131734", + "sha256:eda2616eb2313cbb3eebbe51f19362eb434b18e3bb599466a1ffa76a033fb916", + "sha256:ee217c198f2e41f184f3869f3e485557296d505b5195c513b2bfe0062dc537f1", + "sha256:f02541ef64077f22bf4924f225c0fd1248c168f86e4b7abdedd87d6ebaceab0f", + "sha256:f1b82c27e89fffc6da125d5eb0ca6e68017faf5efc078128cfaa42cf5cb38798", + "sha256:fba162b8872d30fea8c52b258a542c5dfd7b235fb5cb352240c8d63b414013eb", + "sha256:fbbcb7b57dc9c794843e3d1258c0fbf0f48656d46ffe9e09b63bbd6e8cd5d0a2", + "sha256:fcb4621042ac4b7865c179bb972ed0da0218a076dc1820ffc48b1d74c1e37fe9" ], "index": "aliyun", - "markers": "python_version >= '3.8'", - "version": "==10.4.0" + "markers": "python_version >= '3.9'", + "version": "==11.0.0" }, "propcache": { "hashes": [ @@ -966,30 +922,30 @@ }, "pyinstaller": { "hashes": [ - "sha256:04f71828aa9531ab18c9656985c1f09b83d10332c73a1f4a113a48b491906955", - "sha256:0e229610c22b96d741d905706f9496af472c1a9216a118988f393c98ecc3f51f", - "sha256:6fd68a3c1207635c49326c54881b89d5c3bd9ba061bbc9daa58c0902db1be39e", - "sha256:7d2cd2ebdcd6860f8a4abe2977264a7b6d260a7147047008971c7cfc66a656a4", - "sha256:963dedc1f37144a4385f58f7f65f1c69c004a67faae522a2085b5ddb230c908b", - "sha256:a5f716bb507517912fda39d109dead91fc0dd2e7b2859562522b63c61aa21676", - "sha256:a843d470768d68b05684ccf4860c45b2eb13727f41667c0b2cd8f57ae231bd18", - "sha256:c71024c8a19c7b221b9152b2baff4c3ba849cada68dcdd34382ba09f0107451f", - "sha256:cb4d433a3db30d9d17cf5f2cf7bb4df80a788d493c1d67dd822dc5791d9864af", - "sha256:d9ec6d4398b4eebc1d4c00437716264ba8406bc2746f594e253070a82378a584", - "sha256:e6d229009e815542833fe00332b589aa6984a06f794dc16f2ce1acab1c567590", - "sha256:eddd53f231e51adc65088eac4f40057ca803a990239828d4a9229407fb866239" + "sha256:0d6475559c4939f0735122989611d7f739ed3bf02f666ce31022928f7a7e4fda", + "sha256:208c0ef6dab0837a0a273ea32d1a3619a208e3d1fe3fec3785eea71a77fd00ce", + "sha256:2e8365276c5131c9bef98e358fbc305e4022db8bedc9df479629d6414021956a", + "sha256:32c742a24fe65d0702958fadf4040f76de85859c26bec0008766e5dbabc5b68f", + "sha256:35e6b8077d240600bb309ed68bb0b1453fd2b7ab740b66d000db7abae6244423", + "sha256:44e36172de326af6d4e7663b12f71dbd34e2e3e02233e181e457394423daaf03", + "sha256:491dfb4d9d5d1d9650d9507daec1ff6829527a254d8e396badd60a0affcb72ef", + "sha256:6d12c45a29add78039066a53fb05967afaa09a672426072b13816fe7676abfc4", + "sha256:7ac83c0dc0e04357dab98c487e74ad2adb30e7eb186b58157a8faf46f1fa796f", + "sha256:ad84abf465bcda363c1d54eafa76745d77b6a8a713778348377dc98d12a452f7", + "sha256:ddc0fddd75f07f7e423da1f0822e389a42af011f9589e0269b87e0d89aa48c1f", + "sha256:e21c7806e34f40181e7606926a14579f848bfb1dc52cbca7eea66eccccbfe977" ], "index": "aliyun", "markers": "python_version < '3.14' and python_version >= '3.8'", - "version": "==6.11.0" + "version": "==6.11.1" }, "pyinstaller-hooks-contrib": { "hashes": [ - "sha256:1ddf9ba21d586afa84e505bb5c65fca10b22500bf3fdb89ee2965b99da53b891", - "sha256:4793869f370d1dc4806c101efd2890e3c3e703467d8d27bb5a3db005ebfb008d" + "sha256:8a46655e5c5b0186b5e527399118a9b342f10513eb1425c483fa4f6d02e8800c", + "sha256:ad47db0e153683b4151e10d231cb91f2d93c85079e78d76d9e0f57ac6c8a5e10" ], "markers": "python_version >= '3.8'", - "version": "==2024.9" + "version": "==2024.10" }, "pysocks": { "hashes": [ @@ -997,6 +953,7 @@ "sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5", "sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0" ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.7.1" }, "pywin32-ctypes": { @@ -1004,7 +961,7 @@ "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8", "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755" ], - "markers": "sys_platform == 'win32'", + "markers": "python_version >= '3.6'", "version": "==0.2.3" }, "requests": { @@ -1018,20 +975,20 @@ }, "selenium": { "hashes": [ - "sha256:3798d2d12b4a570bc5790163ba57fef10b2afee958bf1d80f2a3cf07c4141f33", - "sha256:95d08d3b82fb353f3c474895154516604c7f0e6a9a565ae6498ef36c9bac6921" + "sha256:1db3f3a0cd5bb07624fa8a3905a6fdde1595a42185a0617077c361dc53d104fb", + "sha256:7640f3f08ae7f4e450f895678e8a10a55eb4e4ca18311ed675ecc4684b96b683" ], "index": "aliyun", "markers": "python_version >= '3.8'", - "version": "==4.25.0" + "version": "==4.26.1" }, "setuptools": { "hashes": [ - "sha256:753bb6ebf1f465a1912e19ed1d41f403a79173a9acf66a42e7e6aec45c3c16ec", - "sha256:a7fcb66f68b4d9e8e66b42f9876150a3371558f98fa32222ffaa5bced76406f8" + "sha256:5c4ccb41111392671f02bb5f8436dfc5a9a7185e80500531b133f5775c4163ef", + "sha256:87cb777c3b96d638ca02031192d40390e0ad97737e27b6b4fa831bea86f2f829" ], - "markers": "python_version >= '3.8'", - "version": "==75.2.0" + "markers": "python_version >= '3.9'", + "version": "==75.5.0" }, "sniffio": { "hashes": [ @@ -1058,12 +1015,12 @@ }, "tqdm": { "hashes": [ - "sha256:90279a3770753eafc9194a0364852159802111925aa30eb3f9d85b0e805ac7cd", - "sha256:e1020aef2e5096702d8a025ac7d16b1577279c9d63f8375b63083e9a5f0fcbad" + "sha256:0cd8af9d56911acab92182e88d763100d4788bdf421d251616040cc4d44863be", + "sha256:fe5a6f95e6fe0b9755e9469b77b9c3cf850048224ecaa8293d7d2d31f97d869a" ], "index": "aliyun", "markers": "python_version >= '3.7'", - "version": "==4.66.5" + "version": "==4.67.0" }, "trio": { "hashes": [ @@ -1110,12 +1067,11 @@ }, "werkzeug": { "hashes": [ - "sha256:1bc0c2310d2fbb07b1dd1105eba2f7af72f322e1e455f2f93c993bee8c8a5f17", - "sha256:a8dd59d4de28ca70471a34cba79bed5f7ef2e036a76b3ab0835474246eb41f8d" + "sha256:54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e", + "sha256:60723ce945c19328679790e3282cc758aa4a6040e4bb330f53d30fa546d44746" ], - "index": "aliyun", - "markers": "python_version >= '3.8'", - "version": "==3.0.6" + "markers": "python_version >= '3.9'", + "version": "==3.1.3" }, "wsproto": { "hashes": [ @@ -1127,115 +1083,100 @@ }, "yarl": { "hashes": [ - "sha256:0545de8c688fbbf3088f9e8b801157923be4bf8e7b03e97c2ecd4dfa39e48e0e", - "sha256:076b1ed2ac819933895b1a000904f62d615fe4533a5cf3e052ff9a1da560575c", - "sha256:0afad2cd484908f472c8fe2e8ef499facee54a0a6978be0e0cff67b1254fd747", - "sha256:0ccaa1bc98751fbfcf53dc8dfdb90d96e98838010fc254180dd6707a6e8bb179", - "sha256:0d3105efab7c5c091609abacad33afff33bdff0035bece164c98bcf5a85ef90a", - "sha256:0e1af74a9529a1137c67c887ed9cde62cff53aa4d84a3adbec329f9ec47a3936", - "sha256:136f9db0f53c0206db38b8cd0c985c78ded5fd596c9a86ce5c0b92afb91c3a19", - "sha256:156ececdf636143f508770bf8a3a0498de64da5abd890c7dbb42ca9e3b6c05b8", - "sha256:15c87339490100c63472a76d87fe7097a0835c705eb5ae79fd96e343473629ed", - "sha256:1695497bb2a02a6de60064c9f077a4ae9c25c73624e0d43e3aa9d16d983073c2", - "sha256:173563f3696124372831007e3d4b9821746964a95968628f7075d9231ac6bb33", - "sha256:173866d9f7409c0fb514cf6e78952e65816600cb888c68b37b41147349fe0057", - "sha256:23ec1d3c31882b2a8a69c801ef58ebf7bae2553211ebbddf04235be275a38548", - "sha256:243fbbbf003754fe41b5bdf10ce1e7f80bcc70732b5b54222c124d6b4c2ab31c", - "sha256:28c6cf1d92edf936ceedc7afa61b07e9d78a27b15244aa46bbcd534c7458ee1b", - "sha256:2aa738e0282be54eede1e3f36b81f1e46aee7ec7602aa563e81e0e8d7b67963f", - "sha256:2cf441c4b6e538ba0d2591574f95d3fdd33f1efafa864faa077d9636ecc0c4e9", - "sha256:30c3ff305f6e06650a761c4393666f77384f1cc6c5c0251965d6bfa5fbc88f7f", - "sha256:31561a5b4d8dbef1559b3600b045607cf804bae040f64b5f5bca77da38084a8a", - "sha256:32b66be100ac5739065496c74c4b7f3015cef792c3174982809274d7e51b3e04", - "sha256:3433da95b51a75692dcf6cc8117a31410447c75a9a8187888f02ad45c0a86c50", - "sha256:34a2d76a1984cac04ff8b1bfc939ec9dc0914821264d4a9c8fd0ed6aa8d4cfd2", - "sha256:353665775be69bbfc6d54c8d134bfc533e332149faeddd631b0bc79df0897f46", - "sha256:38d0124fa992dbacd0c48b1b755d3ee0a9f924f427f95b0ef376556a24debf01", - "sha256:3c56ec1eacd0a5d35b8a29f468659c47f4fe61b2cab948ca756c39b7617f0aa5", - "sha256:3db817b4e95eb05c362e3b45dafe7144b18603e1211f4a5b36eb9522ecc62bcf", - "sha256:3e52474256a7db9dcf3c5f4ca0b300fdea6c21cca0148c8891d03a025649d935", - "sha256:416f2e3beaeae81e2f7a45dc711258be5bdc79c940a9a270b266c0bec038fb84", - "sha256:435aca062444a7f0c884861d2e3ea79883bd1cd19d0a381928b69ae1b85bc51d", - "sha256:4388c72174868884f76affcdd3656544c426407e0043c89b684d22fb265e04a5", - "sha256:43ebdcc120e2ca679dba01a779333a8ea76b50547b55e812b8b92818d604662c", - "sha256:458c0c65802d816a6b955cf3603186de79e8fdb46d4f19abaec4ef0a906f50a7", - "sha256:533a28754e7f7439f217550a497bb026c54072dbe16402b183fdbca2431935a9", - "sha256:553dad9af802a9ad1a6525e7528152a015b85fb8dbf764ebfc755c695f488367", - "sha256:5838f2b79dc8f96fdc44077c9e4e2e33d7089b10788464609df788eb97d03aad", - "sha256:5b48388ded01f6f2429a8c55012bdbd1c2a0c3735b3e73e221649e524c34a58d", - "sha256:5bc0df728e4def5e15a754521e8882ba5a5121bd6b5a3a0ff7efda5d6558ab3d", - "sha256:63eab904f8630aed5a68f2d0aeab565dcfc595dc1bf0b91b71d9ddd43dea3aea", - "sha256:66f629632220a4e7858b58e4857927dd01a850a4cef2fb4044c8662787165cf7", - "sha256:670eb11325ed3a6209339974b276811867defe52f4188fe18dc49855774fa9cf", - "sha256:69d5856d526802cbda768d3e6246cd0d77450fa2a4bc2ea0ea14f0d972c2894b", - "sha256:6e840553c9c494a35e449a987ca2c4f8372668ee954a03a9a9685075228e5036", - "sha256:711bdfae4e699a6d4f371137cbe9e740dc958530cb920eb6f43ff9551e17cfbc", - "sha256:74abb8709ea54cc483c4fb57fb17bb66f8e0f04438cff6ded322074dbd17c7ec", - "sha256:75119badf45f7183e10e348edff5a76a94dc19ba9287d94001ff05e81475967b", - "sha256:766dcc00b943c089349d4060b935c76281f6be225e39994c2ccec3a2a36ad627", - "sha256:78e6fdc976ec966b99e4daa3812fac0274cc28cd2b24b0d92462e2e5ef90d368", - "sha256:81dadafb3aa124f86dc267a2168f71bbd2bfb163663661ab0038f6e4b8edb810", - "sha256:82d5161e8cb8f36ec778fd7ac4d740415d84030f5b9ef8fe4da54784a1f46c94", - "sha256:833547179c31f9bec39b49601d282d6f0ea1633620701288934c5f66d88c3e50", - "sha256:856b7f1a7b98a8c31823285786bd566cf06226ac4f38b3ef462f593c608a9bd6", - "sha256:8657d3f37f781d987037f9cc20bbc8b40425fa14380c87da0cb8dfce7c92d0fb", - "sha256:93bed8a8084544c6efe8856c362af08a23e959340c87a95687fdbe9c9f280c8b", - "sha256:954dde77c404084c2544e572f342aef384240b3e434e06cecc71597e95fd1ce7", - "sha256:98f68df80ec6ca3015186b2677c208c096d646ef37bbf8b49764ab4a38183931", - "sha256:99e12d2bf587b44deb74e0d6170fec37adb489964dbca656ec41a7cd8f2ff178", - "sha256:9a13a07532e8e1c4a5a3afff0ca4553da23409fad65def1b71186fb867eeae8d", - "sha256:9c1e3ff4b89cdd2e1a24c214f141e848b9e0451f08d7d4963cb4108d4d798f1f", - "sha256:9ce2e0f6123a60bd1a7f5ae3b2c49b240c12c132847f17aa990b841a417598a2", - "sha256:9fcda20b2de7042cc35cf911702fa3d8311bd40055a14446c1e62403684afdc5", - "sha256:a32d58f4b521bb98b2c0aa9da407f8bd57ca81f34362bcb090e4a79e9924fefc", - "sha256:a39c36f4218a5bb668b4f06874d676d35a035ee668e6e7e3538835c703634b84", - "sha256:a5cafb02cf097a82d74403f7e0b6b9df3ffbfe8edf9415ea816314711764a27b", - "sha256:a7cf963a357c5f00cb55b1955df8bbe68d2f2f65de065160a1c26b85a1e44172", - "sha256:a880372e2e5dbb9258a4e8ff43f13888039abb9dd6d515f28611c54361bc5644", - "sha256:ace4cad790f3bf872c082366c9edd7f8f8f77afe3992b134cfc810332206884f", - "sha256:af8ff8d7dc07ce873f643de6dfbcd45dc3db2c87462e5c387267197f59e6d776", - "sha256:b47a6000a7e833ebfe5886b56a31cb2ff12120b1efd4578a6fcc38df16cc77bd", - "sha256:b71862a652f50babab4a43a487f157d26b464b1dedbcc0afda02fd64f3809d04", - "sha256:b7f227ca6db5a9fda0a2b935a2ea34a7267589ffc63c8045f0e4edb8d8dcf956", - "sha256:bc8936d06cd53fddd4892677d65e98af514c8d78c79864f418bbf78a4a2edde4", - "sha256:bed1b5dbf90bad3bfc19439258c97873eab453c71d8b6869c136346acfe497e7", - "sha256:c45817e3e6972109d1a2c65091504a537e257bc3c885b4e78a95baa96df6a3f8", - "sha256:c68e820879ff39992c7f148113b46efcd6ec765a4865581f2902b3c43a5f4bbb", - "sha256:c77494a2f2282d9bbbbcab7c227a4d1b4bb829875c96251f66fb5f3bae4fb053", - "sha256:c998d0558805860503bc3a595994895ca0f7835e00668dadc673bbf7f5fbfcbe", - "sha256:ccad2800dfdff34392448c4bf834be124f10a5bc102f254521d931c1c53c455a", - "sha256:cd126498171f752dd85737ab1544329a4520c53eed3997f9b08aefbafb1cc53b", - "sha256:ce44217ad99ffad8027d2fde0269ae368c86db66ea0571c62a000798d69401fb", - "sha256:d1ac2bc069f4a458634c26b101c2341b18da85cb96afe0015990507efec2e417", - "sha256:d417a4f6943112fae3924bae2af7112562285848d9bcee737fc4ff7cbd450e6c", - "sha256:d538df442c0d9665664ab6dd5fccd0110fa3b364914f9c85b3ef9b7b2e157980", - "sha256:ded1b1803151dd0f20a8945508786d57c2f97a50289b16f2629f85433e546d47", - "sha256:e2e93b88ecc8f74074012e18d679fb2e9c746f2a56f79cd5e2b1afcf2a8a786b", - "sha256:e4ca3b9f370f218cc2a0309542cab8d0acdfd66667e7c37d04d617012485f904", - "sha256:e4ee8b8639070ff246ad3649294336b06db37a94bdea0d09ea491603e0be73b8", - "sha256:e52f77a0cd246086afde8815039f3e16f8d2be51786c0a39b57104c563c5cbb0", - "sha256:eaea112aed589131f73d50d570a6864728bd7c0c66ef6c9154ed7b59f24da611", - "sha256:ed20a4bdc635f36cb19e630bfc644181dd075839b6fc84cac51c0f381ac472e2", - "sha256:eedc3f247ee7b3808ea07205f3e7d7879bc19ad3e6222195cd5fbf9988853e4d", - "sha256:f0e1844ad47c7bd5d6fa784f1d4accc5f4168b48999303a868fe0f8597bde715", - "sha256:f4fe99ce44128c71233d0d72152db31ca119711dfc5f2c82385ad611d8d7f897", - "sha256:f8cfd847e6b9ecf9f2f2531c8427035f291ec286c0a4944b0a9fce58c6446046", - "sha256:f9ca0e6ce7774dc7830dc0cc4bb6b3eec769db667f230e7c770a628c1aa5681b", - "sha256:fa2bea05ff0a8fb4d8124498e00e02398f06d23cdadd0fe027d84a3f7afde31e", - "sha256:fbbb63bed5fcd70cd3dd23a087cd78e4675fb5a2963b8af53f945cbbca79ae16", - "sha256:fbda058a9a68bec347962595f50546a8a4a34fd7b0654a7b9697917dc2bf810d", - "sha256:ffd591e22b22f9cb48e472529db6a47203c41c2c5911ff0a52e85723196c0d75" + "sha256:0c8e589379ef0407b10bed16cc26e7392ef8f86961a706ade0a22309a45414d7", + "sha256:0d41c684f286ce41fa05ab6af70f32d6da1b6f0457459a56cf9e393c1c0b2217", + "sha256:1056cadd5e850a1c026f28e0704ab0a94daaa8f887ece8dfed30f88befb87bb0", + "sha256:11d86c6145ac5c706c53d484784cf504d7d10fa407cb73b9d20f09ff986059ef", + "sha256:170ed4971bf9058582b01a8338605f4d8c849bd88834061e60e83b52d0c76870", + "sha256:17791acaa0c0f89323c57da7b9a79f2174e26d5debbc8c02d84ebd80c2b7bff8", + "sha256:17931dfbb84ae18b287279c1f92b76a3abcd9a49cd69b92e946035cff06bcd20", + "sha256:18662443c6c3707e2fc7fad184b4dc32dd428710bbe72e1bce7fe1988d4aa654", + "sha256:187df91395c11e9f9dc69b38d12406df85aa5865f1766a47907b1cc9855b6303", + "sha256:1fee66b32e79264f428dc8da18396ad59cc48eef3c9c13844adec890cd339db5", + "sha256:2270d590997445a0dc29afa92e5534bfea76ba3aea026289e811bf9ed4b65a7f", + "sha256:2654caaf5584449d49c94a6b382b3cb4a246c090e72453493ea168b931206a4d", + "sha256:26bfb6226e0c157af5da16d2d62258f1ac578d2899130a50433ffee4a5dfa673", + "sha256:2941756754a10e799e5b87e2319bbec481ed0957421fba0e7b9fb1c11e40509f", + "sha256:3294f787a437cb5d81846de3a6697f0c35ecff37a932d73b1fe62490bef69211", + "sha256:358dc7ddf25e79e1cc8ee16d970c23faee84d532b873519c5036dbb858965795", + "sha256:38bc4ed5cae853409cb193c87c86cd0bc8d3a70fd2268a9807217b9176093ac6", + "sha256:3a0baff7827a632204060f48dca9e63fbd6a5a0b8790c1a2adfb25dc2c9c0d50", + "sha256:3a3ede8c248f36b60227eb777eac1dbc2f1022dc4d741b177c4379ca8e75571a", + "sha256:3a58a2f2ca7aaf22b265388d40232f453f67a6def7355a840b98c2d547bd037f", + "sha256:4434b739a8a101a837caeaa0137e0e38cb4ea561f39cb8960f3b1e7f4967a3fc", + "sha256:460024cacfc3246cc4d9f47a7fc860e4fcea7d1dc651e1256510d8c3c9c7cde0", + "sha256:46c465ad06971abcf46dd532f77560181387b4eea59084434bdff97524444032", + "sha256:48e424347a45568413deec6f6ee2d720de2cc0385019bedf44cd93e8638aa0ed", + "sha256:4a8c83f6fcdc327783bdc737e8e45b2e909b7bd108c4da1892d3bc59c04a6d84", + "sha256:4c840cc11163d3c01a9d8aad227683c48cd3e5be5a785921bcc2a8b4b758c4f3", + "sha256:4d486ddcaca8c68455aa01cf53d28d413fb41a35afc9f6594a730c9779545876", + "sha256:4e76381be3d8ff96a4e6c77815653063e87555981329cf8f85e5be5abf449021", + "sha256:50d866f7b1a3f16f98603e095f24c0eeba25eb508c85a2c5939c8b3870ba2df8", + "sha256:52492b87d5877ec405542f43cd3da80bdcb2d0c2fbc73236526e5f2c28e6db28", + "sha256:56afb44a12b0864d17b597210d63a5b88915d680f6484d8d202ed68ade38673d", + "sha256:585ce7cd97be8f538345de47b279b879e091c8b86d9dbc6d98a96a7ad78876a3", + "sha256:5870d620b23b956f72bafed6a0ba9a62edb5f2ef78a8849b7615bd9433384171", + "sha256:5c6ea72fe619fee5e6b5d4040a451d45d8175f560b11b3d3e044cd24b2720526", + "sha256:688058e89f512fb7541cb85c2f149c292d3fa22f981d5a5453b40c5da49eb9e8", + "sha256:6a3f47930fbbed0f6377639503848134c4aa25426b08778d641491131351c2c8", + "sha256:6b981316fcd940f085f646b822c2ff2b8b813cbd61281acad229ea3cbaabeb6b", + "sha256:734144cd2bd633a1516948e477ff6c835041c0536cef1d5b9a823ae29899665b", + "sha256:736bb076f7299c5c55dfef3eb9e96071a795cb08052822c2bb349b06f4cb2e0a", + "sha256:752485cbbb50c1e20908450ff4f94217acba9358ebdce0d8106510859d6eb19a", + "sha256:753eaaa0c7195244c84b5cc159dc8204b7fd99f716f11198f999f2332a86b178", + "sha256:75ac158560dec3ed72f6d604c81090ec44529cfb8169b05ae6fcb3e986b325d9", + "sha256:76499469dcc24759399accd85ec27f237d52dec300daaca46a5352fcbebb1071", + "sha256:782ca9c58f5c491c7afa55518542b2b005caedaf4685ec814fadfcee51f02493", + "sha256:792155279dc093839e43f85ff7b9b6493a8eaa0af1f94f1f9c6e8f4de8c63500", + "sha256:7a1606ba68e311576bcb1672b2a1543417e7e0aa4c85e9e718ba6466952476c0", + "sha256:8281db240a1616af2f9c5f71d355057e73a1409c4648c8949901396dc0a3c151", + "sha256:871e1b47eec7b6df76b23c642a81db5dd6536cbef26b7e80e7c56c2fd371382e", + "sha256:8b9c4643e7d843a0dca9cd9d610a0876e90a1b2cbc4c5ba7930a0d90baf6903f", + "sha256:8c6d5fed96f0646bfdf698b0a1cebf32b8aae6892d1bec0c5d2d6e2df44e1e2d", + "sha256:8e1bf59e035534ba4077f5361d8d5d9194149f9ed4f823d1ee29ef3e8964ace3", + "sha256:8fd51299e21da709eabcd5b2dd60e39090804431292daacbee8d3dabe39a6bc0", + "sha256:91c012dceadc695ccf69301bfdccd1fc4472ad714fe2dd3c5ab4d2046afddf29", + "sha256:93771146ef048b34201bfa382c2bf74c524980870bb278e6df515efaf93699ff", + "sha256:93d1c8cc5bf5df401015c5e2a3ce75a5254a9839e5039c881365d2a9dcfc6dc2", + "sha256:9611b83810a74a46be88847e0ea616794c406dbcb4e25405e52bff8f4bee2d0a", + "sha256:9bc27dd5cfdbe3dc7f381b05e6260ca6da41931a6e582267d5ca540270afeeb2", + "sha256:ac8eda86cc75859093e9ce390d423aba968f50cf0e481e6c7d7d63f90bae5c9c", + "sha256:bc3003710e335e3f842ae3fd78efa55f11a863a89a72e9a07da214db3bf7e1f8", + "sha256:bc61b005f6521fcc00ca0d1243559a5850b9dd1e1fe07b891410ee8fe192d0c0", + "sha256:be4c7b1c49d9917c6e95258d3d07f43cfba2c69a6929816e77daf322aaba6628", + "sha256:c019abc2eca67dfa4d8fb72ba924871d764ec3c92b86d5b53b405ad3d6aa56b0", + "sha256:c42774d1d1508ec48c3ed29e7b110e33f5e74a20957ea16197dbcce8be6b52ba", + "sha256:c556fbc6820b6e2cda1ca675c5fa5589cf188f8da6b33e9fc05b002e603e44fa", + "sha256:c6e659b9a24d145e271c2faf3fa6dd1fcb3e5d3f4e17273d9e0350b6ab0fe6e2", + "sha256:c74f0b0472ac40b04e6d28532f55cac8090e34c3e81f118d12843e6df14d0909", + "sha256:cd7e35818d2328b679a13268d9ea505c85cd773572ebb7a0da7ccbca77b6a52e", + "sha256:d17832ba39374134c10e82d137e372b5f7478c4cceeb19d02ae3e3d1daed8721", + "sha256:d1fa68a3c921365c5745b4bd3af6221ae1f0ea1bf04b69e94eda60e57958907f", + "sha256:d63123bfd0dce5f91101e77c8a5427c3872501acece8c90df457b486bc1acd47", + "sha256:da9d3061e61e5ae3f753654813bc1cd1c70e02fb72cf871bd6daf78443e9e2b1", + "sha256:db5ac3871ed76340210fe028f535392f097fb31b875354bcb69162bba2632ef4", + "sha256:dd7abf4f717e33b7487121faf23560b3a50924f80e4bef62b22dab441ded8f3b", + "sha256:dd90238d3a77a0e07d4d6ffdebc0c21a9787c5953a508a2231b5f191455f31e9", + "sha256:ef6eee1a61638d29cd7c85f7fd3ac7b22b4c0fabc8fd00a712b727a3e73b0685", + "sha256:f11fd61d72d93ac23718d393d2a64469af40be2116b24da0a4ca6922df26807e", + "sha256:f1e7fedb09c059efee2533119666ca7e1a2610072076926fa028c2ba5dfeb78c", + "sha256:f25b7e93f5414b9a983e1a6c1820142c13e1782cc9ed354c25e933aebe97fcf2", + "sha256:f2f44a4247461965fed18b2573f3a9eb5e2c3cad225201ee858726cde610daca", + "sha256:f5ffc6b7ace5b22d9e73b2a4c7305740a339fbd55301d52735f73e21d9eb3130", + "sha256:ff6af03cac0d1a4c3c19e5dcc4c05252411bf44ccaa2485e20d0a7c77892ab6e", + "sha256:ff8d95e06546c3a8c188f68040e9d0360feb67ba8498baf018918f669f7bc39b" ], - "markers": "python_version >= '3.8'", - "version": "==1.15.2" + "markers": "python_version >= '3.9'", + "version": "==1.17.2" }, - "zipp": { + "yt-dlp": { "hashes": [ - "sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350", - "sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29" + "sha256:b8a4c23d3c9afd7e476bcdb87f38b6c0e8e12e3a239d7988f13acb434200f54d", + "sha256:b9741695911dc566498b5f115cdd6b1abbc5be61cb01fd98abe649990a41656c" ], - "markers": "python_version >= '3.8'", - "version": "==3.20.2" + "index": "aliyun", + "markers": "python_version >= '3.9'", + "version": "==2024.11.18" } }, "develop": {} diff --git a/main.py b/main.py index 428821a..1ba9104 100644 --- a/main.py +++ b/main.py @@ -174,7 +174,7 @@ class UpdateSource: ) self.start_time = time() self.pbar = tqdm_asyncio(total=self.total, desc="Sorting") - self.channel_data = await process_sort_channel_list( + self.channel_data = process_sort_channel_list( self.channel_data, ipv6=ipv6_support, callback=sort_callback, diff --git a/utils/channel.py b/utils/channel.py index ae0ae0e..49f8099 100644 --- a/utils/channel.py +++ b/utils/channel.py @@ -11,7 +11,6 @@ from utils.tools import ( ) from utils.speed import ( sort_urls_by_speed_and_resolution, - is_ffmpeg_installed, speed_cache, ) import os @@ -21,7 +20,6 @@ from bs4 import NavigableString import logging from logging.handlers import RotatingFileHandler from opencc import OpenCC -import asyncio import base64 import pickle import copy @@ -585,65 +583,52 @@ def append_total_data( ) -async def sort_channel_list( +def sort_channel_list( cate, name, info_list, - semaphore, - ffmpeg=False, ipv6_proxy=None, callback=None, ): """ Sort the channel list """ - async with semaphore: - data = [] - try: - if info_list: - sorted_data = await sort_urls_by_speed_and_resolution( - info_list, ffmpeg=ffmpeg, ipv6_proxy=ipv6_proxy, callback=callback - ) - if sorted_data: - for (url, date, resolution, origin), response_time in sorted_data: - logging.info( - f"Name: {name}, URL: {url}, Date: {date}, Resolution: {resolution}, Response Time: {response_time} ms" - ) - data.append((url, date, resolution, origin)) - except Exception as e: - logging.error(f"Error: {e}") - finally: - return {"cate": cate, "name": name, "data": data} + data = [] + try: + if info_list: + sorted_data = sort_urls_by_speed_and_resolution( + info_list, ipv6_proxy=ipv6_proxy, callback=callback + ) + if sorted_data: + for (url, date, resolution, origin), response_time in sorted_data: + logging.info( + f"Name: {name}, URL: {url}, Date: {date}, Resolution: {resolution}, Response Time: {response_time} ms" + ) + data.append((url, date, resolution, origin)) + except Exception as e: + logging.error(f"Error: {e}") + finally: + return {"cate": cate, "name": name, "data": data} -async def process_sort_channel_list(data, ipv6=False, callback=None): +def process_sort_channel_list(data, ipv6=False, callback=None): """ Processs the sort channel list """ ipv6_proxy = None if (not config.open_ipv6 or ipv6) else constants.ipv6_proxy - ffmpeg_installed = is_ffmpeg_installed() - if config.open_ffmpeg and not ffmpeg_installed: - print("FFmpeg is not installed, using requests for sorting.") - is_ffmpeg = config.open_ffmpeg and ffmpeg_installed - semaphore = asyncio.Semaphore(5) need_sort_data = copy.deepcopy(data) process_nested_dict(need_sort_data, seen=set(), flag=r"cache:(.*)", force_str="!") - tasks = [ - asyncio.create_task( + sort_results = [ sort_channel_list( cate, name, info_list, - semaphore, - ffmpeg=is_ffmpeg, ipv6_proxy=ipv6_proxy, callback=callback, ) - ) for cate, channel_obj in need_sort_data.items() for name, info_list in channel_obj.items() ] - sort_results = await asyncio.gather(*tasks) sort_data = {} for result in sort_results: if result: diff --git a/utils/speed.py b/utils/speed.py index cb6562d..4444771 100644 --- a/utils/speed.py +++ b/utils/speed.py @@ -5,8 +5,27 @@ import re from utils.config import config from utils.tools import is_ipv6, add_url_info, remove_cache_info, get_resolution_value import subprocess +import yt_dlp +def get_speed_yt_dlp(url, timeout=5): + """ + Get the speed of the url by yt_dlp + """ + ydl_opts = { + "timeout": timeout, + "skip_download": True, + "quiet": True, + "no_warnings": True, + } + with yt_dlp.YoutubeDL(ydl_opts) as ydl: + try: + start = time() + info = ydl.extract_info(url, download=False) + return int(round((time() - start) * 1000)) if info else float("inf") + except: + return float("inf") + async def get_speed(url, timeout=config.sort_timeout, proxy=None): """ Get the speed of the url @@ -113,72 +132,60 @@ async def check_stream_speed(url_info): speed_cache = {} -async def get_speed_by_info( - url_info, ffmpeg, semaphore, ipv6_proxy=None, callback=None -): +def get_speed_by_info(url_info, ipv6_proxy=None, callback=None): """ Get the info with speed """ - async with semaphore: - url, _, resolution, _ = url_info - url_info = list(url_info) - cache_key = None - url_is_ipv6 = is_ipv6(url) - if "$" in url: - url, _, cache_info = url.partition("$") - matcher = re.search(r"cache:(.*)", cache_info) - if matcher: - cache_key = matcher.group(1) - url_show_info = remove_cache_info(cache_info) - url_info[0] = url - if cache_key in speed_cache: - speed = speed_cache[cache_key][0] - url_info[2] = speed_cache[cache_key][1] - if speed != float("inf"): - if url_show_info: - url_info[0] = add_url_info(url, url_show_info) - return (tuple(url_info), speed) - else: - return float("inf") - try: - if ipv6_proxy and url_is_ipv6: - url_speed = 0 - speed = (url_info, url_speed) - elif ffmpeg: - speed = await check_stream_speed(url_info) - url_speed = speed[1] if speed != float("inf") else float("inf") - if url_speed == float("inf"): - url_speed = await get_speed(url) - resolution = speed[0][2] if speed != float("inf") else None - else: - url_speed = await get_speed(url) - speed = ( - (url_info, url_speed) if url_speed != float("inf") else float("inf") - ) - if cache_key and cache_key not in speed_cache: - speed_cache[cache_key] = (url_speed, resolution) + url, _, resolution, _ = url_info + url_info = list(url_info) + cache_key = None + url_is_ipv6 = is_ipv6(url) + if "$" in url: + url, _, cache_info = url.partition("$") + matcher = re.search(r"cache:(.*)", cache_info) + if matcher: + cache_key = matcher.group(1) + url_show_info = remove_cache_info(cache_info) + url_info[0] = url + if cache_key in speed_cache: + speed = speed_cache[cache_key][0] + url_info[2] = speed_cache[cache_key][1] + if speed != float("inf"): if url_show_info: - speed[0][0] = add_url_info(speed[0][0], url_show_info) - speed = (tuple(speed[0]), speed[1]) - return speed - except: + url_info[0] = add_url_info(url, url_show_info) + return (tuple(url_info), speed) + else: return float("inf") - finally: - if callback: - callback() + try: + if ipv6_proxy and url_is_ipv6: + url_speed = 0 + speed = (url_info, url_speed) + else: + url_speed = get_speed_yt_dlp(url) + speed = (url_info, url_speed) if url_speed != float("inf") else float("inf") + if cache_key and cache_key not in speed_cache: + speed_cache[cache_key] = (url_speed, resolution) + if url_show_info: + speed[0][0] = add_url_info(speed[0][0], url_show_info) + speed = (tuple(speed[0]), speed[1]) + return speed + except: + return float("inf") + finally: + if callback: + callback() -async def sort_urls_by_speed_and_resolution( - data, ffmpeg=False, ipv6_proxy=None, callback=None +def sort_urls_by_speed_and_resolution( + data, ipv6_proxy=None, callback=None ): """ Sort by speed and resolution """ - semaphore = asyncio.Semaphore(20) - response = await asyncio.gather( + response = asyncio.gather( *( get_speed_by_info( - url_info, ffmpeg, semaphore, ipv6_proxy=ipv6_proxy, callback=callback + url_info, ipv6_proxy=ipv6_proxy, callback=callback ) for url_info in data ) From 865d919350db4d81e84fefe2119007261f5d2f0d Mon Sep 17 00:00:00 2001 From: "guorong.zheng" <360996299@qq.com> Date: Tue, 19 Nov 2024 14:28:52 +0800 Subject: [PATCH 05/37] feat:tkinter_build --- Pipfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Pipfile b/Pipfile index 52b44ce..7682de1 100644 --- a/Pipfile +++ b/Pipfile @@ -9,6 +9,7 @@ ui = "python tkinter_ui/tkinter_ui.py" multicast_tmp = "python updates/multicast/update_tmp.py" docker_build_driver = "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7,linux/arm/v8 --build-arg APP_WORKDIR=/tv-driver --build-arg INSTALL_CHROMIUM=true -t guovern/tv-driver . --push" docker_build_requests = "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7,linux/arm/v8 --build-arg APP_WORKDIR=/tv-requests -t guovern/tv-requests . --push" +tkinter_build = "pyinstaller tkinter_ui/tkinter_ui.spec" [dev-packages] From b032d985c6de71b5449ea32766db2ca509511052 Mon Sep 17 00:00:00 2001 From: "guorong.zheng" <360996299@qq.com> Date: Tue, 19 Nov 2024 18:28:17 +0800 Subject: [PATCH 06/37] feat:get_speed_yt_dlp --- config/config.ini | 2 +- docs/config.md | 2 +- docs/config_en.md | 2 +- main.py | 3 +-- utils/channel.py | 26 ++++++++++++++++---------- utils/speed.py | 38 +++++++++++++++++--------------------- 6 files changed, 37 insertions(+), 36 deletions(-) diff --git a/config/config.ini b/config/config.ini index d63c7a9..968d805 100644 --- a/config/config.ini +++ b/config/config.ini @@ -9,7 +9,7 @@ online_search_page_num = 1 urls_limit = 10 open_keep_all = False open_sort = True -sort_timeout = 10 +sort_timeout = 5 open_ffmpeg = True open_filter_resolution = True min_resolution = 1920x1080 diff --git a/docs/config.md b/docs/config.md index 06c7511..f4f2322 100644 --- a/docs/config.md +++ b/docs/config.md @@ -12,7 +12,7 @@ | urls_limit | 10 | 单个频道接口数量 | | open_keep_all | False | 保留所有检索结果,会保留非模板频道名称的结果,推荐手动维护时开启 | | open_sort | True | 开启排序功能(响应速度、日期、分辨率) | -| sort_timeout | 10 | 单个接口测速超时时长,单位秒(s);数值越大测速所属时间越长,能提高获取接口数量,但质量会有所下降;数值越小测速所需时间越短,能获取低延时的接口,质量较好;调整此值能优化更新时间 | +| sort_timeout | 5 | 单个接口测速超时时长,单位秒(s);数值越大测速所属时间越长,能提高获取接口数量,但质量会有所下降;数值越小测速所需时间越短,能获取低延时的接口,质量较好;调整此值能优化更新时间 | | open_ffmpeg | True | 开启使用 FFmpeg 进行测速,获取更准确的速度与分辨率信息,需要提前手动安装 | | open_m3u_result | True | 开启转换生成 m3u 文件类型结果链接,支持显示频道图标 | | open_filter_resolution | True | 开启分辨率过滤,低于最小分辨率(min_resolution)的接口将会被过滤 | diff --git a/docs/config_en.md b/docs/config_en.md index d0dd43b..3c5d353 100644 --- a/docs/config_en.md +++ b/docs/config_en.md @@ -12,7 +12,7 @@ | urls_limit | 10 | Number of interfaces per channel | | open_keep_all | False | Retain all search results, retain results with non-template channel names, recommended to be turned on when manually maintaining | | open_sort | True | Enable the sorting function (response speed, date, resolution) | -| sort_timeout | 10 | The timeout duration for speed testing of a single interface, in seconds (s). A larger value means a longer testing period, which can increase the number of interfaces obtained but may decrease their quality. A smaller value means a shorter testing time, which can obtain low-latency interfaces with better quality. Adjusting this value can optimize the update time. | +| sort_timeout | 5 | The timeout duration for speed testing of a single interface, in seconds (s). A larger value means a longer testing period, which can increase the number of interfaces obtained but may decrease their quality. A smaller value means a shorter testing time, which can obtain low-latency interfaces with better quality. Adjusting this value can optimize the update time. | | open_ffmpeg | True | Enable speed testing using FFmpeg to obtain more accurate speed and resolution information. Manual installation is required in advance. | | open_m3u_result | True | Enable the conversion to generate m3u file type result links, supporting the display of channel icons | | open_filter_resolution | True | Enable resolution filtering, interfaces with resolution lower than the minimum resolution (min_resolution) will be filtered | diff --git a/main.py b/main.py index 1ba9104..3447a35 100644 --- a/main.py +++ b/main.py @@ -29,7 +29,6 @@ from updates.fofa import get_channels_by_fofa from updates.online_search import get_channels_by_online_search import os from tqdm import tqdm -from tqdm.asyncio import tqdm_asyncio from time import time from flask import Flask, render_template_string import sys @@ -173,7 +172,7 @@ class UpdateSource: 0, ) self.start_time = time() - self.pbar = tqdm_asyncio(total=self.total, desc="Sorting") + self.pbar = tqdm(total=self.total, desc="Sorting") self.channel_data = process_sort_channel_list( self.channel_data, ipv6=ipv6_support, diff --git a/utils/channel.py b/utils/channel.py index 49f8099..864385a 100644 --- a/utils/channel.py +++ b/utils/channel.py @@ -24,6 +24,7 @@ import base64 import pickle import copy import datetime +from concurrent.futures import ThreadPoolExecutor handler = None @@ -618,22 +619,27 @@ def process_sort_channel_list(data, ipv6=False, callback=None): ipv6_proxy = None if (not config.open_ipv6 or ipv6) else constants.ipv6_proxy need_sort_data = copy.deepcopy(data) process_nested_dict(need_sort_data, seen=set(), flag=r"cache:(.*)", force_str="!") - sort_results = [ - sort_channel_list( + sort_data = {} + with ThreadPoolExecutor(max_workers=30) as executor: + futures = [ + executor.submit( + sort_channel_list, cate, name, info_list, ipv6_proxy=ipv6_proxy, callback=callback, ) - for cate, channel_obj in need_sort_data.items() - for name, info_list in channel_obj.items() - ] - sort_data = {} - for result in sort_results: - if result: - cate, name, result_data = result["cate"], result["name"], result["data"] - append_data_to_info_data(sort_data, cate, name, result_data, check=False) + for cate, channel_obj in need_sort_data.items() + for name, info_list in channel_obj.items() + ] + for future in futures: + result = future.result() + if result: + cate, name, result_data = result["cate"], result["name"], result["data"] + append_data_to_info_data( + sort_data, cate, name, result_data, check=False + ) for cate, obj in data.items(): for name, info_list in obj.items(): sort_info_list = sort_data.get(cate, {}).get(name, []) diff --git a/utils/speed.py b/utils/speed.py index 4444771..d9ea39d 100644 --- a/utils/speed.py +++ b/utils/speed.py @@ -8,23 +8,24 @@ import subprocess import yt_dlp -def get_speed_yt_dlp(url, timeout=5): +def get_speed_yt_dlp(url, timeout=config.sort_timeout): """ Get the speed of the url by yt_dlp """ - ydl_opts = { - "timeout": timeout, - "skip_download": True, - "quiet": True, - "no_warnings": True, - } - with yt_dlp.YoutubeDL(ydl_opts) as ydl: - try: + try: + ydl_opts = { + "socket_timeout": timeout, + "skip_download": True, + "quiet": True, + "no_warnings": True, + } + with yt_dlp.YoutubeDL(ydl_opts) as ydl: start = time() info = ydl.extract_info(url, download=False) return int(round((time() - start) * 1000)) if info else float("inf") - except: - return float("inf") + except Exception as e: + return float("inf") + async def get_speed(url, timeout=config.sort_timeout, proxy=None): """ @@ -176,20 +177,15 @@ def get_speed_by_info(url_info, ipv6_proxy=None, callback=None): callback() -def sort_urls_by_speed_and_resolution( - data, ipv6_proxy=None, callback=None -): +def sort_urls_by_speed_and_resolution(data, ipv6_proxy=None, callback=None): """ Sort by speed and resolution """ - response = asyncio.gather( - *( - get_speed_by_info( - url_info, ipv6_proxy=ipv6_proxy, callback=callback - ) - for url_info in data + response = [] + for url_info in data: + response.append( + get_speed_by_info(url_info, ipv6_proxy=ipv6_proxy, callback=callback) ) - ) valid_response = [res for res in response if res != float("inf")] def combined_key(item): From 483190831d20c3e4db8689fd71a306769b7ab379 Mon Sep 17 00:00:00 2001 From: "guorong.zheng" <360996299@qq.com> Date: Wed, 20 Nov 2024 18:09:57 +0800 Subject: [PATCH 07/37] refactor:get_speed --- main.py | 4 +- updates/online_search/request.py | 2 - updates/proxy/request.py | 4 +- utils/channel.py | 156 +++++-------------------------- utils/speed.py | 102 ++++++++++---------- utils/tools.py | 33 ++++++- 6 files changed, 110 insertions(+), 191 deletions(-) diff --git a/main.py b/main.py index 3447a35..f510b1d 100644 --- a/main.py +++ b/main.py @@ -6,8 +6,6 @@ from utils.channel import ( append_total_data, process_sort_channel_list, write_channel_to_file, - setup_logging, - cleanup_logging, get_channel_data_cache_with_compare, format_channel_url_info, ) @@ -21,6 +19,8 @@ from utils.tools import ( format_interval, check_ipv6_support, resource_path, + setup_logging, + cleanup_logging, ) from updates.subscribe import get_channels_by_subscribe_urls from updates.multicast import get_channels_by_multicast diff --git a/updates/online_search/request.py b/updates/online_search/request.py index 7106d61..ced655d 100644 --- a/updates/online_search/request.py +++ b/updates/online_search/request.py @@ -1,7 +1,5 @@ -from asyncio import create_task, gather from utils.config import config import utils.constants as constants -from utils.speed import get_speed from utils.channel import ( format_channel_name, get_results_from_soup, diff --git a/updates/proxy/request.py b/updates/proxy/request.py index f610a93..d335655 100644 --- a/updates/proxy/request.py +++ b/updates/proxy/request.py @@ -2,7 +2,7 @@ from asyncio import Semaphore from tqdm import tqdm from tqdm.asyncio import tqdm_asyncio from utils.config import config -from utils.speed import get_speed +from utils.speed import get_speed_requests from concurrent.futures import ThreadPoolExecutor from driver.utils import get_soup_driver from requests_custom.utils import get_soup_requests, close_session @@ -71,7 +71,7 @@ async def get_proxy_list_with_test(base_url, proxy_list): async def get_speed_task(url, timeout, proxy): async with semaphore: - return await get_speed(url, timeout=timeout, proxy=proxy) + return await get_speed_requests(url, timeout=timeout, proxy=proxy) response_times = await tqdm_asyncio.gather( *(get_speed_task(base_url, timeout=30, proxy=url) for url in proxy_list), diff --git a/utils/channel.py b/utils/channel.py index 864385a..c3660a2 100644 --- a/utils/channel.py +++ b/utils/channel.py @@ -10,15 +10,13 @@ from utils.tools import ( write_content_into_txt, ) from utils.speed import ( + get_speed, sort_urls_by_speed_and_resolution, - speed_cache, ) import os from collections import defaultdict import re from bs4 import NavigableString -import logging -from logging.handlers import RotatingFileHandler from opencc import OpenCC import base64 import pickle @@ -26,36 +24,6 @@ import copy import datetime from concurrent.futures import ThreadPoolExecutor -handler = None - - -def setup_logging(): - """ - Setup logging - """ - global handler - if not os.path.exists(constants.output_dir): - os.makedirs(constants.output_dir) - handler = RotatingFileHandler(constants.log_path, encoding="utf-8") - logging.basicConfig( - handlers=[handler], - format="%(message)s", - level=logging.INFO, - ) - - -def cleanup_logging(): - """ - Cleanup logging - """ - global handler - if handler: - for handler in logging.root.handlers[:]: - handler.close() - logging.root.removeHandler(handler) - if os.path.exists(constants.log_path): - os.remove(constants.log_path) - def get_name_url(content, pattern, multiline=False, check_url=True): """ @@ -462,9 +430,7 @@ def init_info_data(data, cate, name): data[cate][name] = [] -def append_data_to_info_data( - info_data, cate, name, data, origin=None, check=True, insert=False -): +def append_data_to_info_data(info_data, cate, name, data, origin=None, check=True): """ Append channel data to total info data """ @@ -485,14 +451,7 @@ def append_data_to_info_data( or (not check) or (check and check_url_by_patterns(pure_url)) ): - if insert: - info_data[cate][name].insert( - 0, (url, date, resolution, url_origin) - ) - else: - info_data[cate][name].append( - (url, date, resolution, url_origin) - ) + info_data[cate][name].append((url, date, resolution, url_origin)) urls.append(pure_url) except: continue @@ -584,34 +543,6 @@ def append_total_data( ) -def sort_channel_list( - cate, - name, - info_list, - ipv6_proxy=None, - callback=None, -): - """ - Sort the channel list - """ - data = [] - try: - if info_list: - sorted_data = sort_urls_by_speed_and_resolution( - info_list, ipv6_proxy=ipv6_proxy, callback=callback - ) - if sorted_data: - for (url, date, resolution, origin), response_time in sorted_data: - logging.info( - f"Name: {name}, URL: {url}, Date: {date}, Resolution: {resolution}, Response Time: {response_time} ms" - ) - data.append((url, date, resolution, origin)) - except Exception as e: - logging.error(f"Error: {e}") - finally: - return {"cate": cate, "name": name, "data": data} - - def process_sort_channel_list(data, ipv6=False, callback=None): """ Processs the sort channel list @@ -619,72 +550,31 @@ def process_sort_channel_list(data, ipv6=False, callback=None): ipv6_proxy = None if (not config.open_ipv6 or ipv6) else constants.ipv6_proxy need_sort_data = copy.deepcopy(data) process_nested_dict(need_sort_data, seen=set(), flag=r"cache:(.*)", force_str="!") - sort_data = {} + result = {} with ThreadPoolExecutor(max_workers=30) as executor: - futures = [ - executor.submit( - sort_channel_list, + try: + for channel_obj in need_sort_data.values(): + for info_list in channel_obj.values(): + for info in info_list: + executor.submit( + get_speed, + info[0], + ipv6_proxy=ipv6_proxy, + callback=callback, + ) + except Exception as e: + print(f"Get speed Error: {e}") + for cate, obj in data.items(): + for name, info_list in obj.items(): + info_list = sort_urls_by_speed_and_resolution(name, info_list) + append_data_to_info_data( + result, cate, name, info_list, - ipv6_proxy=ipv6_proxy, - callback=callback, + check=False, ) - for cate, channel_obj in need_sort_data.items() - for name, info_list in channel_obj.items() - ] - for future in futures: - result = future.result() - if result: - cate, name, result_data = result["cate"], result["name"], result["data"] - append_data_to_info_data( - sort_data, cate, name, result_data, check=False - ) - for cate, obj in data.items(): - for name, info_list in obj.items(): - sort_info_list = sort_data.get(cate, {}).get(name, []) - sort_urls = { - remove_cache_info(sort_url[0]) - for sort_url in sort_info_list - if sort_url and sort_url[0] - } - for url, date, resolution, origin in info_list: - if "$" in url: - info = url.partition("$")[2] - if info and info.startswith("!"): - append_data_to_info_data( - sort_data, - cate, - name, - [(url, date, resolution, origin)], - check=False, - insert=True, - ) - continue - matcher = re.search(r"cache:(.*)", info) - if matcher: - cache_key = matcher.group(1) - if not cache_key: - continue - url = remove_cache_info(url) - if url in sort_urls or cache_key not in speed_cache: - continue - cache = speed_cache[cache_key] - if not cache: - continue - response_time, resolution = cache - if response_time and response_time != float("inf"): - append_data_to_info_data( - sort_data, - cate, - name, - [(url, date, resolution, origin)], - check=False, - ) - logging.info( - f"Name: {name}, URL: {url}, Date: {date}, Resolution: {resolution}, Response Time: {response_time} ms" - ) - return sort_data + return result def write_channel_to_file(data, ipv6=False, callback=None): diff --git a/utils/speed.py b/utils/speed.py index d9ea39d..8ca98f0 100644 --- a/utils/speed.py +++ b/utils/speed.py @@ -3,9 +3,10 @@ from time import time import asyncio import re from utils.config import config -from utils.tools import is_ipv6, add_url_info, remove_cache_info, get_resolution_value +from utils.tools import is_ipv6, remove_cache_info, get_resolution_value import subprocess import yt_dlp +import logging def get_speed_yt_dlp(url, timeout=config.sort_timeout): @@ -20,16 +21,16 @@ def get_speed_yt_dlp(url, timeout=config.sort_timeout): "no_warnings": True, } with yt_dlp.YoutubeDL(ydl_opts) as ydl: - start = time() + start_time = time() info = ydl.extract_info(url, download=False) - return int(round((time() - start) * 1000)) if info else float("inf") - except Exception as e: + return int(round((time() - start_time) * 1000)) if info else float("inf") + except: return float("inf") -async def get_speed(url, timeout=config.sort_timeout, proxy=None): +async def get_speed_requests(url, timeout=config.sort_timeout, proxy=None): """ - Get the speed of the url + Get the speed of the url by requests """ async with ClientSession( connector=TCPConnector(verify_ssl=False), trust_env=True @@ -133,42 +134,26 @@ async def check_stream_speed(url_info): speed_cache = {} -def get_speed_by_info(url_info, ipv6_proxy=None, callback=None): +def get_speed(url, ipv6_proxy=None, callback=None): """ - Get the info with speed + Get the speed of the url """ - url, _, resolution, _ = url_info - url_info = list(url_info) - cache_key = None - url_is_ipv6 = is_ipv6(url) - if "$" in url: - url, _, cache_info = url.partition("$") - matcher = re.search(r"cache:(.*)", cache_info) - if matcher: - cache_key = matcher.group(1) - url_show_info = remove_cache_info(cache_info) - url_info[0] = url - if cache_key in speed_cache: - speed = speed_cache[cache_key][0] - url_info[2] = speed_cache[cache_key][1] - if speed != float("inf"): - if url_show_info: - url_info[0] = add_url_info(url, url_show_info) - return (tuple(url_info), speed) - else: - return float("inf") try: + cache_key = None + url_is_ipv6 = is_ipv6(url) + if "$" in url: + url, _, cache_info = url.partition("$") + matcher = re.search(r"cache:(.*)", cache_info) + if matcher: + cache_key = matcher.group(1) + if cache_key in speed_cache: + return speed_cache[cache_key][0] if ipv6_proxy and url_is_ipv6: - url_speed = 0 - speed = (url_info, url_speed) + speed = 0 else: - url_speed = get_speed_yt_dlp(url) - speed = (url_info, url_speed) if url_speed != float("inf") else float("inf") + speed = get_speed_yt_dlp(url) if cache_key and cache_key not in speed_cache: - speed_cache[cache_key] = (url_speed, resolution) - if url_show_info: - speed[0][0] = add_url_info(speed[0][0], url_show_info) - speed = (tuple(speed[0]), speed[1]) + speed_cache[cache_key] = (speed, None) return speed except: return float("inf") @@ -177,24 +162,39 @@ def get_speed_by_info(url_info, ipv6_proxy=None, callback=None): callback() -def sort_urls_by_speed_and_resolution(data, ipv6_proxy=None, callback=None): +def sort_urls_by_speed_and_resolution(name, data): """ Sort by speed and resolution """ - response = [] - for url_info in data: - response.append( - get_speed_by_info(url_info, ipv6_proxy=ipv6_proxy, callback=callback) - ) - valid_response = [res for res in response if res != float("inf")] + filter_data = [] + for url, date, resolution, origin in data: + if origin == "important": + filter_data.append((url, date, resolution, origin)) + continue + cache_key_match = re.search(r"cache:(.*)", url.partition("$")[2]) + cache_key = cache_key_match.group(1) if cache_key_match else None + if cache_key and cache_key in speed_cache: + cache = speed_cache[cache_key] + if cache: + response_time, cache_resolution = cache + resolution = cache_resolution or resolution + if response_time != float("inf"): + url = remove_cache_info(url) + logging.info( + f"Name: {name}, URL: {url}, Date: {date}, Resolution: {resolution}, Response Time: {response_time} ms" + ) + filter_data.append((url, date, resolution, origin)) def combined_key(item): - (_, _, resolution, _), response_time = item - resolution_value = get_resolution_value(resolution) if resolution else 0 - return ( - -(config.response_time_weight * response_time) - + config.resolution_weight * resolution_value - ) + _, _, resolution, origin = item + if origin == "important": + return -float("inf") + else: + resolution_value = get_resolution_value(resolution) if resolution else 0 + return ( + config.response_time_weight * response_time + - config.resolution_weight * resolution_value + ) - sorted_res = sorted(valid_response, key=combined_key, reverse=True) - return sorted_res + filter_data.sort(key=combined_key) + return filter_data diff --git a/utils/tools.py b/utils/tools.py index b370451..45f5301 100644 --- a/utils/tools.py +++ b/utils/tools.py @@ -3,7 +3,6 @@ import datetime import os import urllib.parse import ipaddress -from urllib.parse import urlparse import socket from utils.config import config import utils.constants as constants @@ -13,6 +12,38 @@ from flask import render_template_string, send_file import shutil import requests import sys +import logging +from logging.handlers import RotatingFileHandler + +handler = None + + +def setup_logging(): + """ + Setup logging + """ + global handler + if not os.path.exists(constants.output_dir): + os.makedirs(constants.output_dir) + handler = RotatingFileHandler(constants.log_path, encoding="utf-8") + logging.basicConfig( + handlers=[handler], + format="%(message)s", + level=logging.INFO, + ) + + +def cleanup_logging(): + """ + Cleanup logging + """ + global handler + if handler: + for handler in logging.root.handlers[:]: + handler.close() + logging.root.removeHandler(handler) + if os.path.exists(constants.log_path): + os.remove(constants.log_path) def format_interval(t): From 4f17499e680dd8fb791ee4480863204fbd486650 Mon Sep 17 00:00:00 2001 From: "guorong.zheng" <360996299@qq.com> Date: Thu, 21 Nov 2024 10:51:55 +0800 Subject: [PATCH 08/37] feat:follow qrcode --- README.md | 7 +++++++ README_en.md | 7 +++++++ static/images/qrcode.jpg | Bin 0 -> 28565 bytes 3 files changed, 14 insertions(+) create mode 100644 static/images/qrcode.jpg diff --git a/README.md b/README.md index 744c793..8922e64 100644 --- a/README.md +++ b/README.md @@ -201,6 +201,7 @@ docker run -v /etc/docker/config:/tv-requests/config -v /etc/docker/output:/tv-r ``` 3. 更新结果: + - 接口地址:ip:8000 - 接口详情:ip:8000/result - 测速日志:ip:8000/log @@ -221,6 +222,12 @@ docker run -v /etc/docker/config:/tv-requests/config -v /etc/docker/output:/tv-r | ----------------------------------------- | ------------------------------------------- | | ![支付宝扫码](./static/images/alipay.jpg) | ![微信扫码](./static/images/appreciate.jpg) | +## 👀 关注 + +微信公众号搜索 Govin,或扫码: + +![微信公众号](./static/images/qrcode.jpg) + ## 📣 免责声明 本项目仅供学习交流用途,接口数据均来源于网络,如有侵权,请联系删除 diff --git a/README_en.md b/README_en.md index 3d15814..7d937d5 100644 --- a/README_en.md +++ b/README_en.md @@ -201,6 +201,7 @@ docker run -v /etc/docker/config:/tv-requests/config -v /etc/docker/output:/tv-r ``` 3. Update results: + - API address: ip:8000 - API details: ip:8000/result - Speed test log: ip:8000/log @@ -221,6 +222,12 @@ docker run -v /etc/docker/config:/tv-requests/config -v /etc/docker/output:/tv-r | ------------------------------------- | ----------------------------------------- | | ![Alipay](./static/images/alipay.jpg) | ![Wechat](./static/images/appreciate.jpg) | +## 👀 Follow + +Wechat public account search Govin, or scan code: + +![Wechat public account](./static/images/qrcode.jpg) + ## 📣 Disclaimer This project is for learning and communication purposes only. All interface data comes from the internet. If there is any infringement, please contact us for removal. diff --git a/static/images/qrcode.jpg b/static/images/qrcode.jpg new file mode 100644 index 0000000000000000000000000000000000000000..51bb9b1c615f0f23d8d3168f09d6d5d658459912 GIT binary patch literal 28565 zcmc(|3tUWT{6BsYa!UwFX)LKFv?QT)SWD}+gAl?jNfJiuQZdbOPl+~dTEw(0A&exU zbh;@-
KBhN?C4?ISuzU>O0+ydU$6rKe;z_pZF$53<47UKlbXV&_^0f_c3xNU| z>qGVm6(nAST;hvx21#EH>Jvnj#?GEa>BGeX8xA!Q&Rls8Dl|BS|Lb{*B-Z1QHJ%X+ z-=s2TiW`XeSxGXYjckesexQZ8OrCx`#1U@*~-_N z19$~AZMq=atB#sMGeI^fFjg0Bo^B|q+F9ebVGHmS6LMOCdCnz|bE7`Vl!A88{uzR{ zJ_u`&tYAG7)<|qS` i0CH1+ n7-F1WGv@EhS>Zy`I&s-_{pD~gWa zURRn|`Zs|12HPDA-Zg$}VM@iJ#{`5T0D`#uB$0tO3L>HUF&jk+aj~pzr%ZNdQqclv zT *@o1Z7=N1gm3M(Lcfbs?TA5J_ZFxXSk@D>TM`N%1BgJrse}pZF@Zs zkvE q}l@3sZUDQVMNPuB$E}^?FJzG|bCz ARa1-CMV+{v)MrV_< CtcQ z*k4Uh1~%S&{`XOrs#nt|WE|CdaM0*4`zG5#iT55kSp4KWF|>1iY2=#0q5Zn`{H2Rb z^tj27==tHsHTlOICvq}N@#Pym7WH4Y_0Fl%()d?>xr^%0O})|o$Jt(WJLgFwi{>9X zcJPCTsssJ#QVxEj`qr-j7K@;M=*RKpKPLO}0U5_TIZc)~vZ;H2y<5EOhg-u5-!10c z!6z!0<}I43-+6)a9&&QZbh+D{q$f_?VaNVj6>xEB?e;r8BfY%G&K~vZa{1gL!-s_g z4G_(0VD pz`?$WBZ|~ fe{{m_Z~{;i;TW2~^ m+P=_;7Dmv(rnw2AKbD^C6ZV;6Yo!jhdRlH6^KS zgw$O8^)mV){X)em!k-Y5n!F%T46*Gr%Ow0V-&@VG(qsfwK_~4)y{ix$gzBe7T*B6| z%^)sWmixK5WS7xH(GkvdaaLW?jdekl4v_H%4J;6V%$C8m>Jf;W`YIq^BlYq#P0xAj z_N{re3aXLYf`*?I01%RzYr= jBqc{;|&0X#?& I8 z16>@VHaZbLtPWIeHor5S4WzQNE^#HIHb9zq%%pcafv!`Bb^54+dL2q+MCiw$BB`Vs zAh2D1ks?l>OIH%jTa$$gDG3myV>Bm;c!Ml1h&Lx~6XMbV*X|&Blr5BF^N~D?RhI4N z8*RRg=*|aP8-zULM5g`@u8ff9H9+~&dL-mYVb{;P)FRq62gPpF70O*P8wx1k(h!n= zM}V}HVnFg!e?nXu8-V;cfYT(A6Y^Z(F6*crwz7$Ey}1M4hDi $sty%)iMUMAXFb3`Lf*lc2B%v`p{`pr zb>CrwZg!!kXW9c3y+b`;fu|EijycX_<(pzP01? )UWev@D`6%2g z{G=v|0(f{^;o;e(NtOaLg&v-2Wd@L8k)X$3nxAdqV15Ba#a-;n`|8z_u$7Q*>&EX- zb&K=UIL`lw5swfqqD)nzc_4N@aFcJ2IF0YlFjO}?v5o3RMRyC;O~0knIo(0p#8Lht zcL0+2JOR?CIV!(mY3kFy0CEsWPTh{{#HyW#(2rK?QC*>lSpF24y%irkUv5qEzT$EB z_8sr)E{lFx8_>l`q93-NGLbZ<=W>c_(ogqy=k!@$EI7Pzz$ndm$*{xGzkRnlI6ORb z$msylhSlVcy!onS{>GJc(mI9XJz(OdvJRGHE?&9e@TmQd@8tYovF6vyPqUW{x|_gp z;(5N
O;OGX~nfkG@$vBj}R1n_F!~zf+0!dzRw;2okLQRm7O#KZiK`tHqQT8A;;zKgB6~4rVeG@ za6i84R>wU%cSnEpearc)xNeur!5f3TGTknFKCz!rH8Z^Q5LRP3ykkELC`cZi^Q&6u z@qlF~5ftfHMD3$T_$SR(%!sVG^+9CxX8NW-X8U$}^sEf~(PYixS&}W|%Qi3iZKt_o z*xnuI_g> )Z*;BXRl;E*f1)naJ1xDvD{_g`09wO)q@Xo zJeKF8h nKQLd{(rQAbwS1)?Tv#YG@T9RJTlqk4i_cn?@H+h_I$9+lfGcGzl zn-<+6(6QhqAOwBv1wn#qemUI!{)< Y_`vD@qece>z$E&b5h^Q>`uPwch*WN zW$alYI(WxQP_cAtT=&@ T_*&tNzya8UEdYF`|ZAzmOZ7R?WZph%7=Wl%YjFDNizi7I8+(6Jp(pC7QF+ z#s$Ths*_7sBUYpj@1R|hwdGO5p8rjtFJ~dY48O(!=n7BtI|8JgNdGX?DLVhponk)s zTX;$P87@^uP~9k3Ql6?=tPtx;9P$|m_?1hq;oKImOVA$d5(u;ym$ScY0A-69_ViT4 z=Xku@;XLTej&ar<18$X>q*>aED(vdSPXn67TKXUwLhM8oVqH;)h3tkj?7&B|5KP!g zND3GUd%&*^PRZSogndy KusP%N$z>Opv@IAWA%BIH(S-5v~7wwWaUF zXs@Ba8}k3)XFzv*eU*eutrJtX1oHiwAe8~Vittczik+WpF^iRKP*4L{`_5rwQN3h~ z7ofvCY!M(Z{Rc?Fdl4S69^i{_q;$pt@+U}SWz`julBD2NL$w)Xf$zkIYKEROk@inQ zLb1zkuKecO;cEk*FQ28w9HTd-W$ZF|%a*-UxS-U91_8{e*5oC+ra9UuRiHrt<>%5* zkS_izED-@_%q? m6b#WwDeL|(|%2uj98~)tNojt*8-yH4pN`e zB(L1Vj|Cy$yi4Ayf75`tpZ{1;D3HgeAguz-%%HledmQkE^=k3Q-oR(I)>V z7Y_LO$>y^Y9z3utct|D*rKT_vkt97O5u&_XgJvRH6d__z<1q`_R&ALBmR~7E8eS+x zpD _kd{=6$4dV^}SSp4{ihs=s%|?aEmkz$u}o{ z0;ls*8Pxw9Rhec9c|Q>S@lD)9A9?_Z_>U`O#Te&da8VhlnMy85i|LcOq+jvm_@q>S zO(5ukzo!J{B;2%ssnoI+R!A4TQga%eP`b>zY1rave}w0Z@Qpq)1;n0GTP 8tew+>wIAU_x7w=lhd=$J$e$$? zcjtpV9K@32M6DX;lTa9eJRFH7K_dI`Q44Nsj@hJrg==E!IMCp2TBS099|0gsUv{f9 zb~V|m!kXjRs=`v9Rk|Zk9OP2gI#3*E#FK97+57@VJP8PHvhgQPaD#gpNs#4HtoqeN z5AwY=!cy;GR1n=&^7jfK0M%V&*5`|^s&W%U2JD{D=|pG!h-Y_f_i;?Nh84NZBn 76~t| zWHtJpR2>r7zu4${C%|0TF| jkL;hj>{;D>i!#^W z@4eU?x`w5^)>l4Nc!}SKE?PNAA&gj6X%?U!6ZdOphc0vDqI-mo{sB h4Xp zQSJvgYJkguVdT?&2cC(R-#A>n?y2* Hz5 ER>u$j80qaBAsFS=f z#NzSdbb`YkB}lc~lR)xg82 Wd)6f;tCI6{1ta)Sq$D~(d-uuFu>SZ4}y9J5XkiLtq`4FGRK6SH@Nb}P0xh5mc zKn#F`#J2g0plLnPxN!#qM|4^S(GbM%6#`wdLPB;o^&C>CV=vDAT*uDZg?}#8Td5CX zC1@zS``78jN@xNXMoqZ9gR%AM`=>t(!Q=E)X93IsO1D@)9dBCz2D3*C001^x0luj2 zRB5~jde?SW%e%;kHDkwwQA<4rjnTBsFO$&U^#x_)S=8U@6#t-YbcN?t#}}bdB*M23 zFMI^Zy7ulj&1PGkz?zwPJZ2_OKHS?7<4*z33RNhFISAW8RWHaRxeEZ=-~!zN;s~ZR zJhsg@=y1*myU-(D?BymI;{B=C)N{#QkPbmbdJ`=zNQW9K(aIveIkIyf2d8U!KTI6# z_Mzz>VNU`-Xv+*-A$|}t50d%-Kj^L`nQ1G;4}QY)Fr)uZA)o3o@GN5>@j8OOqlA_S zit%C=Wmp}6IA^ZkNwp*2gEsfnVv7>A*eEtFi!r)HB6yLd>6;0dgRZ15XNF>@gW?m0 zVs)Y*Brw#8f>t1fVbK@ExDVkeq=|tgWmvP;VgQXY>52h{Giz520B6jSPjk{@Xt*X9 zDurZ#do+7UF0RvBb^z@%U#DJAYMcKgZy|ymw3fZ(Ii~4Vy;r!&W`dx8jOK=ON9ts` zIGqFl$U`wSi}a))J|z;~U* m+`T_q zddu#I Yq;iBI_shZWM$ p5oWiC0Qp#L9*E2?~i-2=;(y5()|(JJ3Af? zsP#F2nB#SO|14h3<0vS)#_{5l^DjRcv8F?LpVIX7H<((ru)nk2-mDG8^($7R4rkMg zJooJ_)ysY#G(d7BvA~~H?$AWhgQ#PTQxpa={R``wuf($xm*fSfbe>mh)@Xg{*5n-n zKM>eDGJ$<4aW0<0H>U3O|La2D<(n_ZUwb{X!*|=WJ!-mz{t{@oEvKJZ?UqS~8~imV zrvJL+Uii2}QIWxAIWJURiA(n0E4Z`OWQ^6Nn~I E{I=3o~@gE(bOL>d)}RA+-a8w zMuv9#Y4`H8yOuhR{lRIwJ!e_0Pp=CLQ)BNt52xxbQ2ff-ETi>f-D|HO4cq23I{Q#j zPkv+lJ^o&P){e)o@5(b5C*SS$z@d1R>o&ub&8DJ1j?4+!WvIn)Yty$Unp`UCq&2D$ zlsNm&rtlcv*3^Q;lR<0uWaRgnIsTrvS;x$xMMv1b`h0Lqa~||GWq5@K&ph4#`Qrn7 zSKnH&<&JB?mi|>o11#%j%9cl7x^!sT^}bC#o1Dv=-FDGsB%o&~x++Ai!f{uKj3WU( zL%|gknC&&Qjn(CDk@O1zKzhvV?a4|9r8PspLof;UDyGrk?fj{9lE)_zN|gijO#4M@ zM=#pgLp7tF&=zm#tMV#xeyS8uiU##vfe&;KOOv*1u_#CPf0FaNJ^T|+>=Pm%4&r_| zkiH@rOJ=0*T%Q7(=cMGv^dQn94QKih-Q??L`-Dn}Sl5B+7fA)44Jq%I#6r-!`$>C; z5z|@UH09)`e51t AA+V|C%Ax814%hu zaArV=nN`lOYI2y*hFN8>V`!Q9F?dL taZUG1?Ku0H+sJLx{id?Ax2`VlykNMNU z>Mp(>uLq;AgjstS*hZj`Zq}Y5iI`b?q!MhIwbv{}qPO+<0X&{SqBk?@K_!=(mTKwm zgG6t(%E0`_qSU9`M!mpO6GN78wmS62@7I`J+nlz$+KEUv$ (pEdBD yG2oVpnLNFBqLy`TBk;4QUiqxN&d%xz`gggVRTa!ClB^^A~vPhtp7ch$y z%)nD EB%!_s>{zY>7P#@Gxo!i pOgspXn@G>Q^+NzZ z8uEpa#Jf6mp9tj{7`&SajqejyZ-mrz?e&znPN&nm83xg(0e|rmAP6pv35QcWtnu~g z1!(X91Y`(2(MdMA2s}y1Z83Q1^T|Tvs%yC)2pDpdN9ht)Pab;l-cNa9Nv|_%85 po;( ! zqgJUBn6g2Y-#`LQ**K)1o-hf`Z|FRg&~1^7rxM^|uj(@=q*d)+9;@#4$b&ZV(xl@` zdKW&9Z>gTCFu5llxZYx t@e zz_mHa5<=z_w%j|)rFr3()7?9S(j 8 $TR ztzZFXWaeEqT7E2MoUoTS?NxO3af<6f_5EU9N4MR4Z)nx8yL>)2&|Rmh=JIB0&bn0| zq=G8P2oIa6Y^B(eWyQ>l5x}TcZ8JuqC*tlT8a*B8v<;2mr0SLsMsReq;>-+A8W>01 zu0G(q`{)#*fMArES>ob(ycQ)U9R3*>xS|pn@?Mgjc56S_xJEw>MPBgE`1g@lvj~O? z5;9o>d0ks(A#-373r)kWL-Tu)fM;8^%5}@bIgh#bY*FtA@r#|FIu_Un6uvm?q4z`K zYv$*v^u6G7_mwFY7v+wC&3ULC7^&24P$v!*m#k!$G!RHxy3#9(PIZGZ6?Ssy` VK>0Fc#z&kO*hBh(CUb+Lq5R zBT?J{`c@%ov!<8>WsWVh_lUnm!LuE|{*eP#7V0tJxpbn%%3_1R&U8tMSf1M}Vf!v> z*U1}wt9t>a&ZlaiL_iGmLFb|VFw_JLG}G}-VJK)uPtb1Cs%cRm@}q$Hqzf `SkQUCx*Ookv8s!#UD+s2TbB&=C2xW){3z=q{cx2O(1J zA!M2zLS%}-;6fl%X-{GR_=Rwxf8sEpSN>m3Ffi2hw&_CwasNkss2Jp-neFAF=j>ow zmc#n6gsfNtvT-AoqYC=c4m`1)Op8f3){}?)V5olqKUdHq*s`J?$hiP8F+=?@xR@xE zb=M8`>vT?NsDBvy6v!u5?HXDSfTV0DGC`xWSiRLK`2#A$a6o7#iQ#}g1+V)Cb#>C) zid>|1bUVNYY1V3H6_GF+EP{~MaU|>AcKC)?qljHZ1?YH7Sc-5l5~$uo-2m+=lnSNf z%|M~XfOh7+O@Y3q0nfiFJLz9~3q7PS=I;tfC}%(q4|9}goB)b y?aC__{drL2bfRm41F#OshcUWflRufs*W4zwOUz^@2+9T*7tKYfy5EAP3& z&lSV)c7i-bJpl!<*kzzO;d9@k$!+8j)dce#tyXh@IsPg{0VP|2D8sP|!R|cd6$F$a z3Mhb=)xB?Djs(Dr)@z~kHlrz(2oLbh2W_DIR8ZI}#;UB_>~6TAKEJ7{I9yaS0KWla zSR$!C+{SW*!}R-P8UlJ!{BzR~$rTv;>jZWswvsET{*+Hd^KYp9)I~Q`iX7YCLK=nk zGURE{QGlZhqlFxKoX-1gg8lz8`j)2ifFdf+IZvWaR^sYWtk!<6kC<{n-O~7YXn|!= zSGKee*7@KF^NOD#Fvb}fyW=eNCFo?ouxf-)eW}R(L$7J6st29vqI~K+o)JNt^X!$j zt 0;O&Fe(U7)lOy2%o;2O29n#Jzk^zThZ?}I zTgcU>_8dmo3z#7X)H|C}N48Ewy)!7@6J!KxotFaU !1ko?H8*s&5!Rq+ zqGqJR85qN5hGy0QhTpq&Xl4Z*^E(=7-`^Y;s9CizPrmXZObaffR;k8A^92 AHGNA+O3_t_Li2pT5<*AvqMg&pf7)M3v(&+#w8B;sw&erGF!nM2$jnXjI& z*+X~Yty8>=h3Rg8^LI$*CuAgMVvu VIPh3Tgs6SD;U{TBku3fu<+cL#H2A)aIME6S~3{TQK!yM0kT+*JDA4l(`Bs IY+&eym#M zdvSx;dPxJPGU}c!BOpaPOXnMac2-kwBp`)-_0y%jT?h8;>t*V6be(>4U|T}B#v-09 zcxLg3UOE14-Yj2PLh1YiU-3%`T`)PHJF7YF{{-_dK)CsAKv@V*jM>0&5%n*$*!yC< zBAfHk9oPL21~2%95!GE+Xlqd$9f8_tr y#3?0sU_sooQaC |Ps+TrnJG^=v z>!S-%;ZD5TqH !3rY$q{6K)p2g_c@n+_>Z39#&qDjtH00a-P1dhw?op0gjsO&}m?u_{EIQOlSd z2uRv|3d=t6#`w7r7^tYa&SWf6Pr?uw>mXwdvDJs8o2g_>5z%PpFvxZus=~bYc6-B~ zbep3mo3XBCM}0D@A^W9vhJXlD`rlm<1fki*eFxX2GD(POKy^u|oqnAp;d&9rg#<6Y ztsEB`@cw7P3oo|C7cu9PFCrU!5pAUS+E!o00J^Y5?1XI-Tyx8)Ggg~uz?X!XyDTiT zeC`asB(^t@Pag;7k)7tW8aLe^LfZdFUGdObK?^3`qky5m+XO#c>Nug(`yl?iz23(H zbl9B$y^rWi9X~>%QHAHH&SAVb)m9?=LC_weBAP@>E)!*)tWKxo@&ZdmzD~)toQMM< z*W<&vg2zM%2b^k<6(RCuV&uAWktb8ly%tNRcD}U2XJOQL0`<#BTI>arYJs5};Q$Ps z&Sd&JAhFw=zri%SU^vtq$bn+!pbfl fg5Bw=VQR(c3Y z!mN> MG?_7lQb zy^tF11*xvvY#>!`f`~HXj;PQEEUNp--GOpvEUFpbEMVNhOTf0Kg-;0S3^lY-58r5u zsr~B6BnRnOd?SnckzlMp9qHaec&$e^GVwZ bHHYOJ>O7q?6@Yr z#V@yb7^IYHgvqsIPF^R;o)Ca`r{nTGjsl_GrJB3YmLRlS3W_o?WvFA|?y!$L0q#yn z^i{^n-Z75Z197C2ZM6 NS}cLJj_Dw-ONlq1P>&A1_Ce!^ew8-6)W=$ z$kWpqS D=mNfb#CzG)*dF!CUb9bDI?BJ)n}>!DHHS1gGlk zXb_xAGjd{tr?!O>^Im8Y2?=pOGltpAY@paK>D2LX02`QhI=Dz6En}cSr)4~!d`EME z0xu#o1BAm25PG))z~5>#do>+u!5WxHI%s}kCs}MDcAA!gYq*|T%3FZM--n$YTS%l< z1@4gVTLid~t+4CSxjSON&9M37*XUkK9GH(FTl-=b;!L^aV(|MMLxoo&cG`0t7=A9s zy;YN6Fgot<|C)QP n4U{Q>J|PE;CM3+QL}oLfou8Iz?q%@%bd2W; zikQ#e{K81x4-DXj8dR=z(d-(B-f{v`;5U|z{XkO#?VC=K&$Mqyk iFG>J145mLT+E1(5Lx7*6eJYi zV?5A9)|A+%Tx^KRdlh=Iqef4)gDyi%0R5nB5@W7_r~nSoh~NsYZq;J6aVHNt>~bE? zG ^V4NIbJ$|K&KyC0wQwu>?IAw~=^@&?EL(r|P66P*BcyzzS}n`N+Wna^ bW!H?4;@9DfEBiv2m@khb ctO8;0Ze5~ zgcv`b*A4uvxe#(-UYMV&bIV1BL1#X Q;;IBmd@Va7gGT|xupCKG#u{0@J+ z&wac`z+j*;-&7}{W&q7yjX$NcD+8DtH3KR%9>Um_eJXp>4AA?GeC8KUo+q)dYB~-7 z+h!KV>D9gR2%!uZmv2`B*+jHA`94Vx6a2Hu_bhl90)QQ1s`5|jjPp>6VW}XIpoE9s z-zBx+HE|&r1UO-JUS|H;zwnSr$hW=wPK*(v0+xec{YN#Fvfx*La`Zbmaial%J!%c= zD>O{}nD`cF`Kxh~D8^;(=)l3$VNgB%eBcn|=>Gp?7x=r;CAc3kGSL|aeNhj!3#%`| z*l@#;LyL2F>Fh6@yD#Co??47@@Es7;&g$@lVxn>>Xu);1J1>`fZo9K1N!>>RZ=q2U zrGY-;!&^U)lz!vjRE$vwS$>;nKV|Kc&!5PDfsh4T=~RVT7Fc5$GUk;nN8^h(6+&5c zFGO8$lvUB2!!WQlfSj#EK}_6k hq8i?vy|8~WL5|Y Tod1Rdw<5y-KmS)>TlD_`L4a@j literal 0 HcmV?d00001 From 0b3703611bd9343636d96dc62e73bc5b44735730 Mon Sep 17 00:00:00 2001 From: "guorong.zheng" <360996299@qq.com> Date: Thu, 21 Nov 2024 11:15:08 +0800 Subject: [PATCH 09/37] Update:readme --- README.md | 8 ++++---- README_en.md | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 8922e64..84c6575 100644 --- a/README.md +++ b/README.md @@ -210,10 +210,6 @@ docker run -v /etc/docker/config:/tv-requests/config -v /etc/docker/output:/tv-r [更新日志](./CHANGELOG.md) -## ⚖️ 许可证 - -[MIT](./LICENSE) License © 2024-PRESENT [Govin](https://github.com/guovin) - ## 💰️ 赞赏 开发维护不易,请我喝杯咖啡☕️吧~@@ -231,3 +227,7 @@ docker run -v /etc/docker/config:/tv-requests/config -v /etc/docker/output:/tv-r ## 📣 免责声明 本项目仅供学习交流用途,接口数据均来源于网络,如有侵权,请联系删除 + +## ⚖️ 许可证 + +[MIT](./LICENSE) License © 2024-PRESENT [Govin](https://github.com/guovin) diff --git a/README_en.md b/README_en.md index 7d937d5..249d3e9 100644 --- a/README_en.md +++ b/README_en.md @@ -210,10 +210,6 @@ docker run -v /etc/docker/config:/tv-requests/config -v /etc/docker/output:/tv-r [Changelog](./CHANGELOG.md) -## ⚖️ License - -[MIT](./LICENSE) License © 2024-PRESENT [Govin](https://github.com/guovin) - ## 💰️ AppreciateDevelopment and maintenance are not easy, please buy me a coffee ~@@ -231,3 +227,7 @@ Wechat public account search Govin, or scan code: ## 📣 Disclaimer This project is for learning and communication purposes only. All interface data comes from the internet. If there is any infringement, please contact us for removal. + +## ⚖️ License + +[MIT](./LICENSE) License © 2024-PRESENT [Govin](https://github.com/guovin) From 81afb616c80d2bd7dfd76b735aeb2978649a1550 Mon Sep 17 00:00:00 2001 From: "guorong.zheng" <360996299@qq.com> Date: Fri, 22 Nov 2024 10:13:37 +0800 Subject: [PATCH 10/37] feat:GTV --- .github/workflows/release.yml | 6 +++--- README.md | 4 ++-- README_en.md | 4 ++-- tkinter_ui/tkinter_ui.spec | 2 +- version.json | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index bd6d1df..67da8ee 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -36,7 +36,7 @@ jobs: - name: Upload artifact uses: actions/upload-artifact@v4 with: - name: iptv-update-tool + name: GTV path: dist - name: Get version from version.json @@ -79,6 +79,6 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: dist/iptv-update-tool.exe - asset_name: iptv-update-tool.exe + asset_path: dist/GTV.exe + asset_name: GTV.exe asset_content_type: application/octet-stream diff --git a/README.md b/README.md index 84c6575..7cff625 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@--IPTV电视直播源更新工具
+GTV
自定义频道菜单,根据模板频道,自动获取并更新最新的直播源接口,测速校验后生成可用的接口文件+IPTV直播源更新工具:自定义频道,自动获取直播源接口,测速验效后生成可用的结果默认结果包含:📺央视频道、💰央视付费频道、📡卫视频道、🏠广东频道、🌊港·澳·台频道、🎬电影频道、🎥咪咕直播、🏀体育频道、🪁动画频道、🎮游戏频道、🎵音乐频道、🏛经典剧场diff --git a/README_en.md b/README_en.md index 249d3e9..6bde25f 100644 --- a/README_en.md +++ b/README_en.md @@ -1,9 +1,9 @@--IPTV live TV source update tool
+GTV
Customize the channel menu, automatically obtain and update the latest live source interfaces based on the template channels, and generate available interface files after speed test verification.+IPTV live source update tool: customize channels, automatically obtain live source interface, and generate usable results after speed testDefault results include: 📺CCTV Channel, 💰CCTV Pay Channel, 📡Satellite TV Channel, 🏠Guangdong Channel, 🌊Hong Kong · Macao · Taiwan Channel, 🎬Movie Channel, 🎥Migu Live Streaming, 🏀Sports Channel, 🪁Animation channel, 🎮Game channel, 🎵Music channel, 🏛Classic Theater.diff --git a/tkinter_ui/tkinter_ui.spec b/tkinter_ui/tkinter_ui.spec index 7ff6446..0a83b2c 100644 --- a/tkinter_ui/tkinter_ui.spec +++ b/tkinter_ui/tkinter_ui.spec @@ -45,7 +45,7 @@ exe = EXE( a.binaries, a.datas, [], - name='iptv-update-tool', + name='GTV', debug=True, bootloader_ignore_signals=False, strip=False, diff --git a/version.json b/version.json index d2d7d6b..705d426 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { "version": "1.5.2", - "name": "IPTV电视直播源更新工具" + "name": "GTV" } \ No newline at end of file From e8616c11562ee03825c8f62a0fa1b71336e02a47 Mon Sep 17 00:00:00 2001 From: "guorong.zheng" <360996299@qq.com> Date: Fri, 22 Nov 2024 18:30:08 +0800 Subject: [PATCH 11/37] feat:gtv --- .github/workflows/main.yml | 30 +- .github/workflows/release.yml | 5 +- CHANGELOG.md | 4 +- Dockerfile | 44 +- Pipfile | 22 +- Pipfile.lock | 1267 ++++++++++++++++++++++++++++----- README.md | 68 +- README_en.md | 60 +- docs/tutorial.md | 75 +- docs/tutorial_en.md | 75 +- entrypoint.sh | 8 - tkinter_ui/about.py | 4 +- utils/speed.py | 1 + 13 files changed, 1331 insertions(+), 332 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 49aac0b..b590cd2 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -9,7 +9,6 @@ on: - master - dev - gd - - gd-test jobs: push: runs-on: ${{ matrix.operating-system }} @@ -40,16 +39,16 @@ jobs: except: open_driver = False print(open_driver)')" >> $GITHUB_ENV - - name: Check open_ffmpeg config - id: check_ffmpeg - run: | - echo "OPEN_FFMPEG=$(python -c ' - try: - from utils.config import config - open_ffmpeg = config.open_ffmpeg - except: - open_ffmpeg = False - print(open_ffmpeg)')" >> $GITHUB_ENV + # - name: Check open_ffmpeg config + # id: check_ffmpeg + # run: | + # echo "OPEN_FFMPEG=$(python -c ' + # try: + # from utils.config import config + # open_ffmpeg = config.open_ffmpeg + # except: + # open_ffmpeg = False + # print(open_ffmpeg)')" >> $GITHUB_ENV - name: Set up Chrome if: env.OPEN_DRIVER == 'True' || env.OPEN_DRIVER == 'true' uses: browser-actions/setup-chrome@latest @@ -58,13 +57,16 @@ jobs: - name: Download chrome driver if: env.OPEN_DRIVER == 'True' || env.OPEN_DRIVER == 'true' uses: nanasess/setup-chromedriver@master - - name: Install FFmpeg - if: env.OPEN_FFMPEG == 'True' || env.OPEN_FFMPEG == 'true' - run: sudo apt-get update && sudo apt-get install -y ffmpeg + # - name: Install FFmpeg + # if: env.OPEN_FFMPEG == 'True' || env.OPEN_FFMPEG == 'true' + # run: sudo apt-get update && sudo apt-get install -y ffmpeg - name: Install pipenv run: pip3 install --user pipenv - name: Install dependecies run: pipenv --python 3.13 && pipenv install + - name: Install selenium + if: env.OPEN_DRIVER == 'True' || env.OPEN_DRIVER == 'true' + run: pipenv install selenium - name: Update run: pipenv run dev - name: Commit and push if changed diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 67da8ee..5d3bc15 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -22,10 +22,7 @@ jobs: run: pip3 install --user pipenv - name: Install dependencies with pipenv - run: pipenv --python 3.13 && pipenv install - - - name: Install PyInstaller - run: pipenv install pyinstaller + run: pipenv --python 3.13 && pipenv install --dev - name: Build the application run: pipenv run pyinstaller tkinter_ui/tkinter_ui.spec diff --git a/CHANGELOG.md b/CHANGELOG.md index dde562a..575e9f0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -59,7 +59,7 @@ - ✨ 新增频道接口白名单:不参与测速,永远保留在结果最前面(#470) 使用方法: 1. 模板频道接口地址后添加$!即可实现(如:广东珠江,http://xxx.m3u$! ) - 2. 额外信息补充(如:广东珠江,http://xxx.m3u$!额外信息 ),更多接口白名单请至https://github.com/Guovin/TV/issues/514 讨论 + 2. 额外信息补充(如:广东珠江,http://xxx.m3u$!额外信息 ),更多接口白名单请至https://github.com/Guovin/GTV/issues/514 讨论 - ✨ 新增 🈳 无结果频道分类:无结果频道默认归类至该底部分类下(#473) - ✨ 接口地址增加来源类型说明 - ✨ 默认模板增加广东民生(#481)、广州综合(#504) @@ -78,7 +78,7 @@ - ✨ Added channel interface whitelist: Not participating in speed testing, always kept at the very front of the results. (#470) Usage: 1. Add $! after the template channel interface address (e.g., Guangdong Pearl River, http://xxx.m3u$!). - 2. Additional information can be appended (e.g., Guangdong Pearl River, http://xxx.m3u$! Additional Information) (#470). For more interface whitelists, please discuss at https://github.com/Guovin/TV/issues/514. + 2. Additional information can be appended (e.g., Guangdong Pearl River, http://xxx.m3u$! Additional Information) (#470). For more interface whitelists, please discuss at https://github.com/Guovin/GTV/issues/514. - ✨ Added 🈳 No Results Channel Category: Channels without results are categorized under this bottom category by default (#473). - ✨ Interface addresses now include source type descriptions. - ✨ Default templates now include Guangdong People's Livelihood (#481) and Guangzhou Comprehensive (#504). diff --git a/Dockerfile b/Dockerfile index 2ca9df8..55bc664 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,15 +1,27 @@ -FROM python:3.8-slim +FROM python:3.13 AS builder -ARG APP_WORKDIR=/tv +ARG APP_WORKDIR=/gtv +ARG LITE=false ENV APP_WORKDIR=$APP_WORKDIR +WORKDIR $APP_WORKDIR + COPY . $APP_WORKDIR +RUN pip install -i https://mirrors.aliyun.com/pypi/simple pipenv \ + && if [ "$LITE" = true ]; then pipenv install; else pipenv install && pipenv install selenium; fi + +FROM python:3.13-slim + +ARG APP_WORKDIR=/gtv +ARG LITE=false + +ENV APP_WORKDIR=$APP_WORKDIR + WORKDIR $APP_WORKDIR -RUN pip install -i https://mirrors.aliyun.com/pypi/simple pipenv \ - && pipenv install +COPY --from=builder $APP_WORKDIR $APP_WORKDIR RUN echo "deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmware\n \ deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmware\n \ @@ -22,19 +34,9 @@ RUN echo "deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security/ bookworm-security main contrib non-free non-free-firmware\n" \ > /etc/apt/sources.list -RUN apt-get update && apt-get install -y --no-install-recommends \ - cron \ - ffmpeg - -ARG INSTALL_CHROMIUM=false - -RUN if [ "$INSTALL_CHROMIUM" = "true" ]; then \ - apt-get install -y --no-install-recommends \ - chromium \ - chromium-driver; \ - fi - -RUN apt-get clean && rm -rf /var/lib/apt/lists/* +RUN apt-get update && apt-get install -y --no-install-recommends cron \ + && if [ "$LITE" = false ]; then apt-get install -y --no-install-recommends chromium chromium-driver; fi \ + && apt-get clean && rm -rf /var/lib/apt/lists/* RUN (crontab -l ; \ echo "0 22 * * * cd $APP_WORKDIR && /usr/local/bin/pipenv run python main.py scheduled_task"; \ @@ -42,10 +44,8 @@ RUN (crontab -l ; \ EXPOSE 8000 -COPY entrypoint.sh /tv_entrypoint.sh +COPY entrypoint.sh /gtv_entrypoint.sh -COPY config /tv_config +RUN chmod +x /gtv_entrypoint.sh -RUN chmod +x /tv_entrypoint.sh - -ENTRYPOINT /tv_entrypoint.sh \ No newline at end of file +ENTRYPOINT ["/gtv_entrypoint.sh"] \ No newline at end of file diff --git a/Pipfile b/Pipfile index 7682de1..67e8b38 100644 --- a/Pipfile +++ b/Pipfile @@ -6,14 +6,13 @@ verify_ssl = true [scripts] dev = "python main.py" ui = "python tkinter_ui/tkinter_ui.py" -multicast_tmp = "python updates/multicast/update_tmp.py" -docker_build_driver = "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7,linux/arm/v8 --build-arg APP_WORKDIR=/tv-driver --build-arg INSTALL_CHROMIUM=true -t guovern/tv-driver . --push" -docker_build_requests = "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7,linux/arm/v8 --build-arg APP_WORKDIR=/tv-requests -t guovern/tv-requests . --push" +docker_run = "docker run -v config:/gtv/config -v output:/gtv/output -d -p 8000:8000 guovern/gtv" +docker_run_lite = "docker run -v config:/gtv-lite/config -v output:/gtv-lite/output -d -p 8000:8000 guovern/gtv:lite" tkinter_build = "pyinstaller tkinter_ui/tkinter_ui.spec" +docker_build = "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 --build-arg APP_WORKDIR=/gtv -t guovern/gtv ." +docker_build_lite = "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 --build-arg APP_WORKDIR=/gtv-lite --build-arg LITE=true -t guovern/gtv:lite ." [dev-packages] - -[packages] requests = "*" selenium = "*" bs4 = "*" @@ -28,5 +27,18 @@ gunicorn = "*" pillow = "*" yt-dlp = "*" +[packages] +requests = "*" +bs4 = "*" +tqdm = "*" +async-timeout = "*" +aiohttp = "*" +flask = "*" +opencc-python-reimplemented = "*" +fake-useragent = "*" +gunicorn = "*" +pillow = "*" +yt-dlp = "*" + [requires] python_version = "3.13" diff --git a/Pipfile.lock b/Pipfile.lock index 553f137..d32de8b 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "d9a281a6c42302c03ab3f3bb4665c2fd6a2913d2d42269ec3eca044053a2523c" + "sha256": "be2b3e79aad9c13d97124c36063384a1b513bc777fd72f4175fcdd4f41de8332" }, "pipfile-spec": 6, "requires": { @@ -26,86 +26,1019 @@ }, "aiohttp": { "hashes": [ - "sha256:08ebe7a1d6c1e5ca766d68407280d69658f5f98821c2ba6c41c63cabfed159af", - "sha256:0a90a0dc4b054b5af299a900bf950fe8f9e3e54322bc405005f30aa5cacc5c98", - "sha256:0cba0b8d25aa2d450762f3dd6df85498f5e7c3ad0ddeb516ef2b03510f0eea32", - "sha256:0ebdf5087e2ce903d8220cc45dcece90c2199ae4395fd83ca616fcc81010db2c", - "sha256:10a5f91c319d9d4afba812f72984816b5fcd20742232ff7ecc1610ffbf3fc64d", - "sha256:122768e3ae9ce74f981b46edefea9c6e5a40aea38aba3ac50168e6370459bf20", - "sha256:14eb6c628432720e41b4fab1ada879d56cfe7034159849e083eb536b4c2afa99", - "sha256:177b000efaf8d2f7012c649e8aee5b0bf488677b1162be5e7511aa4f9d567607", - "sha256:1c2496182e577042e0e07a328d91c949da9e77a2047c7291071e734cd7a6e780", - "sha256:1e33a7eddcd07545ccf5c3ab230f60314a17dc33e285475e8405e26e21f02660", - "sha256:2793d3297f3e49015140e6d3ea26142c967e07998e2fb00b6ee8d041138fbc4e", - "sha256:2914061f5ca573f990ec14191e6998752fa8fe50d518e3405410353c3f44aa5d", - "sha256:2adb967454e10e69478ba4a8d8afbba48a7c7a8619216b7c807f8481cc66ddfb", - "sha256:2b02a68b9445c70d7f5c8b578c5f5e5866b1d67ca23eb9e8bc8658ae9e3e2c74", - "sha256:3129151378f858cdc4a0a4df355c9a0d060ab49e2eea7e62e9f085bac100551b", - "sha256:32334f35824811dd20a12cc90825d000e6b50faaeaa71408d42269151a66140d", - "sha256:33af11eca7bb0f5c6ffaf5e7d9d2336c2448f9c6279b93abdd6f3c35f9ee321f", - "sha256:34f37c59b12bc3afc52bab6fcd9cd3be82ff01c4598a84cbea934ccb3a9c54a0", - "sha256:3666c750b73ce463a413692e3a57c60f7089e2d9116a2aa5a0f0eaf2ae325148", - "sha256:374baefcb1b6275f350da605951f5f02487a9bc84a574a7d5b696439fabd49a3", - "sha256:382f853516664d2ebfc75dc01da4a10fdef5edcb335fe7b45cf471ce758ecb18", - "sha256:3b1f4844909321ef2c1cee50ddeccbd6018cd8c8d1ddddda3f553e94a5859497", - "sha256:3f617a48b70f4843d54f52440ea1e58da6bdab07b391a3a6aed8d3b311a4cc04", - "sha256:435f7a08d8aa42371a94e7c141205a9cb092ba551084b5e0c57492e6673601a3", - "sha256:44b69c69c194ffacbc50165911cf023a4b1b06422d1e1199d3aea82eac17004e", - "sha256:486273d3b5af75a80c31c311988931bdd2a4b96a74d5c7f422bad948f99988ef", - "sha256:4a23475d8d5c56e447b7752a1e2ac267c1f723f765e406c81feddcd16cdc97bc", - "sha256:4c979fc92aba66730b66099cd5becb42d869a26c0011119bc1c2478408a8bf7a", - "sha256:4d7fad8c456d180a6d2f44c41cfab4b80e2e81451815825097db48b8293f59d5", - "sha256:50e0aee4adc9abcd2109c618a8d1b2c93b85ac277b24a003ab147d91e068b06d", - "sha256:556564d89e2f4a6e8fe000894c03e4e84cf0b6cfa5674e425db122633ee244d1", - "sha256:5587da333b7d280a312715b843d43e734652aa382cba824a84a67c81f75b338b", - "sha256:57993f406ce3f114b2a6756d7809be3ffd0cc40f33e8f8b9a4aa1b027fd4e3eb", - "sha256:5d6e069b882c1fdcbe5577dc4be372eda705180197140577a4cddb648c29d22e", - "sha256:5d878a0186023ac391861958035174d0486f3259cabf8fd94e591985468da3ea", - "sha256:5d90b5a3b0f32a5fecf5dd83d828713986c019585f5cddf40d288ff77f366615", - "sha256:5e9a766c346b2ed7e88937919d84ed64b4ef489dad1d8939f806ee52901dc142", - "sha256:64e8f5178958a9954043bc8cd10a5ae97352c3f2fc99aa01f2aebb0026010910", - "sha256:66e58a2e8c7609a3545c4b38fb8b01a6b8346c4862e529534f7674c5265a97b8", - "sha256:68d1f46f9387db3785508f5225d3acbc5825ca13d9c29f2b5cce203d5863eb79", - "sha256:6ad9a7d2a3a0f235184426425f80bd3b26c66b24fd5fddecde66be30c01ebe6e", - "sha256:6e8e19a80ba194db5c06915a9df23c0c06e0e9ca9a4db9386a6056cca555a027", - "sha256:73a664478ae1ea011b5a710fb100b115ca8b2146864fa0ce4143ff944df714b8", - "sha256:766d0ebf8703d28f854f945982aa09224d5a27a29594c70d921c43c3930fe7ac", - "sha256:783741f534c14957fbe657d62a34b947ec06db23d45a2fd4a8aeb73d9c84d7e6", - "sha256:79efd1ee3827b2f16797e14b1e45021206c3271249b4d0025014466d416d7413", - "sha256:83a70e22e0f6222effe7f29fdeba6c6023f9595e59a0479edacfbd7de4b77bb7", - "sha256:85de9904bc360fd29a98885d2bfcbd4e02ab33c53353cb70607f2bea2cb92468", - "sha256:8d954ba0eae7f33884d27dc00629ca4389d249eb8d26ca07c30911257cae8c96", - "sha256:9075313f8e41b481e4cb10af405054564b0247dc335db5398ed05f8ec38787e2", - "sha256:97fba98fc5d9ccd3d33909e898d00f2494d6a9eec7cbda3d030632e2c8bb4d00", - "sha256:994cb893936dd2e1803655ae8667a45066bfd53360b148e22b4e3325cc5ea7a3", - "sha256:9aa4e68f1e4f303971ec42976fb170204fb5092de199034b57199a1747e78a2d", - "sha256:9b6d15adc9768ff167614ca853f7eeb6ee5f1d55d5660e3af85ce6744fed2b82", - "sha256:9bbb2dbc2701ab7e9307ca3a8fa4999c5b28246968e0a0202a5afabf48a42e22", - "sha256:9c8d1db4f65bbc9d75b7b271d68fb996f1c8c81a525263862477d93611856c2d", - "sha256:a7b0a1618060e3f5aa73d3526ca2108a16a1b6bf86612cd0bb2ddcbef9879d06", - "sha256:afa55e863224e664a782effa62245df73fdfc55aee539bed6efacf35f6d4e4b7", - "sha256:b339d91ac9060bd6ecdc595a82dc151045e5d74f566e0864ef3f2ba0887fec42", - "sha256:b470de64d17156c37e91effc109d3b032b39867000e2c126732fe01d034441f9", - "sha256:b4ec8afd362356b8798c8caa806e91deb3f0602d8ffae8e91d2d3ced2a90c35e", - "sha256:c28c1677ea33ccb8b14330560094cc44d3ff4fad617a544fd18beb90403fe0f1", - "sha256:c681f34e2814bc6e1eef49752b338061b94a42c92734d0be9513447d3f83718c", - "sha256:cccb2937bece1310c5c0163d0406aba170a2e5fb1f0444d7b0e7fdc9bd6bb713", - "sha256:cdc6f8dce09281ae534eaf08a54f0d38612398375f28dad733a8885f3bf9b978", - "sha256:d23854e5867650d40cba54d49956aad8081452aa80b2cf0d8c310633f4f48510", - "sha256:d2d942421cf3a1d1eceae8fa192f1fbfb74eb9d3e207d35ad2696bd2ce2c987c", - "sha256:d2f991c18132f3e505c108147925372ffe4549173b7c258cf227df1c5977a635", - "sha256:d3a2bcf6c81639a165da93469e1e0aff67c956721f3fa9c0560f07dd1e505116", - "sha256:d84930b4145991214602372edd7305fc76b700220db79ac0dd57d3afd0f0a1ca", - "sha256:de3b4d5fb5d69749104b880a157f38baeea7765c93d9cd3837cedd5b84729e10", - "sha256:e57a10aacedcf24666f4c90d03e599f71d172d1c5e00dcf48205c445806745b0", - "sha256:f1d06c8fd8b453c3e553c956bd3b8395100401060430572174bb7876dd95ad49", - "sha256:f833a80d9de9307d736b6af58c235b17ef7f90ebea7b9c49cd274dec7a66a2f1", - "sha256:fb0544a0e8294a5a5e20d3cacdaaa9a911d7c0a9150f5264aef36e7d8fdfa07e", - "sha256:ff5d22eece44528023254b595c670dfcf9733ac6af74c4b6cb4f6a784dc3870c" + "sha256:018f1b04883a12e77e7fc161934c0f298865d3a484aea536a6a2ca8d909f0ba0", + "sha256:01a8aca4af3da85cea5c90141d23f4b0eee3cbecfd33b029a45a80f28c66c668", + "sha256:04b0cc74d5a882c9dacaeeccc1444f0233212b6f5be8bc90833feef1e1ce14b9", + "sha256:0de6466b9d742b4ee56fe1b2440706e225eb48c77c63152b1584864a236e7a50", + "sha256:12724f3a211fa243570e601f65a8831372caf1a149d2f1859f68479f07efec3d", + "sha256:12e4d45847a174f77b2b9919719203769f220058f642b08504cf8b1cf185dacf", + "sha256:17829f37c0d31d89aa6b8b010475a10233774771f9b6dc2cc352ea4f8ce95d9a", + "sha256:1a17f6a230f81eb53282503823f59d61dff14fb2a93847bf0399dc8e87817307", + "sha256:1cf03d27885f8c5ebf3993a220cc84fc66375e1e6e812731f51aab2b2748f4a6", + "sha256:1fbf41a6bbc319a7816ae0f0177c265b62f2a59ad301a0e49b395746eb2a9884", + "sha256:2257bdd5cf54a4039a4337162cd8048f05a724380a2283df34620f55d4e29341", + "sha256:24054fce8c6d6f33a3e35d1c603ef1b91bbcba73e3f04a22b4f2f27dac59b347", + "sha256:241a6ca732d2766836d62c58c49ca7a93d08251daef0c1e3c850df1d1ca0cbc4", + "sha256:28c7af3e50e5903d21d7b935aceed901cc2475463bc16ddd5587653548661fdb", + "sha256:351849aca2c6f814575c1a485c01c17a4240413f960df1bf9f5deb0003c61a53", + "sha256:3ce18f703b7298e7f7633efd6a90138d99a3f9a656cb52c1201e76cb5d79cf08", + "sha256:3d1c9c15d3999107cbb9b2d76ca6172e6710a12fda22434ee8bd3f432b7b17e8", + "sha256:3dd3e7e7c9ef3e7214f014f1ae260892286647b3cf7c7f1b644a568fd410f8ca", + "sha256:43bfd25113c1e98aec6c70e26d5f4331efbf4aa9037ba9ad88f090853bf64d7f", + "sha256:43dd89a6194f6ab02a3fe36b09e42e2df19c211fc2050ce37374d96f39604997", + "sha256:481f10a1a45c5f4c4a578bbd74cff22eb64460a6549819242a87a80788461fba", + "sha256:4ba8d043fed7ffa117024d7ba66fdea011c0e7602327c6d73cacaea38abe4491", + "sha256:4bb7493c3e3a36d3012b8564bd0e2783259ddd7ef3a81a74f0dbfa000fce48b7", + "sha256:4c1a6309005acc4b2bcc577ba3b9169fea52638709ffacbd071f3503264620da", + "sha256:4dda726f89bfa5c465ba45b76515135a3ece0088dfa2da49b8bb278f3bdeea12", + "sha256:53c921b58fdc6485d6b2603e0132bb01cd59b8f0620ffc0907f525e0ba071687", + "sha256:5578cf40440eafcb054cf859964bc120ab52ebe0e0562d2b898126d868749629", + "sha256:59ee1925b5a5efdf6c4e7be51deee93984d0ac14a6897bd521b498b9916f1544", + "sha256:670847ee6aeb3a569cd7cdfbe0c3bec1d44828bbfbe78c5d305f7f804870ef9e", + "sha256:78c657ece7a73b976905ab9ec8be9ef2df12ed8984c24598a1791c58ce3b4ce4", + "sha256:7a9318da4b4ada9a67c1dd84d1c0834123081e746bee311a16bb449f363d965e", + "sha256:7b2f8107a3c329789f3c00b2daad0e35f548d0a55cda6291579136622099a46e", + "sha256:7ea4490360b605804bea8173d2d086b6c379d6bb22ac434de605a9cbce006e7d", + "sha256:8360c7cc620abb320e1b8d603c39095101391a82b1d0be05fb2225471c9c5c52", + "sha256:875f7100ce0e74af51d4139495eec4025affa1a605280f23990b6434b81df1bd", + "sha256:8bedb1f6cb919af3b6353921c71281b1491f948ca64408871465d889b4ee1b66", + "sha256:8d20cfe63a1c135d26bde8c1d0ea46fd1200884afbc523466d2f1cf517d1fe33", + "sha256:9202f184cc0582b1db15056f2225ab4c1e3dac4d9ade50dd0613ac3c46352ac2", + "sha256:9acfc7f652b31853eed3b92095b0acf06fd5597eeea42e939bd23a17137679d5", + "sha256:9d18a8b44ec8502a7fde91446cd9c9b95ce7c49f1eacc1fb2358b8907d4369fd", + "sha256:9e67531370a3b07e49b280c1f8c2df67985c790ad2834d1b288a2f13cd341c5f", + "sha256:9ee6a4cdcbf54b8083dc9723cdf5f41f722c00db40ccf9ec2616e27869151129", + "sha256:a7d9a606355655617fee25dd7e54d3af50804d002f1fd3118dd6312d26692d70", + "sha256:aa3705a8d14de39898da0fbad920b2a37b7547c3afd2a18b9b81f0223b7d0f68", + "sha256:b7215bf2b53bc6cb35808149980c2ae80a4ae4e273890ac85459c014d5aa60ac", + "sha256:badda65ac99555791eed75e234afb94686ed2317670c68bff8a4498acdaee935", + "sha256:bf0e6cce113596377cadda4e3ac5fb89f095bd492226e46d91b4baef1dd16f60", + "sha256:c171fc35d3174bbf4787381716564042a4cbc008824d8195eede3d9b938e29a8", + "sha256:c1f6490dd1862af5aae6cfcf2a274bffa9a5b32a8f5acb519a7ecf5a99a88866", + "sha256:c25b74a811dba37c7ea6a14d99eb9402d89c8d739d50748a75f3cf994cf19c43", + "sha256:c6095aaf852c34f42e1bd0cf0dc32d1e4b48a90bfb5054abdbb9d64b36acadcb", + "sha256:c63f898f683d1379b9be5afc3dd139e20b30b0b1e0bf69a3fc3681f364cf1629", + "sha256:cd8d62cab363dfe713067027a5adb4907515861f1e4ce63e7be810b83668b847", + "sha256:ce91a24aac80de6be8512fb1c4838a9881aa713f44f4e91dd7bb3b34061b497d", + "sha256:cea52d11e02123f125f9055dfe0ccf1c3857225fb879e4a944fae12989e2aef2", + "sha256:cf4efa2d01f697a7dbd0509891a286a4af0d86902fc594e20e3b1712c28c0106", + "sha256:d2fa6fc7cc865d26ff42480ac9b52b8c9b7da30a10a6442a9cdf429de840e949", + "sha256:d329300fb23e14ed1f8c6d688dfd867d1dcc3b1d7cd49b7f8c5b44e797ce0932", + "sha256:d6177077a31b1aecfc3c9070bd2f11419dbb4a70f30f4c65b124714f525c2e48", + "sha256:db37248535d1ae40735d15bdf26ad43be19e3d93ab3f3dad8507eb0f85bb8124", + "sha256:db70a47987e34494b451a334605bee57a126fe8d290511349e86810b4be53b01", + "sha256:dcefcf2915a2dbdbce37e2fc1622129a1918abfe3d06721ce9f6cdac9b6d2eaa", + "sha256:dda3ed0a7869d2fa16aa41f9961ade73aa2c2e3b2fcb0a352524e7b744881889", + "sha256:e0bf378db07df0a713a1e32381a1b277e62ad106d0dbe17b5479e76ec706d720", + "sha256:e13a05db87d3b241c186d0936808d0e4e12decc267c617d54e9c643807e968b6", + "sha256:e143b0ef9cb1a2b4f74f56d4fbe50caa7c2bb93390aff52f9398d21d89bc73ea", + "sha256:e22d1721c978a6494adc824e0916f9d187fa57baeda34b55140315fa2f740184", + "sha256:e5522ee72f95661e79db691310290c4618b86dff2d9b90baedf343fd7a08bf79", + "sha256:e993676c71288618eb07e20622572b1250d8713e7e00ab3aabae28cb70f3640d", + "sha256:ee9afa1b0d2293c46954f47f33e150798ad68b78925e3710044e0d67a9487791", + "sha256:f1ac5462582d6561c1c1708853a9faf612ff4e5ea5e679e99be36143d6eabd8e", + "sha256:f5022504adab881e2d801a88b748ea63f2a9d130e0b2c430824682a96f6534be", + "sha256:f5b973cce96793725ef63eb449adfb74f99c043c718acb76e0d2a447ae369962", + "sha256:f7c58a240260822dc07f6ae32a0293dd5bccd618bb2d0f36d51c5dbd526f89c0", + "sha256:fc6da202068e0a268e298d7cd09b6e9f3997736cd9b060e2750963754552a0a9", + "sha256:fdadc3f6a32d6eca45f9a900a254757fd7855dfb2d8f8dcf0e88f0fae3ff8eb1" ], "index": "aliyun", "markers": "python_version >= '3.9'", - "version": "==3.11.2" + "version": "==3.11.7" + }, + "aiosignal": { + "hashes": [ + "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc", + "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17" + ], + "markers": "python_version >= '3.7'", + "version": "==1.3.1" + }, + "async-timeout": { + "hashes": [ + "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c", + "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3" + ], + "index": "aliyun", + "markers": "python_version >= '3.8'", + "version": "==5.0.1" + }, + "attrs": { + "hashes": [ + "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346", + "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2" + ], + "markers": "python_version >= '3.7'", + "version": "==24.2.0" + }, + "beautifulsoup4": { + "hashes": [ + "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051", + "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed" + ], + "markers": "python_full_version >= '3.6.0'", + "version": "==4.12.3" + }, + "blinker": { + "hashes": [ + "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf", + "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc" + ], + "markers": "python_version >= '3.9'", + "version": "==1.9.0" + }, + "bs4": { + "hashes": [ + "sha256:a48685c58f50fe127722417bae83fe6badf500d54b55f7e39ffe43b798653925", + "sha256:abf8742c0805ef7f662dce4b51cca104cffe52b835238afc169142ab9b3fbccc" + ], + "index": "aliyun", + "version": "==0.0.2" + }, + "certifi": { + "hashes": [ + "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", + "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9" + ], + "markers": "python_version >= '3.6'", + "version": "==2024.8.30" + }, + "charset-normalizer": { + "hashes": [ + "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621", + "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6", + "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8", + "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912", + "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c", + "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b", + "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d", + "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d", + "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95", + "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e", + "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565", + "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64", + "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab", + "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be", + "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e", + "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907", + "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0", + "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2", + "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62", + "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62", + "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23", + "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc", + "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284", + "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca", + "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455", + "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858", + "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b", + "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594", + "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc", + "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db", + "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b", + "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea", + "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6", + "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920", + "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749", + "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7", + "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd", + "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99", + "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242", + "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee", + "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129", + "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2", + "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51", + "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee", + "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8", + "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b", + "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613", + "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742", + "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe", + "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3", + "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5", + "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631", + "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7", + "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15", + "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c", + "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea", + "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417", + "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250", + "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88", + "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca", + "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa", + "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99", + "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149", + "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41", + "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574", + "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0", + "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f", + "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d", + "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654", + "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3", + "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19", + "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90", + "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578", + "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9", + "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1", + "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51", + "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719", + "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236", + "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a", + "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c", + "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade", + "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944", + "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc", + "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6", + "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6", + "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27", + "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6", + "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2", + "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12", + "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf", + "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114", + "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7", + "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf", + "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d", + "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b", + "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed", + "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03", + "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4", + "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67", + "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365", + "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a", + "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748", + "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b", + "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079", + "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482" + ], + "markers": "python_full_version >= '3.7.0'", + "version": "==3.4.0" + }, + "click": { + "hashes": [ + "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", + "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de" + ], + "markers": "python_version >= '3.7'", + "version": "==8.1.7" + }, + "colorama": { + "hashes": [ + "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", + "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", + "sha256:96e0137fb3ab6b56576b4638116d77c59f3e0565f4ea081172e4721c722afa92", + "sha256:bc3a1efa0b297242dcd0757e2e83d358bcd18bda77735e493aa89a634e74c9bf" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", + "version": "==0.4.6" + }, + "fake-useragent": { + "hashes": [ + "sha256:57415096557c8a4e23b62a375c21c55af5fd4ba30549227f562d2c4f5b60e3b3", + "sha256:6387269f5a2196b5ba7ed8935852f75486845a1c95c50e72460e6a8e762f5c49" + ], + "index": "aliyun", + "version": "==1.5.1" + }, + "flask": { + "hashes": [ + "sha256:5f873c5184c897c8d9d1b05df1e3d01b14910ce69607a117bd3277098a5836ac", + "sha256:d667207822eb83f1c4b50949b1623c8fc8d51f2341d65f72e1a1815397551136" + ], + "index": "aliyun", + "markers": "python_version >= '3.9'", + "version": "==3.1.0" + }, + "frozenlist": { + "hashes": [ + "sha256:000a77d6034fbad9b6bb880f7ec073027908f1b40254b5d6f26210d2dab1240e", + "sha256:03d33c2ddbc1816237a67f66336616416e2bbb6beb306e5f890f2eb22b959cdf", + "sha256:04a5c6babd5e8fb7d3c871dc8b321166b80e41b637c31a995ed844a6139942b6", + "sha256:0996c66760924da6e88922756d99b47512a71cfd45215f3570bf1e0b694c206a", + "sha256:0cc974cc93d32c42e7b0f6cf242a6bd941c57c61b618e78b6c0a96cb72788c1d", + "sha256:0f253985bb515ecd89629db13cb58d702035ecd8cfbca7d7a7e29a0e6d39af5f", + "sha256:11aabdd62b8b9c4b84081a3c246506d1cddd2dd93ff0ad53ede5defec7886b28", + "sha256:12f78f98c2f1c2429d42e6a485f433722b0061d5c0b0139efa64f396efb5886b", + "sha256:140228863501b44b809fb39ec56b5d4071f4d0aa6d216c19cbb08b8c5a7eadb9", + "sha256:1431d60b36d15cda188ea222033eec8e0eab488f39a272461f2e6d9e1a8e63c2", + "sha256:15538c0cbf0e4fa11d1e3a71f823524b0c46299aed6e10ebb4c2089abd8c3bec", + "sha256:15b731db116ab3aedec558573c1a5eec78822b32292fe4f2f0345b7f697745c2", + "sha256:17dcc32fc7bda7ce5875435003220a457bcfa34ab7924a49a1c19f55b6ee185c", + "sha256:1893f948bf6681733aaccf36c5232c231e3b5166d607c5fa77773611df6dc336", + "sha256:189f03b53e64144f90990d29a27ec4f7997d91ed3d01b51fa39d2dbe77540fd4", + "sha256:1a8ea951bbb6cacd492e3948b8da8c502a3f814f5d20935aae74b5df2b19cf3d", + "sha256:1b96af8c582b94d381a1c1f51ffaedeb77c821c690ea5f01da3d70a487dd0a9b", + "sha256:1e76bfbc72353269c44e0bc2cfe171900fbf7f722ad74c9a7b638052afe6a00c", + "sha256:2150cc6305a2c2ab33299453e2968611dacb970d2283a14955923062c8d00b10", + "sha256:226d72559fa19babe2ccd920273e767c96a49b9d3d38badd7c91a0fdeda8ea08", + "sha256:237f6b23ee0f44066219dae14c70ae38a63f0440ce6750f868ee08775073f942", + "sha256:29d94c256679247b33a3dc96cce0f93cbc69c23bf75ff715919332fdbb6a32b8", + "sha256:2b5e23253bb709ef57a8e95e6ae48daa9ac5f265637529e4ce6b003a37b2621f", + "sha256:2d0da8bbec082bf6bf18345b180958775363588678f64998c2b7609e34719b10", + "sha256:2f3f7a0fbc219fb4455264cae4d9f01ad41ae6ee8524500f381de64ffaa077d5", + "sha256:30c72000fbcc35b129cb09956836c7d7abf78ab5416595e4857d1cae8d6251a6", + "sha256:31115ba75889723431aa9a4e77d5f398f5cf976eea3bdf61749731f62d4a4a21", + "sha256:31a9ac2b38ab9b5a8933b693db4939764ad3f299fcaa931a3e605bc3460e693c", + "sha256:366d8f93e3edfe5a918c874702f78faac300209a4d5bf38352b2c1bdc07a766d", + "sha256:374ca2dabdccad8e2a76d40b1d037f5bd16824933bf7bcea3e59c891fd4a0923", + "sha256:44c49271a937625619e862baacbd037a7ef86dd1ee215afc298a417ff3270608", + "sha256:45e0896250900b5aa25180f9aec243e84e92ac84bd4a74d9ad4138ef3f5c97de", + "sha256:498524025a5b8ba81695761d78c8dd7382ac0b052f34e66939c42df860b8ff17", + "sha256:50cf5e7ee9b98f22bdecbabf3800ae78ddcc26e4a435515fc72d97903e8488e0", + "sha256:52ef692a4bc60a6dd57f507429636c2af8b6046db8b31b18dac02cbc8f507f7f", + "sha256:561eb1c9579d495fddb6da8959fd2a1fca2c6d060d4113f5844b433fc02f2641", + "sha256:5a3ba5f9a0dfed20337d3e966dc359784c9f96503674c2faf015f7fe8e96798c", + "sha256:5b6a66c18b5b9dd261ca98dffcb826a525334b2f29e7caa54e182255c5f6a65a", + "sha256:5c28f4b5dbef8a0d8aad0d4de24d1e9e981728628afaf4ea0792f5d0939372f0", + "sha256:5d7f5a50342475962eb18b740f3beecc685a15b52c91f7d975257e13e029eca9", + "sha256:6321899477db90bdeb9299ac3627a6a53c7399c8cd58d25da094007402b039ab", + "sha256:6482a5851f5d72767fbd0e507e80737f9c8646ae7fd303def99bfe813f76cf7f", + "sha256:666534d15ba8f0fda3f53969117383d5dc021266b3c1a42c9ec4855e4b58b9d3", + "sha256:683173d371daad49cffb8309779e886e59c2f369430ad28fe715f66d08d4ab1a", + "sha256:6e9080bb2fb195a046e5177f10d9d82b8a204c0736a97a153c2466127de87784", + "sha256:73f2e31ea8dd7df61a359b731716018c2be196e5bb3b74ddba107f694fbd7604", + "sha256:7437601c4d89d070eac8323f121fcf25f88674627505334654fd027b091db09d", + "sha256:76e4753701248476e6286f2ef492af900ea67d9706a0155335a40ea21bf3b2f5", + "sha256:7707a25d6a77f5d27ea7dc7d1fc608aa0a478193823f88511ef5e6b8a48f9d03", + "sha256:7948140d9f8ece1745be806f2bfdf390127cf1a763b925c4a805c603df5e697e", + "sha256:7a1a048f9215c90973402e26c01d1cff8a209e1f1b53f72b95c13db61b00f953", + "sha256:7d57d8f702221405a9d9b40f9da8ac2e4a1a8b5285aac6100f3393675f0a85ee", + "sha256:7f3c8c1dacd037df16e85227bac13cca58c30da836c6f936ba1df0c05d046d8d", + "sha256:81d5af29e61b9c8348e876d442253723928dce6433e0e76cd925cd83f1b4b817", + "sha256:828afae9f17e6de596825cf4228ff28fbdf6065974e5ac1410cecc22f699d2b3", + "sha256:87f724d055eb4785d9be84e9ebf0f24e392ddfad00b3fe036e43f489fafc9039", + "sha256:8969190d709e7c48ea386db202d708eb94bdb29207a1f269bab1196ce0dcca1f", + "sha256:90646abbc7a5d5c7c19461d2e3eeb76eb0b204919e6ece342feb6032c9325ae9", + "sha256:91d6c171862df0a6c61479d9724f22efb6109111017c87567cfeb7b5d1449fdf", + "sha256:9272fa73ca71266702c4c3e2d4a28553ea03418e591e377a03b8e3659d94fa76", + "sha256:92b5278ed9d50fe610185ecd23c55d8b307d75ca18e94c0e7de328089ac5dcba", + "sha256:97160e245ea33d8609cd2b8fd997c850b56db147a304a262abc2b3be021a9171", + "sha256:977701c081c0241d0955c9586ffdd9ce44f7a7795df39b9151cd9a6fd0ce4cfb", + "sha256:9b7dc0c4338e6b8b091e8faf0db3168a37101943e687f373dce00959583f7439", + "sha256:9b93d7aaa36c966fa42efcaf716e6b3900438632a626fb09c049f6a2f09fc631", + "sha256:9bbcdfaf4af7ce002694a4e10a0159d5a8d20056a12b05b45cea944a4953f972", + "sha256:9c2623347b933fcb9095841f1cc5d4ff0b278addd743e0e966cb3d460278840d", + "sha256:a2fe128eb4edeabe11896cb6af88fca5346059f6c8d807e3b910069f39157869", + "sha256:a72b7a6e3cd2725eff67cd64c8f13335ee18fc3c7befc05aed043d24c7b9ccb9", + "sha256:a9fe0f1c29ba24ba6ff6abf688cb0b7cf1efab6b6aa6adc55441773c252f7411", + "sha256:b97f7b575ab4a8af9b7bc1d2ef7f29d3afee2226bd03ca3875c16451ad5a7723", + "sha256:bdac3c7d9b705d253b2ce370fde941836a5f8b3c5c2b8fd70940a3ea3af7f4f2", + "sha256:c03eff4a41bd4e38415cbed054bbaff4a075b093e2394b6915dca34a40d1e38b", + "sha256:c16d2fa63e0800723139137d667e1056bee1a1cf7965153d2d104b62855e9b99", + "sha256:c1fac3e2ace2eb1052e9f7c7db480818371134410e1f5c55d65e8f3ac6d1407e", + "sha256:ce3aa154c452d2467487765e3adc730a8c153af77ad84096bc19ce19a2400840", + "sha256:cee6798eaf8b1416ef6909b06f7dc04b60755206bddc599f52232606e18179d3", + "sha256:d1b3eb7b05ea246510b43a7e53ed1653e55c2121019a97e60cad7efb881a97bb", + "sha256:d994863bba198a4a518b467bb971c56e1db3f180a25c6cf7bb1949c267f748c3", + "sha256:dd47a5181ce5fcb463b5d9e17ecfdb02b678cca31280639255ce9d0e5aa67af0", + "sha256:dd94994fc91a6177bfaafd7d9fd951bc8689b0a98168aa26b5f543868548d3ca", + "sha256:de537c11e4aa01d37db0d403b57bd6f0546e71a82347a97c6a9f0dcc532b3a45", + "sha256:df6e2f325bfee1f49f81aaac97d2aa757c7646534a06f8f577ce184afe2f0a9e", + "sha256:e66cc454f97053b79c2ab09c17fbe3c825ea6b4de20baf1be28919460dd7877f", + "sha256:e79225373c317ff1e35f210dd5f1344ff31066ba8067c307ab60254cd3a78ad5", + "sha256:f1577515d35ed5649d52ab4319db757bb881ce3b2b796d7283e6634d99ace307", + "sha256:f1e6540b7fa044eee0bb5111ada694cf3dc15f2b0347ca125ee9ca984d5e9e6e", + "sha256:f2ac49a9bedb996086057b75bf93538240538c6d9b38e57c82d51f75a73409d2", + "sha256:f47c9c9028f55a04ac254346e92977bf0f166c483c74b4232bee19a6697e4778", + "sha256:f5f9da7f5dbc00a604fe74aa02ae7c98bcede8a3b8b9666f9f86fc13993bc71a", + "sha256:fd74520371c3c4175142d02a976aee0b4cb4a7cc912a60586ffd8d5929979b30", + "sha256:feeb64bc9bcc6b45c6311c9e9b99406660a9c05ca8a5b30d14a78555088b0b3a" + ], + "markers": "python_version >= '3.8'", + "version": "==1.5.0" + }, + "gunicorn": { + "hashes": [ + "sha256:ec400d38950de4dfd418cff8328b2c8faed0edb0d517d3394e457c317908ca4d", + "sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec" + ], + "index": "aliyun", + "markers": "python_version >= '3.7'", + "version": "==23.0.0" + }, + "idna": { + "hashes": [ + "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", + "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3" + ], + "markers": "python_version >= '3.6'", + "version": "==3.10" + }, + "itsdangerous": { + "hashes": [ + "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef", + "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173" + ], + "markers": "python_version >= '3.8'", + "version": "==2.2.0" + }, + "jinja2": { + "hashes": [ + "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369", + "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d" + ], + "markers": "python_version >= '3.7'", + "version": "==3.1.4" + }, + "markupsafe": { + "hashes": [ + "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", + "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", + "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0", + "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", + "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", + "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13", + "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", + "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", + "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", + "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", + "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0", + "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b", + "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579", + "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", + "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", + "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff", + "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", + "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", + "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", + "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb", + "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", + "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", + "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a", + "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", + "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a", + "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", + "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8", + "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", + "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", + "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144", + "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f", + "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", + "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", + "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", + "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", + "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158", + "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", + "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", + "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", + "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171", + "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", + "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", + "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", + "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d", + "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", + "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", + "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", + "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", + "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29", + "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", + "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", + "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c", + "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", + "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", + "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", + "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a", + "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178", + "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", + "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", + "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", + "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50" + ], + "markers": "python_version >= '3.9'", + "version": "==3.0.2" + }, + "multidict": { + "hashes": [ + "sha256:052e10d2d37810b99cc170b785945421141bf7bb7d2f8799d431e7db229c385f", + "sha256:06809f4f0f7ab7ea2cabf9caca7d79c22c0758b58a71f9d32943ae13c7ace056", + "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761", + "sha256:0c3f390dc53279cbc8ba976e5f8035eab997829066756d811616b652b00a23a3", + "sha256:0e2b90b43e696f25c62656389d32236e049568b39320e2735d51f08fd362761b", + "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6", + "sha256:10524ebd769727ac77ef2278390fb0068d83f3acb7773792a5080f2b0abf7748", + "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966", + "sha256:16e5f4bf4e603eb1fdd5d8180f1a25f30056f22e55ce51fb3d6ad4ab29f7d96f", + "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1", + "sha256:189f652a87e876098bbc67b4da1049afb5f5dfbaa310dd67c594b01c10388db6", + "sha256:1ca0083e80e791cffc6efce7660ad24af66c8d4079d2a750b29001b53ff59ada", + "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305", + "sha256:2090f6a85cafc5b2db085124d752757c9d251548cedabe9bd31afe6363e0aff2", + "sha256:20b9b5fbe0b88d0bdef2012ef7dee867f874b72528cf1d08f1d59b0e3850129d", + "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a", + "sha256:22f3105d4fb15c8f57ff3959a58fcab6ce36814486500cd7485651230ad4d4ef", + "sha256:23bfd518810af7de1116313ebd9092cb9aa629beb12f6ed631ad53356ed6b86c", + "sha256:27e5fc84ccef8dfaabb09d82b7d179c7cf1a3fbc8a966f8274fcb4ab2eb4cadb", + "sha256:3380252550e372e8511d49481bd836264c009adb826b23fefcc5dd3c69692f60", + "sha256:3702ea6872c5a2a4eeefa6ffd36b042e9773f05b1f37ae3ef7264b1163c2dcf6", + "sha256:37bb93b2178e02b7b618893990941900fd25b6b9ac0fa49931a40aecdf083fe4", + "sha256:3914f5aaa0f36d5d60e8ece6a308ee1c9784cd75ec8151062614657a114c4478", + "sha256:3a37ffb35399029b45c6cc33640a92bef403c9fd388acce75cdc88f58bd19a81", + "sha256:3c8b88a2ccf5493b6c8da9076fb151ba106960a2df90c2633f342f120751a9e7", + "sha256:3e97b5e938051226dc025ec80980c285b053ffb1e25a3db2a3aa3bc046bf7f56", + "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3", + "sha256:3efe2c2cb5763f2f1b275ad2bf7a287d3f7ebbef35648a9726e3b69284a4f3d6", + "sha256:483a6aea59cb89904e1ceabd2b47368b5600fb7de78a6e4a2c2987b2d256cf30", + "sha256:4867cafcbc6585e4b678876c489b9273b13e9fff9f6d6d66add5e15d11d926cb", + "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506", + "sha256:4a9cb68166a34117d6646c0023c7b759bf197bee5ad4272f420a0141d7eb03a0", + "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925", + "sha256:4e18b656c5e844539d506a0a06432274d7bd52a7487e6828c63a63d69185626c", + "sha256:4e9f48f58c2c523d5a06faea47866cd35b32655c46b443f163d08c6d0ddb17d6", + "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e", + "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95", + "sha256:57feec87371dbb3520da6192213c7d6fc892d5589a93db548331954de8248fd2", + "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133", + "sha256:5845c1fd4866bb5dd3125d89b90e57ed3138241540897de748cdf19de8a2fca2", + "sha256:59bfeae4b25ec05b34f1956eaa1cb38032282cd4dfabc5056d0a1ec4d696d3aa", + "sha256:5b48204e8d955c47c55b72779802b219a39acc3ee3d0116d5080c388970b76e3", + "sha256:5c09fcfdccdd0b57867577b719c69e347a436b86cd83747f179dbf0cc0d4c1f3", + "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436", + "sha256:682b987361e5fd7a139ed565e30d81fd81e9629acc7d925a205366877d8c8657", + "sha256:6b5d83030255983181005e6cfbac1617ce9746b219bc2aad52201ad121226581", + "sha256:6bb5992037f7a9eff7991ebe4273ea7f51f1c1c511e6a2ce511d0e7bdb754492", + "sha256:73eae06aa53af2ea5270cc066dcaf02cc60d2994bbb2c4ef5764949257d10f43", + "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2", + "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2", + "sha256:82176036e65644a6cc5bd619f65f6f19781e8ec2e5330f51aa9ada7504cc1926", + "sha256:87701f25a2352e5bf7454caa64757642734da9f6b11384c1f9d1a8e699758057", + "sha256:9079dfc6a70abe341f521f78405b8949f96db48da98aeb43f9907f342f627cdc", + "sha256:90f8717cb649eea3504091e640a1b8568faad18bd4b9fcd692853a04475a4b80", + "sha256:957cf8e4b6e123a9eea554fa7ebc85674674b713551de587eb318a2df3e00255", + "sha256:99f826cbf970077383d7de805c0681799491cb939c25450b9b5b3ced03ca99f1", + "sha256:9f636b730f7e8cb19feb87094949ba54ee5357440b9658b2a32a5ce4bce53972", + "sha256:a114d03b938376557927ab23f1e950827c3b893ccb94b62fd95d430fd0e5cf53", + "sha256:a185f876e69897a6f3325c3f19f26a297fa058c5e456bfcff8015e9a27e83ae1", + "sha256:a7a9541cd308eed5e30318430a9c74d2132e9a8cb46b901326272d780bf2d423", + "sha256:aa466da5b15ccea564bdab9c89175c762bc12825f4659c11227f515cee76fa4a", + "sha256:aaed8b0562be4a0876ee3b6946f6869b7bcdb571a5d1496683505944e268b160", + "sha256:ab7c4ceb38d91570a650dba194e1ca87c2b543488fe9309b4212694174fd539c", + "sha256:ac10f4c2b9e770c4e393876e35a7046879d195cd123b4f116d299d442b335bcd", + "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa", + "sha256:b1c416351ee6271b2f49b56ad7f308072f6f44b37118d69c2cad94f3fa8a40d5", + "sha256:b225d95519a5bf73860323e633a664b0d85ad3d5bede6d30d95b35d4dfe8805b", + "sha256:b2f59caeaf7632cc633b5cf6fc449372b83bbdf0da4ae04d5be36118e46cc0aa", + "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef", + "sha256:bf6bea52ec97e95560af5ae576bdac3aa3aae0b6758c6efa115236d9e07dae44", + "sha256:c08be4f460903e5a9d0f76818db3250f12e9c344e79314d1d570fc69d7f4eae4", + "sha256:c7053d3b0353a8b9de430a4f4b4268ac9a4fb3481af37dfe49825bf45ca24156", + "sha256:c943a53e9186688b45b323602298ab727d8865d8c9ee0b17f8d62d14b56f0753", + "sha256:ce2186a7df133a9c895dea3331ddc5ddad42cdd0d1ea2f0a51e5d161e4762f28", + "sha256:d093be959277cb7dee84b801eb1af388b6ad3ca6a6b6bf1ed7585895789d027d", + "sha256:d094ddec350a2fb899fec68d8353c78233debde9b7d8b4beeafa70825f1c281a", + "sha256:d1a9dd711d0877a1ece3d2e4fea11a8e75741ca21954c919406b44e7cf971304", + "sha256:d569388c381b24671589335a3be6e1d45546c2988c2ebe30fdcada8457a31008", + "sha256:d618649d4e70ac6efcbba75be98b26ef5078faad23592f9b51ca492953012429", + "sha256:d83a047959d38a7ff552ff94be767b7fd79b831ad1cd9920662db05fec24fe72", + "sha256:d8fff389528cad1618fb4b26b95550327495462cd745d879a8c7c2115248e399", + "sha256:da1758c76f50c39a2efd5e9859ce7d776317eb1dd34317c8152ac9251fc574a3", + "sha256:db7457bac39421addd0c8449933ac32d8042aae84a14911a757ae6ca3eef1392", + "sha256:e27bbb6d14416713a8bd7aaa1313c0fc8d44ee48d74497a0ff4c3a1b6ccb5167", + "sha256:e617fb6b0b6953fffd762669610c1c4ffd05632c138d61ac7e14ad187870669c", + "sha256:e9aa71e15d9d9beaad2c6b9319edcdc0a49a43ef5c0a4c8265ca9ee7d6c67774", + "sha256:ec2abea24d98246b94913b76a125e855eb5c434f7c46546046372fe60f666351", + "sha256:f179dee3b863ab1c59580ff60f9d99f632f34ccb38bf67a33ec6b3ecadd0fd76", + "sha256:f4c035da3f544b1882bac24115f3e2e8760f10a0107614fc9839fd232200b875", + "sha256:f67f217af4b1ff66c68a87318012de788dd95fcfeb24cc889011f4e1c7454dfd", + "sha256:f90c822a402cb865e396a504f9fc8173ef34212a342d92e362ca498cad308e28", + "sha256:ff3827aef427c89a25cc96ded1759271a93603aba9fb977a6d264648ebf989db" + ], + "markers": "python_version >= '3.8'", + "version": "==6.1.0" + }, + "opencc-python-reimplemented": { + "hashes": [ + "sha256:41b3b92943c7bed291f448e9c7fad4b577c8c2eae30fcfe5a74edf8818493aa6", + "sha256:4f777ea3461a25257a7b876112cfa90bb6acabc6dfb843bf4d11266e43579dee" + ], + "index": "aliyun", + "version": "==0.1.7" + }, + "packaging": { + "hashes": [ + "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", + "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f" + ], + "markers": "python_version >= '3.8'", + "version": "==24.2" + }, + "pillow": { + "hashes": [ + "sha256:00177a63030d612148e659b55ba99527803288cea7c75fb05766ab7981a8c1b7", + "sha256:006bcdd307cc47ba43e924099a038cbf9591062e6c50e570819743f5607404f5", + "sha256:084a07ef0821cfe4858fe86652fffac8e187b6ae677e9906e192aafcc1b69903", + "sha256:0ae08bd8ffc41aebf578c2af2f9d8749d91f448b3bfd41d7d9ff573d74f2a6b2", + "sha256:0e038b0745997c7dcaae350d35859c9715c71e92ffb7e0f4a8e8a16732150f38", + "sha256:1187739620f2b365de756ce086fdb3604573337cc28a0d3ac4a01ab6b2d2a6d2", + "sha256:16095692a253047fe3ec028e951fa4221a1f3ed3d80c397e83541a3037ff67c9", + "sha256:1a61b54f87ab5786b8479f81c4b11f4d61702830354520837f8cc791ebba0f5f", + "sha256:1c1d72714f429a521d8d2d018badc42414c3077eb187a59579f28e4270b4b0fc", + "sha256:1e2688958a840c822279fda0086fec1fdab2f95bf2b717b66871c4ad9859d7e8", + "sha256:20ec184af98a121fb2da42642dea8a29ec80fc3efbaefb86d8fdd2606619045d", + "sha256:21a0d3b115009ebb8ac3d2ebec5c2982cc693da935f4ab7bb5c8ebe2f47d36f2", + "sha256:224aaa38177597bb179f3ec87eeefcce8e4f85e608025e9cfac60de237ba6316", + "sha256:2679d2258b7f1192b378e2893a8a0a0ca472234d4c2c0e6bdd3380e8dfa21b6a", + "sha256:27a7860107500d813fcd203b4ea19b04babe79448268403172782754870dac25", + "sha256:290f2cc809f9da7d6d622550bbf4c1e57518212da51b6a30fe8e0a270a5b78bd", + "sha256:2e46773dc9f35a1dd28bd6981332fd7f27bec001a918a72a79b4133cf5291dba", + "sha256:3107c66e43bda25359d5ef446f59c497de2b5ed4c7fdba0894f8d6cf3822dafc", + "sha256:375b8dd15a1f5d2feafff536d47e22f69625c1aa92f12b339ec0b2ca40263273", + "sha256:45c566eb10b8967d71bf1ab8e4a525e5a93519e29ea071459ce517f6b903d7fa", + "sha256:499c3a1b0d6fc8213519e193796eb1a86a1be4b1877d678b30f83fd979811d1a", + "sha256:4ad70c4214f67d7466bea6a08061eba35c01b1b89eaa098040a35272a8efb22b", + "sha256:4b60c9520f7207aaf2e1d94de026682fc227806c6e1f55bba7606d1c94dd623a", + "sha256:5178952973e588b3f1360868847334e9e3bf49d19e169bbbdfaf8398002419ae", + "sha256:52a2d8323a465f84faaba5236567d212c3668f2ab53e1c74c15583cf507a0291", + "sha256:598b4e238f13276e0008299bd2482003f48158e2b11826862b1eb2ad7c768b97", + "sha256:5bd2d3bdb846d757055910f0a59792d33b555800813c3b39ada1829c372ccb06", + "sha256:5c39ed17edea3bc69c743a8dd3e9853b7509625c2462532e62baa0732163a904", + "sha256:5d203af30149ae339ad1b4f710d9844ed8796e97fda23ffbc4cc472968a47d0b", + "sha256:5ddbfd761ee00c12ee1be86c9c0683ecf5bb14c9772ddbd782085779a63dd55b", + "sha256:607bbe123c74e272e381a8d1957083a9463401f7bd01287f50521ecb05a313f8", + "sha256:61b887f9ddba63ddf62fd02a3ba7add935d053b6dd7d58998c630e6dbade8527", + "sha256:6619654954dc4936fcff82db8eb6401d3159ec6be81e33c6000dfd76ae189947", + "sha256:674629ff60030d144b7bca2b8330225a9b11c482ed408813924619c6f302fdbb", + "sha256:6ec0d5af64f2e3d64a165f490d96368bb5dea8b8f9ad04487f9ab60dc4bb6003", + "sha256:6f4dba50cfa56f910241eb7f883c20f1e7b1d8f7d91c750cd0b318bad443f4d5", + "sha256:70fbbdacd1d271b77b7721fe3cdd2d537bbbd75d29e6300c672ec6bb38d9672f", + "sha256:72bacbaf24ac003fea9bff9837d1eedb6088758d41e100c1552930151f677739", + "sha256:7326a1787e3c7b0429659e0a944725e1b03eeaa10edd945a86dead1913383944", + "sha256:73853108f56df97baf2bb8b522f3578221e56f646ba345a372c78326710d3830", + "sha256:73e3a0200cdda995c7e43dd47436c1548f87a30bb27fb871f352a22ab8dcf45f", + "sha256:75acbbeb05b86bc53cbe7b7e6fe00fbcf82ad7c684b3ad82e3d711da9ba287d3", + "sha256:8069c5179902dcdce0be9bfc8235347fdbac249d23bd90514b7a47a72d9fecf4", + "sha256:846e193e103b41e984ac921b335df59195356ce3f71dcfd155aa79c603873b84", + "sha256:8594f42df584e5b4bb9281799698403f7af489fba84c34d53d1c4bfb71b7c4e7", + "sha256:86510e3f5eca0ab87429dd77fafc04693195eec7fd6a137c389c3eeb4cfb77c6", + "sha256:8853a3bf12afddfdf15f57c4b02d7ded92c7a75a5d7331d19f4f9572a89c17e6", + "sha256:88a58d8ac0cc0e7f3a014509f0455248a76629ca9b604eca7dc5927cc593c5e9", + "sha256:8ba470552b48e5835f1d23ecb936bb7f71d206f9dfeee64245f30c3270b994de", + "sha256:8c676b587da5673d3c75bd67dd2a8cdfeb282ca38a30f37950511766b26858c4", + "sha256:8ec4a89295cd6cd4d1058a5e6aec6bf51e0eaaf9714774e1bfac7cfc9051db47", + "sha256:94f3e1780abb45062287b4614a5bc0874519c86a777d4a7ad34978e86428b8dd", + "sha256:9a0f748eaa434a41fccf8e1ee7a3eed68af1b690e75328fd7a60af123c193b50", + "sha256:a5629742881bcbc1f42e840af185fd4d83a5edeb96475a575f4da50d6ede337c", + "sha256:a65149d8ada1055029fcb665452b2814fe7d7082fcb0c5bed6db851cb69b2086", + "sha256:b3c5ac4bed7519088103d9450a1107f76308ecf91d6dabc8a33a2fcfb18d0fba", + "sha256:b4fd7bd29610a83a8c9b564d457cf5bd92b4e11e79a4ee4716a63c959699b306", + "sha256:bcd1fb5bb7b07f64c15618c89efcc2cfa3e95f0e3bcdbaf4642509de1942a699", + "sha256:c12b5ae868897c7338519c03049a806af85b9b8c237b7d675b8c5e089e4a618e", + "sha256:c26845094b1af3c91852745ae78e3ea47abf3dbcd1cf962f16b9a5fbe3ee8488", + "sha256:c6a660307ca9d4867caa8d9ca2c2658ab685de83792d1876274991adec7b93fa", + "sha256:c809a70e43c7977c4a42aefd62f0131823ebf7dd73556fa5d5950f5b354087e2", + "sha256:c8b2351c85d855293a299038e1f89db92a2f35e8d2f783489c6f0b2b5f3fe8a3", + "sha256:cb929ca942d0ec4fac404cbf520ee6cac37bf35be479b970c4ffadf2b6a1cad9", + "sha256:d2c0a187a92a1cb5ef2c8ed5412dd8d4334272617f532d4ad4de31e0495bd923", + "sha256:d69bfd8ec3219ae71bcde1f942b728903cad25fafe3100ba2258b973bd2bc1b2", + "sha256:daffdf51ee5db69a82dd127eabecce20729e21f7a3680cf7cbb23f0829189790", + "sha256:e58876c91f97b0952eb766123bfef372792ab3f4e3e1f1a2267834c2ab131734", + "sha256:eda2616eb2313cbb3eebbe51f19362eb434b18e3bb599466a1ffa76a033fb916", + "sha256:ee217c198f2e41f184f3869f3e485557296d505b5195c513b2bfe0062dc537f1", + "sha256:f02541ef64077f22bf4924f225c0fd1248c168f86e4b7abdedd87d6ebaceab0f", + "sha256:f1b82c27e89fffc6da125d5eb0ca6e68017faf5efc078128cfaa42cf5cb38798", + "sha256:fba162b8872d30fea8c52b258a542c5dfd7b235fb5cb352240c8d63b414013eb", + "sha256:fbbcb7b57dc9c794843e3d1258c0fbf0f48656d46ffe9e09b63bbd6e8cd5d0a2", + "sha256:fcb4621042ac4b7865c179bb972ed0da0218a076dc1820ffc48b1d74c1e37fe9" + ], + "index": "aliyun", + "markers": "python_version >= '3.9'", + "version": "==11.0.0" + }, + "propcache": { + "hashes": [ + "sha256:00181262b17e517df2cd85656fcd6b4e70946fe62cd625b9d74ac9977b64d8d9", + "sha256:0e53cb83fdd61cbd67202735e6a6687a7b491c8742dfc39c9e01e80354956763", + "sha256:1235c01ddaa80da8235741e80815ce381c5267f96cc49b1477fdcf8c047ef325", + "sha256:140fbf08ab3588b3468932974a9331aff43c0ab8a2ec2c608b6d7d1756dbb6cb", + "sha256:191db28dc6dcd29d1a3e063c3be0b40688ed76434622c53a284e5427565bbd9b", + "sha256:1e41d67757ff4fbc8ef2af99b338bfb955010444b92929e9e55a6d4dcc3c4f09", + "sha256:1ec43d76b9677637a89d6ab86e1fef70d739217fefa208c65352ecf0282be957", + "sha256:20a617c776f520c3875cf4511e0d1db847a076d720714ae35ffe0df3e440be68", + "sha256:218db2a3c297a3768c11a34812e63b3ac1c3234c3a086def9c0fee50d35add1f", + "sha256:22aa8f2272d81d9317ff5756bb108021a056805ce63dd3630e27d042c8092798", + "sha256:25a1f88b471b3bc911d18b935ecb7115dff3a192b6fef46f0bfaf71ff4f12418", + "sha256:25c8d773a62ce0451b020c7b29a35cfbc05de8b291163a7a0f3b7904f27253e6", + "sha256:2a60ad3e2553a74168d275a0ef35e8c0a965448ffbc3b300ab3a5bb9956c2162", + "sha256:2a66df3d4992bc1d725b9aa803e8c5a66c010c65c741ad901e260ece77f58d2f", + "sha256:2ccc28197af5313706511fab3a8b66dcd6da067a1331372c82ea1cb74285e036", + "sha256:2e900bad2a8456d00a113cad8c13343f3b1f327534e3589acc2219729237a2e8", + "sha256:2ee7606193fb267be4b2e3b32714f2d58cad27217638db98a60f9efb5efeccc2", + "sha256:33ac8f098df0585c0b53009f039dfd913b38c1d2edafed0cedcc0c32a05aa110", + "sha256:3444cdba6628accf384e349014084b1cacd866fbb88433cd9d279d90a54e0b23", + "sha256:363ea8cd3c5cb6679f1c2f5f1f9669587361c062e4899fce56758efa928728f8", + "sha256:375a12d7556d462dc64d70475a9ee5982465fbb3d2b364f16b86ba9135793638", + "sha256:388f3217649d6d59292b722d940d4d2e1e6a7003259eb835724092a1cca0203a", + "sha256:3947483a381259c06921612550867b37d22e1df6d6d7e8361264b6d037595f44", + "sha256:39e104da444a34830751715f45ef9fc537475ba21b7f1f5b0f4d71a3b60d7fe2", + "sha256:3c997f8c44ec9b9b0bcbf2d422cc00a1d9b9c681f56efa6ca149a941e5560da2", + "sha256:3dfafb44f7bb35c0c06eda6b2ab4bfd58f02729e7c4045e179f9a861b07c9850", + "sha256:3ebbcf2a07621f29638799828b8d8668c421bfb94c6cb04269130d8de4fb7136", + "sha256:3f88a4095e913f98988f5b338c1d4d5d07dbb0b6bad19892fd447484e483ba6b", + "sha256:439e76255daa0f8151d3cb325f6dd4a3e93043e6403e6491813bcaaaa8733887", + "sha256:4569158070180c3855e9c0791c56be3ceeb192defa2cdf6a3f39e54319e56b89", + "sha256:466c219deee4536fbc83c08d09115249db301550625c7fef1c5563a584c9bc87", + "sha256:4a9d9b4d0a9b38d1c391bb4ad24aa65f306c6f01b512e10a8a34a2dc5675d348", + "sha256:4c7dde9e533c0a49d802b4f3f218fa9ad0a1ce21f2c2eb80d5216565202acab4", + "sha256:53d1bd3f979ed529f0805dd35ddaca330f80a9a6d90bc0121d2ff398f8ed8861", + "sha256:55346705687dbd7ef0d77883ab4f6fabc48232f587925bdaf95219bae072491e", + "sha256:56295eb1e5f3aecd516d91b00cfd8bf3a13991de5a479df9e27dd569ea23959c", + "sha256:56bb5c98f058a41bb58eead194b4db8c05b088c93d94d5161728515bd52b052b", + "sha256:5a5b3bb545ead161be780ee85a2b54fdf7092815995661947812dde94a40f6fb", + "sha256:5f2564ec89058ee7c7989a7b719115bdfe2a2fb8e7a4543b8d1c0cc4cf6478c1", + "sha256:608cce1da6f2672a56b24a015b42db4ac612ee709f3d29f27a00c943d9e851de", + "sha256:63f13bf09cc3336eb04a837490b8f332e0db41da66995c9fd1ba04552e516354", + "sha256:662dd62358bdeaca0aee5761de8727cfd6861432e3bb828dc2a693aa0471a563", + "sha256:676135dcf3262c9c5081cc8f19ad55c8a64e3f7282a21266d05544450bffc3a5", + "sha256:67aeb72e0f482709991aa91345a831d0b707d16b0257e8ef88a2ad246a7280bf", + "sha256:67b69535c870670c9f9b14a75d28baa32221d06f6b6fa6f77a0a13c5a7b0a5b9", + "sha256:682a7c79a2fbf40f5dbb1eb6bfe2cd865376deeac65acf9beb607505dced9e12", + "sha256:6994984550eaf25dd7fc7bd1b700ff45c894149341725bb4edc67f0ffa94efa4", + "sha256:69d3a98eebae99a420d4b28756c8ce6ea5a29291baf2dc9ff9414b42676f61d5", + "sha256:6e2e54267980349b723cff366d1e29b138b9a60fa376664a157a342689553f71", + "sha256:73e4b40ea0eda421b115248d7e79b59214411109a5bc47d0d48e4c73e3b8fcf9", + "sha256:74acd6e291f885678631b7ebc85d2d4aec458dd849b8c841b57ef04047833bed", + "sha256:7665f04d0c7f26ff8bb534e1c65068409bf4687aa2534faf7104d7182debb336", + "sha256:7735e82e3498c27bcb2d17cb65d62c14f1100b71723b68362872bca7d0913d90", + "sha256:77a86c261679ea5f3896ec060be9dc8e365788248cc1e049632a1be682442063", + "sha256:7cf18abf9764746b9c8704774d8b06714bcb0a63641518a3a89c7f85cc02c2ad", + "sha256:83928404adf8fb3d26793665633ea79b7361efa0287dfbd372a7e74311d51ee6", + "sha256:8e40876731f99b6f3c897b66b803c9e1c07a989b366c6b5b475fafd1f7ba3fb8", + "sha256:8f188cfcc64fb1266f4684206c9de0e80f54622c3f22a910cbd200478aeae61e", + "sha256:91997d9cb4a325b60d4e3f20967f8eb08dfcb32b22554d5ef78e6fd1dda743a2", + "sha256:91ee8fc02ca52e24bcb77b234f22afc03288e1dafbb1f88fe24db308910c4ac7", + "sha256:92fe151145a990c22cbccf9ae15cae8ae9eddabfc949a219c9f667877e40853d", + "sha256:945db8ee295d3af9dbdbb698cce9bbc5c59b5c3fe328bbc4387f59a8a35f998d", + "sha256:9517d5e9e0731957468c29dbfd0f976736a0e55afaea843726e887f36fe017df", + "sha256:952e0d9d07609d9c5be361f33b0d6d650cd2bae393aabb11d9b719364521984b", + "sha256:97a58a28bcf63284e8b4d7b460cbee1edaab24634e82059c7b8c09e65284f178", + "sha256:97e48e8875e6c13909c800fa344cd54cc4b2b0db1d5f911f840458a500fde2c2", + "sha256:9e0f07b42d2a50c7dd2d8675d50f7343d998c64008f1da5fef888396b7f84630", + "sha256:a3dc1a4b165283bd865e8f8cb5f0c64c05001e0718ed06250d8cac9bec115b48", + "sha256:a3ebe9a75be7ab0b7da2464a77bb27febcb4fab46a34f9288f39d74833db7f61", + "sha256:a64e32f8bd94c105cc27f42d3b658902b5bcc947ece3c8fe7bc1b05982f60e89", + "sha256:a6ed8db0a556343d566a5c124ee483ae113acc9a557a807d439bcecc44e7dfbb", + "sha256:ad9c9b99b05f163109466638bd30ada1722abb01bbb85c739c50b6dc11f92dc3", + "sha256:b33d7a286c0dc1a15f5fc864cc48ae92a846df287ceac2dd499926c3801054a6", + "sha256:bc092ba439d91df90aea38168e11f75c655880c12782facf5cf9c00f3d42b562", + "sha256:c436130cc779806bdf5d5fae0d848713105472b8566b75ff70048c47d3961c5b", + "sha256:c5869b8fd70b81835a6f187c5fdbe67917a04d7e52b6e7cc4e5fe39d55c39d58", + "sha256:c5ecca8f9bab618340c8e848d340baf68bcd8ad90a8ecd7a4524a81c1764b3db", + "sha256:cfac69017ef97db2438efb854edf24f5a29fd09a536ff3a992b75990720cdc99", + "sha256:d2f0d0f976985f85dfb5f3d685697ef769faa6b71993b46b295cdbbd6be8cc37", + "sha256:d5bed7f9805cc29c780f3aee05de3262ee7ce1f47083cfe9f77471e9d6777e83", + "sha256:d6a21ef516d36909931a2967621eecb256018aeb11fc48656e3257e73e2e247a", + "sha256:d9b6ddac6408194e934002a69bcaadbc88c10b5f38fb9307779d1c629181815d", + "sha256:db47514ffdbd91ccdc7e6f8407aac4ee94cc871b15b577c1c324236b013ddd04", + "sha256:df81779732feb9d01e5d513fad0122efb3d53bbc75f61b2a4f29a020bc985e70", + "sha256:e4a91d44379f45f5e540971d41e4626dacd7f01004826a18cb048e7da7e96544", + "sha256:e63e3e1e0271f374ed489ff5ee73d4b6e7c60710e1f76af5f0e1a6117cd26394", + "sha256:e70fac33e8b4ac63dfc4c956fd7d85a0b1139adcfc0d964ce288b7c527537fea", + "sha256:ecddc221a077a8132cf7c747d5352a15ed763b674c0448d811f408bf803d9ad7", + "sha256:f45eec587dafd4b2d41ac189c2156461ebd0c1082d2fe7013571598abb8505d1", + "sha256:f52a68c21363c45297aca15561812d542f8fc683c85201df0bebe209e349f793", + "sha256:f571aea50ba5623c308aa146eb650eebf7dbe0fd8c5d946e28343cb3b5aad577", + "sha256:f60f0ac7005b9f5a6091009b09a419ace1610e163fa5deaba5ce3484341840e7", + "sha256:f6475a1b2ecb310c98c28d271a30df74f9dd436ee46d09236a6b750a7599ce57", + "sha256:f6d5749fdd33d90e34c2efb174c7e236829147a2713334d708746e94c4bde40d", + "sha256:f902804113e032e2cdf8c71015651c97af6418363bea8d78dc0911d56c335032", + "sha256:fa1076244f54bb76e65e22cb6910365779d5c3d71d1f18b275f1dfc7b0d71b4d", + "sha256:fc2db02409338bf36590aa985a461b2c96fce91f8e7e0f14c50c5fcc4f229016", + "sha256:ffcad6c564fe6b9b8916c1aefbb37a362deebf9394bd2974e9d84232e3e08504" + ], + "markers": "python_version >= '3.8'", + "version": "==0.2.0" + }, + "requests": { + "hashes": [ + "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", + "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6" + ], + "index": "aliyun", + "markers": "python_version >= '3.8'", + "version": "==2.32.3" + }, + "soupsieve": { + "hashes": [ + "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb", + "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9" + ], + "markers": "python_version >= '3.8'", + "version": "==2.6" + }, + "tqdm": { + "hashes": [ + "sha256:0cd8af9d56911acab92182e88d763100d4788bdf421d251616040cc4d44863be", + "sha256:fe5a6f95e6fe0b9755e9469b77b9c3cf850048224ecaa8293d7d2d31f97d869a" + ], + "index": "aliyun", + "markers": "python_version >= '3.7'", + "version": "==4.67.0" + }, + "urllib3": { + "hashes": [ + "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", + "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9" + ], + "markers": "python_version >= '3.8'", + "version": "==2.2.3" + }, + "werkzeug": { + "hashes": [ + "sha256:54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e", + "sha256:60723ce945c19328679790e3282cc758aa4a6040e4bb330f53d30fa546d44746" + ], + "markers": "python_version >= '3.9'", + "version": "==3.1.3" + }, + "yarl": { + "hashes": [ + "sha256:01be8688fc211dc237e628fcc209dda412d35de7642453059a0553747018d075", + "sha256:039c299a0864d1f43c3e31570045635034ea7021db41bf4842693a72aca8df3a", + "sha256:074fee89caab89a97e18ef5f29060ef61ba3cae6cd77673acc54bfdd3214b7b7", + "sha256:13aaf2bdbc8c86ddce48626b15f4987f22e80d898818d735b20bd58f17292ee8", + "sha256:14408cc4d34e202caba7b5ac9cc84700e3421a9e2d1b157d744d101b061a4a88", + "sha256:1db1537e9cb846eb0ff206eac667f627794be8b71368c1ab3207ec7b6f8c5afc", + "sha256:1ece25e2251c28bab737bdf0519c88189b3dd9492dc086a1d77336d940c28ced", + "sha256:1ff116f0285b5c8b3b9a2680aeca29a858b3b9e0402fc79fd850b32c2bcb9f8b", + "sha256:205de377bd23365cd85562c9c6c33844050a93661640fda38e0567d2826b50df", + "sha256:20d95535e7d833889982bfe7cc321b7f63bf8879788fee982c76ae2b24cfb715", + "sha256:20de4a8b04de70c49698dc2390b7fd2d18d424d3b876371f9b775e2b462d4b41", + "sha256:2d90f2e4d16a5b0915ee065218b435d2ef619dd228973b1b47d262a6f7cd8fa5", + "sha256:2e6b4466714a73f5251d84b471475850954f1fa6acce4d3f404da1d55d644c34", + "sha256:309f8d27d6f93ceeeb80aa6980e883aa57895270f7f41842b92247e65d7aeddf", + "sha256:32141e13a1d5a48525e519c9197d3f4d9744d818d5c7d6547524cc9eccc8971e", + "sha256:34176bfb082add67cb2a20abd85854165540891147f88b687a5ed0dc225750a0", + "sha256:38b39b7b3e692b6c92b986b00137a3891eddb66311b229d1940dcbd4f025083c", + "sha256:3a3709450a574d61be6ac53d582496014342ea34876af8dc17cc16da32826c9a", + "sha256:3adaaf9c6b1b4fc258584f4443f24d775a2086aee82d1387e48a8b4f3d6aecf6", + "sha256:3f576ed278860df2721a5d57da3381040176ef1d07def9688a385c8330db61a1", + "sha256:42ba84e2ac26a3f252715f8ec17e6fdc0cbf95b9617c5367579fafcd7fba50eb", + "sha256:454902dc1830d935c90b5b53c863ba2a98dcde0fbaa31ca2ed1ad33b2a7171c6", + "sha256:466d31fd043ef9af822ee3f1df8fdff4e8c199a7f4012c2642006af240eade17", + "sha256:49a98ecadc5a241c9ba06de08127ee4796e1009555efd791bac514207862b43d", + "sha256:4d26f1fa9fa2167bb238f6f4b20218eb4e88dd3ef21bb8f97439fa6b5313e30d", + "sha256:52c136f348605974c9b1c878addd6b7a60e3bf2245833e370862009b86fa4689", + "sha256:536a7a8a53b75b2e98ff96edb2dfb91a26b81c4fed82782035767db5a465be46", + "sha256:576d258b21c1db4c6449b1c572c75d03f16a482eb380be8003682bdbe7db2f28", + "sha256:609ffd44fed2ed88d9b4ef62ee860cf86446cf066333ad4ce4123505b819e581", + "sha256:67b336c15e564d76869c9a21316f90edf546809a5796a083b8f57c845056bc01", + "sha256:685cc37f3f307c6a8e879986c6d85328f4c637f002e219f50e2ef66f7e062c1d", + "sha256:6a49ad0102c0f0ba839628d0bf45973c86ce7b590cdedf7540d5b1833ddc6f00", + "sha256:6fb64dd45453225f57d82c4764818d7a205ee31ce193e9f0086e493916bd4f72", + "sha256:701bb4a8f4de191c8c0cc9a1e6d5142f4df880e9d1210e333b829ca9425570ed", + "sha256:73553bbeea7d6ec88c08ad8027f4e992798f0abc459361bf06641c71972794dc", + "sha256:7520e799b1f84e095cce919bd6c23c9d49472deeef25fe1ef960b04cca51c3fc", + "sha256:7609b8462351c4836b3edce4201acb6dd46187b207c589b30a87ffd1813b48dc", + "sha256:7db9584235895a1dffca17e1c634b13870852094f6389b68dcc6338086aa7b08", + "sha256:7fa7d37f2ada0f42e0723632993ed422f2a679af0e200874d9d861720a54f53e", + "sha256:80741ec5b471fbdfb997821b2842c59660a1c930ceb42f8a84ba8ca0f25a66aa", + "sha256:8254dbfce84ee5d1e81051ee7a0f1536c108ba294c0fdb5933476398df0654f3", + "sha256:8b8d3e4e014fb4274f1c5bf61511d2199e263909fb0b8bda2a7428b0894e8dc6", + "sha256:8e1c18890091aa3cc8a77967943476b729dc2016f4cfe11e45d89b12519d4a93", + "sha256:9106025c7f261f9f5144f9aa7681d43867eed06349a7cfb297a1bc804de2f0d1", + "sha256:91b8fb9427e33f83ca2ba9501221ffaac1ecf0407f758c4d2f283c523da185ee", + "sha256:96404e8d5e1bbe36bdaa84ef89dc36f0e75939e060ca5cd45451aba01db02902", + "sha256:9b4c90c5363c6b0a54188122b61edb919c2cd1119684999d08cd5e538813a28e", + "sha256:a0509475d714df8f6d498935b3f307cd122c4ca76f7d426c7e1bb791bcd87eda", + "sha256:a173401d7821a2a81c7b47d4e7d5c4021375a1441af0c58611c1957445055056", + "sha256:a45d94075ac0647621eaaf693c8751813a3eccac455d423f473ffed38c8ac5c9", + "sha256:a5f72421246c21af6a92fbc8c13b6d4c5427dfd949049b937c3b731f2f9076bd", + "sha256:a64619a9c47c25582190af38e9eb382279ad42e1f06034f14d794670796016c0", + "sha256:a7ee6884a8848792d58b854946b685521f41d8871afa65e0d4a774954e9c9e89", + "sha256:ae38bd86eae3ba3d2ce5636cc9e23c80c9db2e9cb557e40b98153ed102b5a736", + "sha256:b026cf2c32daf48d90c0c4e406815c3f8f4cfe0c6dfccb094a9add1ff6a0e41a", + "sha256:b0a2074a37285570d54b55820687de3d2f2b9ecf1b714e482e48c9e7c0402038", + "sha256:b1a3297b9cad594e1ff0c040d2881d7d3a74124a3c73e00c3c71526a1234a9f7", + "sha256:b212452b80cae26cb767aa045b051740e464c5129b7bd739c58fbb7deb339e7b", + "sha256:b234a4a9248a9f000b7a5dfe84b8cb6210ee5120ae70eb72a4dcbdb4c528f72f", + "sha256:b4095c5019bb889aa866bf12ed4c85c0daea5aafcb7c20d1519f02a1e738f07f", + "sha256:b8e8c516dc4e1a51d86ac975b0350735007e554c962281c432eaa5822aa9765c", + "sha256:bd80ed29761490c622edde5dd70537ca8c992c2952eb62ed46984f8eff66d6e8", + "sha256:c083f6dd6951b86e484ebfc9c3524b49bcaa9c420cb4b2a78ef9f7a512bfcc85", + "sha256:c0f4808644baf0a434a3442df5e0bedf8d05208f0719cedcd499e168b23bfdc4", + "sha256:c4cb992d8090d5ae5f7afa6754d7211c578be0c45f54d3d94f7781c495d56716", + "sha256:c60e547c0a375c4bfcdd60eef82e7e0e8698bf84c239d715f5c1278a73050393", + "sha256:c73a6bbc97ba1b5a0c3c992ae93d721c395bdbb120492759b94cc1ac71bc6350", + "sha256:c893f8c1a6d48b25961e00922724732d00b39de8bb0b451307482dc87bddcd74", + "sha256:cd6ab7d6776c186f544f893b45ee0c883542b35e8a493db74665d2e594d3ca75", + "sha256:d89ae7de94631b60d468412c18290d358a9d805182373d804ec839978b120422", + "sha256:d9d4f5e471e8dc49b593a80766c2328257e405f943c56a3dc985c125732bc4cf", + "sha256:da206d1ec78438a563c5429ab808a2b23ad7bc025c8adbf08540dde202be37d5", + "sha256:dbf53db46f7cf176ee01d8d98c39381440776fcda13779d269a8ba664f69bec0", + "sha256:dd21c0128e301851de51bc607b0a6da50e82dc34e9601f4b508d08cc89ee7929", + "sha256:e2580c1d7e66e6d29d6e11855e3b1c6381971e0edd9a5066e6c14d79bc8967af", + "sha256:e3818eabaefb90adeb5e0f62f047310079d426387991106d4fbf3519eec7d90a", + "sha256:ed69af4fe2a0949b1ea1d012bf065c77b4c7822bad4737f17807af2adb15a73c", + "sha256:f172b8b2c72a13a06ea49225a9c47079549036ad1b34afa12d5491b881f5b993", + "sha256:f275ede6199d0f1ed4ea5d55a7b7573ccd40d97aee7808559e1298fe6efc8dbd", + "sha256:f7edeb1dcc7f50a2c8e08b9dc13a413903b7817e72273f00878cb70e766bdb3b", + "sha256:fa2c9cb607e0f660d48c54a63de7a9b36fef62f6b8bd50ff592ce1137e73ac7d", + "sha256:fe94d1de77c4cd8caff1bd5480e22342dbd54c93929f5943495d9c1e8abe9f42" + ], + "markers": "python_version >= '3.9'", + "version": "==1.18.0" + }, + "yt-dlp": { + "hashes": [ + "sha256:b8a4c23d3c9afd7e476bcdb87f38b6c0e8e12e3a239d7988f13acb434200f54d", + "sha256:b9741695911dc566498b5f115cdd6b1abbc5be61cb01fd98abe649990a41656c" + ], + "index": "aliyun", + "markers": "python_version >= '3.9'", + "version": "==2024.11.18" + } + }, + "develop": { + "aiohappyeyeballs": { + "hashes": [ + "sha256:75cf88a15106a5002a8eb1dab212525c00d1f4c0fa96e551c9fbe6f09a621586", + "sha256:8a7a83727b2756f394ab2895ea0765a0a8c475e3c71e98d43d76f22b4b435572" + ], + "markers": "python_version >= '3.8'", + "version": "==2.4.3" + }, + "aiohttp": { + "hashes": [ + "sha256:018f1b04883a12e77e7fc161934c0f298865d3a484aea536a6a2ca8d909f0ba0", + "sha256:01a8aca4af3da85cea5c90141d23f4b0eee3cbecfd33b029a45a80f28c66c668", + "sha256:04b0cc74d5a882c9dacaeeccc1444f0233212b6f5be8bc90833feef1e1ce14b9", + "sha256:0de6466b9d742b4ee56fe1b2440706e225eb48c77c63152b1584864a236e7a50", + "sha256:12724f3a211fa243570e601f65a8831372caf1a149d2f1859f68479f07efec3d", + "sha256:12e4d45847a174f77b2b9919719203769f220058f642b08504cf8b1cf185dacf", + "sha256:17829f37c0d31d89aa6b8b010475a10233774771f9b6dc2cc352ea4f8ce95d9a", + "sha256:1a17f6a230f81eb53282503823f59d61dff14fb2a93847bf0399dc8e87817307", + "sha256:1cf03d27885f8c5ebf3993a220cc84fc66375e1e6e812731f51aab2b2748f4a6", + "sha256:1fbf41a6bbc319a7816ae0f0177c265b62f2a59ad301a0e49b395746eb2a9884", + "sha256:2257bdd5cf54a4039a4337162cd8048f05a724380a2283df34620f55d4e29341", + "sha256:24054fce8c6d6f33a3e35d1c603ef1b91bbcba73e3f04a22b4f2f27dac59b347", + "sha256:241a6ca732d2766836d62c58c49ca7a93d08251daef0c1e3c850df1d1ca0cbc4", + "sha256:28c7af3e50e5903d21d7b935aceed901cc2475463bc16ddd5587653548661fdb", + "sha256:351849aca2c6f814575c1a485c01c17a4240413f960df1bf9f5deb0003c61a53", + "sha256:3ce18f703b7298e7f7633efd6a90138d99a3f9a656cb52c1201e76cb5d79cf08", + "sha256:3d1c9c15d3999107cbb9b2d76ca6172e6710a12fda22434ee8bd3f432b7b17e8", + "sha256:3dd3e7e7c9ef3e7214f014f1ae260892286647b3cf7c7f1b644a568fd410f8ca", + "sha256:43bfd25113c1e98aec6c70e26d5f4331efbf4aa9037ba9ad88f090853bf64d7f", + "sha256:43dd89a6194f6ab02a3fe36b09e42e2df19c211fc2050ce37374d96f39604997", + "sha256:481f10a1a45c5f4c4a578bbd74cff22eb64460a6549819242a87a80788461fba", + "sha256:4ba8d043fed7ffa117024d7ba66fdea011c0e7602327c6d73cacaea38abe4491", + "sha256:4bb7493c3e3a36d3012b8564bd0e2783259ddd7ef3a81a74f0dbfa000fce48b7", + "sha256:4c1a6309005acc4b2bcc577ba3b9169fea52638709ffacbd071f3503264620da", + "sha256:4dda726f89bfa5c465ba45b76515135a3ece0088dfa2da49b8bb278f3bdeea12", + "sha256:53c921b58fdc6485d6b2603e0132bb01cd59b8f0620ffc0907f525e0ba071687", + "sha256:5578cf40440eafcb054cf859964bc120ab52ebe0e0562d2b898126d868749629", + "sha256:59ee1925b5a5efdf6c4e7be51deee93984d0ac14a6897bd521b498b9916f1544", + "sha256:670847ee6aeb3a569cd7cdfbe0c3bec1d44828bbfbe78c5d305f7f804870ef9e", + "sha256:78c657ece7a73b976905ab9ec8be9ef2df12ed8984c24598a1791c58ce3b4ce4", + "sha256:7a9318da4b4ada9a67c1dd84d1c0834123081e746bee311a16bb449f363d965e", + "sha256:7b2f8107a3c329789f3c00b2daad0e35f548d0a55cda6291579136622099a46e", + "sha256:7ea4490360b605804bea8173d2d086b6c379d6bb22ac434de605a9cbce006e7d", + "sha256:8360c7cc620abb320e1b8d603c39095101391a82b1d0be05fb2225471c9c5c52", + "sha256:875f7100ce0e74af51d4139495eec4025affa1a605280f23990b6434b81df1bd", + "sha256:8bedb1f6cb919af3b6353921c71281b1491f948ca64408871465d889b4ee1b66", + "sha256:8d20cfe63a1c135d26bde8c1d0ea46fd1200884afbc523466d2f1cf517d1fe33", + "sha256:9202f184cc0582b1db15056f2225ab4c1e3dac4d9ade50dd0613ac3c46352ac2", + "sha256:9acfc7f652b31853eed3b92095b0acf06fd5597eeea42e939bd23a17137679d5", + "sha256:9d18a8b44ec8502a7fde91446cd9c9b95ce7c49f1eacc1fb2358b8907d4369fd", + "sha256:9e67531370a3b07e49b280c1f8c2df67985c790ad2834d1b288a2f13cd341c5f", + "sha256:9ee6a4cdcbf54b8083dc9723cdf5f41f722c00db40ccf9ec2616e27869151129", + "sha256:a7d9a606355655617fee25dd7e54d3af50804d002f1fd3118dd6312d26692d70", + "sha256:aa3705a8d14de39898da0fbad920b2a37b7547c3afd2a18b9b81f0223b7d0f68", + "sha256:b7215bf2b53bc6cb35808149980c2ae80a4ae4e273890ac85459c014d5aa60ac", + "sha256:badda65ac99555791eed75e234afb94686ed2317670c68bff8a4498acdaee935", + "sha256:bf0e6cce113596377cadda4e3ac5fb89f095bd492226e46d91b4baef1dd16f60", + "sha256:c171fc35d3174bbf4787381716564042a4cbc008824d8195eede3d9b938e29a8", + "sha256:c1f6490dd1862af5aae6cfcf2a274bffa9a5b32a8f5acb519a7ecf5a99a88866", + "sha256:c25b74a811dba37c7ea6a14d99eb9402d89c8d739d50748a75f3cf994cf19c43", + "sha256:c6095aaf852c34f42e1bd0cf0dc32d1e4b48a90bfb5054abdbb9d64b36acadcb", + "sha256:c63f898f683d1379b9be5afc3dd139e20b30b0b1e0bf69a3fc3681f364cf1629", + "sha256:cd8d62cab363dfe713067027a5adb4907515861f1e4ce63e7be810b83668b847", + "sha256:ce91a24aac80de6be8512fb1c4838a9881aa713f44f4e91dd7bb3b34061b497d", + "sha256:cea52d11e02123f125f9055dfe0ccf1c3857225fb879e4a944fae12989e2aef2", + "sha256:cf4efa2d01f697a7dbd0509891a286a4af0d86902fc594e20e3b1712c28c0106", + "sha256:d2fa6fc7cc865d26ff42480ac9b52b8c9b7da30a10a6442a9cdf429de840e949", + "sha256:d329300fb23e14ed1f8c6d688dfd867d1dcc3b1d7cd49b7f8c5b44e797ce0932", + "sha256:d6177077a31b1aecfc3c9070bd2f11419dbb4a70f30f4c65b124714f525c2e48", + "sha256:db37248535d1ae40735d15bdf26ad43be19e3d93ab3f3dad8507eb0f85bb8124", + "sha256:db70a47987e34494b451a334605bee57a126fe8d290511349e86810b4be53b01", + "sha256:dcefcf2915a2dbdbce37e2fc1622129a1918abfe3d06721ce9f6cdac9b6d2eaa", + "sha256:dda3ed0a7869d2fa16aa41f9961ade73aa2c2e3b2fcb0a352524e7b744881889", + "sha256:e0bf378db07df0a713a1e32381a1b277e62ad106d0dbe17b5479e76ec706d720", + "sha256:e13a05db87d3b241c186d0936808d0e4e12decc267c617d54e9c643807e968b6", + "sha256:e143b0ef9cb1a2b4f74f56d4fbe50caa7c2bb93390aff52f9398d21d89bc73ea", + "sha256:e22d1721c978a6494adc824e0916f9d187fa57baeda34b55140315fa2f740184", + "sha256:e5522ee72f95661e79db691310290c4618b86dff2d9b90baedf343fd7a08bf79", + "sha256:e993676c71288618eb07e20622572b1250d8713e7e00ab3aabae28cb70f3640d", + "sha256:ee9afa1b0d2293c46954f47f33e150798ad68b78925e3710044e0d67a9487791", + "sha256:f1ac5462582d6561c1c1708853a9faf612ff4e5ea5e679e99be36143d6eabd8e", + "sha256:f5022504adab881e2d801a88b748ea63f2a9d130e0b2c430824682a96f6534be", + "sha256:f5b973cce96793725ef63eb449adfb74f99c043c718acb76e0d2a447ae369962", + "sha256:f7c58a240260822dc07f6ae32a0293dd5bccd618bb2d0f36d51c5dbd526f89c0", + "sha256:fc6da202068e0a268e298d7cd09b6e9f3997736cd9b060e2750963754552a0a9", + "sha256:fdadc3f6a32d6eca45f9a900a254757fd7855dfb2d8f8dcf0e88f0fae3ff8eb1" + ], + "index": "aliyun", + "markers": "python_version >= '3.9'", + "version": "==3.11.7" }, "aiosignal": { "hashes": [ @@ -984,11 +1917,11 @@ }, "setuptools": { "hashes": [ - "sha256:5c4ccb41111392671f02bb5f8436dfc5a9a7185e80500531b133f5775c4163ef", - "sha256:87cb777c3b96d638ca02031192d40390e0ad97737e27b6b4fa831bea86f2f829" + "sha256:8199222558df7c86216af4f84c30e9b34a61d8ba19366cc914424cdbd28252f6", + "sha256:ce74b49e8f7110f9bf04883b730f4765b774ef3ef28f722cce7c273d253aaf7d" ], "markers": "python_version >= '3.9'", - "version": "==75.5.0" + "version": "==75.6.0" }, "sniffio": { "hashes": [ @@ -1047,9 +1980,6 @@ "version": "==4.12.2" }, "urllib3": { - "extras": [ - "socks" - ], "hashes": [ "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9" @@ -1083,91 +2013,91 @@ }, "yarl": { "hashes": [ - "sha256:0c8e589379ef0407b10bed16cc26e7392ef8f86961a706ade0a22309a45414d7", - "sha256:0d41c684f286ce41fa05ab6af70f32d6da1b6f0457459a56cf9e393c1c0b2217", - "sha256:1056cadd5e850a1c026f28e0704ab0a94daaa8f887ece8dfed30f88befb87bb0", - "sha256:11d86c6145ac5c706c53d484784cf504d7d10fa407cb73b9d20f09ff986059ef", - "sha256:170ed4971bf9058582b01a8338605f4d8c849bd88834061e60e83b52d0c76870", - "sha256:17791acaa0c0f89323c57da7b9a79f2174e26d5debbc8c02d84ebd80c2b7bff8", - "sha256:17931dfbb84ae18b287279c1f92b76a3abcd9a49cd69b92e946035cff06bcd20", - "sha256:18662443c6c3707e2fc7fad184b4dc32dd428710bbe72e1bce7fe1988d4aa654", - "sha256:187df91395c11e9f9dc69b38d12406df85aa5865f1766a47907b1cc9855b6303", - "sha256:1fee66b32e79264f428dc8da18396ad59cc48eef3c9c13844adec890cd339db5", - "sha256:2270d590997445a0dc29afa92e5534bfea76ba3aea026289e811bf9ed4b65a7f", - "sha256:2654caaf5584449d49c94a6b382b3cb4a246c090e72453493ea168b931206a4d", - "sha256:26bfb6226e0c157af5da16d2d62258f1ac578d2899130a50433ffee4a5dfa673", - "sha256:2941756754a10e799e5b87e2319bbec481ed0957421fba0e7b9fb1c11e40509f", - "sha256:3294f787a437cb5d81846de3a6697f0c35ecff37a932d73b1fe62490bef69211", - "sha256:358dc7ddf25e79e1cc8ee16d970c23faee84d532b873519c5036dbb858965795", - "sha256:38bc4ed5cae853409cb193c87c86cd0bc8d3a70fd2268a9807217b9176093ac6", - "sha256:3a0baff7827a632204060f48dca9e63fbd6a5a0b8790c1a2adfb25dc2c9c0d50", - "sha256:3a3ede8c248f36b60227eb777eac1dbc2f1022dc4d741b177c4379ca8e75571a", - "sha256:3a58a2f2ca7aaf22b265388d40232f453f67a6def7355a840b98c2d547bd037f", - "sha256:4434b739a8a101a837caeaa0137e0e38cb4ea561f39cb8960f3b1e7f4967a3fc", - "sha256:460024cacfc3246cc4d9f47a7fc860e4fcea7d1dc651e1256510d8c3c9c7cde0", - "sha256:46c465ad06971abcf46dd532f77560181387b4eea59084434bdff97524444032", - "sha256:48e424347a45568413deec6f6ee2d720de2cc0385019bedf44cd93e8638aa0ed", - "sha256:4a8c83f6fcdc327783bdc737e8e45b2e909b7bd108c4da1892d3bc59c04a6d84", - "sha256:4c840cc11163d3c01a9d8aad227683c48cd3e5be5a785921bcc2a8b4b758c4f3", - "sha256:4d486ddcaca8c68455aa01cf53d28d413fb41a35afc9f6594a730c9779545876", - "sha256:4e76381be3d8ff96a4e6c77815653063e87555981329cf8f85e5be5abf449021", - "sha256:50d866f7b1a3f16f98603e095f24c0eeba25eb508c85a2c5939c8b3870ba2df8", - "sha256:52492b87d5877ec405542f43cd3da80bdcb2d0c2fbc73236526e5f2c28e6db28", - "sha256:56afb44a12b0864d17b597210d63a5b88915d680f6484d8d202ed68ade38673d", - "sha256:585ce7cd97be8f538345de47b279b879e091c8b86d9dbc6d98a96a7ad78876a3", - "sha256:5870d620b23b956f72bafed6a0ba9a62edb5f2ef78a8849b7615bd9433384171", - "sha256:5c6ea72fe619fee5e6b5d4040a451d45d8175f560b11b3d3e044cd24b2720526", - "sha256:688058e89f512fb7541cb85c2f149c292d3fa22f981d5a5453b40c5da49eb9e8", - "sha256:6a3f47930fbbed0f6377639503848134c4aa25426b08778d641491131351c2c8", - "sha256:6b981316fcd940f085f646b822c2ff2b8b813cbd61281acad229ea3cbaabeb6b", - "sha256:734144cd2bd633a1516948e477ff6c835041c0536cef1d5b9a823ae29899665b", - "sha256:736bb076f7299c5c55dfef3eb9e96071a795cb08052822c2bb349b06f4cb2e0a", - "sha256:752485cbbb50c1e20908450ff4f94217acba9358ebdce0d8106510859d6eb19a", - "sha256:753eaaa0c7195244c84b5cc159dc8204b7fd99f716f11198f999f2332a86b178", - "sha256:75ac158560dec3ed72f6d604c81090ec44529cfb8169b05ae6fcb3e986b325d9", - "sha256:76499469dcc24759399accd85ec27f237d52dec300daaca46a5352fcbebb1071", - "sha256:782ca9c58f5c491c7afa55518542b2b005caedaf4685ec814fadfcee51f02493", - "sha256:792155279dc093839e43f85ff7b9b6493a8eaa0af1f94f1f9c6e8f4de8c63500", - "sha256:7a1606ba68e311576bcb1672b2a1543417e7e0aa4c85e9e718ba6466952476c0", - "sha256:8281db240a1616af2f9c5f71d355057e73a1409c4648c8949901396dc0a3c151", - "sha256:871e1b47eec7b6df76b23c642a81db5dd6536cbef26b7e80e7c56c2fd371382e", - "sha256:8b9c4643e7d843a0dca9cd9d610a0876e90a1b2cbc4c5ba7930a0d90baf6903f", - "sha256:8c6d5fed96f0646bfdf698b0a1cebf32b8aae6892d1bec0c5d2d6e2df44e1e2d", - "sha256:8e1bf59e035534ba4077f5361d8d5d9194149f9ed4f823d1ee29ef3e8964ace3", - "sha256:8fd51299e21da709eabcd5b2dd60e39090804431292daacbee8d3dabe39a6bc0", - "sha256:91c012dceadc695ccf69301bfdccd1fc4472ad714fe2dd3c5ab4d2046afddf29", - "sha256:93771146ef048b34201bfa382c2bf74c524980870bb278e6df515efaf93699ff", - "sha256:93d1c8cc5bf5df401015c5e2a3ce75a5254a9839e5039c881365d2a9dcfc6dc2", - "sha256:9611b83810a74a46be88847e0ea616794c406dbcb4e25405e52bff8f4bee2d0a", - "sha256:9bc27dd5cfdbe3dc7f381b05e6260ca6da41931a6e582267d5ca540270afeeb2", - "sha256:ac8eda86cc75859093e9ce390d423aba968f50cf0e481e6c7d7d63f90bae5c9c", - "sha256:bc3003710e335e3f842ae3fd78efa55f11a863a89a72e9a07da214db3bf7e1f8", - "sha256:bc61b005f6521fcc00ca0d1243559a5850b9dd1e1fe07b891410ee8fe192d0c0", - "sha256:be4c7b1c49d9917c6e95258d3d07f43cfba2c69a6929816e77daf322aaba6628", - "sha256:c019abc2eca67dfa4d8fb72ba924871d764ec3c92b86d5b53b405ad3d6aa56b0", - "sha256:c42774d1d1508ec48c3ed29e7b110e33f5e74a20957ea16197dbcce8be6b52ba", - "sha256:c556fbc6820b6e2cda1ca675c5fa5589cf188f8da6b33e9fc05b002e603e44fa", - "sha256:c6e659b9a24d145e271c2faf3fa6dd1fcb3e5d3f4e17273d9e0350b6ab0fe6e2", - "sha256:c74f0b0472ac40b04e6d28532f55cac8090e34c3e81f118d12843e6df14d0909", - "sha256:cd7e35818d2328b679a13268d9ea505c85cd773572ebb7a0da7ccbca77b6a52e", - "sha256:d17832ba39374134c10e82d137e372b5f7478c4cceeb19d02ae3e3d1daed8721", - "sha256:d1fa68a3c921365c5745b4bd3af6221ae1f0ea1bf04b69e94eda60e57958907f", - "sha256:d63123bfd0dce5f91101e77c8a5427c3872501acece8c90df457b486bc1acd47", - "sha256:da9d3061e61e5ae3f753654813bc1cd1c70e02fb72cf871bd6daf78443e9e2b1", - "sha256:db5ac3871ed76340210fe028f535392f097fb31b875354bcb69162bba2632ef4", - "sha256:dd7abf4f717e33b7487121faf23560b3a50924f80e4bef62b22dab441ded8f3b", - "sha256:dd90238d3a77a0e07d4d6ffdebc0c21a9787c5953a508a2231b5f191455f31e9", - "sha256:ef6eee1a61638d29cd7c85f7fd3ac7b22b4c0fabc8fd00a712b727a3e73b0685", - "sha256:f11fd61d72d93ac23718d393d2a64469af40be2116b24da0a4ca6922df26807e", - "sha256:f1e7fedb09c059efee2533119666ca7e1a2610072076926fa028c2ba5dfeb78c", - "sha256:f25b7e93f5414b9a983e1a6c1820142c13e1782cc9ed354c25e933aebe97fcf2", - "sha256:f2f44a4247461965fed18b2573f3a9eb5e2c3cad225201ee858726cde610daca", - "sha256:f5ffc6b7ace5b22d9e73b2a4c7305740a339fbd55301d52735f73e21d9eb3130", - "sha256:ff6af03cac0d1a4c3c19e5dcc4c05252411bf44ccaa2485e20d0a7c77892ab6e", - "sha256:ff8d95e06546c3a8c188f68040e9d0360feb67ba8498baf018918f669f7bc39b" + "sha256:01be8688fc211dc237e628fcc209dda412d35de7642453059a0553747018d075", + "sha256:039c299a0864d1f43c3e31570045635034ea7021db41bf4842693a72aca8df3a", + "sha256:074fee89caab89a97e18ef5f29060ef61ba3cae6cd77673acc54bfdd3214b7b7", + "sha256:13aaf2bdbc8c86ddce48626b15f4987f22e80d898818d735b20bd58f17292ee8", + "sha256:14408cc4d34e202caba7b5ac9cc84700e3421a9e2d1b157d744d101b061a4a88", + "sha256:1db1537e9cb846eb0ff206eac667f627794be8b71368c1ab3207ec7b6f8c5afc", + "sha256:1ece25e2251c28bab737bdf0519c88189b3dd9492dc086a1d77336d940c28ced", + "sha256:1ff116f0285b5c8b3b9a2680aeca29a858b3b9e0402fc79fd850b32c2bcb9f8b", + "sha256:205de377bd23365cd85562c9c6c33844050a93661640fda38e0567d2826b50df", + "sha256:20d95535e7d833889982bfe7cc321b7f63bf8879788fee982c76ae2b24cfb715", + "sha256:20de4a8b04de70c49698dc2390b7fd2d18d424d3b876371f9b775e2b462d4b41", + "sha256:2d90f2e4d16a5b0915ee065218b435d2ef619dd228973b1b47d262a6f7cd8fa5", + "sha256:2e6b4466714a73f5251d84b471475850954f1fa6acce4d3f404da1d55d644c34", + "sha256:309f8d27d6f93ceeeb80aa6980e883aa57895270f7f41842b92247e65d7aeddf", + "sha256:32141e13a1d5a48525e519c9197d3f4d9744d818d5c7d6547524cc9eccc8971e", + "sha256:34176bfb082add67cb2a20abd85854165540891147f88b687a5ed0dc225750a0", + "sha256:38b39b7b3e692b6c92b986b00137a3891eddb66311b229d1940dcbd4f025083c", + "sha256:3a3709450a574d61be6ac53d582496014342ea34876af8dc17cc16da32826c9a", + "sha256:3adaaf9c6b1b4fc258584f4443f24d775a2086aee82d1387e48a8b4f3d6aecf6", + "sha256:3f576ed278860df2721a5d57da3381040176ef1d07def9688a385c8330db61a1", + "sha256:42ba84e2ac26a3f252715f8ec17e6fdc0cbf95b9617c5367579fafcd7fba50eb", + "sha256:454902dc1830d935c90b5b53c863ba2a98dcde0fbaa31ca2ed1ad33b2a7171c6", + "sha256:466d31fd043ef9af822ee3f1df8fdff4e8c199a7f4012c2642006af240eade17", + "sha256:49a98ecadc5a241c9ba06de08127ee4796e1009555efd791bac514207862b43d", + "sha256:4d26f1fa9fa2167bb238f6f4b20218eb4e88dd3ef21bb8f97439fa6b5313e30d", + "sha256:52c136f348605974c9b1c878addd6b7a60e3bf2245833e370862009b86fa4689", + "sha256:536a7a8a53b75b2e98ff96edb2dfb91a26b81c4fed82782035767db5a465be46", + "sha256:576d258b21c1db4c6449b1c572c75d03f16a482eb380be8003682bdbe7db2f28", + "sha256:609ffd44fed2ed88d9b4ef62ee860cf86446cf066333ad4ce4123505b819e581", + "sha256:67b336c15e564d76869c9a21316f90edf546809a5796a083b8f57c845056bc01", + "sha256:685cc37f3f307c6a8e879986c6d85328f4c637f002e219f50e2ef66f7e062c1d", + "sha256:6a49ad0102c0f0ba839628d0bf45973c86ce7b590cdedf7540d5b1833ddc6f00", + "sha256:6fb64dd45453225f57d82c4764818d7a205ee31ce193e9f0086e493916bd4f72", + "sha256:701bb4a8f4de191c8c0cc9a1e6d5142f4df880e9d1210e333b829ca9425570ed", + "sha256:73553bbeea7d6ec88c08ad8027f4e992798f0abc459361bf06641c71972794dc", + "sha256:7520e799b1f84e095cce919bd6c23c9d49472deeef25fe1ef960b04cca51c3fc", + "sha256:7609b8462351c4836b3edce4201acb6dd46187b207c589b30a87ffd1813b48dc", + "sha256:7db9584235895a1dffca17e1c634b13870852094f6389b68dcc6338086aa7b08", + "sha256:7fa7d37f2ada0f42e0723632993ed422f2a679af0e200874d9d861720a54f53e", + "sha256:80741ec5b471fbdfb997821b2842c59660a1c930ceb42f8a84ba8ca0f25a66aa", + "sha256:8254dbfce84ee5d1e81051ee7a0f1536c108ba294c0fdb5933476398df0654f3", + "sha256:8b8d3e4e014fb4274f1c5bf61511d2199e263909fb0b8bda2a7428b0894e8dc6", + "sha256:8e1c18890091aa3cc8a77967943476b729dc2016f4cfe11e45d89b12519d4a93", + "sha256:9106025c7f261f9f5144f9aa7681d43867eed06349a7cfb297a1bc804de2f0d1", + "sha256:91b8fb9427e33f83ca2ba9501221ffaac1ecf0407f758c4d2f283c523da185ee", + "sha256:96404e8d5e1bbe36bdaa84ef89dc36f0e75939e060ca5cd45451aba01db02902", + "sha256:9b4c90c5363c6b0a54188122b61edb919c2cd1119684999d08cd5e538813a28e", + "sha256:a0509475d714df8f6d498935b3f307cd122c4ca76f7d426c7e1bb791bcd87eda", + "sha256:a173401d7821a2a81c7b47d4e7d5c4021375a1441af0c58611c1957445055056", + "sha256:a45d94075ac0647621eaaf693c8751813a3eccac455d423f473ffed38c8ac5c9", + "sha256:a5f72421246c21af6a92fbc8c13b6d4c5427dfd949049b937c3b731f2f9076bd", + "sha256:a64619a9c47c25582190af38e9eb382279ad42e1f06034f14d794670796016c0", + "sha256:a7ee6884a8848792d58b854946b685521f41d8871afa65e0d4a774954e9c9e89", + "sha256:ae38bd86eae3ba3d2ce5636cc9e23c80c9db2e9cb557e40b98153ed102b5a736", + "sha256:b026cf2c32daf48d90c0c4e406815c3f8f4cfe0c6dfccb094a9add1ff6a0e41a", + "sha256:b0a2074a37285570d54b55820687de3d2f2b9ecf1b714e482e48c9e7c0402038", + "sha256:b1a3297b9cad594e1ff0c040d2881d7d3a74124a3c73e00c3c71526a1234a9f7", + "sha256:b212452b80cae26cb767aa045b051740e464c5129b7bd739c58fbb7deb339e7b", + "sha256:b234a4a9248a9f000b7a5dfe84b8cb6210ee5120ae70eb72a4dcbdb4c528f72f", + "sha256:b4095c5019bb889aa866bf12ed4c85c0daea5aafcb7c20d1519f02a1e738f07f", + "sha256:b8e8c516dc4e1a51d86ac975b0350735007e554c962281c432eaa5822aa9765c", + "sha256:bd80ed29761490c622edde5dd70537ca8c992c2952eb62ed46984f8eff66d6e8", + "sha256:c083f6dd6951b86e484ebfc9c3524b49bcaa9c420cb4b2a78ef9f7a512bfcc85", + "sha256:c0f4808644baf0a434a3442df5e0bedf8d05208f0719cedcd499e168b23bfdc4", + "sha256:c4cb992d8090d5ae5f7afa6754d7211c578be0c45f54d3d94f7781c495d56716", + "sha256:c60e547c0a375c4bfcdd60eef82e7e0e8698bf84c239d715f5c1278a73050393", + "sha256:c73a6bbc97ba1b5a0c3c992ae93d721c395bdbb120492759b94cc1ac71bc6350", + "sha256:c893f8c1a6d48b25961e00922724732d00b39de8bb0b451307482dc87bddcd74", + "sha256:cd6ab7d6776c186f544f893b45ee0c883542b35e8a493db74665d2e594d3ca75", + "sha256:d89ae7de94631b60d468412c18290d358a9d805182373d804ec839978b120422", + "sha256:d9d4f5e471e8dc49b593a80766c2328257e405f943c56a3dc985c125732bc4cf", + "sha256:da206d1ec78438a563c5429ab808a2b23ad7bc025c8adbf08540dde202be37d5", + "sha256:dbf53db46f7cf176ee01d8d98c39381440776fcda13779d269a8ba664f69bec0", + "sha256:dd21c0128e301851de51bc607b0a6da50e82dc34e9601f4b508d08cc89ee7929", + "sha256:e2580c1d7e66e6d29d6e11855e3b1c6381971e0edd9a5066e6c14d79bc8967af", + "sha256:e3818eabaefb90adeb5e0f62f047310079d426387991106d4fbf3519eec7d90a", + "sha256:ed69af4fe2a0949b1ea1d012bf065c77b4c7822bad4737f17807af2adb15a73c", + "sha256:f172b8b2c72a13a06ea49225a9c47079549036ad1b34afa12d5491b881f5b993", + "sha256:f275ede6199d0f1ed4ea5d55a7b7573ccd40d97aee7808559e1298fe6efc8dbd", + "sha256:f7edeb1dcc7f50a2c8e08b9dc13a413903b7817e72273f00878cb70e766bdb3b", + "sha256:fa2c9cb607e0f660d48c54a63de7a9b36fef62f6b8bd50ff592ce1137e73ac7d", + "sha256:fe94d1de77c4cd8caff1bd5480e22342dbd54c93929f5943495d9c1e8abe9f42" ], "markers": "python_version >= '3.9'", - "version": "==1.17.2" + "version": "==1.18.0" }, "yt-dlp": { "hashes": [ @@ -1178,6 +2108,5 @@ "markers": "python_version >= '3.9'", "version": "==2024.11.18" } - }, - "develop": {} + } } diff --git a/README.md b/README.md index 7cff625..43123c5 100644 --- a/README.md +++ b/README.md @@ -62,23 +62,23 @@
@@ -91,7 +91,7 @@ - ✅ 接口测速验效,响应时间、分辨率优先级,过滤无效接口 - ✅ 偏好设置:IPv6、接口来源排序优先级与数量配置、接口白名单 - ✅ 定时执行,北京时间每日 6:00 与 18:00 执行更新 -- ✅ 支持多种运行方式:工作流、命令行、GUI 软件、Docker(amd64/arm64/arm v7/arm v8) +- ✅ 支持多种运行方式:工作流、命令行、GUI 软件、Docker(amd64/arm64/arm v7) - ✨ 更多功能请见[配置参数](./docs/config.md) ## 🔗 最新结果 @@ -99,17 +99,17 @@ - 接口源: ```bash -https://ghproxy.net/raw.githubusercontent.com/Guovin/TV/gd/output/result.m3u +https://ghproxy.net/raw.githubusercontent.com/Guovin/GTV/gd/output/result.m3u ``` ```bash -https://ghproxy.net/raw.githubusercontent.com/Guovin/TV/gd/output/result.txt +https://ghproxy.net/raw.githubusercontent.com/Guovin/GTV/gd/output/result.txt ``` - 数据源: ```bash -https://ghproxy.net/raw.githubusercontent.com/Guovin/TV/gd/source.json +https://ghproxy.net/raw.githubusercontent.com/Guovin/GTV/gd/source.json ``` ## ⚙️ 配置 @@ -129,7 +129,7 @@ pip install pipenv ``` ```python -pipenv install +pipenv install --dev ``` ```python @@ -138,7 +138,7 @@ pipenv run dev ### 方式三:GUI 软件 -1. 下载[更新工具软件](https://github.com/Guovin/TV/releases),打开软件,点击更新,即可完成更新 +1. 下载[GTV 软件](https://github.com/Guovin/GTV/releases),打开软件,点击更新,即可完成更新 2. 或者在项目目录下运行以下命令,即可打开 GUI 软件: @@ -146,41 +146,39 @@ pipenv run dev pipenv run ui ``` - + ### 方式四:Docker -- driver:性能要求较高,更新速度较慢,稳定性、成功率高;修改配置 open_driver = False 可切换到 request 版本(推荐酒店源、组播源、关键字搜索使用此版本) -- requests:轻量级,性能要求低,更新速度快,稳定性不确定(推荐订阅源使用此版本) - -建议都试用一次,选择自己合适的版本 +- gtv(完整版本):性能要求较高,更新速度较慢,稳定性、成功率高;修改配置 open_driver = False 可切换到 Lite 版本运行方式(推荐酒店源、组播源、关键字搜索使用此版本) +- gtv:lite(精简版本):轻量级,性能要求低,更新速度快,稳定性不确定(推荐订阅源使用此版本) 1. 拉取镜像: -- driver: +- gtv: ```bash -docker pull guovern/tv-driver:latest +docker pull guovern/gtv:latest ``` -- requests: +- gtv:lite: ```bash -docker pull guovern/tv-requests:latest +docker pull guovern/gtv:lite ``` 2. 运行容器: -- driver: +- gtv: ```bash -docker run -d -p 8000:8000 guovern/tv-driver +docker run -d -p 8000:8000 guovern/gtv ``` -- requests: +- gtv:lite: ```bash -docker run -d -p 8000:8000 guovern/tv-requests +docker run -d -p 8000:8000 guovern/gtv:lite ``` 卷挂载参数(可选): @@ -188,16 +186,16 @@ docker run -d -p 8000:8000 guovern/tv-requests 以宿主机路径/etc/docker 为例: -- driver: +- gtv: ```bash -docker run -v /etc/docker/config:/tv-driver/config -v /etc/docker/output:/tv-driver/output -d -p 8000:8000 guovern/tv-driver +docker run -v /etc/docker/config:/gtv/config -v /etc/docker/output:/gtv/output -d -p 8000:8000 guovern/gtv ``` -- requests: +- gtv:lite: ```bash -docker run -v /etc/docker/config:/tv-requests/config -v /etc/docker/output:/tv-requests/output -d -p 8000:8000 guovern/tv-requests +docker run -v /etc/docker/config:/gtv-lite/config -v /etc/docker/output:/gtv-lite/output -d -p 8000:8000 guovern/gtv:lite ``` 3. 更新结果: @@ -220,7 +218,7 @@ docker run -v /etc/docker/config:/tv-requests/config -v /etc/docker/output:/tv-r ## 👀 关注 -微信公众号搜索 Govin,或扫码: +微信公众号搜索 Govin,或扫码,接收更新推送、学习更多使用技巧: ![微信公众号](./static/images/qrcode.jpg) diff --git a/README_en.md b/README_en.md index 6bde25f..8cc3b9d 100644 --- a/README_en.md +++ b/README_en.md @@ -62,23 +62,23 @@
- - + + - + - - + + - - + + - - + + - - + +
@@ -91,7 +91,7 @@ - ✅ Interface speed testing and verification, with priority on response time and resolution, filtering out ineffective interfaces - ✅ Preferences: IPv6, priority and quantity of interface source sorting, and interface whitelist - ✅ Scheduled execution at 6:00 AM and 18:00 PM Beijing time daily -- ✅ Supports various execution methods: workflows, command line, GUI software, Docker(amd64/arm64/arm v7/arm v8) +- ✅ Supports various execution methods: workflows, command line, GUI software, Docker(amd64/arm64/arm v7) - ✨ For more features, see [Config parameter](./docs/config_en.md) ## 🔗 Latest results @@ -129,7 +129,7 @@ pip install pipenv ``` ```python -pipenv install +pipenv install --dev ``` ```python @@ -138,7 +138,7 @@ pipenv run dev ### Method 3: GUI Software -1. Download [Update tool software](https://github.com/Guovin/TV/releases), open the software, click update to complete the update +1. Download [GTV software](https://github.com/Guovin/GTV/releases), open the software, click update to complete the update 2. Or run the following command in the project directory to open the GUI software: @@ -146,41 +146,41 @@ pipenv run dev pipenv run ui ``` - + ### Method 4: Docker -- driver: Higher performance requirements, slower update speed, high stability and success rate. Set open_driver = False to switch to the request version (recommended for hotel sources, multicast sources, and online searches) -- requests: Lightweight, low performance requirements, fast update speed, stability uncertain (recommend using this version for the subscription source) +- gtv (Full version): Higher performance requirements, slower update speed, high stability and success rate. Set open_driver = False to switch to the gtv-lite version (recommended for hotel sources, multicast sources, and online searches) +- gtv:lite (Condensed version): Lightweight, low performance requirements, fast update speed, stability uncertain (recommend using this version for the subscription source) It's recommended to try each one and choose the version that suits you 1. Pull the image: -- driver +- gtv ```bash -docker pull guovern/tv-driver:latest +docker pull guovern/gtv:latest ``` -- requests +- gtv:lite ```bash -docker pull guovern/tv-requests:latest +docker pull guovern/gtv:lite ``` 2. Run the container: -- driver +- gtv ```bash -docker run -d -p 8000:8000 guovern/tv-driver +docker run -d -p 8000:8000 guovern/gtv ``` -- requests +- gtv:lite ```bash -docker run -d -p 8000:8000 guovern/tv-requests +docker run -d -p 8000:8000 guovern/gtv:lite ``` Volume Mount Parameter (Optional): @@ -188,16 +188,16 @@ This allows synchronization of files between the host machine and the container. Taking the host path /etc/docker as an example: -- driver: +- gtv: ```bash -docker run -v /etc/docker/config:/tv-driver/config -v /etc/docker/output:/tv-driver/output -d -p 8000:8000 guovern/tv-driver +docker run -v /etc/docker/config:/gtv/config -v /etc/docker/output:/gtv/output -d -p 8000:8000 guovern/gtv ``` -- requests: +- gtv:lite: ```bash -docker run -v /etc/docker/config:/tv-requests/config -v /etc/docker/output:/tv-requests/output -d -p 8000:8000 guovern/tv-requests +docker run -v /etc/docker/config:/gtv-lite/config -v /etc/docker/output:/gtv-lite/output -d -p 8000:8000 guovern/gtv:lite ``` 3. Update results: @@ -220,7 +220,7 @@ docker run -v /etc/docker/config:/tv-requests/config -v /etc/docker/output:/tv-r ## 👀 Follow -Wechat public account search Govin, or scan code: +Wechat public account search for Govin, or scan the code to receive updates and learn more tips: ![Wechat public account](./static/images/qrcode.jpg) diff --git a/docs/tutorial.md b/docs/tutorial.md index f62b18a..08dd6e4 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -23,7 +23,7 @@ ### 1. Star -打开 https://github.com/Guovin/TV ,点击 Star 收藏该项目(您的 Star 是我持续更新的动力) +打开 https://github.com/Guovin/GTV ,点击 Star 收藏该项目(您的 Star 是我持续更新的动力) ![Star](./images/star.png 'Star') ### 2. Watch @@ -168,20 +168,27 @@ https://mirror.ghproxy.com/raw.githubusercontent.com/您的github用户名/仓 ### 方式二:命令行 -```python 1. 安装 Python -请至官方下载并安装 Python,安装时请选择将 Python 添加到系统环境变量 Path 中 + 请至官方下载并安装 Python,安装时请选择将 Python 添加到系统环境变量 Path 中 2. 运行更新 -项目目录下打开终端 CMD 依次运行以下命令: + 项目目录下打开终端 CMD 依次运行以下命令: + +```python pip install pipenv -pipenv install +``` + +```python +pipenv install --dev +``` + +```python pipenv run dev ``` ### 方式三:GUI 软件 -1. 下载[更新工具软件](https://github.com/Guovin/TV/releases),打开软件,点击更新,即可完成更新 +1. 下载[GTV 软件](https://github.com/Guovin/GTV/releases),打开软件,点击更新,即可完成更新 2. 或者在项目目录下运行以下命令,即可打开 GUI 软件: @@ -189,37 +196,63 @@ pipenv run dev pipenv run ui ``` -![更新工具软件](./images/ui.png '更新工具软件') +![GTV](./images/ui.png 'GTV') ### 方式四:Docker -- requests:轻量级,性能要求低,更新速度快,稳定性不确定(推荐订阅源使用此版本) -- driver:性能要求较高,更新速度较慢,稳定性、成功率高;修改配置 open_driver = False 可切换到 request 版本(推荐酒店源、组播源、关键字搜索使用此版本) +- gtv(完整版本):性能要求较高,更新速度较慢,稳定性、成功率高;修改配置 open_driver = False 可切换到 Lite 版本运行方式(推荐酒店源、组播源、关键字搜索使用此版本) +- gtv:lite(精简版本):轻量级,性能要求低,更新速度快,稳定性不确定(推荐订阅源使用此版本) + +1. 拉取镜像: + +- gtv: ```bash -1. 拉取镜像: -requests: -docker pull guovern/tv-requests:latest +docker pull guovern/gtv:latest +``` -driver: -docker pull guovern/tv-driver:latest +- gtv:lite: + +```bash +docker pull guovern/gtv:lite +``` 2. 运行容器: -docker run -d -p 8000:8000 guovern/tv-requests 或 tv-driver + +- gtv: + +```bash +docker run -d -p 8000:8000 guovern/gtv +``` + +- gtv:lite: + +```bash +docker run -d -p 8000:8000 guovern/gtv:lite +``` 卷挂载参数(可选): 实现宿主机文件与容器文件同步,修改模板、配置、获取更新结果文件可直接在宿主机文件夹下操作 -配置文件: --v 宿主机路径/config:/tv-requests/config 或 tv-driver/config +以宿主机路径/etc/docker 为例: -结果文件: --v 宿主机路径/output:/tv-requests/output 或 tv-driver/output +- gtv: -3. 查看更新结果:访问(域名:8000) +```bash +docker run -v /etc/docker/config:/gtv/config -v /etc/docker/output:/gtv/output -d -p 8000:8000 guovern/gtv ``` -#### 注:方式一至三更新完成后的结果文件链接:http://本地 ip:8000 或 http://localhost:8000 +- gtv:lite: + +```bash +docker run -v /etc/docker/config:/gtv-lite/config -v /etc/docker/output:/gtv-lite/output -d -p 8000:8000 guovern/gtv:lite +``` + +3. 更新结果: + +- 接口地址:ip:8000 +- 接口详情:ip:8000/result +- 测速日志:ip:8000/log ### 上传更新文件至仓库(可选) diff --git a/docs/tutorial_en.md b/docs/tutorial_en.md index 5a785a0..ca741a8 100644 --- a/docs/tutorial_en.md +++ b/docs/tutorial_en.md @@ -23,7 +23,7 @@ Since this project will continue to iterate and improve, if you want to get the ### 1. Star -Go to https://github.com/Guovin/TV, click on Star to bookmark this project (Your Star is my motivation to keep updating). +Go to https://github.com/Guovin/GTV, click on Star to bookmark this project (Your Star is my motivation to keep updating). ![Star](./images/star.png 'Star') ### 2. Watch @@ -165,20 +165,27 @@ If you want to perform updates every 2 days, you can modify it like this: ### Method 2: Command Line -```python 1. Install Python -Please download and install Python from the official site. During installation, choose to add Python to the system's environment variables Path. + Please download and install Python from the official site. During installation, choose to add Python to the system's environment variables Path. 2. Run Update -Open a CMD terminal in the project directory and run the following commands in sequence: + Open a CMD terminal in the project directory and run the following commands in sequence: + +```python pip install pipenv -pipenv install +``` + +```python +pipenv install --dev +``` + +```python pipenv run dev ``` ### Method 3: GUI Software -1. Download the update tool software, open the software, click update to complete the update. +1. Download [GTV software](https://github.com/Guovin/GTV/releases), open the software, click update to complete the update. 2. Alternatively, run the following command in the project directory to open the GUI software: @@ -190,33 +197,61 @@ pipenv run ui ### Method 4: Docker -- requests: Lightweight, low performance requirements, fast update speed, stability uncertain (recommend this version for subscription sources) -- driver: Higher performance requirements, slower update speed, high stability and success rate. Set open_driver = False to switch to the request version (recommended for hotel sources, multicast sources, and keyword search) +- gtv (Full version): Higher performance requirements, slower update speed, high stability and success rate. Set open_driver = False to switch to the gtv-lite version (recommended for hotel sources, multicast sources, and online searches) +- gtv:lite (Condensed version): Lightweight, low performance requirements, fast update speed, stability uncertain (recommend using this version for the subscription source) + +It's recommended to try each one and choose the version that suits you + +1. Pull the image: + +- gtv ```bash -1. Pull the image: -For requests version: -docker pull guovern/tv-requests:latest +docker pull guovern/gtv:latest +``` -For driver version: -docker pull guovern/tv-driver:latest +- gtv:lite + +```bash +docker pull guovern/gtv:lite +``` 2. Run the container: -docker run -d -p 8000:8000 guovern/tv-requests or driver + +- gtv + +```bash +docker run -d -p 8000:8000 guovern/gtv +``` + +- gtv:lite + +```bash +docker run -d -p 8000:8000 guovern/gtv:lite +``` Volume Mount Parameter (Optional): This allows synchronization of files between the host machine and the container. Modifying templates, configurations, and retrieving updated result files can be directly operated in the host machine's folder. -config: --v/config:/tv-requests/config or tv-driver/config +Taking the host path /etc/docker as an example: -result: --v /output:/tv-requests/output or tv-driver/output +- gtv: -3. Check the update results: Visit (domain:8000) +```bash +docker run -v /etc/docker/config:/gtv/config -v /etc/docker/output:/gtv/output -d -p 8000:8000 guovern/gtv ``` -#### Note: Link to the result file after updates of methods one to three: http://local ip:8000 or http://localhost:8000 +- gtv:lite: + +```bash +docker run -v /etc/docker/config:/gtv-lite/config -v /etc/docker/output:/gtv-lite/output -d -p 8000:8000 guovern/gtv:lite +``` + +3. Update results: + +- API address: ip:8000 +- API details: ip:8000/result +- Speed test log: ip:8000/log ### Update the File to the Repository(optional) diff --git a/entrypoint.sh b/entrypoint.sh index 50af236..9bb4f75 100644 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -1,13 +1,5 @@ #!/bin/bash -for file in /tv_config/*; do - filename=$(basename "$file") - target_file="$APP_WORKDIR/config/$filename" - if [ ! -e "$target_file" ]; then - cp -r "$file" "$target_file" - fi -done - service cron start pipenv run python $APP_WORKDIR/main.py diff --git a/tkinter_ui/about.py b/tkinter_ui/about.py index 9c84677..092aa17 100644 --- a/tkinter_ui/about.py +++ b/tkinter_ui/about.py @@ -44,14 +44,14 @@ class AboutUI: project_label.pack() project_link = tk.Label( project_row_column2, - text="https://github.com/Guovin/TV", + text="https://github.com/Guovin/GTV", fg="blue", cursor="hand2", ) project_link.pack() project_link.bind( " ", - lambda e: webbrowser.open_new_tab("https://github.com/Guovin/TV"), + lambda e: webbrowser.open_new_tab("https://github.com/Guovin/GTV"), ) disclaimer_label = tk.Label( diff --git a/utils/speed.py b/utils/speed.py index 8ca98f0..bb5a42d 100644 --- a/utils/speed.py +++ b/utils/speed.py @@ -19,6 +19,7 @@ def get_speed_yt_dlp(url, timeout=config.sort_timeout): "skip_download": True, "quiet": True, "no_warnings": True, + "logger": logging.getLogger(), } with yt_dlp.YoutubeDL(ydl_opts) as ydl: start_time = time() From 9ed41daa10dbf720182c80d373b88efe53d5990b Mon Sep 17 00:00:00 2001 From: "guorong.zheng" <360996299@qq.com> Date: Mon, 25 Nov 2024 18:10:22 +0800 Subject: [PATCH 12/37] chore:docker --- .gitattributes | 3 +-- Dockerfile | 66 ++++++++++++++++++++++++++------------------------ Pipfile | 8 +++--- entrypoint.sh | 7 ------ 4 files changed, 39 insertions(+), 45 deletions(-) delete mode 100644 entrypoint.sh diff --git a/.gitattributes b/.gitattributes index 8428f3f..1a966c6 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1 @@ -*.sh linguist-language=Python -Dockerfile linguist-language=Python +Dockerfile linguist-language=Python \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 55bc664..e16c249 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,51 +1,53 @@ FROM python:3.13 AS builder -ARG APP_WORKDIR=/gtv +ARG LITE=false + +WORKDIR /app + +COPY Pipfile* ./ + +RUN pip install -i https://mirrors.aliyun.com/pypi/simple pipenv + +RUN PIPENV_VENV_IN_PROJECT=1 pipenv install --deploy\ + && if [ "$LITE" = false ]; then pipenv install selenium; fi + + +FROM python:3.13-slim + +ARG APP_WORKDIR=/iptv ARG LITE=false ENV APP_WORKDIR=$APP_WORKDIR +ENV PIPENV_VENV_IN_PROJECT=1 +ENV PATH="/.venv/bin:$PATH" WORKDIR $APP_WORKDIR COPY . $APP_WORKDIR -RUN pip install -i https://mirrors.aliyun.com/pypi/simple pipenv \ - && if [ "$LITE" = true ]; then pipenv install; else pipenv install && pipenv install selenium; fi +COPY --from=builder /app/.venv /.venv -FROM python:3.13-slim - -ARG APP_WORKDIR=/gtv -ARG LITE=false - -ENV APP_WORKDIR=$APP_WORKDIR - -WORKDIR $APP_WORKDIR - -COPY --from=builder $APP_WORKDIR $APP_WORKDIR - -RUN echo "deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmware\n \ - deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmware\n \ - deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware\n \ - deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware\n \ - deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware\n \ - deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-backports main contrib non-free non-free-firmware\n \ - deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-backports main contrib non-free non-free-firmware\n \ - deb https://mirrors.tuna.tsinghua.edu.cn/debian-security/ bookworm-security main contrib non-free non-free-firmware\n \ - deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security/ bookworm-security main contrib non-free non-free-firmware\n" \ +RUN echo "deb https://mirrors.aliyun.com/debian/ bookworm main contrib non-free non-free-firmware\n \ + deb-src https://mirrors.aliyun.com/debian/ bookworm main contrib non-free non-free-firmware\n \ + deb https://mirrors.aliyun.com/debian/ bookworm-updates main contrib non-free non-free-firmware\n \ + deb-src https://mirrors.aliyun.com/debian/ bookworm-updates main contrib non-free non-free-firmware\n \ + deb-src https://mirrors.aliyun.com/debian/ bookworm-updates main contrib non-free non-free-firmware\n \ + deb https://mirrors.aliyun.com/debian/ bookworm-backports main contrib non-free non-free-firmware\n \ + deb-src https://mirrors.aliyun.com/debian/ bookworm-backports main contrib non-free non-free-firmware\n \ + deb https://mirrors.aliyun.com/debian-security/ bookworm-security main contrib non-free non-free-firmware\n \ + deb-src https://mirrors.aliyun.com/debian-security/ bookworm-security main contrib non-free non-free-firmware\n" \ > /etc/apt/sources.list -RUN apt-get update && apt-get install -y --no-install-recommends cron \ - && if [ "$LITE" = false ]; then apt-get install -y --no-install-recommends chromium chromium-driver; fi \ +RUN apt-get update && apt-get install -y --no-install-recommends cron + +RUN if [ "$LITE" = false ]; then apt-get install -y --no-install-recommends chromium chromium-driver; fi \ && apt-get clean && rm -rf /var/lib/apt/lists/* RUN (crontab -l ; \ - echo "0 22 * * * cd $APP_WORKDIR && /usr/local/bin/pipenv run python main.py scheduled_task"; \ - echo "0 10 * * * cd $APP_WORKDIR && /usr/local/bin/pipenv run python main.py scheduled_task") | crontab - + echo "0 22 * * * python $APP_WORKDIR/main.py scheduled_task"; \ + echo "0 10 * * * python $APP_WORKDIR/main.py scheduled_task") | crontab - EXPOSE 8000 -COPY entrypoint.sh /gtv_entrypoint.sh - -RUN chmod +x /gtv_entrypoint.sh - -ENTRYPOINT ["/gtv_entrypoint.sh"] \ No newline at end of file +CMD . /.venv/bin/activate && service cron start && python $APP_WORKDIR/main.py \ + && gunicorn -w 4 -b 0.0.0.0:8000 main:app \ No newline at end of file diff --git a/Pipfile b/Pipfile index 67e8b38..1b262ef 100644 --- a/Pipfile +++ b/Pipfile @@ -6,11 +6,11 @@ verify_ssl = true [scripts] dev = "python main.py" ui = "python tkinter_ui/tkinter_ui.py" -docker_run = "docker run -v config:/gtv/config -v output:/gtv/output -d -p 8000:8000 guovern/gtv" -docker_run_lite = "docker run -v config:/gtv-lite/config -v output:/gtv-lite/output -d -p 8000:8000 guovern/gtv:lite" +docker_run = "docker run -v config:/iptv/config -v output:/iptv/output -d -p 8000:8000 guovern/iptv" +docker_run_lite = "docker run -v config:/iptv-lite/config -v output:/iptv-lite/output -d -p 8000:8000 guovern/iptv:lite" tkinter_build = "pyinstaller tkinter_ui/tkinter_ui.spec" -docker_build = "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 --build-arg APP_WORKDIR=/gtv -t guovern/gtv ." -docker_build_lite = "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 --build-arg APP_WORKDIR=/gtv-lite --build-arg LITE=true -t guovern/gtv:lite ." +docker_build = "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 --build-arg APP_WORKDIR=/iptv -t guovern/iptv ." +docker_build_lite = "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 --build-arg APP_WORKDIR=/iptv-lite --build-arg LITE=true -t guovern/iptv:lite ." [dev-packages] requests = "*" diff --git a/entrypoint.sh b/entrypoint.sh deleted file mode 100644 index 9bb4f75..0000000 --- a/entrypoint.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash - -service cron start - -pipenv run python $APP_WORKDIR/main.py - -gunicorn -w 4 -b 0.0.0.0:8000 main:app \ No newline at end of file From 62456659860467c036005ffec13d836eeaa5b6f2 Mon Sep 17 00:00:00 2001 From: "guorong.zheng" <360996299@qq.com> Date: Mon, 25 Nov 2024 18:10:34 +0800 Subject: [PATCH 13/37] chore:iptv --- .github/workflows/release.yml | 6 +-- CHANGELOG.md | 29 +++++++++++++- README.md | 65 +++++++++++++++++--------------- README_en.md | 59 +++++++++++++++-------------- docs/tutorial.md | 34 ++++++++--------- docs/tutorial_en.md | 34 ++++++++--------- driver/utils.py | 6 ++- tkinter_ui/about.py | 4 +- tkinter_ui/tkinter_ui.spec | 2 +- updates/fofa/request.py | 3 +- updates/hotel/request.py | 3 +- updates/multicast/request.py | 3 +- updates/online_search/request.py | 3 +- utils/retry.py | 8 ++-- version.json | 4 +- 15 files changed, 151 insertions(+), 112 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5d3bc15..65e16db 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -33,7 +33,7 @@ jobs: - name: Upload artifact uses: actions/upload-artifact@v4 with: - name: GTV + name: IPTV path: dist - name: Get version from version.json @@ -76,6 +76,6 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: dist/GTV.exe - asset_name: GTV.exe + asset_path: dist/IPTV.exe + asset_name: IPTV.exe asset_content_type: application/octet-stream diff --git a/CHANGELOG.md b/CHANGELOG.md index 575e9f0..5e9450d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,30 @@ # 更新日志(Changelog) +## v1.5.4 + +### 2024/11/25 + +- ⚠️ Python 升级至 3.13,该版本已不支持 Win7,若有需要请使用 v1.5.3 +- ⚠️ Github 仓库改名:IPTV,使用旧接口地址请及时更换新地址 +- ⚠️ Docker 镜像仓库改名:guovern/iptv(之前的 tv-driver 对应:guovern/iptv:latest,tv-requests 对应 guovern/iptv:lite) +- ✨ 更换测速方法(yt-dlp),重构测速逻辑,提升准确性、稳定性与效率,减小接口切换延迟(#563) +- ✨ 新增支持 ARM v7(#562) +- ✨ 新增微信公众号关注途径(公众号搜索:Govin),关注公众号可订阅更新通知与使用技巧等文章推送 +- 🪄 优化 Docker 镜像大小 + + ++ ## v1.5.3 ### 2024/11/19 @@ -59,7 +84,7 @@ - ✨ 新增频道接口白名单:不参与测速,永远保留在结果最前面(#470) 使用方法: 1. 模板频道接口地址后添加$!即可实现(如:广东珠江,http://xxx.m3u$! ) - 2. 额外信息补充(如:广东珠江,http://xxx.m3u$!额外信息 ),更多接口白名单请至https://github.com/Guovin/GTV/issues/514 讨论 + 2. 额外信息补充(如:广东珠江,http://xxx.m3u$!额外信息 ),更多接口白名单请至https://github.com/Guovin/IPTV/issues/514 讨论 - ✨ 新增 🈳 无结果频道分类:无结果频道默认归类至该底部分类下(#473) - ✨ 接口地址增加来源类型说明 - ✨ 默认模板增加广东民生(#481)、广州综合(#504) @@ -78,7 +103,7 @@ - ✨ Added channel interface whitelist: Not participating in speed testing, always kept at the very front of the results. (#470) Usage: 1. Add $! after the template channel interface address (e.g., Guangdong Pearl River, http://xxx.m3u$!). - 2. Additional information can be appended (e.g., Guangdong Pearl River, http://xxx.m3u$! Additional Information) (#470). For more interface whitelists, please discuss at https://github.com/Guovin/GTV/issues/514. + 2. Additional information can be appended (e.g., Guangdong Pearl River, http://xxx.m3u$! Additional Information) (#470). For more interface whitelists, please discuss at https://github.com/Guovin/IPTV/issues/514. - ✨ Added 🈳 No Results Channel Category: Channels without results are categorized under this bottom category by default (#473). - ✨ Interface addresses now include source type descriptions. - ✨ Default templates now include Guangdong People's Livelihood (#481) and Guangzhou Comprehensive (#504). diff --git a/README.md b/README.md index 43123c5..6c5a7de 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@English
+ +- ⚠️ Python has been upgraded to version 3.13, which no longer supports Win7. If needed, please use version v1.5.3. +- ⚠️ The GitHub repository has been renamed to IPTV. If you are using the old API address, please update it to the new one promptly. +- ⚠️ The Docker image repository has been renamed to guovern/iptv (the previous tv-driver corresponds to guovern/iptv:latest, and tv-requests corresponds to guovern/iptv:lite). +- ✨ Change the speed measurement method (yt-dlp), reconstruct the speed measurement logic, improve accuracy, stability, and efficiency, and reduce interface switching delay. (#563) +- ✨ Support for ARM v7 has been added. (#562) +- ✨ A new way to follow the WeChat official account (search for: Govin) has been added. Following the official account will allow you to subscribe to update notifications and receive articles with usage tips. +- 🪄 The size of the Docker image has been optimized. + +--GTV
+IPTV更新工具
IPTV直播源更新工具:自定义频道,自动获取直播源接口,测速验效后生成可用的结果+自定义频道,自动获取直播源接口,测速验效后生成可用的结果默认结果包含:📺央视频道、💰央视付费频道、📡卫视频道、🏠广东频道、🌊港·澳·台频道、🎬电影频道、🎥咪咕直播、🏀体育频道、🪁动画频道、🎮游戏频道、🎵音乐频道、🏛经典剧场@@ -62,23 +62,26 @@
- - + + - - + + - - + + - - + + - - + + + + +
@@ -99,17 +102,17 @@ - 接口源: ```bash -https://ghproxy.net/raw.githubusercontent.com/Guovin/GTV/gd/output/result.m3u +https://ghproxy.net/raw.githubusercontent.com/Guovin/IPTV/gd/output/result.m3u ``` ```bash -https://ghproxy.net/raw.githubusercontent.com/Guovin/GTV/gd/output/result.txt +https://ghproxy.net/raw.githubusercontent.com/Guovin/IPTV/gd/output/result.txt ``` - 数据源: ```bash -https://ghproxy.net/raw.githubusercontent.com/Guovin/GTV/gd/source.json +https://ghproxy.net/raw.githubusercontent.com/Guovin/IPTV/gd/source.json ``` ## ⚙️ 配置 @@ -138,7 +141,7 @@ pipenv run dev ### 方式三:GUI 软件 -1. 下载[GTV 软件](https://github.com/Guovin/GTV/releases),打开软件,点击更新,即可完成更新 +1. 下载[IPTV 更新软件](https://github.com/Guovin/IPTV/releases),打开软件,点击更新,即可完成更新 2. 或者在项目目录下运行以下命令,即可打开 GUI 软件: @@ -146,39 +149,39 @@ pipenv run dev pipenv run ui ``` - + ### 方式四:Docker -- gtv(完整版本):性能要求较高,更新速度较慢,稳定性、成功率高;修改配置 open_driver = False 可切换到 Lite 版本运行方式(推荐酒店源、组播源、关键字搜索使用此版本) -- gtv:lite(精简版本):轻量级,性能要求低,更新速度快,稳定性不确定(推荐订阅源使用此版本) +- iptv(完整版本):性能要求较高,更新速度较慢,稳定性、成功率高;修改配置 open_driver = False 可切换到 Lite 版本运行模式(推荐酒店源、组播源、关键字搜索使用此版本) +- iptv:lite(精简版本):轻量级,性能要求低,更新速度快,稳定性不确定(推荐订阅源使用此版本) 1. 拉取镜像: -- gtv: +- iptv: ```bash -docker pull guovern/gtv:latest +docker pull guovern/iptv:latest ``` -- gtv:lite: +- iptv:lite: ```bash -docker pull guovern/gtv:lite +docker pull guovern/iptv:lite ``` 2. 运行容器: -- gtv: +- iptv: ```bash -docker run -d -p 8000:8000 guovern/gtv +docker run -d -p 8000:8000 guovern/iptv ``` -- gtv:lite: +- iptv:lite: ```bash -docker run -d -p 8000:8000 guovern/gtv:lite +docker run -d -p 8000:8000 guovern/iptv:lite ``` 卷挂载参数(可选): @@ -186,16 +189,16 @@ docker run -d -p 8000:8000 guovern/gtv:lite 以宿主机路径/etc/docker 为例: -- gtv: +- iptv: ```bash -docker run -v /etc/docker/config:/gtv/config -v /etc/docker/output:/gtv/output -d -p 8000:8000 guovern/gtv +docker run -v /etc/docker/config:/iptv/config -v /etc/docker/output:/iptv/output -d -p 8000:8000 guovern/iptv ``` -- gtv:lite: +- iptv:lite: ```bash -docker run -v /etc/docker/config:/gtv-lite/config -v /etc/docker/output:/gtv-lite/output -d -p 8000:8000 guovern/gtv:lite +docker run -v /etc/docker/config:/iptv-lite/config -v /etc/docker/output:/iptv-lite/output -d -p 8000:8000 guovern/iptv:lite ``` 3. 更新结果: diff --git a/README_en.md b/README_en.md index 8cc3b9d..5daa4eb 100644 --- a/README_en.md +++ b/README_en.md @@ -1,9 +1,9 @@--GTV
+IPTV update tool
IPTV live source update tool: customize channels, automatically obtain live source interface, and generate usable results after speed test+Customize channels, automatically obtain live source interface, and generate usable results after speed testDefault results include: 📺CCTV Channel, 💰CCTV Pay Channel, 📡Satellite TV Channel, 🏠Guangdong Channel, 🌊Hong Kong · Macao · Taiwan Channel, 🎬Movie Channel, 🎥Migu Live Streaming, 🏀Sports Channel, 🪁Animation channel, 🎮Game channel, 🎵Music channel, 🏛Classic Theater.@@ -62,23 +62,26 @@
- - + + - - + + - - + + - - + + - - + + + + +
@@ -138,7 +141,7 @@ pipenv run dev ### Method 3: GUI Software -1. Download [GTV software](https://github.com/Guovin/GTV/releases), open the software, click update to complete the update +1. Download [IPTV update software](https://github.com/Guovin/IPTV/releases), open the software, click update to complete the update 2. Or run the following command in the project directory to open the GUI software: @@ -146,41 +149,41 @@ pipenv run dev pipenv run ui ``` - + ### Method 4: Docker -- gtv (Full version): Higher performance requirements, slower update speed, high stability and success rate. Set open_driver = False to switch to the gtv-lite version (recommended for hotel sources, multicast sources, and online searches) -- gtv:lite (Condensed version): Lightweight, low performance requirements, fast update speed, stability uncertain (recommend using this version for the subscription source) +- iptv (Full version): Higher performance requirements, slower update speed, high stability and success rate. Set open_driver = False to switch to the iptv-lite running mode (recommended for hotel sources, multicast sources, and online searches) +- iptv:lite (Condensed version): Lightweight, low performance requirements, fast update speed, stability uncertain (recommend using this version for the subscription source) It's recommended to try each one and choose the version that suits you 1. Pull the image: -- gtv +- iptv ```bash -docker pull guovern/gtv:latest +docker pull guovern/iptv:latest ``` -- gtv:lite +- iptv:lite ```bash -docker pull guovern/gtv:lite +docker pull guovern/iptv:lite ``` 2. Run the container: -- gtv +- iptv ```bash -docker run -d -p 8000:8000 guovern/gtv +docker run -d -p 8000:8000 guovern/iptv ``` -- gtv:lite +- iptv:lite ```bash -docker run -d -p 8000:8000 guovern/gtv:lite +docker run -d -p 8000:8000 guovern/iptv:lite ``` Volume Mount Parameter (Optional): @@ -188,16 +191,16 @@ This allows synchronization of files between the host machine and the container. Taking the host path /etc/docker as an example: -- gtv: +- iptv: ```bash -docker run -v /etc/docker/config:/gtv/config -v /etc/docker/output:/gtv/output -d -p 8000:8000 guovern/gtv +docker run -v /etc/docker/config:/iptv/config -v /etc/docker/output:/iptv/output -d -p 8000:8000 guovern/iptv ``` -- gtv:lite: +- iptv:lite: ```bash -docker run -v /etc/docker/config:/gtv-lite/config -v /etc/docker/output:/gtv-lite/output -d -p 8000:8000 guovern/gtv:lite +docker run -v /etc/docker/config:/iptv-lite/config -v /etc/docker/output:/iptv-lite/output -d -p 8000:8000 guovern/iptv:lite ``` 3. Update results: diff --git a/docs/tutorial.md b/docs/tutorial.md index 08dd6e4..b6940d7 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -23,7 +23,7 @@ ### 1. Star -打开 https://github.com/Guovin/GTV ,点击 Star 收藏该项目(您的 Star 是我持续更新的动力) +打开 https://github.com/Guovin/IPTV ,点击 Star 收藏该项目(您的 Star 是我持续更新的动力) ![Star](./images/star.png 'Star') ### 2. Watch @@ -188,7 +188,7 @@ pipenv run dev ### 方式三:GUI 软件 -1. 下载[GTV 软件](https://github.com/Guovin/GTV/releases),打开软件,点击更新,即可完成更新 +1. 下载[IPTV 更新软件](https://github.com/Guovin/IPTV/releases),打开软件,点击更新,即可完成更新 2. 或者在项目目录下运行以下命令,即可打开 GUI 软件: @@ -196,39 +196,39 @@ pipenv run dev pipenv run ui ``` -![GTV](./images/ui.png 'GTV') +![IPTV 更新软件](./images/ui.png 'IPTV 更新软件') ### 方式四:Docker -- gtv(完整版本):性能要求较高,更新速度较慢,稳定性、成功率高;修改配置 open_driver = False 可切换到 Lite 版本运行方式(推荐酒店源、组播源、关键字搜索使用此版本) -- gtv:lite(精简版本):轻量级,性能要求低,更新速度快,稳定性不确定(推荐订阅源使用此版本) +- iptv(完整版本):性能要求较高,更新速度较慢,稳定性、成功率高;修改配置 open_driver = False 可切换到 Lite 版本运行模式(推荐酒店源、组播源、关键字搜索使用此版本) +- iptv:lite(精简版本):轻量级,性能要求低,更新速度快,稳定性不确定(推荐订阅源使用此版本) 1. 拉取镜像: -- gtv: +- iptv: ```bash -docker pull guovern/gtv:latest +docker pull guovern/iptv:latest ``` -- gtv:lite: +- iptv:lite: ```bash -docker pull guovern/gtv:lite +docker pull guovern/iptv:lite ``` 2. 运行容器: -- gtv: +- iptv: ```bash -docker run -d -p 8000:8000 guovern/gtv +docker run -d -p 8000:8000 guovern/iptv ``` -- gtv:lite: +- iptv:lite: ```bash -docker run -d -p 8000:8000 guovern/gtv:lite +docker run -d -p 8000:8000 guovern/iptv:lite ``` 卷挂载参数(可选): @@ -236,16 +236,16 @@ docker run -d -p 8000:8000 guovern/gtv:lite 以宿主机路径/etc/docker 为例: -- gtv: +- iptv: ```bash -docker run -v /etc/docker/config:/gtv/config -v /etc/docker/output:/gtv/output -d -p 8000:8000 guovern/gtv +docker run -v /etc/docker/config:/iptv/config -v /etc/docker/output:/iptv/output -d -p 8000:8000 guovern/iptv ``` -- gtv:lite: +- iptv:lite: ```bash -docker run -v /etc/docker/config:/gtv-lite/config -v /etc/docker/output:/gtv-lite/output -d -p 8000:8000 guovern/gtv:lite +docker run -v /etc/docker/config:/iptv-lite/config -v /etc/docker/output:/iptv-lite/output -d -p 8000:8000 guovern/iptv:lite ``` 3. 更新结果: diff --git a/docs/tutorial_en.md b/docs/tutorial_en.md index ca741a8..0ead44a 100644 --- a/docs/tutorial_en.md +++ b/docs/tutorial_en.md @@ -23,7 +23,7 @@ Since this project will continue to iterate and improve, if you want to get the ### 1. Star -Go to https://github.com/Guovin/GTV, click on Star to bookmark this project (Your Star is my motivation to keep updating). +Go to https://github.com/Guovin/IPTV, click on Star to bookmark this project (Your Star is my motivation to keep updating). ![Star](./images/star.png 'Star') ### 2. Watch @@ -185,7 +185,7 @@ pipenv run dev ### Method 3: GUI Software -1. Download [GTV software](https://github.com/Guovin/GTV/releases), open the software, click update to complete the update. +1. Download [IPTV update software](https://github.com/Guovin/IPTV/releases), open the software, click update to complete the update. 2. Alternatively, run the following command in the project directory to open the GUI software: @@ -193,41 +193,41 @@ pipenv run dev pipenv run ui ``` -![Update tool software](./images/ui.png 'Update tool software') +![IPTV update software](./images/ui.png 'IPTV update software') ### Method 4: Docker -- gtv (Full version): Higher performance requirements, slower update speed, high stability and success rate. Set open_driver = False to switch to the gtv-lite version (recommended for hotel sources, multicast sources, and online searches) -- gtv:lite (Condensed version): Lightweight, low performance requirements, fast update speed, stability uncertain (recommend using this version for the subscription source) +- iptv (Full version): Higher performance requirements, slower update speed, high stability and success rate. Set open_driver = False to switch to the iptv-lite running mode (recommended for hotel sources, multicast sources, and online searches) +- iptv:lite (Condensed version): Lightweight, low performance requirements, fast update speed, stability uncertain (recommend using this version for the subscription source) It's recommended to try each one and choose the version that suits you 1. Pull the image: -- gtv +- iptv ```bash -docker pull guovern/gtv:latest +docker pull guovern/iptv:latest ``` -- gtv:lite +- iptv:lite ```bash -docker pull guovern/gtv:lite +docker pull guovern/iptv:lite ``` 2. Run the container: -- gtv +- iptv ```bash -docker run -d -p 8000:8000 guovern/gtv +docker run -d -p 8000:8000 guovern/iptv ``` -- gtv:lite +- iptv:lite ```bash -docker run -d -p 8000:8000 guovern/gtv:lite +docker run -d -p 8000:8000 guovern/iptv:lite ``` Volume Mount Parameter (Optional): @@ -235,16 +235,16 @@ This allows synchronization of files between the host machine and the container. Taking the host path /etc/docker as an example: -- gtv: +- iptv: ```bash -docker run -v /etc/docker/config:/gtv/config -v /etc/docker/output:/gtv/output -d -p 8000:8000 guovern/gtv +docker run -v /etc/docker/config:/iptv/config -v /etc/docker/output:/iptv/output -d -p 8000:8000 guovern/iptv ``` -- gtv:lite: +- iptv:lite: ```bash -docker run -v /etc/docker/config:/gtv-lite/config -v /etc/docker/output:/gtv-lite/output -d -p 8000:8000 guovern/gtv:lite +docker run -v /etc/docker/config:/iptv-lite/config -v /etc/docker/output:/iptv-lite/output -d -p 8000:8000 guovern/iptv:lite ``` 3. Update results: diff --git a/driver/utils.py b/driver/utils.py index f7a3c53..54a0570 100644 --- a/driver/utils.py +++ b/driver/utils.py @@ -1,4 +1,3 @@ -from driver.setup import setup_driver from utils.retry import ( retry_func, locate_element_with_retry, @@ -7,13 +6,14 @@ from utils.retry import ( from time import sleep import re from bs4 import BeautifulSoup -from selenium.webdriver.common.by import By def get_soup_driver(url): """ Get the soup by driver """ + from driver.setup import setup_driver + driver = setup_driver() retry_func(lambda: driver.get(url), name=url) sleep(1) @@ -33,6 +33,8 @@ def search_submit(driver, name): """ Input key word and submit with driver """ + from selenium.webdriver.common.by import By + search_box = locate_element_with_retry(driver, (By.XPATH, '//input[@type="text"]')) if not search_box: return diff --git a/tkinter_ui/about.py b/tkinter_ui/about.py index 092aa17..5f6f441 100644 --- a/tkinter_ui/about.py +++ b/tkinter_ui/about.py @@ -44,14 +44,14 @@ class AboutUI: project_label.pack() project_link = tk.Label( project_row_column2, - text="https://github.com/Guovin/GTV", + text="https://github.com/Guovin/IPTV", fg="blue", cursor="hand2", ) project_link.pack() project_link.bind( "", - lambda e: webbrowser.open_new_tab("https://github.com/Guovin/GTV"), + lambda e: webbrowser.open_new_tab("https://github.com/Guovin/IPTV"), ) disclaimer_label = tk.Label( diff --git a/tkinter_ui/tkinter_ui.spec b/tkinter_ui/tkinter_ui.spec index 0a83b2c..068936c 100644 --- a/tkinter_ui/tkinter_ui.spec +++ b/tkinter_ui/tkinter_ui.spec @@ -45,7 +45,7 @@ exe = EXE( a.binaries, a.datas, [], - name='GTV', + name='IPTV', debug=True, bootloader_ignore_signals=False, strip=False, diff --git a/updates/fofa/request.py b/updates/fofa/request.py index b823c37..a76ac7d 100644 --- a/updates/fofa/request.py +++ b/updates/fofa/request.py @@ -3,7 +3,6 @@ from time import time from requests import get from concurrent.futures import ThreadPoolExecutor, as_completed import updates.fofa.fofa_map as fofa_map -from driver.setup import setup_driver import re from utils.config import config import utils.constants as constants @@ -87,6 +86,8 @@ async def get_channels_by_fofa(urls=None, multicast=False, callback=None): proxy = None open_proxy = config.open_proxy open_driver = config.open_driver + if open_driver: + from driver.setup import setup_driver open_sort = config.open_sort if open_proxy: test_url = fofa_urls[0][0] diff --git a/updates/hotel/request.py b/updates/hotel/request.py index 08c3fd2..a2eb570 100644 --- a/updates/hotel/request.py +++ b/updates/hotel/request.py @@ -13,7 +13,6 @@ from utils.retry import ( retry_func, find_clickable_element_with_retry, ) -from selenium.webdriver.common.by import By from tqdm.asyncio import tqdm_asyncio from concurrent.futures import ThreadPoolExecutor, as_completed from requests_custom.utils import get_soup_requests, close_session @@ -33,6 +32,8 @@ async def get_channels_by_hotel(callback=None): proxy = None open_proxy = config.open_proxy open_driver = config.open_driver + if open_driver: + from selenium.webdriver.common.by import By page_num = config.hotel_page_num region_list = config.hotel_region_list if "all" in region_list or "ALL" in region_list or "全部" in region_list: diff --git a/updates/multicast/request.py b/updates/multicast/request.py index 5b12fee..769008d 100644 --- a/updates/multicast/request.py +++ b/updates/multicast/request.py @@ -18,7 +18,6 @@ from utils.retry import ( retry_func, find_clickable_element_with_retry, ) -from selenium.webdriver.common.by import By from tqdm.asyncio import tqdm_asyncio from concurrent.futures import ThreadPoolExecutor, as_completed from requests_custom.utils import get_soup_requests, close_session @@ -37,6 +36,8 @@ async def get_channels_by_multicast(names, callback=None): proxy = None open_proxy = config.open_proxy open_driver = config.open_driver + if open_driver: + from selenium.webdriver.common.by import By page_num = config.multicast_page_num if open_proxy: proxy = await get_proxy(pageUrl, best=True, with_test=True) diff --git a/updates/online_search/request.py b/updates/online_search/request.py index ced655d..27c9151 100644 --- a/updates/online_search/request.py +++ b/updates/online_search/request.py @@ -20,7 +20,6 @@ from utils.retry import ( retry_func, find_clickable_element_with_retry, ) -from selenium.webdriver.common.by import By from tqdm.asyncio import tqdm_asyncio from concurrent.futures import ThreadPoolExecutor from requests_custom.utils import get_soup_requests, close_session @@ -37,6 +36,8 @@ async def get_channels_by_online_search(names, callback=None): proxy = None open_proxy = config.open_proxy open_driver = config.open_driver + if open_driver: + from selenium.webdriver.common.by import By page_num = config.online_search_page_num if open_proxy: proxy = await get_proxy(pageUrl, best=True, with_test=True) diff --git a/utils/retry.py b/utils/retry.py index 4d93c24..39c0745 100644 --- a/utils/retry.py +++ b/utils/retry.py @@ -1,9 +1,11 @@ from time import sleep -from selenium.webdriver.support.ui import WebDriverWait -from selenium.webdriver.support import expected_conditions as EC -from selenium.common.exceptions import TimeoutException from utils.config import config +if config.open_driver: + from selenium.webdriver.support.ui import WebDriverWait + from selenium.webdriver.support import expected_conditions as EC + from selenium.common.exceptions import TimeoutException + max_retries = 2 diff --git a/version.json b/version.json index 705d426..d324451 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "1.5.2", - "name": "GTV" + "version": "1.5.4", + "name": "IPTV" } \ No newline at end of file From bfc78e2622083c4257f920d5519192fdc7fd6024 Mon Sep 17 00:00:00 2001 From: "guorong.zheng" <360996299@qq.com> Date: Mon, 25 Nov 2024 18:32:41 +0800 Subject: [PATCH 14/37] fix:tcl --- tkinter_ui/tkinter_ui.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tkinter_ui/tkinter_ui.py b/tkinter_ui/tkinter_ui.py index f4c80ae..59e034b 100644 --- a/tkinter_ui/tkinter_ui.py +++ b/tkinter_ui/tkinter_ui.py @@ -19,7 +19,19 @@ from hotel import HotelUI from subscribe import SubscribeUI from online_search import OnlineSearchUI import json +from pathlib import Path +from sys import base_prefix +from os import environ +import platform +if not ("TCL_LIBRARY" in environ and "TK_LIBRARY" in environ): + try: + tk.Tk() + except tk.TclError: + tk_dir = "tcl" if platform.system() == "Windows" else "lib" + tk_path = Path(base_prefix) / tk_dir + environ["TCL_LIBRARY"] = str(next(tk_path.glob("tcl8.*"))) + environ["TK_LIBRARY"] = str(next(tk_path.glob("tk8.*"))) class TkinterUI: def __init__(self, root): From 487cb1f6f0d9db965ee4c4643be4e8648b640f4b Mon Sep 17 00:00:00 2001 From: "guorong.zheng" <360996299@qq.com> Date: Tue, 26 Nov 2024 13:39:59 +0800 Subject: [PATCH 15/37] chore:docker --- .gitattributes | 1 + .github/workflows/main.yml | 8 ++++---- Dockerfile | 19 ++++++++++++------- Pipfile | 6 +++--- README.md | 2 +- README_en.md | 4 ++-- docs/tutorial.md | 2 +- docs/tutorial_en.md | 4 ++-- driver/setup.py | 8 +++++++- driver/utils.py | 9 +++++++-- entrypoint.sh | 17 +++++++++++++++++ updates/hotel/request.py | 8 ++++++-- updates/multicast/request.py | 8 ++++++-- updates/online_search/request.py | 8 ++++++-- utils/config.py | 4 +++- utils/retry.py | 9 ++++++--- 16 files changed, 84 insertions(+), 33 deletions(-) create mode 100644 entrypoint.sh diff --git a/.gitattributes b/.gitattributes index 1a966c6..e89baee 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,2 @@ +*.sh linguist-language=Python Dockerfile linguist-language=Python \ No newline at end of file diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index b590cd2..297b717 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -50,22 +50,22 @@ jobs: # open_ffmpeg = False # print(open_ffmpeg)')" >> $GITHUB_ENV - name: Set up Chrome - if: env.OPEN_DRIVER == 'True' || env.OPEN_DRIVER == 'true' + if: env.OPEN_DRIVER == 'True' uses: browser-actions/setup-chrome@latest with: chrome-version: stable - name: Download chrome driver - if: env.OPEN_DRIVER == 'True' || env.OPEN_DRIVER == 'true' + if: env.OPEN_DRIVER == 'True' uses: nanasess/setup-chromedriver@master # - name: Install FFmpeg - # if: env.OPEN_FFMPEG == 'True' || env.OPEN_FFMPEG == 'true' + # if: env.OPEN_FFMPEG == 'True' # run: sudo apt-get update && sudo apt-get install -y ffmpeg - name: Install pipenv run: pip3 install --user pipenv - name: Install dependecies run: pipenv --python 3.13 && pipenv install - name: Install selenium - if: env.OPEN_DRIVER == 'True' || env.OPEN_DRIVER == 'true' + if: env.OPEN_DRIVER == 'True' run: pipenv install selenium - name: Update run: pipenv run dev diff --git a/Dockerfile b/Dockerfile index e16c249..39cc522 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ FROM python:3.13 AS builder -ARG LITE=false +ARG LITE=False WORKDIR /app @@ -9,16 +9,16 @@ COPY Pipfile* ./ RUN pip install -i https://mirrors.aliyun.com/pypi/simple pipenv RUN PIPENV_VENV_IN_PROJECT=1 pipenv install --deploy\ - && if [ "$LITE" = false ]; then pipenv install selenium; fi + && if [ "$LITE" = False ]; then pipenv install selenium; fi FROM python:3.13-slim ARG APP_WORKDIR=/iptv -ARG LITE=false +ARG LITE=False ENV APP_WORKDIR=$APP_WORKDIR -ENV PIPENV_VENV_IN_PROJECT=1 +ENV LITE=$LITE ENV PATH="/.venv/bin:$PATH" WORKDIR $APP_WORKDIR @@ -40,7 +40,7 @@ RUN echo "deb https://mirrors.aliyun.com/debian/ bookworm main contrib non-free RUN apt-get update && apt-get install -y --no-install-recommends cron -RUN if [ "$LITE" = false ]; then apt-get install -y --no-install-recommends chromium chromium-driver; fi \ +RUN if [ "$LITE" = False ]; then apt-get install -y --no-install-recommends chromium chromium-driver; fi \ && apt-get clean && rm -rf /var/lib/apt/lists/* RUN (crontab -l ; \ @@ -49,5 +49,10 @@ RUN (crontab -l ; \ EXPOSE 8000 -CMD . /.venv/bin/activate && service cron start && python $APP_WORKDIR/main.py \ - && gunicorn -w 4 -b 0.0.0.0:8000 main:app \ No newline at end of file +COPY entrypoint.sh /iptv_entrypoint.sh + +COPY config /iptv_config + +RUN chmod +x /iptv_entrypoint.sh + +ENTRYPOINT /iptv_entrypoint.sh \ No newline at end of file diff --git a/Pipfile b/Pipfile index 1b262ef..a078090 100644 --- a/Pipfile +++ b/Pipfile @@ -6,11 +6,11 @@ verify_ssl = true [scripts] dev = "python main.py" ui = "python tkinter_ui/tkinter_ui.py" -docker_run = "docker run -v config:/iptv/config -v output:/iptv/output -d -p 8000:8000 guovern/iptv" -docker_run_lite = "docker run -v config:/iptv-lite/config -v output:/iptv-lite/output -d -p 8000:8000 guovern/iptv:lite" +docker_run = "docker run -v ./config:/iptv/config -v ./output:/iptv/output -d -p 8000:8000 guovern/iptv" +docker_run_lite = "docker run -v ./config:/iptv_lite/config -v ./output:/iptv_lite/output -d -p 8000:8000 guovern/iptv:lite" tkinter_build = "pyinstaller tkinter_ui/tkinter_ui.spec" docker_build = "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 --build-arg APP_WORKDIR=/iptv -t guovern/iptv ." -docker_build_lite = "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 --build-arg APP_WORKDIR=/iptv-lite --build-arg LITE=true -t guovern/iptv:lite ." +docker_build_lite = "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 --build-arg APP_WORKDIR=/iptv_lite --build-arg LITE=True -t guovern/iptv:lite ." [dev-packages] requests = "*" diff --git a/README.md b/README.md index 6c5a7de..cbb9484 100644 --- a/README.md +++ b/README.md @@ -198,7 +198,7 @@ docker run -v /etc/docker/config:/iptv/config -v /etc/docker/output:/iptv/output - iptv:lite: ```bash -docker run -v /etc/docker/config:/iptv-lite/config -v /etc/docker/output:/iptv-lite/output -d -p 8000:8000 guovern/iptv:lite +docker run -v /etc/docker/config:/iptv_lite/config -v /etc/docker/output:/iptv_lite/output -d -p 8000:8000 guovern/iptv:lite ``` 3. 更新结果: diff --git a/README_en.md b/README_en.md index 5daa4eb..9f7a3e2 100644 --- a/README_en.md +++ b/README_en.md @@ -153,7 +153,7 @@ pipenv run ui ### Method 4: Docker -- iptv (Full version): Higher performance requirements, slower update speed, high stability and success rate. Set open_driver = False to switch to the iptv-lite running mode (recommended for hotel sources, multicast sources, and online searches) +- iptv (Full version): Higher performance requirements, slower update speed, high stability and success rate. Set open_driver = False to switch to the lite running mode (recommended for hotel sources, multicast sources, and online searches) - iptv:lite (Condensed version): Lightweight, low performance requirements, fast update speed, stability uncertain (recommend using this version for the subscription source) It's recommended to try each one and choose the version that suits you @@ -200,7 +200,7 @@ docker run -v /etc/docker/config:/iptv/config -v /etc/docker/output:/iptv/output - iptv:lite: ```bash -docker run -v /etc/docker/config:/iptv-lite/config -v /etc/docker/output:/iptv-lite/output -d -p 8000:8000 guovern/iptv:lite +docker run -v /etc/docker/config:/iptv_lite/config -v /etc/docker/output:/iptv_lite/output -d -p 8000:8000 guovern/iptv:lite ``` 3. Update results: diff --git a/docs/tutorial.md b/docs/tutorial.md index b6940d7..87def7e 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -245,7 +245,7 @@ docker run -v /etc/docker/config:/iptv/config -v /etc/docker/output:/iptv/output - iptv:lite: ```bash -docker run -v /etc/docker/config:/iptv-lite/config -v /etc/docker/output:/iptv-lite/output -d -p 8000:8000 guovern/iptv:lite +docker run -v /etc/docker/config:/iptv_lite/config -v /etc/docker/output:/iptv_lite/output -d -p 8000:8000 guovern/iptv:lite ``` 3. 更新结果: diff --git a/docs/tutorial_en.md b/docs/tutorial_en.md index 0ead44a..7fe20fa 100644 --- a/docs/tutorial_en.md +++ b/docs/tutorial_en.md @@ -197,7 +197,7 @@ pipenv run ui ### Method 4: Docker -- iptv (Full version): Higher performance requirements, slower update speed, high stability and success rate. Set open_driver = False to switch to the iptv-lite running mode (recommended for hotel sources, multicast sources, and online searches) +- iptv (Full version): Higher performance requirements, slower update speed, high stability and success rate. Set open_driver = False to switch to the lite running mode (recommended for hotel sources, multicast sources, and online searches) - iptv:lite (Condensed version): Lightweight, low performance requirements, fast update speed, stability uncertain (recommend using this version for the subscription source) It's recommended to try each one and choose the version that suits you @@ -244,7 +244,7 @@ docker run -v /etc/docker/config:/iptv/config -v /etc/docker/output:/iptv/output - iptv:lite: ```bash -docker run -v /etc/docker/config:/iptv-lite/config -v /etc/docker/output:/iptv-lite/output -d -p 8000:8000 guovern/iptv:lite +docker run -v /etc/docker/config:/iptv_lite/config -v /etc/docker/output:/iptv_lite/output -d -p 8000:8000 guovern/iptv:lite ``` 3. Update results: diff --git a/driver/setup.py b/driver/setup.py index d1070d5..a80e95f 100644 --- a/driver/setup.py +++ b/driver/setup.py @@ -1,4 +1,10 @@ -from selenium import webdriver +from utils.config import config + +if config.open_driver: + try: + from selenium import webdriver + except: + pass def setup_driver(proxy=None): diff --git a/driver/utils.py b/driver/utils.py index 54a0570..bab9d61 100644 --- a/driver/utils.py +++ b/driver/utils.py @@ -6,6 +6,13 @@ from utils.retry import ( from time import sleep import re from bs4 import BeautifulSoup +from utils.config import config + +if config.open_driver: + try: + from selenium.webdriver.common.by import By + except: + pass def get_soup_driver(url): @@ -33,8 +40,6 @@ def search_submit(driver, name): """ Input key word and submit with driver """ - from selenium.webdriver.common.by import By - search_box = locate_element_with_retry(driver, (By.XPATH, '//input[@type="text"]')) if not search_box: return diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100644 index 0000000..d3c19f0 --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +for file in /iptv_config/*; do + filename=$(basename "$file") + target_file="$APP_WORKDIR/config/$filename" + if [ ! -e "$target_file" ]; then + cp -r "$file" "$target_file" + fi +done + +. /.venv/bin/activate + +service cron start + +python $APP_WORKDIR/main.py + +gunicorn -w 4 -b 0.0.0.0:8000 main:app \ No newline at end of file diff --git a/updates/hotel/request.py b/updates/hotel/request.py index a2eb570..1f8e21a 100644 --- a/updates/hotel/request.py +++ b/updates/hotel/request.py @@ -22,6 +22,12 @@ from updates.subscribe import get_channels_by_subscribe_urls from collections import defaultdict import updates.fofa.fofa_map as fofa_map +if config.open_driver: + try: + from selenium.webdriver.common.by import By + except: + pass + async def get_channels_by_hotel(callback=None): """ @@ -32,8 +38,6 @@ async def get_channels_by_hotel(callback=None): proxy = None open_proxy = config.open_proxy open_driver = config.open_driver - if open_driver: - from selenium.webdriver.common.by import By page_num = config.hotel_page_num region_list = config.hotel_region_list if "all" in region_list or "ALL" in region_list or "全部" in region_list: diff --git a/updates/multicast/request.py b/updates/multicast/request.py index 769008d..1706e2d 100644 --- a/updates/multicast/request.py +++ b/updates/multicast/request.py @@ -26,6 +26,12 @@ from urllib.parse import parse_qs from collections import defaultdict from .update_tmp import get_multicast_region_result_by_rtp_txt +if config.open_driver: + try: + from selenium.webdriver.common.by import By + except: + pass + async def get_channels_by_multicast(names, callback=None): """ @@ -36,8 +42,6 @@ async def get_channels_by_multicast(names, callback=None): proxy = None open_proxy = config.open_proxy open_driver = config.open_driver - if open_driver: - from selenium.webdriver.common.by import By page_num = config.multicast_page_num if open_proxy: proxy = await get_proxy(pageUrl, best=True, with_test=True) diff --git a/updates/online_search/request.py b/updates/online_search/request.py index 27c9151..0992c9e 100644 --- a/updates/online_search/request.py +++ b/updates/online_search/request.py @@ -24,6 +24,12 @@ from tqdm.asyncio import tqdm_asyncio from concurrent.futures import ThreadPoolExecutor from requests_custom.utils import get_soup_requests, close_session +if config.open_driver: + try: + from selenium.webdriver.common.by import By + except: + pass + async def get_channels_by_online_search(names, callback=None): """ @@ -36,8 +42,6 @@ async def get_channels_by_online_search(names, callback=None): proxy = None open_proxy = config.open_proxy open_driver = config.open_driver - if open_driver: - from selenium.webdriver.common.by import By page_num = config.online_search_page_num if open_proxy: proxy = await get_proxy(pageUrl, best=True, with_test=True) diff --git a/utils/config.py b/utils/config.py index ea434b7..a4ccf78 100644 --- a/utils/config.py +++ b/utils/config.py @@ -270,7 +270,9 @@ class ConfigManager: @property def open_driver(self): - return self.config.getboolean("Settings", "open_driver", fallback=True) + return not os.environ.get("LITE") and self.config.getboolean( + "Settings", "open_driver", fallback=True + ) @property def hotel_page_num(self): diff --git a/utils/retry.py b/utils/retry.py index 39c0745..2702098 100644 --- a/utils/retry.py +++ b/utils/retry.py @@ -2,9 +2,12 @@ from time import sleep from utils.config import config if config.open_driver: - from selenium.webdriver.support.ui import WebDriverWait - from selenium.webdriver.support import expected_conditions as EC - from selenium.common.exceptions import TimeoutException + try: + from selenium.webdriver.support.ui import WebDriverWait + from selenium.webdriver.support import expected_conditions as EC + from selenium.common.exceptions import TimeoutException + except: + pass max_retries = 2 From 6f051aa302c09d34c96d07b56786d0a5a0ada45c Mon Sep 17 00:00:00 2001 From: "guorong.zheng" <360996299@qq.com> Date: Tue, 26 Nov 2024 14:27:08 +0800 Subject: [PATCH 16/37] chore:get speed --- utils/speed.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/utils/speed.py b/utils/speed.py index bb5a42d..f203a0f 100644 --- a/utils/speed.py +++ b/utils/speed.py @@ -19,14 +19,25 @@ def get_speed_yt_dlp(url, timeout=config.sort_timeout): "skip_download": True, "quiet": True, "no_warnings": True, + "format": "best", "logger": logging.getLogger(), } with yt_dlp.YoutubeDL(ydl_opts) as ydl: start_time = time() info = ydl.extract_info(url, download=False) - return int(round((time() - start_time) * 1000)) if info else float("inf") + fps = info.get("fps", None) or ( + int(round((time() - start_time) * 1000)) + if "id" in info + else float("inf") + ) + resolution = ( + f"{info['width']}x{info['height']}" + if "width" in info and "height" in info + else None + ) + return (fps, resolution) except: - return float("inf") + return (float("inf"), None) async def get_speed_requests(url, timeout=config.sort_timeout, proxy=None): @@ -154,7 +165,7 @@ def get_speed(url, ipv6_proxy=None, callback=None): else: speed = get_speed_yt_dlp(url) if cache_key and cache_key not in speed_cache: - speed_cache[cache_key] = (speed, None) + speed_cache[cache_key] = speed return speed except: return float("inf") From 5ead1986fc76290d6b6013cbd801f7edb4a933d9 Mon Sep 17 00:00:00 2001 From: "guorong.zheng" <360996299@qq.com> Date: Tue, 26 Nov 2024 17:29:36 +0800 Subject: [PATCH 17/37] feat:two result(#581) --- README.md | 4 +++- README_en.md | 4 +++- main.py | 20 ++++++++++++++++---- utils/tools.py | 23 +++++++++++++++-------- 4 files changed, 37 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index cbb9484..bc9da0c 100644 --- a/README.md +++ b/README.md @@ -204,7 +204,9 @@ docker run -v /etc/docker/config:/iptv_lite/config -v /etc/docker/output:/iptv_l 3. 更新结果: - 接口地址:ip:8000 -- 接口详情:ip:8000/result +- M3u 接口:ip:8000/m3u +- Txt 接口:ip:8000/txt +- 接口内容:ip:8000/content - 测速日志:ip:8000/log ## 🗓️ 更新日志 diff --git a/README_en.md b/README_en.md index 9f7a3e2..a749308 100644 --- a/README_en.md +++ b/README_en.md @@ -206,7 +206,9 @@ docker run -v /etc/docker/config:/iptv_lite/config -v /etc/docker/output:/iptv_l 3. Update results: - API address: ip:8000 -- API details: ip:8000/result +- M3u api:ip:8000/m3u +- Txt api:ip:8000/txt +- API content: ip:8000/content - Speed test log: ip:8000/log ## 🗓️ Changelog diff --git a/main.py b/main.py index f510b1d..39ee123 100644 --- a/main.py +++ b/main.py @@ -46,9 +46,19 @@ def show_index(): return get_result_file_content() -@app.route("/result") +@app.route("/txt") def show_result(): - return get_result_file_content(show_result=True) + return get_result_file_content(file_type="txt") + + +@app.route("/m3u") +def show_result(): + return get_result_file_content(file_type="m3u") + + +@app.route("/content") +def show_result(): + return get_result_file_content(show_content=True) @app.route("/log") @@ -257,8 +267,10 @@ def run_service(): try: if not os.environ.get("GITHUB_ACTIONS"): ip_address = get_ip_address() - print(f"📄 Result detail: {ip_address}/result") - print(f"📄 Log detail: {ip_address}/log") + print(f"📄 Result content: {ip_address}/content") + print(f"📄 Log content: {ip_address}/log") + print(f"🔗 M3u api: {ip_address}/m3u") + print(f"🔗 Txt api: {ip_address}/txt") print(f"✅ You can use this url to watch IPTV 📺: {ip_address}") app.run(host="0.0.0.0", port=8000) except Exception as e: diff --git a/utils/tools.py b/utils/tools.py index 45f5301..7490211 100644 --- a/utils/tools.py +++ b/utils/tools.py @@ -410,18 +410,25 @@ def convert_to_m3u(): print(f"✅ Result m3u file generated at: {m3u_file_path}") -def get_result_file_content(show_result=False): +def get_result_file_content(show_content=False, file_type=None): """ Get the content of the result file """ user_final_file = resource_path(config.final_file) - if os.path.exists(user_final_file): - if config.open_m3u_result: - user_final_file = os.path.splitext(user_final_file)[0] + ".m3u" - if show_result == False: - return send_file(user_final_file, as_attachment=True) - with open(user_final_file, "r", encoding="utf-8") as file: - content = file.read() + result_file = ( + os.path.splitext(user_final_file)[0] + f".{file_type}" + if file_type + else user_final_file + ) + if os.path.exists(result_file): + if file_type == "txt" or not config.open_m3u_result: + with open(result_file, "r", encoding="utf-8") as file: + content = file.read() + elif config.open_m3u_result: + if not file_type: + result_file = os.path.splitext(user_final_file)[0] + ".m3u" + if show_content == False: + return send_file(result_file, as_attachment=True) else: content = constants.waiting_tip return render_template_string( From e744a3455f26d7ec910438268d318371a7f42695 Mon Sep 17 00:00:00 2001 From: "guorong.zheng" <360996299@qq.com> Date: Wed, 27 Nov 2024 15:36:26 +0800 Subject: [PATCH 18/37] fix:separator(#581) --- utils/tools.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/tools.py b/utils/tools.py index 7490211..fc74424 100644 --- a/utils/tools.py +++ b/utils/tools.py @@ -490,7 +490,7 @@ def add_url_info(url, info): Add url info to the URL """ if info: - separator = "|" if "$" in url else "$" + separator = "-" if "$" in url else "$" url += f"{separator}{info}" return url From 899503136be77d152aa2aae707ba155bbafd8e6b Mon Sep 17 00:00:00 2001 From: "guorong.zheng" <360996299@qq.com> Date: Wed, 27 Nov 2024 15:39:44 +0800 Subject: [PATCH 19/37] fix:separator(#581) --- updates/fofa/request.py | 2 +- utils/channel.py | 2 +- utils/tools.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/updates/fofa/request.py b/updates/fofa/request.py index a76ac7d..26b3195 100644 --- a/updates/fofa/request.py +++ b/updates/fofa/request.py @@ -215,7 +215,7 @@ def process_fofa_json_url(url, region, open_sort, hotel_name="酒店源"): total_url = ( add_url_info( f"{url}{item_url}", - f"{region}{hotel_name}|cache:{url}", + f"{region}{hotel_name}-cache:{url}", ) if open_sort else add_url_info( diff --git a/utils/channel.py b/utils/channel.py index c3660a2..3d5575d 100644 --- a/utils/channel.py +++ b/utils/channel.py @@ -225,7 +225,7 @@ def get_channel_multicast_result(result, search_result): ( add_url_info( f"http://{url}/rtp/{ip}", - f"{result_region}{result_type}{multicast_name}|cache:{url}", + f"{result_region}{result_type}{multicast_name}-cache:{url}", ) if config.open_sort else add_url_info( diff --git a/utils/tools.py b/utils/tools.py index fc74424..915e282 100644 --- a/utils/tools.py +++ b/utils/tools.py @@ -507,7 +507,7 @@ def remove_cache_info(str): """ Remove the cache info from the string """ - return re.sub(r"cache:.*|\|cache:.*", "", str) + return re.sub(r"cache:.*|\-cache:.*", "", str) def resource_path(relative_path, persistent=False): From 654b6fc5f12e0329ba98b1399722f17b9c1b6a02 Mon Sep 17 00:00:00 2001 From: "guorong.zheng" <360996299@qq.com> Date: Wed, 27 Nov 2024 16:57:12 +0800 Subject: [PATCH 20/37] chore:service --- Dockerfile | 4 +-- Pipfile | 1 + README.md | 8 +++++ README_en.md | 8 +++++ docs/tutorial.md | 8 +++++ docs/tutorial_en.md | 8 +++++ entrypoint.sh | 4 +-- main.py | 71 +++------------------------------------- service/app.py | 64 ++++++++++++++++++++++++++++++++++++ tkinter_ui/tkinter_ui.py | 8 ++--- utils/constants.py | 2 +- 11 files changed, 108 insertions(+), 78 deletions(-) create mode 100644 service/app.py diff --git a/Dockerfile b/Dockerfile index 39cc522..2a8562a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -44,8 +44,8 @@ RUN if [ "$LITE" = False ]; then apt-get install -y --no-install-recommends chro && apt-get clean && rm -rf /var/lib/apt/lists/* RUN (crontab -l ; \ - echo "0 22 * * * python $APP_WORKDIR/main.py scheduled_task"; \ - echo "0 10 * * * python $APP_WORKDIR/main.py scheduled_task") | crontab - + echo "0 22 * * * python $APP_WORKDIR/main.py &"; \ + echo "0 10 * * * python $APP_WORKDIR/main.py &") | crontab - EXPOSE 8000 diff --git a/Pipfile b/Pipfile index a078090..7e2af22 100644 --- a/Pipfile +++ b/Pipfile @@ -5,6 +5,7 @@ verify_ssl = true [scripts] dev = "python main.py" +service = "python service/app.py" ui = "python tkinter_ui/tkinter_ui.py" docker_run = "docker run -v ./config:/iptv/config -v ./output:/iptv/output -d -p 8000:8000 guovern/iptv" docker_run_lite = "docker run -v ./config:/iptv_lite/config -v ./output:/iptv_lite/output -d -p 8000:8000 guovern/iptv:lite" diff --git a/README.md b/README.md index bc9da0c..18cf1d2 100644 --- a/README.md +++ b/README.md @@ -135,10 +135,18 @@ pip install pipenv pipenv install --dev ``` +启动更新: + ```python pipenv run dev ``` +启动服务: + +```python +pipenv run service +``` + ### 方式三:GUI 软件 1. 下载[IPTV 更新软件](https://github.com/Guovin/IPTV/releases),打开软件,点击更新,即可完成更新 diff --git a/README_en.md b/README_en.md index a749308..2da64d3 100644 --- a/README_en.md +++ b/README_en.md @@ -135,10 +135,18 @@ pip install pipenv pipenv install --dev ``` +Start update: + ```python pipenv run dev ``` +Start service: + +```python +pipenv run service +``` + ### Method 3: GUI Software 1. Download [IPTV update software](https://github.com/Guovin/IPTV/releases), open the software, click update to complete the update diff --git a/docs/tutorial.md b/docs/tutorial.md index 87def7e..6c88d87 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -182,10 +182,18 @@ pip install pipenv pipenv install --dev ``` +启动更新: + ```python pipenv run dev ``` +启动服务: + +```python +pipenv run service +``` + ### 方式三:GUI 软件 1. 下载[IPTV 更新软件](https://github.com/Guovin/IPTV/releases),打开软件,点击更新,即可完成更新 diff --git a/docs/tutorial_en.md b/docs/tutorial_en.md index 7fe20fa..8137d48 100644 --- a/docs/tutorial_en.md +++ b/docs/tutorial_en.md @@ -179,10 +179,18 @@ pip install pipenv pipenv install --dev ``` +Start update: + ```python pipenv run dev ``` +Start service: + +```python +pipenv run service +``` + ### Method 3: GUI Software 1. Download [IPTV update software](https://github.com/Guovin/IPTV/releases), open the software, click update to complete the update. diff --git a/entrypoint.sh b/entrypoint.sh index d3c19f0..afae368 100644 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -12,6 +12,6 @@ done service cron start -python $APP_WORKDIR/main.py +python $APP_WORKDIR/main.py & -gunicorn -w 4 -b 0.0.0.0:8000 main:app \ No newline at end of file +python -m gunicorn service.app:app -b 0.0.0.0:8000 --timeout=1000 \ No newline at end of file diff --git a/main.py b/main.py index 39ee123..8d3ccc5 100644 --- a/main.py +++ b/main.py @@ -1,6 +1,6 @@ import asyncio from utils.config import config -import utils.constants as constants +from service.app import run_service from utils.channel import ( get_channel_items, append_total_data, @@ -14,7 +14,6 @@ from utils.tools import ( get_pbar_remaining, get_ip_address, convert_to_m3u, - get_result_file_content, process_nested_dict, format_interval, check_ipv6_support, @@ -30,53 +29,14 @@ from updates.online_search import get_channels_by_online_search import os from tqdm import tqdm from time import time -from flask import Flask, render_template_string -import sys import atexit import pickle import copy -app = Flask(__name__) atexit.register(cleanup_logging) -@app.route("/") -def show_index(): - return get_result_file_content() - - -@app.route("/txt") -def show_result(): - return get_result_file_content(file_type="txt") - - -@app.route("/m3u") -def show_result(): - return get_result_file_content(file_type="m3u") - - -@app.route("/content") -def show_result(): - return get_result_file_content(show_content=True) - - -@app.route("/log") -def show_log(): - user_log_file = "output/" + ( - "user_result.log" if os.path.exists("config/user_config.ini") else "result.log" - ) - if os.path.exists(user_log_file): - with open(user_log_file, "r", encoding="utf-8") as file: - content = file.read() - else: - content = constants.waiting_tip - return render_template_string( - " {{ content }}", - content=content, - ) - - class UpdateSource: def __init__(self): @@ -237,6 +197,8 @@ class UpdateSource: True, url=f"{get_ip_address()}" if open_service else None, ) + if open_service: + run_service() except asyncio.exceptions.CancelledError: print("Update cancelled!") @@ -256,33 +218,8 @@ class UpdateSource: self.pbar.close() -def scheduled_task(): +if __name__ == "__main__": loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) update_source = UpdateSource() loop.run_until_complete(update_source.start()) - - -def run_service(): - try: - if not os.environ.get("GITHUB_ACTIONS"): - ip_address = get_ip_address() - print(f"📄 Result content: {ip_address}/content") - print(f"📄 Log content: {ip_address}/log") - print(f"🔗 M3u api: {ip_address}/m3u") - print(f"🔗 Txt api: {ip_address}/txt") - print(f"✅ You can use this url to watch IPTV 📺: {ip_address}") - app.run(host="0.0.0.0", port=8000) - except Exception as e: - print(f"❌ Service start failed: {e}") - - -if __name__ == "__main__": - if len(sys.argv) == 1 and config.open_service: - loop = asyncio.new_event_loop() - - async def run_service_async(): - loop.run_in_executor(None, run_service) - - asyncio.run(run_service_async()) - scheduled_task() diff --git a/service/app.py b/service/app.py new file mode 100644 index 0000000..5f00dd6 --- /dev/null +++ b/service/app.py @@ -0,0 +1,64 @@ +import os +import sys + +sys.path.append(os.path.dirname(sys.path[0])) +from flask import Flask, render_template_string +from utils.tools import get_result_file_content, get_ip_address +import utils.constants as constants +from utils.config import config + +app = Flask(__name__) + + +@app.route("/") +def show_index(): + return get_result_file_content() + + +@app.route("/txt") +def show_txt(): + return get_result_file_content(file_type="txt") + + +@app.route("/m3u") +def show_m3u(): + return get_result_file_content(file_type="m3u") + + +@app.route("/content") +def show_content(): + return get_result_file_content(show_content=True) + + +@app.route("/log") +def show_log(): + user_log_file = "output/" + ( + "user_result.log" if os.path.exists("config/user_config.ini") else "result.log" + ) + if os.path.exists(user_log_file): + with open(user_log_file, "r", encoding="utf-8") as file: + content = file.read() + else: + content = constants.waiting_tip + return render_template_string( + "{{ content }}", + content=content, + ) + + +def run_service(): + try: + if not os.environ.get("GITHUB_ACTIONS"): + ip_address = get_ip_address() + print(f"📄 Result content: {ip_address}/content") + print(f"📄 Log content: {ip_address}/log") + print(f"🚀 M3u api: {ip_address}/m3u") + print(f"🚀 Txt api: {ip_address}/txt") + print(f"✅ You can use this url to watch IPTV 📺: {ip_address}") + app.run(host="0.0.0.0", port=8000) + except Exception as e: + print(f"❌ Service start failed: {e}") + + +if __name__ == "__main__": + run_service() diff --git a/tkinter_ui/tkinter_ui.py b/tkinter_ui/tkinter_ui.py index 59e034b..4a0b5a9 100644 --- a/tkinter_ui/tkinter_ui.py +++ b/tkinter_ui/tkinter_ui.py @@ -7,7 +7,7 @@ from tkinter import messagebox from PIL import Image, ImageTk from utils.config import config from utils.tools import resource_path -from main import UpdateSource, run_service +from main import UpdateSource import asyncio import threading import webbrowser @@ -33,6 +33,7 @@ if not ("TCL_LIBRARY" in environ and "TK_LIBRARY" in environ): environ["TCL_LIBRARY"] = str(next(tk_path.glob("tcl8.*"))) environ["TK_LIBRARY"] = str(next(tk_path.glob("tk8.*"))) + class TkinterUI: def __init__(self, root): with open(resource_path("version.json"), "r", encoding="utf-8") as f: @@ -126,15 +127,10 @@ class TkinterUI: def on_run_update(self): loop = asyncio.new_event_loop() - async def run_service_async(): - loop.run_in_executor(None, run_service) - def run_loop(): asyncio.set_event_loop(loop) loop.run_until_complete(self.run_update()) - if config.open_service: - asyncio.run(run_service_async()) self.thread = threading.Thread(target=run_loop, daemon=True) self.thread.start() diff --git a/utils/constants.py b/utils/constants.py index 56e4733..933a799 100644 --- a/utils/constants.py +++ b/utils/constants.py @@ -95,4 +95,4 @@ foodie_url = "http://www.foodieguide.com/iptvsearch/" foodie_hotel_url = "http://www.foodieguide.com/iptvsearch/hoteliptv.php" -waiting_tip = "🔍️正在更新,请耐心等待更新完成..." +waiting_tip = "🔍️未找到结果文件,若已启动更新,请耐心等待更新完成..." From ba155206e1be38712897b705e552b6c95391eaa5 Mon Sep 17 00:00:00 2001 From: "guorong.zheng" <360996299@qq.com> Date: Wed, 27 Nov 2024 18:17:12 +0800 Subject: [PATCH 21/37] refactor:remove_cache_info --- utils/tools.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/tools.py b/utils/tools.py index 915e282..ee6c220 100644 --- a/utils/tools.py +++ b/utils/tools.py @@ -507,7 +507,7 @@ def remove_cache_info(str): """ Remove the cache info from the string """ - return re.sub(r"cache:.*|\-cache:.*", "", str) + return re.sub(r"[^a-zA-Z\u4e00-\u9fa5\$]?cache:.*", "", str) def resource_path(relative_path, persistent=False): From df6e6dac673f6c7ba2c4931e89c50682b7d4bd93 Mon Sep 17 00:00:00 2001 From: "guorong.zheng" <360996299@qq.com> Date: Thu, 28 Nov 2024 14:29:46 +0800 Subject: [PATCH 22/37] refactor:log and get_speed --- .github/workflows/main.yml | 11 ++---- main.py | 22 +++-------- service/app.py | 11 ++---- utils/channel.py | 43 ++++++++++++-------- utils/constants.py | 8 +++- utils/speed.py | 80 ++++++++++++++++++++++++-------------- utils/tools.py | 33 +++++----------- 7 files changed, 104 insertions(+), 104 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 297b717..d4ad49b 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -96,14 +96,11 @@ jobs: if [[ -f "$final_m3u_file" ]]; then git add -f "$final_m3u_file" fi - if [[ -f "output/result_cache.pkl" ]]; then - git add -f "output/result_cache.pkl" - fi - if [[ -f "output/user_result.log" ]]; then - git add -f "output/user_result.log" - elif [[ -f "output/result.log" ]]; then - git add -f "output/result.log" + if [[ -f "output/cache.pkl" ]]; then + git add -f "output/cache.pkl" fi + if [[ -f "output/sort.log" ]]; then + git add -f "output/sort.log" if [[ -f "updates/fofa/fofa_hotel_region_result.pkl" ]]; then git add -f "updates/fofa/fofa_hotel_region_result.pkl" fi diff --git a/main.py b/main.py index 8d3ccc5..17edf95 100644 --- a/main.py +++ b/main.py @@ -1,5 +1,6 @@ import asyncio from utils.config import config +import utils.constants as constants from service.app import run_service from utils.channel import ( get_channel_items, @@ -18,8 +19,6 @@ from utils.tools import ( format_interval, check_ipv6_support, resource_path, - setup_logging, - cleanup_logging, ) from updates.subscribe import get_channels_by_subscribe_urls from updates.multicast import get_channels_by_multicast @@ -34,9 +33,6 @@ import pickle import copy -atexit.register(cleanup_logging) - - class UpdateSource: def __init__(self): @@ -109,7 +105,6 @@ class UpdateSource: async def main(self): try: if config.open_update: - setup_logging() main_start_time = time() self.channel_items = get_channel_items() channel_names = [ @@ -143,7 +138,7 @@ class UpdateSource: ) self.start_time = time() self.pbar = tqdm(total=self.total, desc="Sorting") - self.channel_data = process_sort_channel_list( + self.channel_data = await process_sort_channel_list( self.channel_data, ipv6=ipv6_support, callback=sort_callback, @@ -160,24 +155,17 @@ class UpdateSource: ) self.pbar.close() user_final_file = config.final_file - update_file(user_final_file, "output/result_new.txt") + update_file(user_final_file, constants.result_path) if config.open_use_old_result: if open_sort: get_channel_data_cache_with_compare( channel_data_cache, self.channel_data ) with open( - resource_path("output/result_cache.pkl", persistent=True), "wb" + resource_path(constants.cache_path, persistent=True), + "wb", ) as file: pickle.dump(channel_data_cache, file) - if open_sort: - user_log_file = "output/" + ( - "user_result.log" - if os.path.exists("config/user_config.ini") - else "result.log" - ) - update_file(user_log_file, "output/result_new.log", copy=True) - cleanup_logging() convert_to_m3u() total_time = format_interval(time() - main_start_time) print( diff --git a/service/app.py b/service/app.py index 5f00dd6..13674d1 100644 --- a/service/app.py +++ b/service/app.py @@ -3,9 +3,8 @@ import sys sys.path.append(os.path.dirname(sys.path[0])) from flask import Flask, render_template_string -from utils.tools import get_result_file_content, get_ip_address +from utils.tools import get_result_file_content, get_ip_address, resource_path import utils.constants as constants -from utils.config import config app = Flask(__name__) @@ -32,11 +31,9 @@ def show_content(): @app.route("/log") def show_log(): - user_log_file = "output/" + ( - "user_result.log" if os.path.exists("config/user_config.ini") else "result.log" - ) - if os.path.exists(user_log_file): - with open(user_log_file, "r", encoding="utf-8") as file: + log_path = resource_path(constants.sort_log_path) + if os.path.exists(log_path): + with open(log_path, "r", encoding="utf-8") as file: content = file.read() else: content = constants.waiting_tip diff --git a/utils/channel.py b/utils/channel.py index 3d5575d..56502b1 100644 --- a/utils/channel.py +++ b/utils/channel.py @@ -8,6 +8,7 @@ from utils.tools import ( remove_cache_info, resource_path, write_content_into_txt, + get_logger, ) from utils.speed import ( get_speed, @@ -22,7 +23,8 @@ import base64 import pickle import copy import datetime -from concurrent.futures import ThreadPoolExecutor +import asyncio +from logging import INFO def get_name_url(content, pattern, multiline=False, check_url=True): @@ -84,7 +86,7 @@ def get_channel_items(): ) if config.open_use_old_result: - result_cache_path = resource_path("output/result_cache.pkl") + result_cache_path = resource_path(constants.cache_path) if os.path.exists(result_cache_path): with open(result_cache_path, "rb") as file: old_result = pickle.load(file) @@ -543,7 +545,7 @@ def append_total_data( ) -def process_sort_channel_list(data, ipv6=False, callback=None): +async def process_sort_channel_list(data, ipv6=False, callback=None): """ Processs the sort channel list """ @@ -551,22 +553,29 @@ def process_sort_channel_list(data, ipv6=False, callback=None): need_sort_data = copy.deepcopy(data) process_nested_dict(need_sort_data, seen=set(), flag=r"cache:(.*)", force_str="!") result = {} - with ThreadPoolExecutor(max_workers=30) as executor: - try: - for channel_obj in need_sort_data.values(): - for info_list in channel_obj.values(): - for info in info_list: - executor.submit( - get_speed, - info[0], - ipv6_proxy=ipv6_proxy, - callback=callback, - ) - except Exception as e: - print(f"Get speed Error: {e}") + semaphore = asyncio.Semaphore(10) + + async def limited_get_speed(info, ipv6_proxy, callback): + async with semaphore: + return await get_speed(info[0], ipv6_proxy=ipv6_proxy, callback=callback) + + tasks = [ + asyncio.create_task( + limited_get_speed( + info, + ipv6_proxy=ipv6_proxy, + callback=callback, + ) + ) + for channel_obj in need_sort_data.values() + for info_list in channel_obj.values() + for info in info_list + ] + await asyncio.gather(*tasks) + logger = get_logger(constants.sort_log_path, level=INFO, init=True) for cate, obj in data.items(): for name, info_list in obj.items(): - info_list = sort_urls_by_speed_and_resolution(name, info_list) + info_list = sort_urls_by_speed_and_resolution(name, info_list, logger) append_data_to_info_data( result, cate, diff --git a/utils/constants.py b/utils/constants.py index 933a799..5de5691 100644 --- a/utils/constants.py +++ b/utils/constants.py @@ -2,9 +2,13 @@ import os output_dir = "output" -log_file = "result_new.log" +result_path = os.path.join(output_dir, "result_new.txt") -log_path = os.path.join(output_dir, log_file) +cache_path = os.path.join(output_dir, "cache.pkl") + +sort_log_path = os.path.join(output_dir, "sort.log") + +log_path = os.path.join(output_dir, "log.log") url_pattern = r"((https?):\/\/)?(\[[0-9a-fA-F:]+\]|([\w-]+\.)+[\w-]+)(:[0-9]{1,5})?(\/[^\s]*)?(\$[^\s]+)?" diff --git a/utils/speed.py b/utils/speed.py index f203a0f..00d2103 100644 --- a/utils/speed.py +++ b/utils/speed.py @@ -3,39 +3,55 @@ from time import time import asyncio import re from utils.config import config -from utils.tools import is_ipv6, remove_cache_info, get_resolution_value +import utils.constants as constants +from utils.tools import is_ipv6, remove_cache_info, get_resolution_value, get_logger import subprocess import yt_dlp -import logging +from concurrent.futures import ProcessPoolExecutor +import functools + +logger = get_logger(constants.log_path) -def get_speed_yt_dlp(url, timeout=config.sort_timeout): +def get_info_yt_dlp(url, timeout=config.sort_timeout): + """ + Get the url info by yt_dlp + """ + ydl_opts = { + "socket_timeout": timeout, + "skip_download": True, + "quiet": True, + "no_warnings": True, + "format": "best", + "logger": logger, + } + with yt_dlp.YoutubeDL(ydl_opts) as ydl: + return ydl.sanitize_info(ydl.extract_info(url, download=False)) + + +async def get_speed_yt_dlp(url, timeout=config.sort_timeout): """ Get the speed of the url by yt_dlp """ try: - ydl_opts = { - "socket_timeout": timeout, - "skip_download": True, - "quiet": True, - "no_warnings": True, - "format": "best", - "logger": logging.getLogger(), - } - with yt_dlp.YoutubeDL(ydl_opts) as ydl: + async with asyncio.timeout(timeout + 2): start_time = time() - info = ydl.extract_info(url, download=False) - fps = info.get("fps", None) or ( - int(round((time() - start_time) * 1000)) - if "id" in info - else float("inf") - ) - resolution = ( - f"{info['width']}x{info['height']}" - if "width" in info and "height" in info - else None - ) - return (fps, resolution) + loop = asyncio.get_running_loop() + with ProcessPoolExecutor() as exc: + info = await loop.run_in_executor( + exc, functools.partial(get_info_yt_dlp, url, timeout) + ) + fps = ( + int(round((time() - start_time) * 1000)) + if len(info) + else float("inf") + ) + resolution = ( + f"{info['width']}x{info['height']}" + if "width" in info and "height" in info + else None + ) + return (fps, resolution) except: return (float("inf"), None) @@ -146,7 +162,7 @@ async def check_stream_speed(url_info): speed_cache = {} -def get_speed(url, ipv6_proxy=None, callback=None): +async def get_speed(url, ipv6_proxy=None, callback=None): """ Get the speed of the url """ @@ -163,7 +179,7 @@ def get_speed(url, ipv6_proxy=None, callback=None): if ipv6_proxy and url_is_ipv6: speed = 0 else: - speed = get_speed_yt_dlp(url) + speed = await get_speed_yt_dlp(url) if cache_key and cache_key not in speed_cache: speed_cache[cache_key] = speed return speed @@ -174,7 +190,7 @@ def get_speed(url, ipv6_proxy=None, callback=None): callback() -def sort_urls_by_speed_and_resolution(name, data): +def sort_urls_by_speed_and_resolution(name, data, logger=None): """ Sort by speed and resolution """ @@ -192,9 +208,13 @@ def sort_urls_by_speed_and_resolution(name, data): resolution = cache_resolution or resolution if response_time != float("inf"): url = remove_cache_info(url) - logging.info( - f"Name: {name}, URL: {url}, Date: {date}, Resolution: {resolution}, Response Time: {response_time} ms" - ) + try: + if logger: + logger.info( + f"Name: {name}, URL: {url}, Date: {date}, Resolution: {resolution}, Response Time: {response_time} ms" + ) + except Exception as e: + print(e) filter_data.append((url, date, resolution, origin)) def combined_key(item): diff --git a/utils/tools.py b/utils/tools.py index ee6c220..ce48f3b 100644 --- a/utils/tools.py +++ b/utils/tools.py @@ -15,35 +15,20 @@ import sys import logging from logging.handlers import RotatingFileHandler -handler = None - -def setup_logging(): +def get_logger(path, level=logging.ERROR, init=False): """ - Setup logging + get the logger """ - global handler if not os.path.exists(constants.output_dir): os.makedirs(constants.output_dir) - handler = RotatingFileHandler(constants.log_path, encoding="utf-8") - logging.basicConfig( - handlers=[handler], - format="%(message)s", - level=logging.INFO, - ) - - -def cleanup_logging(): - """ - Cleanup logging - """ - global handler - if handler: - for handler in logging.root.handlers[:]: - handler.close() - logging.root.removeHandler(handler) - if os.path.exists(constants.log_path): - os.remove(constants.log_path) + if init and os.path.exists(path): + os.remove(path) + handler = RotatingFileHandler(path, encoding="utf-8") + logger = logging.getLogger(path) + logger.addHandler(handler) + logger.setLevel(level) + return logger def format_interval(t): From 2af5e2be515104153c1357824475a43b4a0936c4 Mon Sep 17 00:00:00 2001 From: "guorong.zheng" <360996299@qq.com> Date: Thu, 28 Nov 2024 15:03:56 +0800 Subject: [PATCH 23/37] chore:schedule interval --- .github/workflows/main.yml | 3 +- Dockerfile | 4 +- Pipfile | 1 - Pipfile.lock | 345 ++++++++++++++++++------------------- README.md | 2 +- README_en.md | 2 +- docs/tutorial.md | 11 +- docs/tutorial_en.md | 9 +- 8 files changed, 183 insertions(+), 194 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index d4ad49b..dc041ce 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -2,8 +2,7 @@ name: 'Update schedule' on: schedule: - - cron: '0 22 * * *' - - cron: '0 10 * * *' + - cron: '0 0,12 * * *' workflow_dispatch: branches: - master diff --git a/Dockerfile b/Dockerfile index 2a8562a..3c17ec3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -43,9 +43,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends cron RUN if [ "$LITE" = False ]; then apt-get install -y --no-install-recommends chromium chromium-driver; fi \ && apt-get clean && rm -rf /var/lib/apt/lists/* -RUN (crontab -l ; \ - echo "0 22 * * * python $APP_WORKDIR/main.py &"; \ - echo "0 10 * * * python $APP_WORKDIR/main.py &") | crontab - +RUN (crontab -l ; echo "0 0,12 * * * python $APP_WORKDIR/main.py &";) | crontab - EXPOSE 8000 diff --git a/Pipfile b/Pipfile index 7e2af22..0ae10f8 100644 --- a/Pipfile +++ b/Pipfile @@ -24,7 +24,6 @@ aiohttp = "*" flask = "*" opencc-python-reimplemented = "*" fake-useragent = "*" -gunicorn = "*" pillow = "*" yt-dlp = "*" diff --git a/Pipfile.lock b/Pipfile.lock index d32de8b..d4fbb30 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "be2b3e79aad9c13d97124c36063384a1b513bc777fd72f4175fcdd4f41de8332" + "sha256": "607118c241d8006851d09df1f7eaa5299ede1023bfdf43911c258ce406732c3d" }, "pipfile-spec": 6, "requires": { @@ -26,86 +26,86 @@ }, "aiohttp": { "hashes": [ - "sha256:018f1b04883a12e77e7fc161934c0f298865d3a484aea536a6a2ca8d909f0ba0", - "sha256:01a8aca4af3da85cea5c90141d23f4b0eee3cbecfd33b029a45a80f28c66c668", - "sha256:04b0cc74d5a882c9dacaeeccc1444f0233212b6f5be8bc90833feef1e1ce14b9", - "sha256:0de6466b9d742b4ee56fe1b2440706e225eb48c77c63152b1584864a236e7a50", - "sha256:12724f3a211fa243570e601f65a8831372caf1a149d2f1859f68479f07efec3d", - "sha256:12e4d45847a174f77b2b9919719203769f220058f642b08504cf8b1cf185dacf", - "sha256:17829f37c0d31d89aa6b8b010475a10233774771f9b6dc2cc352ea4f8ce95d9a", - "sha256:1a17f6a230f81eb53282503823f59d61dff14fb2a93847bf0399dc8e87817307", - "sha256:1cf03d27885f8c5ebf3993a220cc84fc66375e1e6e812731f51aab2b2748f4a6", - "sha256:1fbf41a6bbc319a7816ae0f0177c265b62f2a59ad301a0e49b395746eb2a9884", - "sha256:2257bdd5cf54a4039a4337162cd8048f05a724380a2283df34620f55d4e29341", - "sha256:24054fce8c6d6f33a3e35d1c603ef1b91bbcba73e3f04a22b4f2f27dac59b347", - "sha256:241a6ca732d2766836d62c58c49ca7a93d08251daef0c1e3c850df1d1ca0cbc4", - "sha256:28c7af3e50e5903d21d7b935aceed901cc2475463bc16ddd5587653548661fdb", - "sha256:351849aca2c6f814575c1a485c01c17a4240413f960df1bf9f5deb0003c61a53", - "sha256:3ce18f703b7298e7f7633efd6a90138d99a3f9a656cb52c1201e76cb5d79cf08", - "sha256:3d1c9c15d3999107cbb9b2d76ca6172e6710a12fda22434ee8bd3f432b7b17e8", - "sha256:3dd3e7e7c9ef3e7214f014f1ae260892286647b3cf7c7f1b644a568fd410f8ca", - "sha256:43bfd25113c1e98aec6c70e26d5f4331efbf4aa9037ba9ad88f090853bf64d7f", - "sha256:43dd89a6194f6ab02a3fe36b09e42e2df19c211fc2050ce37374d96f39604997", - "sha256:481f10a1a45c5f4c4a578bbd74cff22eb64460a6549819242a87a80788461fba", - "sha256:4ba8d043fed7ffa117024d7ba66fdea011c0e7602327c6d73cacaea38abe4491", - "sha256:4bb7493c3e3a36d3012b8564bd0e2783259ddd7ef3a81a74f0dbfa000fce48b7", - "sha256:4c1a6309005acc4b2bcc577ba3b9169fea52638709ffacbd071f3503264620da", - "sha256:4dda726f89bfa5c465ba45b76515135a3ece0088dfa2da49b8bb278f3bdeea12", - "sha256:53c921b58fdc6485d6b2603e0132bb01cd59b8f0620ffc0907f525e0ba071687", - "sha256:5578cf40440eafcb054cf859964bc120ab52ebe0e0562d2b898126d868749629", - "sha256:59ee1925b5a5efdf6c4e7be51deee93984d0ac14a6897bd521b498b9916f1544", - "sha256:670847ee6aeb3a569cd7cdfbe0c3bec1d44828bbfbe78c5d305f7f804870ef9e", - "sha256:78c657ece7a73b976905ab9ec8be9ef2df12ed8984c24598a1791c58ce3b4ce4", - "sha256:7a9318da4b4ada9a67c1dd84d1c0834123081e746bee311a16bb449f363d965e", - "sha256:7b2f8107a3c329789f3c00b2daad0e35f548d0a55cda6291579136622099a46e", - "sha256:7ea4490360b605804bea8173d2d086b6c379d6bb22ac434de605a9cbce006e7d", - "sha256:8360c7cc620abb320e1b8d603c39095101391a82b1d0be05fb2225471c9c5c52", - "sha256:875f7100ce0e74af51d4139495eec4025affa1a605280f23990b6434b81df1bd", - "sha256:8bedb1f6cb919af3b6353921c71281b1491f948ca64408871465d889b4ee1b66", - "sha256:8d20cfe63a1c135d26bde8c1d0ea46fd1200884afbc523466d2f1cf517d1fe33", - "sha256:9202f184cc0582b1db15056f2225ab4c1e3dac4d9ade50dd0613ac3c46352ac2", - "sha256:9acfc7f652b31853eed3b92095b0acf06fd5597eeea42e939bd23a17137679d5", - "sha256:9d18a8b44ec8502a7fde91446cd9c9b95ce7c49f1eacc1fb2358b8907d4369fd", - "sha256:9e67531370a3b07e49b280c1f8c2df67985c790ad2834d1b288a2f13cd341c5f", - "sha256:9ee6a4cdcbf54b8083dc9723cdf5f41f722c00db40ccf9ec2616e27869151129", - "sha256:a7d9a606355655617fee25dd7e54d3af50804d002f1fd3118dd6312d26692d70", - "sha256:aa3705a8d14de39898da0fbad920b2a37b7547c3afd2a18b9b81f0223b7d0f68", - "sha256:b7215bf2b53bc6cb35808149980c2ae80a4ae4e273890ac85459c014d5aa60ac", - "sha256:badda65ac99555791eed75e234afb94686ed2317670c68bff8a4498acdaee935", - "sha256:bf0e6cce113596377cadda4e3ac5fb89f095bd492226e46d91b4baef1dd16f60", - "sha256:c171fc35d3174bbf4787381716564042a4cbc008824d8195eede3d9b938e29a8", - "sha256:c1f6490dd1862af5aae6cfcf2a274bffa9a5b32a8f5acb519a7ecf5a99a88866", - "sha256:c25b74a811dba37c7ea6a14d99eb9402d89c8d739d50748a75f3cf994cf19c43", - "sha256:c6095aaf852c34f42e1bd0cf0dc32d1e4b48a90bfb5054abdbb9d64b36acadcb", - "sha256:c63f898f683d1379b9be5afc3dd139e20b30b0b1e0bf69a3fc3681f364cf1629", - "sha256:cd8d62cab363dfe713067027a5adb4907515861f1e4ce63e7be810b83668b847", - "sha256:ce91a24aac80de6be8512fb1c4838a9881aa713f44f4e91dd7bb3b34061b497d", - "sha256:cea52d11e02123f125f9055dfe0ccf1c3857225fb879e4a944fae12989e2aef2", - "sha256:cf4efa2d01f697a7dbd0509891a286a4af0d86902fc594e20e3b1712c28c0106", - "sha256:d2fa6fc7cc865d26ff42480ac9b52b8c9b7da30a10a6442a9cdf429de840e949", - "sha256:d329300fb23e14ed1f8c6d688dfd867d1dcc3b1d7cd49b7f8c5b44e797ce0932", - "sha256:d6177077a31b1aecfc3c9070bd2f11419dbb4a70f30f4c65b124714f525c2e48", - "sha256:db37248535d1ae40735d15bdf26ad43be19e3d93ab3f3dad8507eb0f85bb8124", - "sha256:db70a47987e34494b451a334605bee57a126fe8d290511349e86810b4be53b01", - "sha256:dcefcf2915a2dbdbce37e2fc1622129a1918abfe3d06721ce9f6cdac9b6d2eaa", - "sha256:dda3ed0a7869d2fa16aa41f9961ade73aa2c2e3b2fcb0a352524e7b744881889", - "sha256:e0bf378db07df0a713a1e32381a1b277e62ad106d0dbe17b5479e76ec706d720", - "sha256:e13a05db87d3b241c186d0936808d0e4e12decc267c617d54e9c643807e968b6", - "sha256:e143b0ef9cb1a2b4f74f56d4fbe50caa7c2bb93390aff52f9398d21d89bc73ea", - "sha256:e22d1721c978a6494adc824e0916f9d187fa57baeda34b55140315fa2f740184", - "sha256:e5522ee72f95661e79db691310290c4618b86dff2d9b90baedf343fd7a08bf79", - "sha256:e993676c71288618eb07e20622572b1250d8713e7e00ab3aabae28cb70f3640d", - "sha256:ee9afa1b0d2293c46954f47f33e150798ad68b78925e3710044e0d67a9487791", - "sha256:f1ac5462582d6561c1c1708853a9faf612ff4e5ea5e679e99be36143d6eabd8e", - "sha256:f5022504adab881e2d801a88b748ea63f2a9d130e0b2c430824682a96f6534be", - "sha256:f5b973cce96793725ef63eb449adfb74f99c043c718acb76e0d2a447ae369962", - "sha256:f7c58a240260822dc07f6ae32a0293dd5bccd618bb2d0f36d51c5dbd526f89c0", - "sha256:fc6da202068e0a268e298d7cd09b6e9f3997736cd9b060e2750963754552a0a9", - "sha256:fdadc3f6a32d6eca45f9a900a254757fd7855dfb2d8f8dcf0e88f0fae3ff8eb1" + "sha256:00618c37a350884c08e87cf9a6532be274d564227ac49e0b474cf41f27e1f190", + "sha256:0983d0ce329f2f9dbeb355c3744bd6333f34e0dc56025b6b7d4f285b90acb51e", + "sha256:0e3b5bfef913d6be270c81976fbc0cbf66625cd92663bbb7e03b3adbd6aa4ac6", + "sha256:16bda233a7b159ab08107e8858fedca90a9de287057fab54cafde51bd83f9819", + "sha256:17e6b9d8e29e3bfc7f893f327e92c9769d3582cee2fb1652c1431ac3f60115a0", + "sha256:1c5838a68e31712354129add1b5fe32b06aa05275f835130edc650e6288af05f", + "sha256:220bbce18b3046973465be45415430f1cab39d7fdc40cbcf0a8c05485c6902fe", + "sha256:2a5afbd805e449048ecebb1a256176e953d4ca9e48bab387d4d1c8524f1c7a95", + "sha256:2b6f8716044ae5e5f2a3b4e4b6bfee48e97c8b2a92e56f43aadd728c7fd26b7d", + "sha256:2d2ca685c6a851ce64e511fbcb906e4dd97d13e567ca7ecb5cb30b184e15dc6d", + "sha256:2fa50ddc6b21cc1ae23e13524d6f75b27e279fdf5cf905b2df6fd171891ac4e2", + "sha256:3260c77cff4e35245bc517658bd54d7a64787f71f3c4f723877c82f22835b032", + "sha256:336bbf7a33dd8cb4a7afb98c70e9935a81e5e88f7ac595ba2e84b1fb5da190d6", + "sha256:35d4545e7684da7a954ffc2dce495462cb16a902dffdebe98572408f6aaaee83", + "sha256:35dafc70051b6cbd6dafb533b4e3f0df6225a4896be373ef86367b2987409331", + "sha256:3c5e4f1ba5059b85e05c551961a448ce2689c6249ed6a2e2174796842c191d10", + "sha256:3e6523f39071a01757048985e4cc22d04aa130bc40d9128503f3a61a3ee98328", + "sha256:4448c9c7f77bad48a6569062c0c16deb77fbb7363de1dc71ed087f66fb3b3c96", + "sha256:47c6663df9446aa848b478413219600da4b54bc0409e1ac4bc80fb1a81501363", + "sha256:481075a1949de79a8a6841e0086f2f5f464785c592cf527ed0db2c0cbd0e1ba2", + "sha256:4867008617bbf86e9fb5b00f72dd0e3a00a579b32233caff834320867f9b7cac", + "sha256:48be7cff468c9c0d86a02e6a826e1fe159094b16d5aa2c17703e7317f791b0f9", + "sha256:52913bb8a0a72a57479f54b281300c9d23036aa9aa3ebbc9a32a643484eadfc2", + "sha256:561b9596a9f90266673ef0b950c27e04ab597cdb53785e2ac91b83b33c31b509", + "sha256:58bd94ad48143e1d42e05fc055da41de0a9933f378ad87760595b8aec83d317b", + "sha256:5a20ddaa58fea717177fac9a4a1fb8b39be868aa4fed2af6de4313b7a08f0f71", + "sha256:64e6b14608a56a4c76c60daac730b0c0eeaf9d10dfc3231f7fc26521a0d628fd", + "sha256:658052941324edea3dee1f681375e70779f55e437e07bdfc4b5bbe65ad53cefb", + "sha256:65fd04f1fea668ad1af48ac31b752000e222dccffedcad3de8ccf9d34489ccd3", + "sha256:6c829471a9e2266da4a0666f8a9e215f19320f79778af379c1c7db324ac24ed2", + "sha256:72779bfb34d6d6b51e55a7f4901b410e416b5431738b367d49696928c91a2ca8", + "sha256:7565689e86a88c1d258351ebd14e343337b76a56ca5c0a2c1db96ec28149386f", + "sha256:7bc9d64a2350cbb29a9732334e1a0743cbb6844de1731cbdf5949b235653f3fd", + "sha256:7d141631a7348038fc7b5d1a81b3c9afa9aa056188ded7902fe754028fdea5c5", + "sha256:7d71d4ac0792ff89541179394d303be846a0b6cd3821ae67286ee69ecec16f9f", + "sha256:7f3be4961a5c2c670f31caab7641a37ea2a97031f0d8ae15bcfd36b6bf273200", + "sha256:80b3ac163145660ce660aed2f1005e6d4de840d39728990b7250525eeec4e4a8", + "sha256:832e58d9454fe501b0d092cdf660c0e34e16005f61acd06e1c79b0fc45019c94", + "sha256:85be3899e6860dd2cd3f4370ded6708e939d00d5ec922a8eb328d114db605a47", + "sha256:8ca580edc3ccd7f6ea76ad9cf59f5a8756d338e770b5eda7be26bcda8fa7ef53", + "sha256:8eeaac75203da1a54afe1faea3c855a1973026b54929112aa9b67bceadbcb0ca", + "sha256:98f596cf59292e779bc387f22378a3d2c5e052c9fe2bf822ac4f547c6fe57758", + "sha256:9bf52642b12d70d78c18882915201bc5345f7c8f0f2ab8919d99b886aa6475a7", + "sha256:9ce8eb6444bb6e862feca664ce365afa8e2e32db24dcf1a502719a8a002f9274", + "sha256:9f4aadfea6b48cfa17aef1a68ba6bee5a0246374f5a588e299a4f4ff5bd1c77b", + "sha256:a0ed9f1f2697713c48efc9ec483ad5d062e4aa91854f090a3eba0b19c002851d", + "sha256:a750ee5a177e0f873d6b2d7d0fa6e1e7c658fc0ca8ea56438dcba2ac94bedb09", + "sha256:a7def89a41fe32120d89cd4577f5efbab3c52234c5890066ced8a2f7202dff88", + "sha256:a81525430da5ca356fae6e889daeb6f5cc0d5f0cef88e59cdde48e2394ea1365", + "sha256:aa7deebb4bc5143745e6282139d7b9de50beb6d06609df64d2c993ef496bc7eb", + "sha256:afba47981ff73b1794c00dce774334dcfe62664b3b4f78f278b77d21ce9daf43", + "sha256:b64fa6b76b35b695cd3e5c42a4e568cbea8d41c9e59165e2a43da00976e2027e", + "sha256:beae08f900b2980af4353a0200eb162b39f276fd8a6e43079a540f83964671f4", + "sha256:c0dbae99737badf3f5e862088a118e28d3b36f03eb608a6382eddfd68178e05b", + "sha256:c3f397e0511a0ec4fe331e602fc057dfd336d352062deb9969ebd81e253a149c", + "sha256:c665ed4b52256614858b20711bbbd2755b0e19ec86870f8ff1645acf9ae9e760", + "sha256:c92e763cf641e10ad9342597d20060ba23de5e411aada96660e679e3f9371189", + "sha256:cb51a81cb637b9a072c9cfae1839e35c6579638861eb3479eb5d6e6ce8bc6782", + "sha256:cf8f05f4abe3288fe2e106e1461fd20d8abf6103886ddfb6d746a5b8fb830d2b", + "sha256:d0f9dbe9763c014c408ad51a027dc9582518e992dc63e2ffe359ac1b4840a560", + "sha256:d21951756690f5d86d0215da38eb0fd65def03b5e2a1c08a4a39718a6d0d48f2", + "sha256:d479c1fdcc920056a06d04059db52eb8590ecbbb3acdcaeeea26a88ff782e94a", + "sha256:d6f9e5fd1b3ecbaca3e04a15a02d1fa213248608caee99fd5bdddd4759959cf7", + "sha256:d96b93a46a3742880fa21bcb35c6c40cf27714ec0fb8ec85fe444d73b95131b9", + "sha256:da343903214bf9f9d314b913caa499fa19e26d73e6e23a3db7d4898ea6d47028", + "sha256:daea456b79ca2bacc7f062845bbb1139c3b3231fc83169da5a682cf385416dd1", + "sha256:dd2ca84e5f7a35f313a62eb7d6a50bac6760b60bafce34586750712731c0aeff", + "sha256:df9bf08eb93611b1d4d6245b6fecf88728e90eece00e00d554e1b0c445557d83", + "sha256:e9ac0cce897904b77e109e5403ed713187dbdf96832bfd061ac07164264be16c", + "sha256:e9f9fd5c672c962389429abd11ed32c9c93f7932fd58584cae1e43951b141c6b", + "sha256:ea68db69f2a4ddc24b28b8e754fc0b963ed7f9b9a76137f06fe44643d6821fbd", + "sha256:f4f1779c3142d913c509c2ed1de8b8f920e07a5cd65ac1f57c61cfb6bfded5a4", + "sha256:f7fd9c11ffad6b022bf02a41a70418cb2ab3b33f2c27842a5999e3ab78daf280", + "sha256:f8dd02b44555893adfe7cc4b3b454fee04f9dcec45cf66ef5bb53ebf393f0505", + "sha256:fe503a76b9e3a13b62e64545693c9463afe9d429e0909120f7bb66de91ed8bc2", + "sha256:fee12d8487b0df2b683424cca2a0d8fb7281d5607518d742e98119a74af01026" ], "index": "aliyun", "markers": "python_version >= '3.9'", - "version": "==3.11.7" + "version": "==3.11.8" }, "aiosignal": { "hashes": [ @@ -827,12 +827,12 @@ }, "tqdm": { "hashes": [ - "sha256:0cd8af9d56911acab92182e88d763100d4788bdf421d251616040cc4d44863be", - "sha256:fe5a6f95e6fe0b9755e9469b77b9c3cf850048224ecaa8293d7d2d31f97d869a" + "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", + "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2" ], "index": "aliyun", "markers": "python_version >= '3.7'", - "version": "==4.67.0" + "version": "==4.67.1" }, "urllib3": { "hashes": [ @@ -940,8 +940,10 @@ }, "yt-dlp": { "hashes": [ + "sha256:6d9727419e55297bf7e689b7dae7bb60455b5365b71d42d34e51089a35692338", "sha256:b8a4c23d3c9afd7e476bcdb87f38b6c0e8e12e3a239d7988f13acb434200f54d", - "sha256:b9741695911dc566498b5f115cdd6b1abbc5be61cb01fd98abe649990a41656c" + "sha256:b9741695911dc566498b5f115cdd6b1abbc5be61cb01fd98abe649990a41656c", + "sha256:ebe2fccbdcc5968937cbe3f4fc0656e133fb14c4d9bf04fca6edcfc03c052de8" ], "index": "aliyun", "markers": "python_version >= '3.9'", @@ -959,86 +961,86 @@ }, "aiohttp": { "hashes": [ - "sha256:018f1b04883a12e77e7fc161934c0f298865d3a484aea536a6a2ca8d909f0ba0", - "sha256:01a8aca4af3da85cea5c90141d23f4b0eee3cbecfd33b029a45a80f28c66c668", - "sha256:04b0cc74d5a882c9dacaeeccc1444f0233212b6f5be8bc90833feef1e1ce14b9", - "sha256:0de6466b9d742b4ee56fe1b2440706e225eb48c77c63152b1584864a236e7a50", - "sha256:12724f3a211fa243570e601f65a8831372caf1a149d2f1859f68479f07efec3d", - "sha256:12e4d45847a174f77b2b9919719203769f220058f642b08504cf8b1cf185dacf", - "sha256:17829f37c0d31d89aa6b8b010475a10233774771f9b6dc2cc352ea4f8ce95d9a", - "sha256:1a17f6a230f81eb53282503823f59d61dff14fb2a93847bf0399dc8e87817307", - "sha256:1cf03d27885f8c5ebf3993a220cc84fc66375e1e6e812731f51aab2b2748f4a6", - "sha256:1fbf41a6bbc319a7816ae0f0177c265b62f2a59ad301a0e49b395746eb2a9884", - "sha256:2257bdd5cf54a4039a4337162cd8048f05a724380a2283df34620f55d4e29341", - "sha256:24054fce8c6d6f33a3e35d1c603ef1b91bbcba73e3f04a22b4f2f27dac59b347", - "sha256:241a6ca732d2766836d62c58c49ca7a93d08251daef0c1e3c850df1d1ca0cbc4", - "sha256:28c7af3e50e5903d21d7b935aceed901cc2475463bc16ddd5587653548661fdb", - "sha256:351849aca2c6f814575c1a485c01c17a4240413f960df1bf9f5deb0003c61a53", - "sha256:3ce18f703b7298e7f7633efd6a90138d99a3f9a656cb52c1201e76cb5d79cf08", - "sha256:3d1c9c15d3999107cbb9b2d76ca6172e6710a12fda22434ee8bd3f432b7b17e8", - "sha256:3dd3e7e7c9ef3e7214f014f1ae260892286647b3cf7c7f1b644a568fd410f8ca", - "sha256:43bfd25113c1e98aec6c70e26d5f4331efbf4aa9037ba9ad88f090853bf64d7f", - "sha256:43dd89a6194f6ab02a3fe36b09e42e2df19c211fc2050ce37374d96f39604997", - "sha256:481f10a1a45c5f4c4a578bbd74cff22eb64460a6549819242a87a80788461fba", - "sha256:4ba8d043fed7ffa117024d7ba66fdea011c0e7602327c6d73cacaea38abe4491", - "sha256:4bb7493c3e3a36d3012b8564bd0e2783259ddd7ef3a81a74f0dbfa000fce48b7", - "sha256:4c1a6309005acc4b2bcc577ba3b9169fea52638709ffacbd071f3503264620da", - "sha256:4dda726f89bfa5c465ba45b76515135a3ece0088dfa2da49b8bb278f3bdeea12", - "sha256:53c921b58fdc6485d6b2603e0132bb01cd59b8f0620ffc0907f525e0ba071687", - "sha256:5578cf40440eafcb054cf859964bc120ab52ebe0e0562d2b898126d868749629", - "sha256:59ee1925b5a5efdf6c4e7be51deee93984d0ac14a6897bd521b498b9916f1544", - "sha256:670847ee6aeb3a569cd7cdfbe0c3bec1d44828bbfbe78c5d305f7f804870ef9e", - "sha256:78c657ece7a73b976905ab9ec8be9ef2df12ed8984c24598a1791c58ce3b4ce4", - "sha256:7a9318da4b4ada9a67c1dd84d1c0834123081e746bee311a16bb449f363d965e", - "sha256:7b2f8107a3c329789f3c00b2daad0e35f548d0a55cda6291579136622099a46e", - "sha256:7ea4490360b605804bea8173d2d086b6c379d6bb22ac434de605a9cbce006e7d", - "sha256:8360c7cc620abb320e1b8d603c39095101391a82b1d0be05fb2225471c9c5c52", - "sha256:875f7100ce0e74af51d4139495eec4025affa1a605280f23990b6434b81df1bd", - "sha256:8bedb1f6cb919af3b6353921c71281b1491f948ca64408871465d889b4ee1b66", - "sha256:8d20cfe63a1c135d26bde8c1d0ea46fd1200884afbc523466d2f1cf517d1fe33", - "sha256:9202f184cc0582b1db15056f2225ab4c1e3dac4d9ade50dd0613ac3c46352ac2", - "sha256:9acfc7f652b31853eed3b92095b0acf06fd5597eeea42e939bd23a17137679d5", - "sha256:9d18a8b44ec8502a7fde91446cd9c9b95ce7c49f1eacc1fb2358b8907d4369fd", - "sha256:9e67531370a3b07e49b280c1f8c2df67985c790ad2834d1b288a2f13cd341c5f", - "sha256:9ee6a4cdcbf54b8083dc9723cdf5f41f722c00db40ccf9ec2616e27869151129", - "sha256:a7d9a606355655617fee25dd7e54d3af50804d002f1fd3118dd6312d26692d70", - "sha256:aa3705a8d14de39898da0fbad920b2a37b7547c3afd2a18b9b81f0223b7d0f68", - "sha256:b7215bf2b53bc6cb35808149980c2ae80a4ae4e273890ac85459c014d5aa60ac", - "sha256:badda65ac99555791eed75e234afb94686ed2317670c68bff8a4498acdaee935", - "sha256:bf0e6cce113596377cadda4e3ac5fb89f095bd492226e46d91b4baef1dd16f60", - "sha256:c171fc35d3174bbf4787381716564042a4cbc008824d8195eede3d9b938e29a8", - "sha256:c1f6490dd1862af5aae6cfcf2a274bffa9a5b32a8f5acb519a7ecf5a99a88866", - "sha256:c25b74a811dba37c7ea6a14d99eb9402d89c8d739d50748a75f3cf994cf19c43", - "sha256:c6095aaf852c34f42e1bd0cf0dc32d1e4b48a90bfb5054abdbb9d64b36acadcb", - "sha256:c63f898f683d1379b9be5afc3dd139e20b30b0b1e0bf69a3fc3681f364cf1629", - "sha256:cd8d62cab363dfe713067027a5adb4907515861f1e4ce63e7be810b83668b847", - "sha256:ce91a24aac80de6be8512fb1c4838a9881aa713f44f4e91dd7bb3b34061b497d", - "sha256:cea52d11e02123f125f9055dfe0ccf1c3857225fb879e4a944fae12989e2aef2", - "sha256:cf4efa2d01f697a7dbd0509891a286a4af0d86902fc594e20e3b1712c28c0106", - "sha256:d2fa6fc7cc865d26ff42480ac9b52b8c9b7da30a10a6442a9cdf429de840e949", - "sha256:d329300fb23e14ed1f8c6d688dfd867d1dcc3b1d7cd49b7f8c5b44e797ce0932", - "sha256:d6177077a31b1aecfc3c9070bd2f11419dbb4a70f30f4c65b124714f525c2e48", - "sha256:db37248535d1ae40735d15bdf26ad43be19e3d93ab3f3dad8507eb0f85bb8124", - "sha256:db70a47987e34494b451a334605bee57a126fe8d290511349e86810b4be53b01", - "sha256:dcefcf2915a2dbdbce37e2fc1622129a1918abfe3d06721ce9f6cdac9b6d2eaa", - "sha256:dda3ed0a7869d2fa16aa41f9961ade73aa2c2e3b2fcb0a352524e7b744881889", - "sha256:e0bf378db07df0a713a1e32381a1b277e62ad106d0dbe17b5479e76ec706d720", - "sha256:e13a05db87d3b241c186d0936808d0e4e12decc267c617d54e9c643807e968b6", - "sha256:e143b0ef9cb1a2b4f74f56d4fbe50caa7c2bb93390aff52f9398d21d89bc73ea", - "sha256:e22d1721c978a6494adc824e0916f9d187fa57baeda34b55140315fa2f740184", - "sha256:e5522ee72f95661e79db691310290c4618b86dff2d9b90baedf343fd7a08bf79", - "sha256:e993676c71288618eb07e20622572b1250d8713e7e00ab3aabae28cb70f3640d", - "sha256:ee9afa1b0d2293c46954f47f33e150798ad68b78925e3710044e0d67a9487791", - "sha256:f1ac5462582d6561c1c1708853a9faf612ff4e5ea5e679e99be36143d6eabd8e", - "sha256:f5022504adab881e2d801a88b748ea63f2a9d130e0b2c430824682a96f6534be", - "sha256:f5b973cce96793725ef63eb449adfb74f99c043c718acb76e0d2a447ae369962", - "sha256:f7c58a240260822dc07f6ae32a0293dd5bccd618bb2d0f36d51c5dbd526f89c0", - "sha256:fc6da202068e0a268e298d7cd09b6e9f3997736cd9b060e2750963754552a0a9", - "sha256:fdadc3f6a32d6eca45f9a900a254757fd7855dfb2d8f8dcf0e88f0fae3ff8eb1" + "sha256:00618c37a350884c08e87cf9a6532be274d564227ac49e0b474cf41f27e1f190", + "sha256:0983d0ce329f2f9dbeb355c3744bd6333f34e0dc56025b6b7d4f285b90acb51e", + "sha256:0e3b5bfef913d6be270c81976fbc0cbf66625cd92663bbb7e03b3adbd6aa4ac6", + "sha256:16bda233a7b159ab08107e8858fedca90a9de287057fab54cafde51bd83f9819", + "sha256:17e6b9d8e29e3bfc7f893f327e92c9769d3582cee2fb1652c1431ac3f60115a0", + "sha256:1c5838a68e31712354129add1b5fe32b06aa05275f835130edc650e6288af05f", + "sha256:220bbce18b3046973465be45415430f1cab39d7fdc40cbcf0a8c05485c6902fe", + "sha256:2a5afbd805e449048ecebb1a256176e953d4ca9e48bab387d4d1c8524f1c7a95", + "sha256:2b6f8716044ae5e5f2a3b4e4b6bfee48e97c8b2a92e56f43aadd728c7fd26b7d", + "sha256:2d2ca685c6a851ce64e511fbcb906e4dd97d13e567ca7ecb5cb30b184e15dc6d", + "sha256:2fa50ddc6b21cc1ae23e13524d6f75b27e279fdf5cf905b2df6fd171891ac4e2", + "sha256:3260c77cff4e35245bc517658bd54d7a64787f71f3c4f723877c82f22835b032", + "sha256:336bbf7a33dd8cb4a7afb98c70e9935a81e5e88f7ac595ba2e84b1fb5da190d6", + "sha256:35d4545e7684da7a954ffc2dce495462cb16a902dffdebe98572408f6aaaee83", + "sha256:35dafc70051b6cbd6dafb533b4e3f0df6225a4896be373ef86367b2987409331", + "sha256:3c5e4f1ba5059b85e05c551961a448ce2689c6249ed6a2e2174796842c191d10", + "sha256:3e6523f39071a01757048985e4cc22d04aa130bc40d9128503f3a61a3ee98328", + "sha256:4448c9c7f77bad48a6569062c0c16deb77fbb7363de1dc71ed087f66fb3b3c96", + "sha256:47c6663df9446aa848b478413219600da4b54bc0409e1ac4bc80fb1a81501363", + "sha256:481075a1949de79a8a6841e0086f2f5f464785c592cf527ed0db2c0cbd0e1ba2", + "sha256:4867008617bbf86e9fb5b00f72dd0e3a00a579b32233caff834320867f9b7cac", + "sha256:48be7cff468c9c0d86a02e6a826e1fe159094b16d5aa2c17703e7317f791b0f9", + "sha256:52913bb8a0a72a57479f54b281300c9d23036aa9aa3ebbc9a32a643484eadfc2", + "sha256:561b9596a9f90266673ef0b950c27e04ab597cdb53785e2ac91b83b33c31b509", + "sha256:58bd94ad48143e1d42e05fc055da41de0a9933f378ad87760595b8aec83d317b", + "sha256:5a20ddaa58fea717177fac9a4a1fb8b39be868aa4fed2af6de4313b7a08f0f71", + "sha256:64e6b14608a56a4c76c60daac730b0c0eeaf9d10dfc3231f7fc26521a0d628fd", + "sha256:658052941324edea3dee1f681375e70779f55e437e07bdfc4b5bbe65ad53cefb", + "sha256:65fd04f1fea668ad1af48ac31b752000e222dccffedcad3de8ccf9d34489ccd3", + "sha256:6c829471a9e2266da4a0666f8a9e215f19320f79778af379c1c7db324ac24ed2", + "sha256:72779bfb34d6d6b51e55a7f4901b410e416b5431738b367d49696928c91a2ca8", + "sha256:7565689e86a88c1d258351ebd14e343337b76a56ca5c0a2c1db96ec28149386f", + "sha256:7bc9d64a2350cbb29a9732334e1a0743cbb6844de1731cbdf5949b235653f3fd", + "sha256:7d141631a7348038fc7b5d1a81b3c9afa9aa056188ded7902fe754028fdea5c5", + "sha256:7d71d4ac0792ff89541179394d303be846a0b6cd3821ae67286ee69ecec16f9f", + "sha256:7f3be4961a5c2c670f31caab7641a37ea2a97031f0d8ae15bcfd36b6bf273200", + "sha256:80b3ac163145660ce660aed2f1005e6d4de840d39728990b7250525eeec4e4a8", + "sha256:832e58d9454fe501b0d092cdf660c0e34e16005f61acd06e1c79b0fc45019c94", + "sha256:85be3899e6860dd2cd3f4370ded6708e939d00d5ec922a8eb328d114db605a47", + "sha256:8ca580edc3ccd7f6ea76ad9cf59f5a8756d338e770b5eda7be26bcda8fa7ef53", + "sha256:8eeaac75203da1a54afe1faea3c855a1973026b54929112aa9b67bceadbcb0ca", + "sha256:98f596cf59292e779bc387f22378a3d2c5e052c9fe2bf822ac4f547c6fe57758", + "sha256:9bf52642b12d70d78c18882915201bc5345f7c8f0f2ab8919d99b886aa6475a7", + "sha256:9ce8eb6444bb6e862feca664ce365afa8e2e32db24dcf1a502719a8a002f9274", + "sha256:9f4aadfea6b48cfa17aef1a68ba6bee5a0246374f5a588e299a4f4ff5bd1c77b", + "sha256:a0ed9f1f2697713c48efc9ec483ad5d062e4aa91854f090a3eba0b19c002851d", + "sha256:a750ee5a177e0f873d6b2d7d0fa6e1e7c658fc0ca8ea56438dcba2ac94bedb09", + "sha256:a7def89a41fe32120d89cd4577f5efbab3c52234c5890066ced8a2f7202dff88", + "sha256:a81525430da5ca356fae6e889daeb6f5cc0d5f0cef88e59cdde48e2394ea1365", + "sha256:aa7deebb4bc5143745e6282139d7b9de50beb6d06609df64d2c993ef496bc7eb", + "sha256:afba47981ff73b1794c00dce774334dcfe62664b3b4f78f278b77d21ce9daf43", + "sha256:b64fa6b76b35b695cd3e5c42a4e568cbea8d41c9e59165e2a43da00976e2027e", + "sha256:beae08f900b2980af4353a0200eb162b39f276fd8a6e43079a540f83964671f4", + "sha256:c0dbae99737badf3f5e862088a118e28d3b36f03eb608a6382eddfd68178e05b", + "sha256:c3f397e0511a0ec4fe331e602fc057dfd336d352062deb9969ebd81e253a149c", + "sha256:c665ed4b52256614858b20711bbbd2755b0e19ec86870f8ff1645acf9ae9e760", + "sha256:c92e763cf641e10ad9342597d20060ba23de5e411aada96660e679e3f9371189", + "sha256:cb51a81cb637b9a072c9cfae1839e35c6579638861eb3479eb5d6e6ce8bc6782", + "sha256:cf8f05f4abe3288fe2e106e1461fd20d8abf6103886ddfb6d746a5b8fb830d2b", + "sha256:d0f9dbe9763c014c408ad51a027dc9582518e992dc63e2ffe359ac1b4840a560", + "sha256:d21951756690f5d86d0215da38eb0fd65def03b5e2a1c08a4a39718a6d0d48f2", + "sha256:d479c1fdcc920056a06d04059db52eb8590ecbbb3acdcaeeea26a88ff782e94a", + "sha256:d6f9e5fd1b3ecbaca3e04a15a02d1fa213248608caee99fd5bdddd4759959cf7", + "sha256:d96b93a46a3742880fa21bcb35c6c40cf27714ec0fb8ec85fe444d73b95131b9", + "sha256:da343903214bf9f9d314b913caa499fa19e26d73e6e23a3db7d4898ea6d47028", + "sha256:daea456b79ca2bacc7f062845bbb1139c3b3231fc83169da5a682cf385416dd1", + "sha256:dd2ca84e5f7a35f313a62eb7d6a50bac6760b60bafce34586750712731c0aeff", + "sha256:df9bf08eb93611b1d4d6245b6fecf88728e90eece00e00d554e1b0c445557d83", + "sha256:e9ac0cce897904b77e109e5403ed713187dbdf96832bfd061ac07164264be16c", + "sha256:e9f9fd5c672c962389429abd11ed32c9c93f7932fd58584cae1e43951b141c6b", + "sha256:ea68db69f2a4ddc24b28b8e754fc0b963ed7f9b9a76137f06fe44643d6821fbd", + "sha256:f4f1779c3142d913c509c2ed1de8b8f920e07a5cd65ac1f57c61cfb6bfded5a4", + "sha256:f7fd9c11ffad6b022bf02a41a70418cb2ab3b33f2c27842a5999e3ab78daf280", + "sha256:f8dd02b44555893adfe7cc4b3b454fee04f9dcec45cf66ef5bb53ebf393f0505", + "sha256:fe503a76b9e3a13b62e64545693c9463afe9d429e0909120f7bb66de91ed8bc2", + "sha256:fee12d8487b0df2b683424cca2a0d8fb7281d5607518d742e98119a74af01026" ], "index": "aliyun", "markers": "python_version >= '3.9'", - "version": "==3.11.7" + "version": "==3.11.8" }, "aiosignal": { "hashes": [ @@ -1421,15 +1423,6 @@ "markers": "python_version >= '3.8'", "version": "==1.5.0" }, - "gunicorn": { - "hashes": [ - "sha256:ec400d38950de4dfd418cff8328b2c8faed0edb0d517d3394e457c317908ca4d", - "sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec" - ], - "index": "aliyun", - "markers": "python_version >= '3.7'", - "version": "==23.0.0" - }, "h11": { "hashes": [ "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", @@ -1908,12 +1901,12 @@ }, "selenium": { "hashes": [ - "sha256:1db3f3a0cd5bb07624fa8a3905a6fdde1595a42185a0617077c361dc53d104fb", - "sha256:7640f3f08ae7f4e450f895678e8a10a55eb4e4ca18311ed675ecc4684b96b683" + "sha256:5296c425a75ff1b44d0d5199042b36a6d1ef76c04fb775b97b40be739a9caae2", + "sha256:b89b1f62b5cfe8025868556fe82360d6b649d464f75d2655cb966c8f8447ea18" ], "index": "aliyun", "markers": "python_version >= '3.8'", - "version": "==4.26.1" + "version": "==4.27.1" }, "setuptools": { "hashes": [ @@ -1948,12 +1941,12 @@ }, "tqdm": { "hashes": [ - "sha256:0cd8af9d56911acab92182e88d763100d4788bdf421d251616040cc4d44863be", - "sha256:fe5a6f95e6fe0b9755e9469b77b9c3cf850048224ecaa8293d7d2d31f97d869a" + "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", + "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2" ], "index": "aliyun", "markers": "python_version >= '3.7'", - "version": "==4.67.0" + "version": "==4.67.1" }, "trio": { "hashes": [ @@ -2101,8 +2094,10 @@ }, "yt-dlp": { "hashes": [ + "sha256:6d9727419e55297bf7e689b7dae7bb60455b5365b71d42d34e51089a35692338", "sha256:b8a4c23d3c9afd7e476bcdb87f38b6c0e8e12e3a239d7988f13acb434200f54d", - "sha256:b9741695911dc566498b5f115cdd6b1abbc5be61cb01fd98abe649990a41656c" + "sha256:b9741695911dc566498b5f115cdd6b1abbc5be61cb01fd98abe649990a41656c", + "sha256:ebe2fccbdcc5968937cbe3f4fc0656e133fb14c4d9bf04fca6edcfc03c052de8" ], "index": "aliyun", "markers": "python_version >= '3.9'", diff --git a/README.md b/README.md index 18cf1d2..8790847 100644 --- a/README.md +++ b/README.md @@ -93,7 +93,7 @@ - ✅ 支持多种获取源方式:组播源、酒店源、订阅源、关键字搜索 - ✅ 接口测速验效,响应时间、分辨率优先级,过滤无效接口 - ✅ 偏好设置:IPv6、接口来源排序优先级与数量配置、接口白名单 -- ✅ 定时执行,北京时间每日 6:00 与 18:00 执行更新 +- ✅ 定时执行,间隔 12 小时更新一次 - ✅ 支持多种运行方式:工作流、命令行、GUI 软件、Docker(amd64/arm64/arm v7) - ✨ 更多功能请见[配置参数](./docs/config.md) diff --git a/README_en.md b/README_en.md index 2da64d3..a777bf6 100644 --- a/README_en.md +++ b/README_en.md @@ -93,7 +93,7 @@ - ✅ Supports multiple source acquisition methods: multicast source, hotel source, subscription source, keyword search - ✅ Interface speed testing and verification, with priority on response time and resolution, filtering out ineffective interfaces - ✅ Preferences: IPv6, priority and quantity of interface source sorting, and interface whitelist -- ✅ Scheduled execution at 6:00 AM and 18:00 PM Beijing time daily +- ✅ The value is updated every 12 hours - ✅ Supports various execution methods: workflows, command line, GUI software, Docker(amd64/arm64/arm v7) - ✨ For more features, see [Config parameter](./docs/config_en.md) diff --git a/docs/tutorial.md b/docs/tutorial.md index 6c88d87..e5b0290 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -149,20 +149,19 @@ https://mirror.ghproxy.com/raw.githubusercontent.com/您的github用户名/仓 如果访问该链接能正常返回更新后的接口内容,说明您的直播源接口链接已经大功告成了!将该链接复制粘贴到 TVBox 等软件配置栏中即可使用~ -- 注意:除了首次执行工作流需要您手动触发,后续执行(默认北京时间每日 6:00 和 18:00)将自动触发。如果您修改了模板或配置文件想立刻执行更新,可手动触发(2)中的 Run workflow 即可。 +- 注意:除了首次执行工作流需要您手动触发,后续执行(默认间隔 12 小时)将自动触发。如果您修改了模板或配置文件想立刻执行更新,可手动触发(2)中的 Run workflow 即可。 ### 4.修改工作流更新频率(可选) -如果您想修改更新频率(默认北京时间每日 6:00 和 18:00),可修改 on:schedule:- cron 字段: +如果您想修改更新频率(默认间隔 12 小时),可修改 on:schedule:- cron 字段: ![.github/workflows/main.yml](./images/schedule-cron.png '.github/workflows/main.yml') -如果您想 每 2 天执行更新可以这样修改: +如果您想 每 2 天执行一次更新可以这样修改: ```bash -- cron: '0 22 */2 * *' -- cron: '0 10 */2 * *' +- cron: '0 0 */2 * *' ``` -#### 1. 强烈不建议修改,因为短时间内的接口内容并无差异,过高的更新频率与高耗时运行的工作流都有可能被判定为资源滥用,导致仓库与账户被封禁的风险。 +#### 1. 强烈不建议修改更新频率过高,因为短时间内的接口内容并无差异,过高的更新频率与高耗时运行的工作流都有可能被判定为资源滥用,导致仓库与账户被封禁的风险。 #### 2. 请留意您的工作流运行时长,若发现执行时间过长,需要适当删减模板中频道数量、修改配置中的分页数量和接口数量,以达到合规的运行要求。 diff --git a/docs/tutorial_en.md b/docs/tutorial_en.md index 8137d48..25b4862 100644 --- a/docs/tutorial_en.md +++ b/docs/tutorial_en.md @@ -146,20 +146,19 @@ https://mirror.ghproxy.com/raw.githubusercontent.com/your github username/reposi If you can access this link and it returns the updated interface content, then your live source interface link has been successfully created! Simply copy and paste this link into software like TVBox in the configuration field to use~ -- Note: Except for the first execution of the workflow, which requires you to manually trigger it, subsequent executions (default: daily at 6:00 am and 18:00 pm Beijing time) will be automatically triggered. If you have modified the template or configuration files and want to execute the update immediately, you can manually trigger (2) Run workflow. +- Note: Except for the first execution of the workflow, which requires you to manually trigger it, subsequent executions (The default interval is 12 hours) will be automatically triggered. If you have modified the template or configuration files and want to execute the update immediately, you can manually trigger (2) Run workflow. ### 4.Modify Workflow Update Frequency(optional) -If you want to modify the update frequency (default: daily at 6:00 am and 18:00 pm Beijing time), you can modify the on:schedule:- cron field. +If you want to modify the update frequency (The default interval is 12 hours), you can modify the on:schedule:- cron field. ![.github/workflows/main.yml](./images/schedule-cron.png '.github/workflows/main.yml') If you want to perform updates every 2 days, you can modify it like this: ```bash -- cron: '0 22 */2 * *' -- cron: '0 10 */2 * *' +- cron: '0 0 */2 * *' ``` -#### 1. It is strongly discouraged to make modifications, as there is no difference in the content of the interface in a short period of time. Both too frequent updates and high-consumption running workflows may be judged as resource abuse, leading to the risk of the repository and account being banned. +#### 1. It is strongly not recommended to modify and update too frequently, because the interface content does not differ within a short period of time, and too high update frequency and time-consuming workflow may be judged as resource abuse, resulting in the risk of warehouse and account being blocked. #### 2. Please pay attention to the runtime of your workflow. If you find that the execution time is too long, you need to appropriately reduce the number of channels in the template, modify the number of pages and interfaces in the configuration, in order to meet the compliant operation requirements. From e1d97bd4d995f673112c3894f52e68363f5edb0b Mon Sep 17 00:00:00 2001 From: "guorong.zheng" <360996299@qq.com> Date: Thu, 28 Nov 2024 15:26:17 +0800 Subject: [PATCH 24/37] chore:app result --- utils/tools.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/utils/tools.py b/utils/tools.py index ce48f3b..659473a 100644 --- a/utils/tools.py +++ b/utils/tools.py @@ -406,14 +406,13 @@ def get_result_file_content(show_content=False, file_type=None): else user_final_file ) if os.path.exists(result_file): - if file_type == "txt" or not config.open_m3u_result: - with open(result_file, "r", encoding="utf-8") as file: - content = file.read() - elif config.open_m3u_result: - if not file_type: + if config.open_m3u_result: + if file_type == "m3u" or not file_type: result_file = os.path.splitext(user_final_file)[0] + ".m3u" - if show_content == False: + if file_type != "txt" and show_content == False: return send_file(result_file, as_attachment=True) + with open(result_file, "r", encoding="utf-8") as file: + content = file.read() else: content = constants.waiting_tip return render_template_string( From 74ffedaa4cd8ddd3afc2fc0d236a3e4fe8da1128 Mon Sep 17 00:00:00 2001 From: "guorong.zheng" <360996299@qq.com> Date: Thu, 28 Nov 2024 15:33:54 +0800 Subject: [PATCH 25/37] chore:run --- .github/workflows/main.yml | 3 ++- entrypoint.sh | 2 +- utils/tools.py | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index dc041ce..e8b7562 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -62,7 +62,7 @@ jobs: - name: Install pipenv run: pip3 install --user pipenv - name: Install dependecies - run: pipenv --python 3.13 && pipenv install + run: pipenv --python 3.13 && pipenv install --deploy - name: Install selenium if: env.OPEN_DRIVER == 'True' run: pipenv install selenium @@ -100,6 +100,7 @@ jobs: fi if [[ -f "output/sort.log" ]]; then git add -f "output/sort.log" + fi if [[ -f "updates/fofa/fofa_hotel_region_result.pkl" ]]; then git add -f "updates/fofa/fofa_hotel_region_result.pkl" fi diff --git a/entrypoint.sh b/entrypoint.sh index afae368..ed62456 100644 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -10,7 +10,7 @@ done . /.venv/bin/activate -service cron start +service cron start & python $APP_WORKDIR/main.py & diff --git a/utils/tools.py b/utils/tools.py index 659473a..0feae9c 100644 --- a/utils/tools.py +++ b/utils/tools.py @@ -392,7 +392,7 @@ def convert_to_m3u(): m3u_file_path = os.path.splitext(user_final_file)[0] + ".m3u" with open(m3u_file_path, "w", encoding="utf-8") as m3u_file: m3u_file.write(m3u_output) - print(f"✅ Result m3u file generated at: {m3u_file_path}") + print(f"✅ M3U result file generated at: {m3u_file_path}") def get_result_file_content(show_content=False, file_type=None): From f29d57c6033b34fca9db276166bdde1e8facda8e Mon Sep 17 00:00:00 2001 From: "guorong.zheng" <360996299@qq.com> Date: Thu, 28 Nov 2024 16:03:01 +0800 Subject: [PATCH 26/37] chore:iptv-api --- CHANGELOG.md | 30 ++++++++++++-------- Dockerfile | 10 +++---- Pipfile | 8 +++--- README.md | 56 +++++++++++++++++++------------------- README_en.md | 56 +++++++++++++++++++------------------- docs/tutorial.md | 38 ++++++++++++++------------ docs/tutorial_en.md | 38 ++++++++++++++------------ entrypoint.sh | 2 +- tkinter_ui/about.py | 4 +-- tkinter_ui/tkinter_ui.spec | 2 +- version.json | 2 +- 11 files changed, 129 insertions(+), 117 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e9450d..bb61b39 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,26 +2,34 @@ ## v1.5.4 -### 2024/11/25 +### 2024/11/28 - ⚠️ Python 升级至 3.13,该版本已不支持 Win7,若有需要请使用 v1.5.3 -- ⚠️ Github 仓库改名:IPTV,使用旧接口地址请及时更换新地址 -- ⚠️ Docker 镜像仓库改名:guovern/iptv(之前的 tv-driver 对应:guovern/iptv:latest,tv-requests 对应 guovern/iptv:lite) +- ⚠️ Github 仓库改名:iptv-api,使用旧接口地址请及时更换新地址 +- ⚠️ Docker 新镜像仓库启用:guovern/iptv-api(旧版的 tv-driver 改为:guovern/iptv-api:latest,tv-requests 改为 guovern/iptv-api:lite),iptv-api:latest 为完整版、iptv-api:lite 为精简版,请使用新的名称命令进行拉取,旧仓库将不再维护 +- ✨ 新增微信公众号关注途径(公众号搜索:Govin),推荐关注公众号,可订阅更新通知与使用技巧等文章推送,还可进行交流讨论 - ✨ 更换测速方法(yt-dlp),重构测速逻辑,提升准确性、稳定性与效率,减小接口切换延迟(#563) - ✨ 新增支持 ARM v7(#562) -- ✨ 新增微信公众号关注途径(公众号搜索:Govin),关注公众号可订阅更新通知与使用技巧等文章推送 +- ✨ 新增双结果 API 访问(ip/m3u, ip/txt)(#581) +- ✨ 新增启动 API 服务命令(pipenv run service) - 🪄 优化 Docker 镜像大小 +- 🛠 调整默认更新频率为 12 小时一次 +- 🐛 修复部分播放器不支持的信息间隔符(#581)@@ -84,7 +92,7 @@ - ✨ 新增频道接口白名单:不参与测速,永远保留在结果最前面(#470) 使用方法: 1. 模板频道接口地址后添加$!即可实现(如:广东珠江,http://xxx.m3u$! ) - 2. 额外信息补充(如:广东珠江,http://xxx.m3u$!额外信息 ),更多接口白名单请至https://github.com/Guovin/IPTV/issues/514 讨论 + 2. 额外信息补充(如:广东珠江,http://xxx.m3u$!额外信息 ),更多接口白名单请至https://github.com/Guovin/iptv-api/issues/514 讨论 - ✨ 新增 🈳 无结果频道分类:无结果频道默认归类至该底部分类下(#473) - ✨ 接口地址增加来源类型说明 - ✨ 默认模板增加广东民生(#481)、广州综合(#504) @@ -103,7 +111,7 @@ - ✨ Added channel interface whitelist: Not participating in speed testing, always kept at the very front of the results. (#470) Usage: 1. Add $! after the template channel interface address (e.g., Guangdong Pearl River, http://xxx.m3u$!). - 2. Additional information can be appended (e.g., Guangdong Pearl River, http://xxx.m3u$! Additional Information) (#470). For more interface whitelists, please discuss at https://github.com/Guovin/IPTV/issues/514. + 2. Additional information can be appended (e.g., Guangdong Pearl River, http://xxx.m3u$! Additional Information) (#470). For more interface whitelists, please discuss at https://github.com/Guovin/iptv-api/issues/514. - ✨ Added 🈳 No Results Channel Category: Channels without results are categorized under this bottom category by default (#473). - ✨ Interface addresses now include source type descriptions. - ✨ Default templates now include Guangdong People's Livelihood (#481) and Guangzhou Comprehensive (#504). diff --git a/Dockerfile b/Dockerfile index 3c17ec3..5541d8b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,7 +14,7 @@ RUN PIPENV_VENV_IN_PROJECT=1 pipenv install --deploy\ FROM python:3.13-slim -ARG APP_WORKDIR=/iptv +ARG APP_WORKDIR=/iptv-api ARG LITE=False ENV APP_WORKDIR=$APP_WORKDIR @@ -47,10 +47,10 @@ RUN (crontab -l ; echo "0 0,12 * * * python $APP_WORKDIR/main.py &";) | crontab EXPOSE 8000 -COPY entrypoint.sh /iptv_entrypoint.sh +COPY entrypoint.sh /iptv-api-entrypoint.sh -COPY config /iptv_config +COPY config /iptv-api-config -RUN chmod +x /iptv_entrypoint.sh +RUN chmod +x /iptv-api-entrypoint.sh -ENTRYPOINT /iptv_entrypoint.sh \ No newline at end of file +ENTRYPOINT /iptv-api-entrypoint.sh \ No newline at end of file diff --git a/Pipfile b/Pipfile index 0ae10f8..2ce52cf 100644 --- a/Pipfile +++ b/Pipfile @@ -7,11 +7,11 @@ verify_ssl = true dev = "python main.py" service = "python service/app.py" ui = "python tkinter_ui/tkinter_ui.py" -docker_run = "docker run -v ./config:/iptv/config -v ./output:/iptv/output -d -p 8000:8000 guovern/iptv" -docker_run_lite = "docker run -v ./config:/iptv_lite/config -v ./output:/iptv_lite/output -d -p 8000:8000 guovern/iptv:lite" +docker_run = "docker run -v ./config:/iptv-api/config -v ./output:/iptv-api/output -d -p 8000:8000 guovern/iptv-api" +docker_run_lite = "docker run -v ./config:/iptv-api-lite/config -v ./output:/iptv-api-lite/output -d -p 8000:8000 guovern/iptv-api:lite" tkinter_build = "pyinstaller tkinter_ui/tkinter_ui.spec" -docker_build = "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 --build-arg APP_WORKDIR=/iptv -t guovern/iptv ." -docker_build_lite = "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 --build-arg APP_WORKDIR=/iptv_lite --build-arg LITE=True -t guovern/iptv:lite ." +docker_build = "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 --build-arg APP_WORKDIR=/iptv-api -t guovern/iptv-api ." +docker_build_lite = "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 --build-arg APP_WORKDIR=/iptv-api-lite --build-arg LITE=True -t guovern/iptv-api:lite ." [dev-packages] requests = "*" diff --git a/README.md b/README.md index 8790847..bc1bc01 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@English
- ⚠️ Python has been upgraded to version 3.13, which no longer supports Win7. If needed, please use version v1.5.3. -- ⚠️ The GitHub repository has been renamed to IPTV. If you are using the old API address, please update it to the new one promptly. -- ⚠️ The Docker image repository has been renamed to guovern/iptv (the previous tv-driver corresponds to guovern/iptv:latest, and tv-requests corresponds to guovern/iptv:lite). -- ✨ Change the speed measurement method (yt-dlp), reconstruct the speed measurement logic, improve accuracy, stability, and efficiency, and reduce interface switching delay. (#563) -- ✨ Support for ARM v7 has been added. (#562) -- ✨ A new way to follow the WeChat official account (search for: Govin) has been added. Following the official account will allow you to subscribe to update notifications and receive articles with usage tips. +- ⚠️ The GitHub repository has been renamed to iptv-api. If you are using the old API address, please update it to the new one promptly. +- ⚠️ New Docker image repository is now active: guovern/iptv-api (the old tv-driver is now guovern/iptv-api:latest, and tv-requests is now guovern/iptv-api:lite). iptv-api:latest is the full version, and iptv-api:lite is the lightweight version. Please use the new names to pull the images, as the old repository will no longer be maintained. +- ✨ A new way to follow the WeChat official account (search for: Govin) has been added. It is recommended to follow the official account to subscribe to update notifications, usage tips, and engage in discussions. +- ✨ The speed measurement method has been changed to yt-dlp, and the speed measurement logic has been refactored to improve accuracy, stability, and efficiency, reducing interface switching delay (#563). +- ✨ Support for ARM v7 has been added (#562). +- ✨ Dual result API access (ip/m3u, ip/txt) has been added (#581). +- ✨ A command to start the API service (pipenv run service) has been added. - 🪄 The size of the Docker image has been optimized. +- 🛠 The default update frequency has been adjusted to once every 12 hours. +- 🐛 Fixed the information delimiter issue for some players that do not support it (#581).-IPTV更新工具
+IPTV-API
自定义频道,自动获取直播源接口,测速验效后生成可用的结果@@ -62,17 +62,17 @@
- - + + - - + + - - + + @@ -80,8 +80,8 @@ - - + +
@@ -102,17 +102,17 @@ - 接口源: ```bash -https://ghproxy.net/raw.githubusercontent.com/Guovin/IPTV/gd/output/result.m3u +https://ghproxy.net/raw.githubusercontent.com/Guovin/iptv-api/gd/output/result.m3u ``` ```bash -https://ghproxy.net/raw.githubusercontent.com/Guovin/IPTV/gd/output/result.txt +https://ghproxy.net/raw.githubusercontent.com/Guovin/iptv-api/gd/output/result.txt ``` - 数据源: ```bash -https://ghproxy.net/raw.githubusercontent.com/Guovin/IPTV/gd/source.json +https://ghproxy.net/raw.githubusercontent.com/Guovin/iptv-api/gd/source.json ``` ## ⚙️ 配置 @@ -149,7 +149,7 @@ pipenv run service ### 方式三:GUI 软件 -1. 下载[IPTV 更新软件](https://github.com/Guovin/IPTV/releases),打开软件,点击更新,即可完成更新 +1. 下载[IPTV-API 更新软件](https://github.com/Guovin/iptv-api/releases),打开软件,点击更新,即可完成更新 2. 或者在项目目录下运行以下命令,即可打开 GUI 软件: @@ -157,39 +157,39 @@ pipenv run service pipenv run ui ``` - + ### 方式四:Docker -- iptv(完整版本):性能要求较高,更新速度较慢,稳定性、成功率高;修改配置 open_driver = False 可切换到 Lite 版本运行模式(推荐酒店源、组播源、关键字搜索使用此版本) -- iptv:lite(精简版本):轻量级,性能要求低,更新速度快,稳定性不确定(推荐订阅源使用此版本) +- iptv-api(完整版本):性能要求较高,更新速度较慢,稳定性、成功率高;修改配置 open_driver = False 可切换到 Lite 版本运行模式(推荐酒店源、组播源、关键字搜索使用此版本) +- iptv-api:lite(精简版本):轻量级,性能要求低,更新速度快,稳定性不确定(推荐订阅源使用此版本) 1. 拉取镜像: -- iptv: +- iptv-api: ```bash -docker pull guovern/iptv:latest +docker pull guovern/iptv-api:latest ``` -- iptv:lite: +- iptv-api:lite: ```bash -docker pull guovern/iptv:lite +docker pull guovern/iptv-api:lite ``` 2. 运行容器: -- iptv: +- iptv-api: ```bash -docker run -d -p 8000:8000 guovern/iptv +docker run -d -p 8000:8000 guovern/iptv-api ``` -- iptv:lite: +- iptv-api:lite: ```bash -docker run -d -p 8000:8000 guovern/iptv:lite +docker run -d -p 8000:8000 guovern/iptv-api:lite ``` 卷挂载参数(可选): @@ -197,16 +197,16 @@ docker run -d -p 8000:8000 guovern/iptv:lite 以宿主机路径/etc/docker 为例: -- iptv: +- iptv-api: ```bash -docker run -v /etc/docker/config:/iptv/config -v /etc/docker/output:/iptv/output -d -p 8000:8000 guovern/iptv +docker run -v /etc/docker/config:/iptv-api/config -v /etc/docker/output:/iptv-api/output -d -p 8000:8000 guovern/iptv-api ``` -- iptv:lite: +- iptv-api:lite: ```bash -docker run -v /etc/docker/config:/iptv_lite/config -v /etc/docker/output:/iptv_lite/output -d -p 8000:8000 guovern/iptv:lite +docker run -v /etc/docker/config:/iptv-api-lite/config -v /etc/docker/output:/iptv-api-lite/output -d -p 8000:8000 guovern/iptv-api:lite ``` 3. 更新结果: diff --git a/README_en.md b/README_en.md index a777bf6..0737239 100644 --- a/README_en.md +++ b/README_en.md @@ -1,6 +1,6 @@-IPTV update tool
+IPTV-API
Customize channels, automatically obtain live source interface, and generate usable results after speed test@@ -62,17 +62,17 @@
- - + + - - + + - - + + @@ -80,8 +80,8 @@ - - + +
@@ -102,17 +102,17 @@ - Interface source: ```bash -https://ghproxy.net/raw.githubusercontent.com/Guovin/TV/gd/output/result.m3u +https://ghproxy.net/raw.githubusercontent.com/Guovin/iptv-api/gd/output/result.m3u ``` ```bash -https://ghproxy.net/raw.githubusercontent.com/Guovin/TV/gd/output/result.txt +https://ghproxy.net/raw.githubusercontent.com/Guovin/iptv-api/gd/output/result.txt ``` - Data source: ```bash -https://ghproxy.net/raw.githubusercontent.com/Guovin/TV/gd/source.json +https://ghproxy.net/raw.githubusercontent.com/Guovin/iptv-api/gd/source.json ``` ## ⚙️ Config @@ -149,7 +149,7 @@ pipenv run service ### Method 3: GUI Software -1. Download [IPTV update software](https://github.com/Guovin/IPTV/releases), open the software, click update to complete the update +1. Download [IPTV-API update software](https://github.com/Guovin/iptv-api/releases), open the software, click update to complete the update 2. Or run the following command in the project directory to open the GUI software: @@ -157,41 +157,41 @@ pipenv run service pipenv run ui ``` - + ### Method 4: Docker -- iptv (Full version): Higher performance requirements, slower update speed, high stability and success rate. Set open_driver = False to switch to the lite running mode (recommended for hotel sources, multicast sources, and online searches) -- iptv:lite (Condensed version): Lightweight, low performance requirements, fast update speed, stability uncertain (recommend using this version for the subscription source) +- iptv-api (Full version): Higher performance requirements, slower update speed, high stability and success rate. Set open_driver = False to switch to the lite running mode (recommended for hotel sources, multicast sources, and online searches) +- iptv-api:lite (Condensed version): Lightweight, low performance requirements, fast update speed, stability uncertain (recommend using this version for the subscription source) It's recommended to try each one and choose the version that suits you 1. Pull the image: -- iptv +- iptv-api ```bash -docker pull guovern/iptv:latest +docker pull guovern/iptv-api:latest ``` -- iptv:lite +- iptv-api:lite ```bash -docker pull guovern/iptv:lite +docker pull guovern/iptv-api:lite ``` 2. Run the container: -- iptv +- iptv-api ```bash -docker run -d -p 8000:8000 guovern/iptv +docker run -d -p 8000:8000 guovern/iptv-api ``` -- iptv:lite +- iptv-api:lite ```bash -docker run -d -p 8000:8000 guovern/iptv:lite +docker run -d -p 8000:8000 guovern/iptv-api:lite ``` Volume Mount Parameter (Optional): @@ -199,16 +199,16 @@ This allows synchronization of files between the host machine and the container. Taking the host path /etc/docker as an example: -- iptv: +- iptv-api: ```bash -docker run -v /etc/docker/config:/iptv/config -v /etc/docker/output:/iptv/output -d -p 8000:8000 guovern/iptv +docker run -v /etc/docker/config:/iptv-api/config -v /etc/docker/output:/iptv-api/output -d -p 8000:8000 guovern/iptv-api ``` -- iptv:lite: +- iptv-api:lite: ```bash -docker run -v /etc/docker/config:/iptv_lite/config -v /etc/docker/output:/iptv_lite/output -d -p 8000:8000 guovern/iptv:lite +docker run -v /etc/docker/config:/iptv-api-lite/config -v /etc/docker/output:/iptv-api-lite/output -d -p 8000:8000 guovern/iptv-api:lite ``` 3. Update results: diff --git a/docs/tutorial.md b/docs/tutorial.md index e5b0290..040ebd3 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -23,7 +23,7 @@ ### 1. Star -打开 https://github.com/Guovin/IPTV ,点击 Star 收藏该项目(您的 Star 是我持续更新的动力) +打开 https://github.com/Guovin/iptv-api ,点击 Star 收藏该项目(您的 Star 是我持续更新的动力) ![Star](./images/star.png 'Star') ### 2. Watch @@ -195,7 +195,7 @@ pipenv run service ### 方式三:GUI 软件 -1. 下载[IPTV 更新软件](https://github.com/Guovin/IPTV/releases),打开软件,点击更新,即可完成更新 +1. 下载[IPTV-API 更新软件](https://github.com/Guovin/iptv-api/releases),打开软件,点击更新,即可完成更新 2. 或者在项目目录下运行以下命令,即可打开 GUI 软件: @@ -203,39 +203,39 @@ pipenv run service pipenv run ui ``` -![IPTV 更新软件](./images/ui.png 'IPTV 更新软件') +![IPTV-API 更新软件](./images/ui.png 'IPTV-API 更新软件') ### 方式四:Docker -- iptv(完整版本):性能要求较高,更新速度较慢,稳定性、成功率高;修改配置 open_driver = False 可切换到 Lite 版本运行模式(推荐酒店源、组播源、关键字搜索使用此版本) -- iptv:lite(精简版本):轻量级,性能要求低,更新速度快,稳定性不确定(推荐订阅源使用此版本) +- iptv-api(完整版本):性能要求较高,更新速度较慢,稳定性、成功率高;修改配置 open_driver = False 可切换到 Lite 版本运行模式(推荐酒店源、组播源、关键字搜索使用此版本) +- iptv-api:lite(精简版本):轻量级,性能要求低,更新速度快,稳定性不确定(推荐订阅源使用此版本) 1. 拉取镜像: -- iptv: +- iptv-api: ```bash -docker pull guovern/iptv:latest +docker pull guovern/iptv-api:latest ``` -- iptv:lite: +- iptv-api:lite: ```bash -docker pull guovern/iptv:lite +docker pull guovern/iptv-api:lite ``` 2. 运行容器: -- iptv: +- iptv-api: ```bash -docker run -d -p 8000:8000 guovern/iptv +docker run -d -p 8000:8000 guovern/iptv-api ``` -- iptv:lite: +- iptv-api:lite: ```bash -docker run -d -p 8000:8000 guovern/iptv:lite +docker run -d -p 8000:8000 guovern/iptv-api:lite ``` 卷挂载参数(可选): @@ -243,22 +243,24 @@ docker run -d -p 8000:8000 guovern/iptv:lite 以宿主机路径/etc/docker 为例: -- iptv: +- iptv-api: ```bash -docker run -v /etc/docker/config:/iptv/config -v /etc/docker/output:/iptv/output -d -p 8000:8000 guovern/iptv +docker run -v /etc/docker/config:/iptv-api/config -v /etc/docker/output:/iptv-api/output -d -p 8000:8000 guovern/iptv-api ``` -- iptv:lite: +- iptv-api:lite: ```bash -docker run -v /etc/docker/config:/iptv_lite/config -v /etc/docker/output:/iptv_lite/output -d -p 8000:8000 guovern/iptv:lite +docker run -v /etc/docker/config:/iptv-api-lite/config -v /etc/docker/output:/iptv-api-lite/output -d -p 8000:8000 guovern/iptv-api:lite ``` 3. 更新结果: - 接口地址:ip:8000 -- 接口详情:ip:8000/result +- M3u 接口:ip:8000/m3u +- Txt 接口:ip:8000/txt +- 接口内容:ip:8000/content - 测速日志:ip:8000/log ### 上传更新文件至仓库(可选) diff --git a/docs/tutorial_en.md b/docs/tutorial_en.md index 25b4862..ebf8cf5 100644 --- a/docs/tutorial_en.md +++ b/docs/tutorial_en.md @@ -23,7 +23,7 @@ Since this project will continue to iterate and improve, if you want to get the ### 1. Star -Go to https://github.com/Guovin/IPTV, click on Star to bookmark this project (Your Star is my motivation to keep updating). +Go to https://github.com/Guovin/iptv-api, click on Star to bookmark this project (Your Star is my motivation to keep updating). ![Star](./images/star.png 'Star') ### 2. Watch @@ -192,7 +192,7 @@ pipenv run service ### Method 3: GUI Software -1. Download [IPTV update software](https://github.com/Guovin/IPTV/releases), open the software, click update to complete the update. +1. Download [IPTV-API software](https://github.com/Guovin/iptv-api/releases), open the software, click update to complete the update. 2. Alternatively, run the following command in the project directory to open the GUI software: @@ -200,41 +200,41 @@ pipenv run service pipenv run ui ``` -![IPTV update software](./images/ui.png 'IPTV update software') +![IPTV-API software](./images/ui.png 'IPTV-API software') ### Method 4: Docker -- iptv (Full version): Higher performance requirements, slower update speed, high stability and success rate. Set open_driver = False to switch to the lite running mode (recommended for hotel sources, multicast sources, and online searches) -- iptv:lite (Condensed version): Lightweight, low performance requirements, fast update speed, stability uncertain (recommend using this version for the subscription source) +- iptv-api (Full version): Higher performance requirements, slower update speed, high stability and success rate. Set open_driver = False to switch to the lite running mode (recommended for hotel sources, multicast sources, and online searches) +- iptv-api:lite (Condensed version): Lightweight, low performance requirements, fast update speed, stability uncertain (recommend using this version for the subscription source) It's recommended to try each one and choose the version that suits you 1. Pull the image: -- iptv +- iptv-api ```bash -docker pull guovern/iptv:latest +docker pull guovern/iptv-api:latest ``` -- iptv:lite +- iptv-api:lite ```bash -docker pull guovern/iptv:lite +docker pull guovern/iptv-api:lite ``` 2. Run the container: -- iptv +- iptv-api ```bash -docker run -d -p 8000:8000 guovern/iptv +docker run -d -p 8000:8000 guovern/iptv-api ``` -- iptv:lite +- iptv-api:lite ```bash -docker run -d -p 8000:8000 guovern/iptv:lite +docker run -d -p 8000:8000 guovern/iptv-api:lite ``` Volume Mount Parameter (Optional): @@ -242,22 +242,24 @@ This allows synchronization of files between the host machine and the container. Taking the host path /etc/docker as an example: -- iptv: +- iptv-api: ```bash -docker run -v /etc/docker/config:/iptv/config -v /etc/docker/output:/iptv/output -d -p 8000:8000 guovern/iptv +docker run -v /etc/docker/config:/iptv-api/config -v /etc/docker/output:/iptv-api/output -d -p 8000:8000 guovern/iptv-api ``` -- iptv:lite: +- iptv-api:lite: ```bash -docker run -v /etc/docker/config:/iptv_lite/config -v /etc/docker/output:/iptv_lite/output -d -p 8000:8000 guovern/iptv:lite +docker run -v /etc/docker/config:/iptv-api-lite/config -v /etc/docker/output:/iptv-api-lite/output -d -p 8000:8000 guovern/iptv-api:lite ``` 3. Update results: - API address: ip:8000 -- API details: ip:8000/result +- M3u api:ip:8000/m3u +- Txt api:ip:8000/txt +- API content: ip:8000/content - Speed test log: ip:8000/log ### Update the File to the Repository(optional) diff --git a/entrypoint.sh b/entrypoint.sh index ed62456..9431678 100644 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -1,6 +1,6 @@ #!/bin/bash -for file in /iptv_config/*; do +for file in /iptv-api-config/*; do filename=$(basename "$file") target_file="$APP_WORKDIR/config/$filename" if [ ! -e "$target_file" ]; then diff --git a/tkinter_ui/about.py b/tkinter_ui/about.py index 5f6f441..3b4f2da 100644 --- a/tkinter_ui/about.py +++ b/tkinter_ui/about.py @@ -44,14 +44,14 @@ class AboutUI: project_label.pack() project_link = tk.Label( project_row_column2, - text="https://github.com/Guovin/IPTV", + text="https://github.com/Guovin/iptv-api", fg="blue", cursor="hand2", ) project_link.pack() project_link.bind( "", - lambda e: webbrowser.open_new_tab("https://github.com/Guovin/IPTV"), + lambda e: webbrowser.open_new_tab("https://github.com/Guovin/iptv-api"), ) disclaimer_label = tk.Label( diff --git a/tkinter_ui/tkinter_ui.spec b/tkinter_ui/tkinter_ui.spec index 068936c..8f4912d 100644 --- a/tkinter_ui/tkinter_ui.spec +++ b/tkinter_ui/tkinter_ui.spec @@ -45,7 +45,7 @@ exe = EXE( a.binaries, a.datas, [], - name='IPTV', + name='IPTV-API', debug=True, bootloader_ignore_signals=False, strip=False, diff --git a/version.json b/version.json index d324451..e1c14d6 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { "version": "1.5.4", - "name": "IPTV" + "name": "IPTV-API" } \ No newline at end of file From 36903d7f3029150ba20f9903e0145ac07a36337b Mon Sep 17 00:00:00 2001 From: "guorong.zheng" <360996299@qq.com> Date: Thu, 28 Nov 2024 16:38:09 +0800 Subject: [PATCH 27/37] chore:schedule interval --- .github/workflows/main.yml | 3 ++- CHANGELOG.md | 2 -- Dockerfile | 4 +++- README.md | 2 +- README_en.md | 2 +- docs/tutorial.md | 9 +++++---- docs/tutorial_en.md | 7 ++++--- 7 files changed, 16 insertions(+), 13 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index e8b7562..777f336 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -2,7 +2,8 @@ name: 'Update schedule' on: schedule: - - cron: '0 0,12 * * *' + - cron: '0 22 * * *' + - cron: '0 10 * * *' workflow_dispatch: branches: - master diff --git a/CHANGELOG.md b/CHANGELOG.md index bb61b39..62657db 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,7 +13,6 @@ - ✨ 新增双结果 API 访问(ip/m3u, ip/txt)(#581) - ✨ 新增启动 API 服务命令(pipenv run service) - 🪄 优化 Docker 镜像大小 -- 🛠 调整默认更新频率为 12 小时一次 - 🐛 修复部分播放器不支持的信息间隔符(#581) @@ -28,7 +27,6 @@ - ✨ Dual result API access (ip/m3u, ip/txt) has been added (#581). - ✨ A command to start the API service (pipenv run service) has been added. - 🪄 The size of the Docker image has been optimized. -- 🛠 The default update frequency has been adjusted to once every 12 hours. - 🐛 Fixed the information delimiter issue for some players that do not support it (#581).diff --git a/Dockerfile b/Dockerfile index 5541d8b..8881e6b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -43,7 +43,9 @@ RUN apt-get update && apt-get install -y --no-install-recommends cron RUN if [ "$LITE" = False ]; then apt-get install -y --no-install-recommends chromium chromium-driver; fi \ && apt-get clean && rm -rf /var/lib/apt/lists/* -RUN (crontab -l ; echo "0 0,12 * * * python $APP_WORKDIR/main.py &";) | crontab - +RUN (crontab -l ; \ + echo "0 22 * * * python $APP_WORKDIR/main.py &"; \ + echo "0 10 * * * python $APP_WORKDIR/main.py &") | crontab - EXPOSE 8000 diff --git a/README.md b/README.md index bc1bc01..3f10369 100644 --- a/README.md +++ b/README.md @@ -93,7 +93,7 @@ - ✅ 支持多种获取源方式:组播源、酒店源、订阅源、关键字搜索 - ✅ 接口测速验效,响应时间、分辨率优先级,过滤无效接口 - ✅ 偏好设置:IPv6、接口来源排序优先级与数量配置、接口白名单 -- ✅ 定时执行,间隔 12 小时更新一次 +- ✅ 定时执行,北京时间每日 6:00 与 18:00 执行更新 - ✅ 支持多种运行方式:工作流、命令行、GUI 软件、Docker(amd64/arm64/arm v7) - ✨ 更多功能请见[配置参数](./docs/config.md) diff --git a/README_en.md b/README_en.md index 0737239..d284461 100644 --- a/README_en.md +++ b/README_en.md @@ -93,7 +93,7 @@ - ✅ Supports multiple source acquisition methods: multicast source, hotel source, subscription source, keyword search - ✅ Interface speed testing and verification, with priority on response time and resolution, filtering out ineffective interfaces - ✅ Preferences: IPv6, priority and quantity of interface source sorting, and interface whitelist -- ✅ The value is updated every 12 hours +- ✅ Scheduled execution at 6:00 AM and 18:00 PM Beijing time daily - ✅ Supports various execution methods: workflows, command line, GUI software, Docker(amd64/arm64/arm v7) - ✨ For more features, see [Config parameter](./docs/config_en.md) diff --git a/docs/tutorial.md b/docs/tutorial.md index 040ebd3..e8b1f08 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -149,16 +149,17 @@ https://mirror.ghproxy.com/raw.githubusercontent.com/您的github用户名/仓 如果访问该链接能正常返回更新后的接口内容,说明您的直播源接口链接已经大功告成了!将该链接复制粘贴到 TVBox 等软件配置栏中即可使用~ -- 注意:除了首次执行工作流需要您手动触发,后续执行(默认间隔 12 小时)将自动触发。如果您修改了模板或配置文件想立刻执行更新,可手动触发(2)中的 Run workflow 即可。 +- 注意:除了首次执行工作流需要您手动触发,后续执行(默认北京时间每日 6:00 与 18:00)将自动触发。如果您修改了模板或配置文件想立刻执行更新,可手动触发(2)中的 Run workflow 即可。 ### 4.修改工作流更新频率(可选) -如果您想修改更新频率(默认间隔 12 小时),可修改 on:schedule:- cron 字段: +如果您想修改更新频率(默认北京时间每日 6:00 与 18:00),可修改 on:schedule:- cron 字段: ![.github/workflows/main.yml](./images/schedule-cron.png '.github/workflows/main.yml') -如果您想 每 2 天执行一次更新可以这样修改: +如果您想 每 2 天执行更新可以这样修改: ```bash -- cron: '0 0 */2 * *' +- cron: '0 22 */2 * *' +- cron: '0 10 */2 * *' ``` #### 1. 强烈不建议修改更新频率过高,因为短时间内的接口内容并无差异,过高的更新频率与高耗时运行的工作流都有可能被判定为资源滥用,导致仓库与账户被封禁的风险。 diff --git a/docs/tutorial_en.md b/docs/tutorial_en.md index ebf8cf5..dae4881 100644 --- a/docs/tutorial_en.md +++ b/docs/tutorial_en.md @@ -146,16 +146,17 @@ https://mirror.ghproxy.com/raw.githubusercontent.com/your github username/reposi If you can access this link and it returns the updated interface content, then your live source interface link has been successfully created! Simply copy and paste this link into software like TVBox in the configuration field to use~ -- Note: Except for the first execution of the workflow, which requires you to manually trigger it, subsequent executions (The default interval is 12 hours) will be automatically triggered. If you have modified the template or configuration files and want to execute the update immediately, you can manually trigger (2) Run workflow. +- Note: Except for the first execution of the workflow, which requires you to manually trigger it, subsequent executions (default: 6:00 AM and 18:00 PM Beijing time daily) will be automatically triggered. If you have modified the template or configuration files and want to execute the update immediately, you can manually trigger (2) Run workflow. ### 4.Modify Workflow Update Frequency(optional) -If you want to modify the update frequency (The default interval is 12 hours), you can modify the on:schedule:- cron field. +If you want to modify the update frequency (default: 6:00 AM and 18:00 PM Beijing time daily), you can modify the on:schedule:- cron field. ![.github/workflows/main.yml](./images/schedule-cron.png '.github/workflows/main.yml') If you want to perform updates every 2 days, you can modify it like this: ```bash -- cron: '0 0 */2 * *' +- cron: '0 22 */2 * *' +- cron: '0 10 */2 * *' ``` #### 1. It is strongly not recommended to modify and update too frequently, because the interface content does not differ within a short period of time, and too high update frequency and time-consuming workflow may be judged as resource abuse, resulting in the risk of warehouse and account being blocked. From 35609ca573a151f846f010f0dd765f0ea0c959e3 Mon Sep 17 00:00:00 2001 From: "guorong.zheng" <360996299@qq.com> Date: Thu, 28 Nov 2024 17:51:52 +0800 Subject: [PATCH 28/37] chore --- main.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/main.py b/main.py index 17edf95..e17ba3a 100644 --- a/main.py +++ b/main.py @@ -25,10 +25,8 @@ from updates.multicast import get_channels_by_multicast from updates.hotel import get_channels_by_hotel from updates.fofa import get_channels_by_fofa from updates.online_search import get_channels_by_online_search -import os from tqdm import tqdm from time import time -import atexit import pickle import copy From 7da9a500db53114fec8ec71ac720dfff339a01d7 Mon Sep 17 00:00:00 2001 From: "guorong.zheng" <360996299@qq.com> Date: Fri, 29 Nov 2024 11:29:15 +0800 Subject: [PATCH 29/37] fix:docker crontab run fail --- Dockerfile | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 8881e6b..8dd40aa 100644 --- a/Dockerfile +++ b/Dockerfile @@ -43,9 +43,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends cron RUN if [ "$LITE" = False ]; then apt-get install -y --no-install-recommends chromium chromium-driver; fi \ && apt-get clean && rm -rf /var/lib/apt/lists/* -RUN (crontab -l ; \ - echo "0 22 * * * python $APP_WORKDIR/main.py &"; \ - echo "0 10 * * * python $APP_WORKDIR/main.py &") | crontab - +RUN (crontab -l ; echo "0 */12 * * * cd $APP_WORKDIR && /.venv/bin/python main.py";) | crontab - EXPOSE 8000 From 83f0e8194c8398df8c82d4e9a2f6e47ea191299d Mon Sep 17 00:00:00 2001 From: "guorong.zheng" <360996299@qq.com> Date: Fri, 29 Nov 2024 11:35:15 +0800 Subject: [PATCH 30/37] chore:update interval --- .github/workflows/main.yml | 3 +-- README.md | 2 +- README_en.md | 2 +- docs/tutorial.md | 5 ++--- docs/tutorial_en.md | 5 ++--- 5 files changed, 7 insertions(+), 10 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 777f336..6e1ed27 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -2,8 +2,7 @@ name: 'Update schedule' on: schedule: - - cron: '0 22 * * *' - - cron: '0 10 * * *' + - cron: '0 */12 * * *' workflow_dispatch: branches: - master diff --git a/README.md b/README.md index 3f10369..8558e79 100644 --- a/README.md +++ b/README.md @@ -93,7 +93,7 @@ - ✅ 支持多种获取源方式:组播源、酒店源、订阅源、关键字搜索 - ✅ 接口测速验效,响应时间、分辨率优先级,过滤无效接口 - ✅ 偏好设置:IPv6、接口来源排序优先级与数量配置、接口白名单 -- ✅ 定时执行,北京时间每日 6:00 与 18:00 执行更新 +- ✅ 定时执行,每 12 小时更新一次 - ✅ 支持多种运行方式:工作流、命令行、GUI 软件、Docker(amd64/arm64/arm v7) - ✨ 更多功能请见[配置参数](./docs/config.md) diff --git a/README_en.md b/README_en.md index d284461..91ee763 100644 --- a/README_en.md +++ b/README_en.md @@ -93,7 +93,7 @@ - ✅ Supports multiple source acquisition methods: multicast source, hotel source, subscription source, keyword search - ✅ Interface speed testing and verification, with priority on response time and resolution, filtering out ineffective interfaces - ✅ Preferences: IPv6, priority and quantity of interface source sorting, and interface whitelist -- ✅ Scheduled execution at 6:00 AM and 18:00 PM Beijing time daily +- ✅ The result is updated every 12 hours - ✅ Supports various execution methods: workflows, command line, GUI software, Docker(amd64/arm64/arm v7) - ✨ For more features, see [Config parameter](./docs/config_en.md) diff --git a/docs/tutorial.md b/docs/tutorial.md index e8b1f08..006f4ee 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -149,17 +149,16 @@ https://mirror.ghproxy.com/raw.githubusercontent.com/您的github用户名/仓 如果访问该链接能正常返回更新后的接口内容,说明您的直播源接口链接已经大功告成了!将该链接复制粘贴到 TVBox 等软件配置栏中即可使用~ -- 注意:除了首次执行工作流需要您手动触发,后续执行(默认北京时间每日 6:00 与 18:00)将自动触发。如果您修改了模板或配置文件想立刻执行更新,可手动触发(2)中的 Run workflow 即可。 +- 注意:除了首次执行工作流需要您手动触发,后续执行(默认每 12 小时)将自动触发。如果您修改了模板或配置文件想立刻执行更新,可手动触发(2)中的 Run workflow 即可。 ### 4.修改工作流更新频率(可选) -如果您想修改更新频率(默认北京时间每日 6:00 与 18:00),可修改 on:schedule:- cron 字段: +如果您想修改更新频率(默认每 12 小时),可修改 on:schedule:- cron 字段: ![.github/workflows/main.yml](./images/schedule-cron.png '.github/workflows/main.yml') 如果您想 每 2 天执行更新可以这样修改: ```bash - cron: '0 22 */2 * *' -- cron: '0 10 */2 * *' ``` #### 1. 强烈不建议修改更新频率过高,因为短时间内的接口内容并无差异,过高的更新频率与高耗时运行的工作流都有可能被判定为资源滥用,导致仓库与账户被封禁的风险。 diff --git a/docs/tutorial_en.md b/docs/tutorial_en.md index dae4881..47dd07b 100644 --- a/docs/tutorial_en.md +++ b/docs/tutorial_en.md @@ -146,17 +146,16 @@ https://mirror.ghproxy.com/raw.githubusercontent.com/your github username/reposi If you can access this link and it returns the updated interface content, then your live source interface link has been successfully created! Simply copy and paste this link into software like TVBox in the configuration field to use~ -- Note: Except for the first execution of the workflow, which requires you to manually trigger it, subsequent executions (default: 6:00 AM and 18:00 PM Beijing time daily) will be automatically triggered. If you have modified the template or configuration files and want to execute the update immediately, you can manually trigger (2) Run workflow. +- Note: Except for the first execution of the workflow, which requires you to manually trigger it, subsequent executions (default every 12 hours) will be automatically triggered. If you have modified the template or configuration files and want to execute the update immediately, you can manually trigger (2) Run workflow. ### 4.Modify Workflow Update Frequency(optional) -If you want to modify the update frequency (default: 6:00 AM and 18:00 PM Beijing time daily), you can modify the on:schedule:- cron field. +If you want to modify the update frequency (default every 12 hours), you can modify the on:schedule:- cron field. ![.github/workflows/main.yml](./images/schedule-cron.png '.github/workflows/main.yml') If you want to perform updates every 2 days, you can modify it like this: ```bash - cron: '0 22 */2 * *' -- cron: '0 10 */2 * *' ``` #### 1. It is strongly not recommended to modify and update too frequently, because the interface content does not differ within a short period of time, and too high update frequency and time-consuming workflow may be judged as resource abuse, resulting in the risk of warehouse and account being blocked. From dfbd000cb46183025142517154ae1996f635802d Mon Sep 17 00:00:00 2001 From: "guorong.zheng" <360996299@qq.com> Date: Fri, 29 Nov 2024 11:38:41 +0800 Subject: [PATCH 31/37] chore:changelog --- CHANGELOG.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 62657db..209a2b8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,17 +2,18 @@ ## v1.5.4 -### 2024/11/28 +### 2024/11/29 - ⚠️ Python 升级至 3.13,该版本已不支持 Win7,若有需要请使用 v1.5.3 - ⚠️ Github 仓库改名:iptv-api,使用旧接口地址请及时更换新地址 - ⚠️ Docker 新镜像仓库启用:guovern/iptv-api(旧版的 tv-driver 改为:guovern/iptv-api:latest,tv-requests 改为 guovern/iptv-api:lite),iptv-api:latest 为完整版、iptv-api:lite 为精简版,请使用新的名称命令进行拉取,旧仓库将不再维护 -- ✨ 新增微信公众号关注途径(公众号搜索:Govin),推荐关注公众号,可订阅更新通知与使用技巧等文章推送,还可进行交流讨论 +- ❤️ 新增微信公众号关注途径(公众号搜索:Govin),推荐关注公众号,可订阅更新通知与使用技巧等文章推送,还可进行交流讨论 - ✨ 更换测速方法(yt-dlp),重构测速逻辑,提升准确性、稳定性与效率,减小接口切换延迟(#563) - ✨ 新增支持 ARM v7(#562) - ✨ 新增双结果 API 访问(ip/m3u, ip/txt)(#581) - ✨ 新增启动 API 服务命令(pipenv run service) - 🪄 优化 Docker 镜像大小 +- 🛠 调整更新频率,每 12 小时执行一次 - 🐛 修复部分播放器不支持的信息间隔符(#581)@@ -21,12 +22,13 @@ - ⚠️ Python has been upgraded to version 3.13, which no longer supports Win7. If needed, please use version v1.5.3. - ⚠️ The GitHub repository has been renamed to iptv-api. If you are using the old API address, please update it to the new one promptly. - ⚠️ New Docker image repository is now active: guovern/iptv-api (the old tv-driver is now guovern/iptv-api:latest, and tv-requests is now guovern/iptv-api:lite). iptv-api:latest is the full version, and iptv-api:lite is the lightweight version. Please use the new names to pull the images, as the old repository will no longer be maintained. -- ✨ A new way to follow the WeChat official account (search for: Govin) has been added. It is recommended to follow the official account to subscribe to update notifications, usage tips, and engage in discussions. +- ❤️ A new way to follow the WeChat official account (search for: Govin) has been added. It is recommended to follow the official account to subscribe to update notifications, usage tips, and engage in discussions. - ✨ The speed measurement method has been changed to yt-dlp, and the speed measurement logic has been refactored to improve accuracy, stability, and efficiency, reducing interface switching delay (#563). - ✨ Support for ARM v7 has been added (#562). - ✨ Dual result API access (ip/m3u, ip/txt) has been added (#581). - ✨ A command to start the API service (pipenv run service) has been added. - 🪄 The size of the Docker image has been optimized. +- 🛠 Adjust the update frequency to be performed every 12 hours. - 🐛 Fixed the information delimiter issue for some players that do not support it (#581).From 61716e1724e79cab792ea3a9aaeeac32f3f94cc7 Mon Sep 17 00:00:00 2001 From: "guorong.zheng" <360996299@qq.com> Date: Fri, 29 Nov 2024 13:40:43 +0800 Subject: [PATCH 32/37] chore:interval --- .github/workflows/main.yml | 3 ++- Dockerfile | 4 +++- README.md | 2 +- README_en.md | 2 +- docs/tutorial.md | 5 +++-- docs/tutorial_en.md | 5 +++-- 6 files changed, 13 insertions(+), 8 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 6e1ed27..777f336 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -2,7 +2,8 @@ name: 'Update schedule' on: schedule: - - cron: '0 */12 * * *' + - cron: '0 22 * * *' + - cron: '0 10 * * *' workflow_dispatch: branches: - master diff --git a/Dockerfile b/Dockerfile index 8dd40aa..3469c00 100644 --- a/Dockerfile +++ b/Dockerfile @@ -43,7 +43,9 @@ RUN apt-get update && apt-get install -y --no-install-recommends cron RUN if [ "$LITE" = False ]; then apt-get install -y --no-install-recommends chromium chromium-driver; fi \ && apt-get clean && rm -rf /var/lib/apt/lists/* -RUN (crontab -l ; echo "0 */12 * * * cd $APP_WORKDIR && /.venv/bin/python main.py";) | crontab - +RUN (crontab -l ; \ + echo "0 22 * * * cd $APP_WORKDIR && /.venv/bin/python main.py"; \ + echo "0 10 * * * cd $APP_WORKDIR && /.venv/bin/python main.py") | crontab - EXPOSE 8000 diff --git a/README.md b/README.md index 8558e79..3f10369 100644 --- a/README.md +++ b/README.md @@ -93,7 +93,7 @@ - ✅ 支持多种获取源方式:组播源、酒店源、订阅源、关键字搜索 - ✅ 接口测速验效,响应时间、分辨率优先级,过滤无效接口 - ✅ 偏好设置:IPv6、接口来源排序优先级与数量配置、接口白名单 -- ✅ 定时执行,每 12 小时更新一次 +- ✅ 定时执行,北京时间每日 6:00 与 18:00 执行更新 - ✅ 支持多种运行方式:工作流、命令行、GUI 软件、Docker(amd64/arm64/arm v7) - ✨ 更多功能请见[配置参数](./docs/config.md) diff --git a/README_en.md b/README_en.md index 91ee763..d284461 100644 --- a/README_en.md +++ b/README_en.md @@ -93,7 +93,7 @@ - ✅ Supports multiple source acquisition methods: multicast source, hotel source, subscription source, keyword search - ✅ Interface speed testing and verification, with priority on response time and resolution, filtering out ineffective interfaces - ✅ Preferences: IPv6, priority and quantity of interface source sorting, and interface whitelist -- ✅ The result is updated every 12 hours +- ✅ Scheduled execution at 6:00 AM and 18:00 PM Beijing time daily - ✅ Supports various execution methods: workflows, command line, GUI software, Docker(amd64/arm64/arm v7) - ✨ For more features, see [Config parameter](./docs/config_en.md) diff --git a/docs/tutorial.md b/docs/tutorial.md index 006f4ee..e8b1f08 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -149,16 +149,17 @@ https://mirror.ghproxy.com/raw.githubusercontent.com/您的github用户名/仓 如果访问该链接能正常返回更新后的接口内容,说明您的直播源接口链接已经大功告成了!将该链接复制粘贴到 TVBox 等软件配置栏中即可使用~ -- 注意:除了首次执行工作流需要您手动触发,后续执行(默认每 12 小时)将自动触发。如果您修改了模板或配置文件想立刻执行更新,可手动触发(2)中的 Run workflow 即可。 +- 注意:除了首次执行工作流需要您手动触发,后续执行(默认北京时间每日 6:00 与 18:00)将自动触发。如果您修改了模板或配置文件想立刻执行更新,可手动触发(2)中的 Run workflow 即可。 ### 4.修改工作流更新频率(可选) -如果您想修改更新频率(默认每 12 小时),可修改 on:schedule:- cron 字段: +如果您想修改更新频率(默认北京时间每日 6:00 与 18:00),可修改 on:schedule:- cron 字段: ![.github/workflows/main.yml](./images/schedule-cron.png '.github/workflows/main.yml') 如果您想 每 2 天执行更新可以这样修改: ```bash - cron: '0 22 */2 * *' +- cron: '0 10 */2 * *' ``` #### 1. 强烈不建议修改更新频率过高,因为短时间内的接口内容并无差异,过高的更新频率与高耗时运行的工作流都有可能被判定为资源滥用,导致仓库与账户被封禁的风险。 diff --git a/docs/tutorial_en.md b/docs/tutorial_en.md index 47dd07b..dae4881 100644 --- a/docs/tutorial_en.md +++ b/docs/tutorial_en.md @@ -146,16 +146,17 @@ https://mirror.ghproxy.com/raw.githubusercontent.com/your github username/reposi If you can access this link and it returns the updated interface content, then your live source interface link has been successfully created! Simply copy and paste this link into software like TVBox in the configuration field to use~ -- Note: Except for the first execution of the workflow, which requires you to manually trigger it, subsequent executions (default every 12 hours) will be automatically triggered. If you have modified the template or configuration files and want to execute the update immediately, you can manually trigger (2) Run workflow. +- Note: Except for the first execution of the workflow, which requires you to manually trigger it, subsequent executions (default: 6:00 AM and 18:00 PM Beijing time daily) will be automatically triggered. If you have modified the template or configuration files and want to execute the update immediately, you can manually trigger (2) Run workflow. ### 4.Modify Workflow Update Frequency(optional) -If you want to modify the update frequency (default every 12 hours), you can modify the on:schedule:- cron field. +If you want to modify the update frequency (default: 6:00 AM and 18:00 PM Beijing time daily), you can modify the on:schedule:- cron field. ![.github/workflows/main.yml](./images/schedule-cron.png '.github/workflows/main.yml') If you want to perform updates every 2 days, you can modify it like this: ```bash - cron: '0 22 */2 * *' +- cron: '0 10 */2 * *' ``` #### 1. It is strongly not recommended to modify and update too frequently, because the interface content does not differ within a short period of time, and too high update frequency and time-consuming workflow may be judged as resource abuse, resulting in the risk of warehouse and account being blocked. From ed6eb1504ac5c22e6701a2e8acd2dcf085fd535d Mon Sep 17 00:00:00 2001 From: "guorong.zheng" <360996299@qq.com> Date: Fri, 29 Nov 2024 14:07:22 +0800 Subject: [PATCH 33/37] feat:navigation --- README.md | 13 ++++++++++++- README_en.md | 13 ++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3f10369..1ad848a 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,7 @@ - + @@ -87,6 +87,17 @@ [English](./README_en.md) | 中文 +- [✅ 特点](#✅-特点) +- [🔗 最新结果](#🔗-最新结果) +- [⚙️ 配置参数](./docs/config.md) +- [🚀 快速上手](#🚀-快速上手) +- [📖 详细教程](./docs/tutorial.md) +- [🗓️ 更新日志](./CHANGELOG.md) +- [💰️ 赞赏](#💰️-赞赏) +- [👀 关注](#👀-关注) +- [📣 免责声明](#📣-免责声明) +- [⚖️ 许可证](#⚖️-许可证) + ## ✅ 特点 - ✅ 自定义模板,生成您想要的频道 diff --git a/README_en.md b/README_en.md index d284461..4bd1828 100644 --- a/README_en.md +++ b/README_en.md @@ -72,7 +72,7 @@ - + @@ -87,6 +87,17 @@ [中文](./README.md) | English +- [✅ Features](#✅-features) +- [🔗 Latest results](#🔗-latest-results) +- [⚙️ Config parameter](./docs/config_en.md) +- [🚀 Quick Start](#🚀-quick-start) +- [📖 Detailed Tutorial](./docs/tutorial_en.md) +- [🗓️ Changelog](./CHANGELOG.md) +- [💰️ Appreciate](#💰️-appreciate) +- [👀 Follow](#👀-follow) +- [📣 Disclaimer](#📣-disclaimer) +- [⚖️ License](#⚖️-license) + ## ✅ Features - ✅ Customize the template to generate the channel you want From 42f4b321ab815645dd19a306f4a2bc17d524113b Mon Sep 17 00:00:00 2001 From: "guorong.zheng" <360996299@qq.com> Date: Fri, 29 Nov 2024 14:40:38 +0800 Subject: [PATCH 34/37] update:changelog --- CHANGELOG.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 209a2b8..233ad31 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,8 +12,7 @@ - ✨ 新增支持 ARM v7(#562) - ✨ 新增双结果 API 访问(ip/m3u, ip/txt)(#581) - ✨ 新增启动 API 服务命令(pipenv run service) -- 🪄 优化 Docker 镜像大小 -- 🛠 调整更新频率,每 12 小时执行一次 +- 🪄 优化 Docker 镜像大小(完整版:-25%,精简版:-66%) - 🐛 修复部分播放器不支持的信息间隔符(#581)@@ -27,8 +26,7 @@ - ✨ Support for ARM v7 has been added (#562). - ✨ Dual result API access (ip/m3u, ip/txt) has been added (#581). - ✨ A command to start the API service (pipenv run service) has been added. -- 🪄 The size of the Docker image has been optimized. -- 🛠 Adjust the update frequency to be performed every 12 hours. +- 🪄 The size of the Docker image has been optimized (Full version: -25%, Lite version: -66%). - 🐛 Fixed the information delimiter issue for some players that do not support it (#581).From 2a3ee247ae2b097aa06feded31c4c0de47457231 Mon Sep 17 00:00:00 2001 From: Govin <37107669+Guovin@users.noreply.github.com> Date: Fri, 29 Nov 2024 14:52:47 +0800 Subject: [PATCH 35/37] Update README.md --- README.md | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 1ad848a..be8d9ac 100644 --- a/README.md +++ b/README.md @@ -87,18 +87,18 @@ [English](./README_en.md) | 中文 -- [✅ 特点](#✅-特点) -- [🔗 最新结果](#🔗-最新结果) +- [✅ 特点](#特点) +- [🔗 最新结果](#最新结果) - [⚙️ 配置参数](./docs/config.md) -- [🚀 快速上手](#🚀-快速上手) +- [🚀 快速上手](#快速上手) - [📖 详细教程](./docs/tutorial.md) - [🗓️ 更新日志](./CHANGELOG.md) -- [💰️ 赞赏](#💰️-赞赏) -- [👀 关注](#👀-关注) -- [📣 免责声明](#📣-免责声明) -- [⚖️ 许可证](#⚖️-许可证) +- [💰️ 赞赏](#赞赏) +- [👀 关注](#关注) +- [📣 免责声明](#免责声明) +- [⚖️ 许可证](#许可证) -## ✅ 特点 +## 特点 - ✅ 自定义模板,生成您想要的频道 - ✅ 支持多种获取源方式:组播源、酒店源、订阅源、关键字搜索 @@ -108,7 +108,7 @@ - ✅ 支持多种运行方式:工作流、命令行、GUI 软件、Docker(amd64/arm64/arm v7) - ✨ 更多功能请见[配置参数](./docs/config.md) -## 🔗 最新结果 +## 最新结果 - 接口源: @@ -126,11 +126,11 @@ https://ghproxy.net/raw.githubusercontent.com/Guovin/iptv-api/gd/output/result.t https://ghproxy.net/raw.githubusercontent.com/Guovin/iptv-api/gd/source.json ``` -## ⚙️ 配置 +## 配置 [配置参数](./docs/config.md) -## 🚀 快速上手 +## 快速上手 ### 方式一:工作流 @@ -228,11 +228,11 @@ docker run -v /etc/docker/config:/iptv-api-lite/config -v /etc/docker/output:/ip - 接口内容:ip:8000/content - 测速日志:ip:8000/log -## 🗓️ 更新日志 +## 更新日志 [更新日志](./CHANGELOG.md) -## 💰️ 赞赏 +## 赞赏开发维护不易,请我喝杯咖啡☕️吧~@@ -240,16 +240,16 @@ docker run -v /etc/docker/config:/iptv-api-lite/config -v /etc/docker/output:/ip | ----------------------------------------- | ------------------------------------------- | | ![支付宝扫码](./static/images/alipay.jpg) | ![微信扫码](./static/images/appreciate.jpg) | -## 👀 关注 +## 关注 微信公众号搜索 Govin,或扫码,接收更新推送、学习更多使用技巧: ![微信公众号](./static/images/qrcode.jpg) -## 📣 免责声明 +## 免责声明 本项目仅供学习交流用途,接口数据均来源于网络,如有侵权,请联系删除 -## ⚖️ 许可证 +## 许可证 [MIT](./LICENSE) License © 2024-PRESENT [Govin](https://github.com/guovin) From 524eb95fd6884dce9b0668482a159515b0dc2bcb Mon Sep 17 00:00:00 2001 From: Govin <37107669+Guovin@users.noreply.github.com> Date: Fri, 29 Nov 2024 14:55:10 +0800 Subject: [PATCH 36/37] Update README_en.md --- README_en.md | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/README_en.md b/README_en.md index 4bd1828..24abb66 100644 --- a/README_en.md +++ b/README_en.md @@ -87,18 +87,18 @@ [中文](./README.md) | English -- [✅ Features](#✅-features) -- [🔗 Latest results](#🔗-latest-results) +- [✅ Features](#features) +- [🔗 Latest results](#latest-results) - [⚙️ Config parameter](./docs/config_en.md) -- [🚀 Quick Start](#🚀-quick-start) +- [🚀 Quick Start](#quick-start) - [📖 Detailed Tutorial](./docs/tutorial_en.md) - [🗓️ Changelog](./CHANGELOG.md) -- [💰️ Appreciate](#💰️-appreciate) -- [👀 Follow](#👀-follow) -- [📣 Disclaimer](#📣-disclaimer) -- [⚖️ License](#⚖️-license) +- [💰️ Appreciate](#appreciate) +- [👀 Follow](#follow) +- [📣 Disclaimer](#disclaimer) +- [⚖️ License](#license) -## ✅ Features +## Features - ✅ Customize the template to generate the channel you want - ✅ Supports multiple source acquisition methods: multicast source, hotel source, subscription source, keyword search @@ -108,7 +108,7 @@ - ✅ Supports various execution methods: workflows, command line, GUI software, Docker(amd64/arm64/arm v7) - ✨ For more features, see [Config parameter](./docs/config_en.md) -## 🔗 Latest results +## Latest results - Interface source: @@ -126,11 +126,11 @@ https://ghproxy.net/raw.githubusercontent.com/Guovin/iptv-api/gd/output/result.t https://ghproxy.net/raw.githubusercontent.com/Guovin/iptv-api/gd/source.json ``` -## ⚙️ Config +## Config [Config parameter](./docs/config_en.md) -## 🚀 Quick Start +## Quick Start ### Method 1: Workflow @@ -230,11 +230,11 @@ docker run -v /etc/docker/config:/iptv-api-lite/config -v /etc/docker/output:/ip - API content: ip:8000/content - Speed test log: ip:8000/log -## 🗓️ Changelog +## Changelog [Changelog](./CHANGELOG.md) -## 💰️ Appreciate +## AppreciateDevelopment and maintenance are not easy, please buy me a coffee ~@@ -242,16 +242,16 @@ docker run -v /etc/docker/config:/iptv-api-lite/config -v /etc/docker/output:/ip | ------------------------------------- | ----------------------------------------- | | ![Alipay](./static/images/alipay.jpg) | ![Wechat](./static/images/appreciate.jpg) | -## 👀 Follow +## Follow Wechat public account search for Govin, or scan the code to receive updates and learn more tips: ![Wechat public account](./static/images/qrcode.jpg) -## 📣 Disclaimer +## Disclaimer This project is for learning and communication purposes only. All interface data comes from the internet. If there is any infringement, please contact us for removal. -## ⚖️ License +## License [MIT](./LICENSE) License © 2024-PRESENT [Govin](https://github.com/guovin) From 61964d477a677fa39d69d0910d1d552c31bf038d Mon Sep 17 00:00:00 2001 From: "guorong.zheng" <360996299@qq.com> Date: Fri, 29 Nov 2024 16:31:41 +0800 Subject: [PATCH 37/37] chore:tkinter --- tkinter_ui/tkinter_ui.py | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/tkinter_ui/tkinter_ui.py b/tkinter_ui/tkinter_ui.py index 4a0b5a9..628279b 100644 --- a/tkinter_ui/tkinter_ui.py +++ b/tkinter_ui/tkinter_ui.py @@ -19,19 +19,6 @@ from hotel import HotelUI from subscribe import SubscribeUI from online_search import OnlineSearchUI import json -from pathlib import Path -from sys import base_prefix -from os import environ -import platform - -if not ("TCL_LIBRARY" in environ and "TK_LIBRARY" in environ): - try: - tk.Tk() - except tk.TclError: - tk_dir = "tcl" if platform.system() == "Windows" else "lib" - tk_path = Path(base_prefix) / tk_dir - environ["TCL_LIBRARY"] = str(next(tk_path.glob("tcl8.*"))) - environ["TK_LIBRARY"] = str(next(tk_path.glob("tk8.*"))) class TkinterUI: