diff --git a/.github/workflows/python-package.yaml b/.github/workflows/python-package.yaml index 6072b38..6bce4bb 100644 --- a/.github/workflows/python-package.yaml +++ b/.github/workflows/python-package.yaml @@ -40,10 +40,7 @@ jobs: - name: run biliarchiver tools run: | touch biliarchiver.home - python -m biliarchiver.cli_tools.biliarchiver -h - python -m biliarchiver.cli_tools.bili_archive_bvids -h - python -m biliarchiver.cli_tools.bili_get_bvids -h - python -m biliarchiver.cli_tools.bili_upload -h + python -m biliarchiver.cli_tools.biliarchiver # - name: Test with pytest # run: | # pytest diff --git a/biliarchiver/_biliarchiver_upload_bvid.py b/biliarchiver/_biliarchiver_upload_bvid.py index de47ac2..45c55eb 100644 --- a/biliarchiver/_biliarchiver_upload_bvid.py +++ b/biliarchiver/_biliarchiver_upload_bvid.py @@ -178,7 +178,7 @@ def _upload_bvid(bvid: str, *, update_existing: bool = False, collection: str): md = xml_chars_legalize(obj=md) assert isinstance(md, dict) if hash(json.dumps(md)) != _md_before: - print(f"Removed XML illegal characters from metadata, cleaned metadata:") + print("Removed XML illegal characters from metadata, cleaned metadata:") print(md) if filedict: @@ -212,7 +212,7 @@ def _upload_bvid(bvid: str, *, update_existing: bool = False, collection: str): if item.metadata.get("external-identifier") != md['external-identifier']: new_md["external-identifier"] = md['external-identifier'] if new_md: - print(f"Updating metadata:") + print("Updating metadata:") print(new_md) # remove XML illegal characters @@ -220,7 +220,7 @@ def _upload_bvid(bvid: str, *, update_existing: bool = False, collection: str): new_md = xml_chars_legalize(obj=new_md) assert isinstance(new_md, dict) if hash(json.dumps(new_md)) != _md_before: - print(f"Removed XML illegal characters from metadata, cleaned metadata:") + print("Removed XML illegal characters from metadata, cleaned metadata:") print(new_md) r = item.modify_metadata( diff --git a/biliarchiver/archive_bvid.py b/biliarchiver/archive_bvid.py index fc0d74a..bc01390 100644 --- a/biliarchiver/archive_bvid.py +++ b/biliarchiver/archive_bvid.py @@ -25,7 +25,7 @@ async def new_get_subtitle_info(client: httpx.AsyncClient, bvid, cid): res = await req_retry(client, 'https://api.bilibili.com/x/player/v2', params=params) info = json.loads(res.text) if info['code'] == -400: - raise APIError(f'未找到字幕信息', params) + raise APIError('未找到字幕信息', params) # 这里 monkey patch 一下把返回 lan_doc 改成返回 lan,这样生成的字幕文件名就是 语言代码 而不是 中文名 了 # 例如 diff --git a/biliarchiver/cli_tools/bili_archive_bvids.py b/biliarchiver/cli_tools/bili_archive_bvids.py index d7ccf8d..288d7cf 100644 --- a/biliarchiver/cli_tools/bili_archive_bvids.py +++ b/biliarchiver/cli_tools/bili_archive_bvids.py @@ -1,82 +1,58 @@ import asyncio +from io import TextIOWrapper import os -import argparse from pathlib import Path -from typing import List, Optional, Union +from typing import List, Union from biliarchiver.archive_bvid import archive_bvid from biliarchiver.config import config - from bilix.sites.bilibili.downloader import DownloaderBilibili -from rich.console import Console from httpx import AsyncClient, Client, TransportError from rich.traceback import install from biliarchiver.utils.http_patch import HttpOnlyCookie_Handler from biliarchiver.utils.version_check import check_outdated_version from biliarchiver.utils.storage import get_free_space from biliarchiver.version import BILI_ARCHIVER_VERSION -install() - +from biliarchiver.config import BILIBILI_IDENTIFIER_PERFIX from biliarchiver.utils.identifier import human_readable_upper_part_map from biliarchiver.utils.ffmpeg import check_ffmpeg -from biliarchiver.config import BILIBILI_IDENTIFIER_PERFIX +install() -from dataclasses import dataclass - -@dataclass -class Args: - bvids: str - skip_ia: bool - from_browser: Optional[str] - min_free_space_gb: int - skip_to: int = 0 - -def parse_args(): - - parser = argparse.ArgumentParser() - parser.add_argument('--bvids', dest='bvids', type=str, help='bvids 列表的文件路径', required=True) - parser.add_argument('-s', '--skip-ia-check', dest='skip_ia', action='store_true', - help='不检查 IA 上是否已存在对应 BVID 的 item ,直接开始下载') - parser.add_argument('--fb', '--from-browser', dest='from_browser', type=str, help='从指定浏览器导入 cookies (否则导入 config.json 中的 cookies_file) [default: None]', default=None) - parser.add_argument('--min-free-space-gb', dest='min_free_space_gb', type=int, help='最小剩余空间 (GB),用超退出 [default: 10]', default=10) - parser.add_argument('--skip-to', dest='skip_to', type=int, help='跳过前 skip_to 个 bvid [default: 0]', default=0) - - args = Args(**vars(parser.parse_args())) - - return args def check_ia_item_exist(client: Client, identifier: str) -> bool: - cache_dir = config.storage_home_dir / 'ia_item_exist_cache' + cache_dir = config.storage_home_dir / "ia_item_exist_cache" # check_ia_item_exist_from_cache_file: - if (cache_dir / f'{identifier}.mark').exists(): + if (cache_dir / f"{identifier}.mark").exists(): # print('from cached .mark') return True def create_item_exist_cache_file(identifier: str) -> Path: - with open(cache_dir / f'{identifier}.mark', 'w', encoding='utf-8') as f: - f.write('') - return cache_dir / f'{identifier}.mark' + with open(cache_dir / f"{identifier}.mark", "w", encoding="utf-8") as f: + f.write("") + return cache_dir / f"{identifier}.mark" params = { - 'identifier': identifier, - 'output': 'json', + "identifier": identifier, + "output": "json", } # check_identifier.php API 响应快 r = None for _ in range(3): try: - r = client.get('https://archive.org/services/check_identifier.php', params=params) + r = client.get( + "https://archive.org/services/check_identifier.php", params=params + ) break except TransportError as e: - print(e, 'retrying...') + print(e, "retrying...") assert r is not None r.raise_for_status() r_json = r.json() - assert r_json['type'] =='success' - if r_json['code'] == 'available': + assert r_json["type"] == "success" + if r_json["code"] == "available": return False - elif r_json['code'] == 'not_available': # exists + elif r_json["code"] == "not_available": # exists cache_dir.mkdir(parents=True, exist_ok=True) create_item_exist_cache_file(identifier) return True @@ -84,28 +60,35 @@ def check_ia_item_exist(client: Client, identifier: str) -> bool: raise ValueError(f'Unexpected code: {r_json["code"]}') -def _main(): - args = parse_args() - assert check_ffmpeg() is True, 'ffmpeg 未安装' +def _down( + bvids: TextIOWrapper, + skip_ia_check: bool, + from_browser: str | None, + min_free_space_gb: int, + skip: int, +): + assert check_ffmpeg() is True, "ffmpeg 未安装" - assert args.bvids is not None, '必须指定 bvids 列表的文件路径' - with open(args.bvids, 'r', encoding='utf-8') as f: - bvids_from_file = f.read().splitlines() + bvids_from_file = bvids.read().splitlines() - check_outdated_version(pypi_project='biliarchiver', self_version=BILI_ARCHIVER_VERSION) + check_outdated_version( + pypi_project="biliarchiver", self_version=BILI_ARCHIVER_VERSION + ) loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) - d = DownloaderBilibili(hierarchy=True, sess_data=None, # sess_data 将在后面装载 cookies 时装载 # type: ignore + d = DownloaderBilibili( + hierarchy=True, + sess_data=None, # sess_data 将在后面装载 cookies 时装载 # type: ignore video_concurrency=config.video_concurrency, part_concurrency=config.part_concurrency, stream_retry=config.stream_retry, ) # load cookies - if args.from_browser is not None: - update_cookies_from_browser(d.client, args.from_browser) + if from_browser is not None: + update_cookies_from_browser(d.client, from_browser) else: update_cookies_from_file(d.client, config.cookies_file) client = Client(cookies=d.client.cookies, headers=d.client.headers) @@ -114,69 +97,84 @@ def _main(): return def check_free_space(): - if args.min_free_space_gb != 0: - if get_free_space(path=config.storage_home_dir) // 1024 // 1024 // 1024 <= args.min_free_space_gb: - return False # not pass - return True # pass + if min_free_space_gb != 0: + if ( + get_free_space( + path=config.storage_home_dir) // 1024 // 1024 // 1024 + <= min_free_space_gb + ): + return False # not pass + return True # pass d.progress.start() sem = asyncio.Semaphore(config.video_concurrency) tasks: List[asyncio.Task] = [] + def tasks_check(): for task in tasks: if task.done(): _task_exception = task.exception() if isinstance(_task_exception, BaseException): - print(f'任务 {task} 出错,即将异常退出...') + print(f"任务 {task} 出错,即将异常退出...") for task in tasks: task.cancel() raise _task_exception # print(f'任务 {task} 已完成') tasks.remove(task) if not check_free_space(): - print(f'剩余空间不足 {args.min_free_space_gb} GiB') + print(f"剩余空间不足 {min_free_space_gb} GiB") for task in tasks: task.cancel() - raise RuntimeError(f'剩余空间不足 {args.min_free_space_gb} GiB') + raise RuntimeError(f"剩余空间不足 {min_free_space_gb} GiB") for index, bvid in enumerate(bvids_from_file): - if index < args.skip_to: - print(f'跳过 {bvid} ({index+1}/{len(bvids_from_file)})', end='\r') + if index < skip: + print(f"跳过 {bvid} ({index+1}/{len(bvids_from_file)})", end="\r") continue tasks_check() - if not args.skip_ia: - upper_part = human_readable_upper_part_map(string=bvid, backward=True) - remote_identifier = f'{BILIBILI_IDENTIFIER_PERFIX}-{bvid}_p1-{upper_part}' + if not skip: + upper_part = human_readable_upper_part_map( + string=bvid, backward=True) + remote_identifier = f"{BILIBILI_IDENTIFIER_PERFIX}-{bvid}_p1-{upper_part}" if check_ia_item_exist(client, remote_identifier): - print(f'IA 上已存在 {remote_identifier} ,跳过') + print(f"IA 上已存在 {remote_identifier} ,跳过") continue - upper_part = human_readable_upper_part_map(string=bvid, backward=True) - videos_basepath: Path = config.storage_home_dir / 'videos' / f'{bvid}-{upper_part}' - if os.path.exists(videos_basepath / '_all_downloaded.mark'): - print(f'{bvid} 所有分p都已下载过了') + videos_basepath: Path = ( + config.storage_home_dir / "videos" / f"{bvid}-{upper_part}" + ) + if os.path.exists(videos_basepath / "_all_downloaded.mark"): + print(f"{bvid} 所有分p都已下载过了") continue if len(tasks) >= config.video_concurrency: - loop.run_until_complete(asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED)) + loop.run_until_complete( + asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED) + ) tasks_check() - print(f'=== {bvid} ({index+1}/{len(bvids_from_file)}) ===') + print(f"=== {bvid} ({index+1}/{len(bvids_from_file)}) ===") - task = loop.create_task(archive_bvid(d, bvid, logined=logined, semaphore=sem), name=f'archive_bvid({bvid})') + task = loop.create_task( + archive_bvid(d, bvid, logined=logined, semaphore=sem), + name=f"archive_bvid({bvid})", + ) tasks.append(task) - + while len(tasks) > 0: - loop.run_until_complete(asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED)) + loop.run_until_complete( + asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED) + ) tasks_check() print("DONE") - - + + def update_cookies_from_browser(client: AsyncClient, browser: str): try: import browser_cookie3 + f = getattr(browser_cookie3, browser.lower()) cookies_to_update = f(domain_name="bilibili.com") client.cookies.update(cookies_to_update) @@ -191,59 +189,50 @@ def update_cookies_from_file(client: AsyncClient, cookies_path: Union[str, Path] elif isinstance(cookies_path, str): cookies_path = Path(cookies_path).expanduser() else: - raise TypeError(f'cookies_path: {type(cookies_path)}') + raise TypeError(f"cookies_path: {type(cookies_path)}") - assert os.path.exists(cookies_path), f'cookies 文件不存在: {cookies_path}' + assert os.path.exists(cookies_path), f"cookies 文件不存在: {cookies_path}" from http.cookiejar import MozillaCookieJar + cj = MozillaCookieJar() with HttpOnlyCookie_Handler(cookies_path): - cj.load(f'{cookies_path}', ignore_discard=True, ignore_expires=True) + cj.load(f"{cookies_path}", ignore_discard=True, ignore_expires=True) loadded_cookies = 0 loadded_keys = [] for cookie in cj: # only load bilibili cookies - if not 'bilibili.com' in cookie.domain: + if "bilibili.com" not in cookie.domain: continue if cookie.name in loadded_keys: - print(f'跳过重复的 cookies: {cookie.name}') + print(f"跳过重复的 cookies: {cookie.name}") # httpx 不能处理不同域名的同名 cookies,只好硬去重了 continue assert cookie.value is not None client.cookies.set( cookie.name, cookie.value, domain=cookie.domain, path=cookie.path - ) + ) loadded_keys.append(cookie.name) loadded_cookies += 1 - print(f'从 {cookies_path} 品尝了 {loadded_cookies} 块 cookies') + print(f"从 {cookies_path} 品尝了 {loadded_cookies} 块 cookies") if loadded_cookies > 100: - print('吃了过多的 cookies,可能导致 httpx.Client 怠工,响应非常缓慢') + print("吃了过多的 cookies,可能导致 httpx.Client 怠工,响应非常缓慢") - assert client.cookies.get('SESSDATA') is not None, 'SESSDATA 不存在' + assert client.cookies.get("SESSDATA") is not None, "SESSDATA 不存在" # print(f'SESS_DATA: {client.cookies.get("SESSDATA")}') + def is_login(cilent: Client) -> bool: - r = cilent.get('https://api.bilibili.com/x/member/web/account') + r = cilent.get("https://api.bilibili.com/x/member/web/account") r.raise_for_status() nav_json = r.json() - if nav_json['code'] == 0: - print('BiliBili 登录成功,饼干真香。') - print('NOTICE: 存档过程中请不要在 cookies 的源浏览器访问 B 站,避免 B 站刷新' - ' cookies 导致我们半路下到的视频全是 480P 的优酷土豆级醇享画质。') + if nav_json["code"] == 0: + print("BiliBili 登录成功,饼干真香。") + print( + "NOTICE: 存档过程中请不要在 cookies 的源浏览器访问 B 站,避免 B 站刷新" + " cookies 导致我们半路下到的视频全是 480P 的优酷土豆级醇享画质。" + ) return True - print('未登录/SESSDATA无效/过期,你这饼干它保真吗?') + print("未登录/SESSDATA无效/过期,你这饼干它保真吗?") return False - -def main(): - try: - _main() - except KeyboardInterrupt: - print('KeyboardInterrupt') - finally: - # 显示终端光标 - console = Console() - console.show_cursor() - -if __name__ == '__main__': - main() \ No newline at end of file diff --git a/biliarchiver/cli_tools/bili_get_bvids.py b/biliarchiver/cli_tools/bili_get_bvids.py deleted file mode 100644 index 04c0991..0000000 --- a/biliarchiver/cli_tools/bili_get_bvids.py +++ /dev/null @@ -1,266 +0,0 @@ -import asyncio -import os -from pathlib import Path -import re -import time -from httpx import AsyncClient -import requests -import json -import argparse - -from bilix.sites.bilibili import api -from rich import print - - -def arg_parse(): - parser = argparse.ArgumentParser() - # 为啥是 by-xxx 而不是 from-xxx ?因为命令行里好敲…… - ranking_group = parser.add_argument_group() - ranking_group.title = 'by ranking' - ranking_group.description = '排行榜(全站榜,非个性推荐榜)' - ranking_group.add_argument('--by-ranking', action='store_true', help='从排行榜获取 bvids') - ranking_group.add_argument('--ranking-rid', type=int, default=0, help='目标排行 rid,0 为全站排行榜。rid 等于分区的 tid [default: 0]') - - up_videos_group = parser.add_argument_group() - up_videos_group.title = 'by up videos' - up_videos_group.description = 'up 主用户页投稿' - up_videos_group.add_argument('--by-up_videos', action='store_true', help='从 up 主用户页获取全部的投稿的 bvids') - up_videos_group.add_argument('--up_videos-mid', type=str, help='目标 up 主的 mid (也可以是用户页的 URL)') - - popular_precious_group = parser.add_argument_group() - popular_precious_group.title = 'popular precious' - popular_precious_group.description = '入站必刷,更新频率低' - popular_precious_group.add_argument('--by-popular_precious', action='store_true', help='从入站必刷获取 bvids', dest='by_popular_precious') - - popular_series_group = parser.add_argument_group() - popular_series_group.title = 'popular series' - popular_series_group.description = '每周必看,每周五晚18:00更新' - popular_series_group.add_argument('--by-popular_series', action='store_true', help='从每周必看获取 bvids', dest='by_popular_series') - popular_series_group.add_argument('--popular_series-number', type=int, default=1, help='获取第几期(周) [default: 1]') - popular_series_group.add_argument('--all-popular_series', action='store_true', help='自动获取全部的每周必看(增量)', dest='all_popular_series') - - space_fav_season = parser.add_argument_group() - space_fav_season.title = 'space_fav_season' - space_fav_season.description = '获取合集或视频列表内视频' - space_fav_season.add_argument('--by-space_fav_season', type=str, help='合集或视频列表 sid (或 URL)', dest='by_space_fav_season', default=None) - - favour_group = parser.add_argument_group() - favour_group.title = 'favour' - favour_group.description = '收藏夹' - favour_group.add_argument('--by-fav', type=str, help='收藏夹 fid (或 URL)', dest='by_fav', default=None) - - args = parser.parse_args() - return args - - -async def by_sapce_fav_season(url_or_sid: str) -> Path: - sid = sid = re.search(r'sid=(\d+)', url_or_sid).groups()[0] if url_or_sid.startswith('http') else url_or_sid # type: ignore - client = AsyncClient(**api.dft_client_settings) - print(f'正在获取 {sid} 的视频列表……') - col_name, up_name, bvids = await api.get_collect_info(client, sid) - filepath = f'bvids/by-sapce_fav_season/sid-{sid}-{int(time.time())}.txt' - os.makedirs(os.path.dirname(filepath), exist_ok=True) - abs_filepath = os.path.abspath(filepath) - with open(abs_filepath, 'w', encoding='utf-8') as f: - for bv_id in bvids: - f.write(f'{bv_id}' + '\n') - print(f'已获取 {col_name}({up_name})的 {len(bvids)} 个视频') - print(f'到 {abs_filepath}') - return Path(abs_filepath) - - -def by_raning(rid: int) -> Path: - bilibili_ranking_api = "https://api.bilibili.com/x/web-interface/ranking/v2" - bilibili_ranking_params = { - "rid": rid, - "type": "all" - } - - r = requests.get(bilibili_ranking_api, params=bilibili_ranking_params) - r.raise_for_status() - ranking_json = json.loads(r.text) - assert ranking_json['code'] == 0 # 0 为成功(HTTP 200 不能信) - - ranking = ranking_json['data']['list'] - bvids = [] - for video_info in ranking: - # print(video_info['title'], video_info['bvid'], video_info['pic']) - bvid = video_info['bvid'] - bvids.append(bvid) - - import datetime - today = datetime.date.today() - os.makedirs('bvids', exist_ok=True) - - bvids_filepath = f'bvids/by-ranking/rid-{rid}/rid-{rid}-{int(time.time())}.txt' - os.makedirs(os.path.dirname(bvids_filepath), exist_ok=True) - with open(bvids_filepath, 'w', encoding='utf-8') as f: - for bvid in bvids: - f.write(f'{bvid}' + '\n') - abs_filepath = os.path.abspath(bvids_filepath) - print(f'已保存 {len(bvids)} 个 bvid 到 {abs_filepath}') - return Path(abs_filepath) - -async def by_up_videos(url_or_mid: str) -> Path: - ''' 频率高了会封 ''' - - if isinstance(url_or_mid, int): - mid = str(url_or_mid) - elif url_or_mid.startswith("http"): - mid = re.findall(r"/(\d+)", url_or_mid)[0] - else: - mid = url_or_mid - - assert isinstance(mid, str) - assert mid.isdigit(), 'mid 应是数字字符串' - - client = AsyncClient(**api.dft_client_settings) - ps = 30 # 每页视频数,最小 1,最大 50,默认 30 - order = 'pubdate'# 默认为pubdate 最新发布:pubdate 最多播放:click 最多收藏:stow - keyword = '' # 搜索关键词 - bv_ids = [] - pn = 1 - print(f'获取第 {pn} 页...') - up_name, total_size, bv_ids_page = await api.get_up_info(client, mid, pn, ps, order, keyword) - bv_ids += bv_ids_page - print(f'{mid} {up_name} 共 {total_size} 个视频. (如果最新的视频为合作视频的非主作者,UP 名可能会识别错误,但不影响获取 bvid 列表)') - while pn < total_size / ps: - pn += 1 - print(f'获取第 {pn} 页 (10s...)') - await asyncio.sleep(10) - _, _, bv_ids_page = await api.get_up_info(client, mid, pn, ps, order, keyword) - bv_ids += bv_ids_page - - print(mid, up_name, total_size) - await client.aclose() - assert len(bv_ids) == len(set(bv_ids)), '有重复的 bv_id' - assert total_size == len(bv_ids), '视频总数不匹配' - filepath = f'bvids/by-up_videos/mid-{mid}-{int(time.time())}.txt' - os.makedirs(os.path.dirname(filepath), exist_ok=True) - abs_filepath = os.path.abspath(filepath) - with open(abs_filepath, 'w', encoding='utf-8') as f: - for bv_id in bv_ids: - f.write(f'{bv_id}' + '\n') - print(f'已保存 {len(bv_ids)} 个 bvid 到 {abs_filepath}') - return Path(abs_filepath) - -def by_popular_precious(): - API_URL = "https://api.bilibili.com/x/web-interface/popular/precious" - r = requests.get(API_URL) - r.raise_for_status() - popular_precious_json = json.loads(r.text) - assert popular_precious_json['code'] == 0 - bvids = [] - for video_info in popular_precious_json['data']['list']: - bvid = video_info['bvid'] - bvids.append(bvid) - filepath = f'bvids/by-popular_precious/{int(time.time())}.txt' - os.makedirs(os.path.dirname(filepath), exist_ok=True) - abs_filepath = os.path.abspath(filepath) - with open(abs_filepath, 'w', encoding='utf-8') as f: - f.write('\n'.join(bvids)) - print(f'已保存 {len(bvids)} 个 bvid 到 {abs_filepath}') - - -def by_popular_series_one(number: int): - API_URL = "https://api.bilibili.com/x/web-interface/popular/series/one" - params = { - "number": number - } - r = requests.get(API_URL, params=params) - r.raise_for_status() - popular_series_json = json.loads(r.text) - assert popular_series_json['code'] == 0 - bvids = [] - for video_info in popular_series_json['data']['list']: - bvid = video_info['bvid'] - bvids.append(bvid) - filepath = f'bvids/by-popular_series/s{number}-{int(time.time())}.txt' - os.makedirs(os.path.dirname(filepath), exist_ok=True) - abs_filepath = os.path.abspath(filepath) - with open(abs_filepath, 'w', encoding='utf-8') as f: - f.write('\n'.join(bvids)) - print(f'已保存 {len(bvids)} 个 bvid 到 {abs_filepath}') - - -def not_got_popular_series() -> list[int]: - API_URL = "http://api.bilibili.com/x/web-interface/popular/series/list" - got_series = [] - os.makedirs('bvids/by-popular_series', exist_ok=True) - for filename in os.listdir('bvids/by-popular_series'): - if filename.endswith('.txt'): - got_series.append(int(filename.split('-')[0][1:])) # s{number}-{int(time.time())}.txt - r = requests.get(API_URL) - r.raise_for_status() - popular_series_json = json.loads(r.text) - assert popular_series_json['code'] == 0 - max_series_number = popular_series_json['data']['list'][0]['number'] - series_not_got = [] - for i in range(1, max_series_number + 1): - if i not in got_series: - series_not_got.append(i) - return series_not_got - - -async def by_favour(url_or_fid: str): - if url_or_fid.startswith('http'): - fid = re.findall(r'fid=(\d+)', url_or_fid)[0] - else: - fid = url_or_fid - - client = AsyncClient(**api.dft_client_settings) - PAGE_SIZE = 20 - media_left = None - total_size = None - bvids = [] - page_num = 1 - while media_left is None or media_left > 0: - # bilix 的收藏夹获取有 bug - fav_name, up_name, total_size, available_bvids = await api.get_favour_page_info(client=client, url_or_fid=fid, pn=page_num, ps=PAGE_SIZE, keyword='') - bvids.extend(available_bvids) - if media_left is None: - print(f'fav_name: {fav_name}, up_name: {up_name}, total_size: {total_size}') - media_left = total_size - PAGE_SIZE * page_num - print(f'还剩 ~{media_left // PAGE_SIZE} 页', end='\r') - await asyncio.sleep(2) - page_num += 1 - await client.aclose() - assert total_size is not None - assert len(bvids) == len(set(bvids)), '有重复的 bvid' - print(f'{len(bvids)} 个有效视频,{total_size-len(bvids)} 个失效视频') - filepath = f'bvids/by-favour/fid-{fid}-{int(time.time())}.txt' - os.makedirs(os.path.dirname(filepath), exist_ok=True) - abs_filepath = os.path.abspath(filepath) - with open(abs_filepath, 'w', encoding='utf-8') as f: - f.write('\n'.join(bvids)) - f.write('\n') - print(f'已保存 {len(bvids)} 个 bvid 到 {abs_filepath}') - - -async def _main(): - args = arg_parse() - if args.by_ranking: - by_raning(args.ranking_rid) - if args.by_up_videos: - assert args.up_videos_mid is not None, 'up_videos_mid 不能为空' - await by_up_videos(args.up_videos_mid) - if args.by_popular_precious: - by_popular_precious() - if args.by_popular_series: - if args.all_popular_series: - for number in not_got_popular_series(): - time.sleep(3) - by_popular_series_one(number) - else: - by_popular_series_one(args.popular_series_number) - if args.by_space_fav_season: - await by_sapce_fav_season(args.by_space_fav_season) - if args.by_fav: - await by_favour(args.by_fav) - - -def main(): - asyncio.run(_main()) - -if __name__ == '__main__': - main() \ No newline at end of file diff --git a/biliarchiver/cli_tools/bili_upload.py b/biliarchiver/cli_tools/bili_upload.py deleted file mode 100644 index 900676b..0000000 --- a/biliarchiver/cli_tools/bili_upload.py +++ /dev/null @@ -1,66 +0,0 @@ -import os -import argparse -from dataclasses import dataclass -from pathlib import Path - -from biliarchiver._biliarchiver_upload_bvid import upload_bvid -from biliarchiver.config import config - -DEFAULT_COLLECTION = "opensource_movies" -""" -开放 collection ,任何人均可上传。 -通过 biliarchiver 上传的 item 会在24小时内被自动转移到 bilibili_videos collection -""" -BILIBILI_VIDEOS_COLLECTION = "bilibili_videos" -""" 由 arkiver 管理。bilibili_videos 属于 social-media-video 的子集 """ -BILIBILI_VIDEOS_SUB_1_COLLECTION = "bilibili_videos_sub_1" -""" 由 yzqzss 管理。属于 bilibili_videos 的子集 """ - - -@dataclass -class Args: - bvids: str - by_storage_home_dir: bool - update_existing: bool - collection: str - - -def parse_args(): - parser = argparse.ArgumentParser() - source_group = parser.add_argument_group() - source_group.title = '视频来源' - source_group.description = "$storage_home_dir 由 config.json 定义" - source_group.add_argument('--bvids', type=str, dest='bvids', - help='bvids 列表的文件路径') - source_group.add_argument('--by-storage_home_dir', action='store_true', dest='by_storage_home_dir', - help="使用 $storage_home_dir/videos 目录下的所有视频 ") - parser.add_argument('--update_existing', action='store_true', dest='update_existing', - help='更新 IA 上已存在的 item') - parser.add_argument("--collection", default=DEFAULT_COLLECTION, dest='collection', - choices=[DEFAULT_COLLECTION, BILIBILI_VIDEOS_COLLECTION, BILIBILI_VIDEOS_SUB_1_COLLECTION], - help=f"Collection to upload to. (非默认值仅限 collection 管理员使用) [default: {DEFAULT_COLLECTION}]" - ) - - args = Args(**vars(parser.parse_args())) - - return args - -def main(): - args = parse_args() - if args.by_storage_home_dir: - for bvid_with_upper_part in os.listdir(config.storage_home_dir / 'videos'): - bvid = bvid_with_upper_part - if '-' in bvid_with_upper_part: - bvid = bvid_with_upper_part.split('-')[0] - - upload_bvid(bvid, update_existing=args.update_existing, collection=args.collection) - - elif args.bvids: - with open(args.bvids, 'r', encoding='utf-8') as f: - bvids_from_file = f.read().splitlines() - for bvid in bvids_from_file: - - upload_bvid(bvid, update_existing=args.update_existing, collection=args.collection) - -if __name__ == '__main__': - main() \ No newline at end of file diff --git a/biliarchiver/cli_tools/biliarchiver.py b/biliarchiver/cli_tools/biliarchiver.py index 9ac79eb..3d864e8 100644 --- a/biliarchiver/cli_tools/biliarchiver.py +++ b/biliarchiver/cli_tools/biliarchiver.py @@ -1,15 +1,63 @@ -import os +import click +from biliarchiver.cli_tools.up_command import up +from biliarchiver.cli_tools.down_command import down +from biliarchiver.cli_tools.get_command import get +from biliarchiver.version import BILI_ARCHIVER_VERSION -def main(): - _tools = os.listdir(os.path.dirname(__file__)) - available_tools = [] - for tool in _tools: - if tool.endswith('.py') and tool != '__init__.py' and tool != 'biliarchiver.py': - available_tools.append(tool[:-3]) - - print("biliarchiver 可用的命令行工具有: (-h 查看帮助)") - print("\n".join(available_tools)) +class HelpCommand(click.Group): + def format_help(self, ctx, formatter): + version_info = click.style( + f"[ biliarchiver {BILI_ARCHIVER_VERSION} ]", + fg="black", + bg="white", + bold=True, + blink=True, + ) + click.echo( + f""" + <_-^-_> + <%&&&&&&&&&&&&&&&&&&&&%*> + <&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&> > __ __ __ __ < + /<&&&> <&&&>/ .<&&&> <&&&> > / / /_/ / / /_/ < + (<&&&>,(/(/<&&&>%(/(/(/(<&&&>(/(// <&&&> > / /_ __ / / __ < + %<&&&>(( <&&&#> <#&&&> (((<&&&(> > / __ \ / / / / / / < + <&&&&>/* <&&&#>, .<#&&&> .//<&&&(> > / /_/ / / / / / / / __ __ < + <&&&&>(* ,(<&&&#>% %<#&&&>%( ((<&&&(> > /_.___/ /_/ /_/ /_/ / / /_/ < + <&&&&>/* .<&&&#> <#&&&>% (/<&&&(> > ____ _ ____ _____ / /_ __ _ __ ___ ____ < + (<&&&>(* <&&&>#,,-w-,#<&&&> ((<&&&(> > / __ `/ / __/ / ___/ / __ \ / / | | / / / _ \ / __/ < + (<&&&>/* <&&&>, <&&&> .//<&&&)> > / /_/ / / / / /__ / / / / / / | |/ / / __/ / / < + <&&&>((/((<&&&>((((((((<&&&>(((/((<&&&> > \__,_/ /_/ \___/ /_/ /_/ /_/ |___/ \___/ /_/ < + <&&&> ,,(<&&&> <&&&>(,, <&&&> + <&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&> {version_info} +<&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&><""".replace( + "<", "\u001b[0m" + ).replace( + ">", "\u001b[96m" + ), + ) + click.echo(super().format_help(ctx, formatter)) -if __name__ == '__main__': - main() \ No newline at end of file + +@click.group(cls=HelpCommand) +def biliarchiver(): + pass + + +@biliarchiver.command(help=click.style("初始化所需目录", fg="cyan")) +def init(): + import pathlib + + biliarchiver_home = pathlib.Path.cwd() / "biliarchiver.home" + bilibili_archive_dir = pathlib.Path.cwd() / "bilibili_archive_dir" + biliarchiver_home.mkdir(exist_ok=True) + bilibili_archive_dir.mkdir(exist_ok=True) + + +biliarchiver.add_command(up) +biliarchiver.add_command(down) +biliarchiver.add_command(get) + + +if __name__ == "__main__": + biliarchiver() diff --git a/biliarchiver/cli_tools/down_command.py b/biliarchiver/cli_tools/down_command.py new file mode 100644 index 0000000..feb2a1c --- /dev/null +++ b/biliarchiver/cli_tools/down_command.py @@ -0,0 +1,40 @@ +import click +from rich.console import Console + + +@click.command(help=click.style("从哔哩哔哩下载", fg="cyan")) +@click.option("--bvids", type=click.File(), required=True, help="bvids 列表的文件路径") +@click.option( + "--skip-ia-check", + "-s", + is_flag=True, + default=False, + show_default=True, + help="不检查 IA 上是否已存在对应 BVID 的 item ,直接开始下载", +) +@click.option( + "--from-browser", + "--fb", + type=str, + default=None, + help="从指定浏览器导入 cookies (否则导入 config.json 中的 cookies_file)", +) +@click.option( + "--min-free-space-gb", + type=int, + default=10, + help="最小剩余空间 (GB),用超退出", + show_default=True, +) +@click.option("--skip", type=int, default=0, show_default=True, help="跳过文件开头 bvid 的个数") +def down(**kwargs): + from biliarchiver.cli_tools.bili_archive_bvids import _down + + try: + _down(**kwargs) + except KeyboardInterrupt: + print("KeyboardInterrupt") + finally: + # 显示终端光标 + console = Console() + console.show_cursor() diff --git a/biliarchiver/cli_tools/get_command.py b/biliarchiver/cli_tools/get_command.py new file mode 100644 index 0000000..fb0ddb3 --- /dev/null +++ b/biliarchiver/cli_tools/get_command.py @@ -0,0 +1,383 @@ +import asyncio +import os +from pathlib import Path +import re +import time +from httpx import AsyncClient +import requests +import json +import click +from click_option_group import optgroup + +from bilix.sites.bilibili import api +from rich import print + + +""" def arg_parse(): + parser = argparse.ArgumentParser() + # 为啥是 by-xxx 而不是 from-xxx ?因为命令行里好敲…… + ranking_group = parser.add_argument_group() + ranking_group.title = 'by ranking' + ranking_group.description = '排行榜(全站榜,非个性推荐榜)' + ranking_group.add_argument( + '--by-ranking', action='store_true', help='从排行榜获取 bvids') + ranking_group.add_argument('--ranking-rid', type=int, default=0, + help='目标排行 rid,0 为全站排行榜。rid 等于分区的 tid [default: 0]') + + up_videos_group = parser.add_argument_group() + up_videos_group.title = 'by up videos' + up_videos_group.description = 'up 主用户页投稿' + up_videos_group.add_argument( + '--by-up_videos', action='store_true', help='从 up 主用户页获取全部的投稿的 bvids') + up_videos_group.add_argument( + '--up_videos-mid', type=str, help='目标 up 主的 mid (也可以是用户页的 URL)') + + popular_precious_group = parser.add_argument_group() + popular_precious_group.title = 'popular precious' + popular_precious_group.description = '入站必刷,更新频率低' + popular_precious_group.add_argument( + '--by-popular_precious', action='store_true', help='从入站必刷获取 bvids', dest='by_popular_precious') + + popular_series_group = parser.add_argument_group() + popular_series_group.title = 'popular series' + popular_series_group.description = '每周必看,每周五晚18:00更新' + popular_series_group.add_argument( + '--by-popular_series', action='store_true', help='从每周必看获取 bvids', dest='by_popular_series') + popular_series_group.add_argument( + '--popular_series-number', type=int, default=1, help='获取第几期(周) [default: 1]') + popular_series_group.add_argument( + '--all-popular_series', action='store_true', help='自动获取全部的每周必看(增量)', dest='all_popular_series') + + space_fav_season = parser.add_argument_group() + space_fav_season.title = 'space_fav_season' + space_fav_season.description = '获取合集或视频列表内视频' + space_fav_season.add_argument('--by-space_fav_season', type=str, + help='合集或视频列表 sid (或 URL)', dest='by_space_fav_season', default=None) + + favour_group = parser.add_argument_group() + favour_group.title = 'favour' + favour_group.description = '收藏夹' + favour_group.add_argument( + '--by-fav', type=str, help='收藏夹 fid (或 URL)', dest='by_fav', default=None) + + args = parser.parse_args() + return args + """ + + +async def by_series(url_or_sid: str) -> Path: + sid = sid = ( + re.search(r"sid=(\d+)", url_or_sid).groups()[0] + if url_or_sid.startswith("http") + else url_or_sid + ) # type: ignore + client = AsyncClient(**api.dft_client_settings) + print(f"正在获取 {sid} 的视频列表……") + col_name, up_name, bvids = await api.get_collect_info(client, sid) + filepath = f"bvids/by-sapce_fav_season/sid-{sid}-{int(time.time())}.txt" + os.makedirs(os.path.dirname(filepath), exist_ok=True) + abs_filepath = os.path.abspath(filepath) + with open(abs_filepath, "w", encoding="utf-8") as f: + for bv_id in bvids: + f.write(f"{bv_id}" + "\n") + print(f"已获取 {col_name}({up_name})的 {len(bvids)} 个视频") + print(f"到 {abs_filepath}") + return Path(abs_filepath) + + +def by_ranking(rid: int) -> Path: + bilibili_ranking_api = "https://api.bilibili.com/x/web-interface/ranking/v2" + bilibili_ranking_params = {"rid": rid, "type": "all"} + + r = requests.get(bilibili_ranking_api, params=bilibili_ranking_params) + r.raise_for_status() + ranking_json = json.loads(r.text) + assert ranking_json["code"] == 0 # 0 为成功(HTTP 200 不能信) + + ranking = ranking_json["data"]["list"] + bvids = [] + for video_info in ranking: + # print(video_info['title'], video_info['bvid'], video_info['pic']) + bvid = video_info["bvid"] + bvids.append(bvid) + + import datetime + + datetime.date.today() + os.makedirs("bvids", exist_ok=True) + + bvids_filepath = f"bvids/by-ranking/rid-{rid}/rid-{rid}-{int(time.time())}.txt" + os.makedirs(os.path.dirname(bvids_filepath), exist_ok=True) + with open(bvids_filepath, "w", encoding="utf-8") as f: + for bvid in bvids: + f.write(f"{bvid}" + "\n") + abs_filepath = os.path.abspath(bvids_filepath) + print(f"已保存 {len(bvids)} 个 bvid 到 {abs_filepath}") + return Path(abs_filepath) + + +async def by_up_videos(url_or_mid: str) -> Path: + """频率高了会封""" + + if isinstance(url_or_mid, int): + mid = str(url_or_mid) + elif url_or_mid.startswith("http"): + mid = re.findall(r"/(\d+)", url_or_mid)[0] + else: + mid = url_or_mid + + assert isinstance(mid, str) + assert mid.isdigit(), "mid 应是数字字符串" + + client = AsyncClient(**api.dft_client_settings) + ps = 30 # 每页视频数,最小 1,最大 50,默认 30 + order = "pubdate" # 默认为pubdate 最新发布:pubdate 最多播放:click 最多收藏:stow + keyword = "" # 搜索关键词 + bv_ids = [] + pn = 1 + print(f"获取第 {pn} 页...") + up_name, total_size, bv_ids_page = await api.get_up_info( + client, mid, pn, ps, order, keyword + ) + bv_ids += bv_ids_page + print( + f"{mid} {up_name} 共 {total_size} 个视频. (如果最新的视频为合作视频的非主作者,UP 名可能会识别错误,但不影响获取 bvid 列表)" + ) + while pn < total_size / ps: + pn += 1 + print(f"获取第 {pn} 页 (10s...)") + await asyncio.sleep(10) + _, _, bv_ids_page = await api.get_up_info(client, mid, pn, ps, order, keyword) + bv_ids += bv_ids_page + + print(mid, up_name, total_size) + await client.aclose() + assert len(bv_ids) == len(set(bv_ids)), "有重复的 bv_id" + assert total_size == len(bv_ids), "视频总数不匹配" + filepath = f"bvids/by-up_videos/mid-{mid}-{int(time.time())}.txt" + os.makedirs(os.path.dirname(filepath), exist_ok=True) + abs_filepath = os.path.abspath(filepath) + with open(abs_filepath, "w", encoding="utf-8") as f: + for bv_id in bv_ids: + f.write(f"{bv_id}" + "\n") + print(f"已保存 {len(bv_ids)} 个 bvid 到 {abs_filepath}") + return Path(abs_filepath) + + +def by_popular_precious(): + API_URL = "https://api.bilibili.com/x/web-interface/popular/precious" + r = requests.get(API_URL) + r.raise_for_status() + popular_precious_json = json.loads(r.text) + assert popular_precious_json["code"] == 0 + bvids = [] + for video_info in popular_precious_json["data"]["list"]: + bvid = video_info["bvid"] + bvids.append(bvid) + filepath = f"bvids/by-popular_precious/{int(time.time())}.txt" + os.makedirs(os.path.dirname(filepath), exist_ok=True) + abs_filepath = os.path.abspath(filepath) + with open(abs_filepath, "w", encoding="utf-8") as f: + f.write("\n".join(bvids)) + print(f"已保存 {len(bvids)} 个 bvid 到 {abs_filepath}") + + +def by_popular_series_one(number: int): + API_URL = "https://api.bilibili.com/x/web-interface/popular/series/one" + params = {"number": number} + r = requests.get(API_URL, params=params) + r.raise_for_status() + popular_series_json = json.loads(r.text) + assert popular_series_json["code"] == 0 + bvids = [] + for video_info in popular_series_json["data"]["list"]: + bvid = video_info["bvid"] + bvids.append(bvid) + filepath = f"bvids/by-popular_series/s{number}-{int(time.time())}.txt" + os.makedirs(os.path.dirname(filepath), exist_ok=True) + abs_filepath = os.path.abspath(filepath) + with open(abs_filepath, "w", encoding="utf-8") as f: + f.write("\n".join(bvids)) + print(f"已保存 {len(bvids)} 个 bvid 到 {abs_filepath}") + + +def not_got_popular_series() -> list[int]: + API_URL = "http://api.bilibili.com/x/web-interface/popular/series/list" + got_series = [] + os.makedirs("bvids/by-popular_series", exist_ok=True) + for filename in os.listdir("bvids/by-popular_series"): + if filename.endswith(".txt"): + # s{number}-{int(time.time())}.txt + got_series.append(int(filename.split("-")[0][1:])) + r = requests.get(API_URL) + r.raise_for_status() + popular_series_json = json.loads(r.text) + assert popular_series_json["code"] == 0 + max_series_number = popular_series_json["data"]["list"][0]["number"] + series_not_got = [] + for i in range(1, max_series_number + 1): + if i not in got_series: + series_not_got.append(i) + return series_not_got + + +async def by_favlist(url_or_fid: str): + if url_or_fid.startswith("http"): + fid = re.findall(r"fid=(\d+)", url_or_fid)[0] + else: + fid = url_or_fid + + client = AsyncClient(**api.dft_client_settings) + PAGE_SIZE = 20 + media_left = None + total_size = None + bvids = [] + page_num = 1 + while media_left is None or media_left > 0: + # bilix 的收藏夹获取有 bug + fav_name, up_name, total_size, available_bvids = await api.get_favour_page_info( + client=client, url_or_fid=fid, pn=page_num, ps=PAGE_SIZE, keyword="" + ) + bvids.extend(available_bvids) + if media_left is None: + print(f"fav_name: {fav_name}, up_name: {up_name}, total_size: {total_size}") + media_left = total_size - PAGE_SIZE * page_num + print(f"还剩 ~{media_left // PAGE_SIZE} 页", end="\r") + await asyncio.sleep(2) + page_num += 1 + await client.aclose() + assert total_size is not None + assert len(bvids) == len(set(bvids)), "有重复的 bvid" + print(f"{len(bvids)} 个有效视频,{total_size-len(bvids)} 个失效视频") + filepath = f"bvids/by-favour/fid-{fid}-{int(time.time())}.txt" + os.makedirs(os.path.dirname(filepath), exist_ok=True) + abs_filepath = os.path.abspath(filepath) + with open(abs_filepath, "w", encoding="utf-8") as f: + f.write("\n".join(bvids)) + f.write("\n") + print(f"已保存 {len(bvids)} 个 bvid 到 {abs_filepath}") + + +async def main( + series: str, + ranking: str, + rid: str, + up_videos: str, + popular_precious: bool, + popular_series: bool, + popular_series_number: int, + all_popular_series: bool, + favlist: str, +): + if ranking: + by_ranking(rid) + if up_videos: + await by_up_videos(up_videos) + if popular_precious: + by_popular_precious() + if popular_series: + if all_popular_series: + for number in not_got_popular_series(): + time.sleep(3) + by_popular_series_one(number) + else: + by_popular_series_one(popular_series_number) + if series: + await by_series(series) + if favlist: + await by_favlist(favlist) + + +class URLorIntParamType(click.ParamType): + def __init__(self, name): + self.name = "URL|" + name + + def convert(self, value, param, ctx): + # Simple regex to check if value might be a URL + # (just checking if it starts with http:// or https://) + url_pattern = re.compile(r"^https?://") + + # If value matches URL pattern or is a digit, return value + if url_pattern.match(value) or value.isdigit(): + return value + + # If value doesn't match any, raise an error + self.fail(f"{value!r} is not a valid {self.name}", param, ctx) + + +@click.command( + short_help=click.style("批量获取 BV 号", fg="cyan"), + help="请通过 flag 指定至少一种批量获取 BV 号的方式。多个不同组的 flag 同时使用时,将会先后通过不同方式获取。", +) +@optgroup.group("合集") +@optgroup.option( + "--series", + "-s", + help=click.style("合集或视频列表内视频", fg="red"), + type=URLorIntParamType("sid"), +) +@optgroup.group("排行榜") +@optgroup.option( + "--ranking", + "-r", + help=click.style("排行榜(全站榜,非个性推荐榜)", fg="yellow"), + is_flag=True, +) +@optgroup.option( + "--rid", + "--ranking-id", + default=0, + show_default=True, + help=click.style("目标排行 rid,0 为全站排行榜。rid 等于分区的 tid", fg="yellow"), + type=int, +) +@optgroup.group("UP 主") +@optgroup.option( + "--up-videos", + "-u", + help=click.style("UP 主用户页投稿", fg="cyan"), + type=URLorIntParamType("mid"), +) +@optgroup.group("入站必刷") +@optgroup.option( + "--popular-precious", help=click.style("入站必刷,更新频率低", fg="bright_red"), is_flag=True +) +@optgroup.group("每周必看") +@optgroup.option( + "--popular-series", + "-p", + help=click.style("每周必看,每周五晚 18:00 更新", fg="magenta"), + is_flag=True, +) +@optgroup.option( + "--popular-series-number", + default=1, + type=int, + show_default=True, + help=click.style("获取第几期(周)", fg="magenta"), +) +@optgroup.option( + "--all-popular-series", + help=click.style("自动获取全部的每周必看(增量)", fg="magenta"), + is_flag=True, +) +@optgroup.group("收藏夹") +@optgroup.option( + "--favlist", + "--fav", + help=click.style("收藏夹", fg="green"), + type=URLorIntParamType("fid"), +) +def get(**kwargs): + if ( + not kwargs["favlist"] + and not kwargs["series"] + and not kwargs["ranking"] + and not kwargs["up_videos"] + and not kwargs["popular_precious"] + and not kwargs["popular_series"] + ): + click.echo(click.style("ERROR: 请指定至少一种获取方式。", fg="red")) + click.echo(get.get_help(click.Context(get))) + return + asyncio.run(main(**kwargs)) diff --git a/biliarchiver/cli_tools/up_command.py b/biliarchiver/cli_tools/up_command.py new file mode 100644 index 0000000..f1654e8 --- /dev/null +++ b/biliarchiver/cli_tools/up_command.py @@ -0,0 +1,58 @@ +from io import TextIOWrapper +import click +import os + + +DEFAULT_COLLECTION = "opensource_movies" +""" +开放 collection ,任何人均可上传。 +通过 biliarchiver 上传的 item 会在24小时内被自动转移到 bilibili_videos collection +""" +BILIBILI_VIDEOS_COLLECTION = "bilibili_videos" +""" 由 arkiver 管理。bilibili_videos 属于 social-media-video 的子集 """ +BILIBILI_VIDEOS_SUB_1_COLLECTION = "bilibili_videos_sub_1" +""" 由 yzqzss 管理。属于 bilibili_videos 的子集 """ + + +@click.command(help=click.style("上传至互联网档案馆", fg="cyan")) +@click.option("--bvids", type=click.File(), default=None, help="bvids 列表的文件路径") +@click.option( + "--by-storage-home-dir", + is_flag=True, + default=False, + help="使用 `$storage_home_dir/videos` 目录下的所有视频", +) +@click.option("--update-existing", is_flag=True, default=False, help="更新已存在的 item") +@click.option( + "--collection", + default=DEFAULT_COLLECTION, + type=click.Choice( + [ + DEFAULT_COLLECTION, + BILIBILI_VIDEOS_COLLECTION, + BILIBILI_VIDEOS_SUB_1_COLLECTION, + ] + ), + help=f"Collection to upload to. (非默认值仅限 collection 管理员使用) [default: {DEFAULT_COLLECTION}]", +) +def up( + bvids: TextIOWrapper, + by_storage_home_dir: bool, + update_existing: bool, + collection: str, +): + from biliarchiver._biliarchiver_upload_bvid import upload_bvid + from biliarchiver.config import config + + if by_storage_home_dir: + for bvid_with_upper_part in os.listdir(config.storage_home_dir / "videos"): + bvid = bvid_with_upper_part + if "-" in bvid_with_upper_part: + bvid = bvid_with_upper_part.split("-")[0] + + upload_bvid(bvid, update_existing=update_existing, collection=collection) + + elif bvids: + bvids_from_file = bvids.read().splitlines() + for bvid in bvids_from_file: + upload_bvid(bvid, update_existing=update_existing, collection=collection) diff --git a/biliarchiver/config.py b/biliarchiver/config.py index 48e6f97..703cdc4 100644 --- a/biliarchiver/config.py +++ b/biliarchiver/config.py @@ -17,7 +17,7 @@ class singleton(type): @dataclass class _Config(metaclass=singleton): - video_concurrency: int = 3 + video_concurrency: int = 3 part_concurrency: int = 10 stream_retry: int = 20 storage_home_dir: Path = Path('bilibili_archive_dir/').expanduser() diff --git a/biliarchiver/utils/dirLock.py b/biliarchiver/utils/dirLock.py index aad4c3a..28cd760 100644 --- a/biliarchiver/utils/dirLock.py +++ b/biliarchiver/utils/dirLock.py @@ -1,5 +1,4 @@ import os -import sys import importlib.util class AlreadyRunningError(Exception): diff --git a/poetry.lock b/poetry.lock index 60de43d..a07c619 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,977 +1,950 @@ -# This file is automatically @generated by Poetry and should not be changed by hand. - -[[package]] -name = "aiofiles" -version = "23.1.0" -description = "File support for asyncio." -category = "main" -optional = false -python-versions = ">=3.7,<4.0" -files = [ - {file = "aiofiles-23.1.0-py3-none-any.whl", hash = "sha256:9312414ae06472eb6f1d163f555e466a23aed1c8f60c30cccf7121dba2e53eb2"}, - {file = "aiofiles-23.1.0.tar.gz", hash = "sha256:edd247df9a19e0db16534d4baaf536d6609a43e1de5401d7a4c1c148753a1635"}, -] - -[[package]] -name = "anyio" -version = "3.7.1" -description = "High level compatibility layer for multiple asynchronous event loop implementations" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "anyio-3.7.1-py3-none-any.whl", hash = "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5"}, - {file = "anyio-3.7.1.tar.gz", hash = "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780"}, -] - -[package.dependencies] -exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} -idna = ">=2.8" -sniffio = ">=1.1" - -[package.extras] -doc = ["Sphinx", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme (>=1.2.2)", "sphinxcontrib-jquery"] -test = ["anyio[trio]", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (<0.22)"] - -[[package]] -name = "beautifulsoup4" -version = "4.12.2" -description = "Screen-scraping library" -category = "main" -optional = false -python-versions = ">=3.6.0" -files = [ - {file = "beautifulsoup4-4.12.2-py3-none-any.whl", hash = "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a"}, - {file = "beautifulsoup4-4.12.2.tar.gz", hash = "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da"}, -] - -[package.dependencies] -soupsieve = ">1.2" - -[package.extras] -html5lib = ["html5lib"] -lxml = ["lxml"] - -[[package]] -name = "bilix" -version = "0.18.4" -description = "⚡️Lightning-fast asynchronous download tool for bilibili and more" -category = "main" -optional = false -python-versions = ">=3.8" -files = [ - {file = "bilix-0.18.4-py3-none-any.whl", hash = "sha256:c9405a274dce609113a3266c2ab415cf74f8562d266849b841b268585c57d88e"}, - {file = "bilix-0.18.4.tar.gz", hash = "sha256:e62e030b975f338a6d4e40a56af589e65b05a1d667747a3737ecb5cdec4093f9"}, -] - -[package.dependencies] -aiofiles = ">=0.8.0" -anyio = "*" -browser-cookie3 = ">=0.17.1" -bs4 = "*" -click = ">=8.0.3" -danmakuc = ">=0.3.5" -httpx = {version = ">=0.23.3", extras = ["http2"]} -json5 = "*" -m3u8 = "*" -pycryptodome = "*" -pydantic = ">=1.0.0,<2.0.0" -pymp4 = ">=1.2.0" -rich = "*" - -[package.extras] -serve = ["fastapi (>=0.92.0)", "passlib[bcrypt]", "python-jose[cryptography]", "starlette"] - -[[package]] -name = "browser-cookie3" -version = "0.19.1" -description = "Loads cookies from your browser into a cookiejar object so can download with urllib and other libraries the same content you see in the web browser." -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "browser-cookie3-0.19.1.tar.gz", hash = "sha256:3031ad14b96b47ef1e4c8545f2f463e10ad844ef834dcd0ebdae361e31c6119a"}, - {file = "browser_cookie3-0.19.1-py3-none-any.whl", hash = "sha256:114e40fe80853211d65f14bc690a7d90c4c287251593dc5767692a950a9006d4"}, -] - -[package.dependencies] -jeepney = {version = "*", markers = "python_version >= \"3.7\" and (sys_platform in \"bsd\" or sys_platform == \"linux\")"} -lz4 = "*" -pycryptodomex = "*" - -[[package]] -name = "bs4" -version = "0.0.1" -description = "Dummy package for Beautiful Soup" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "bs4-0.0.1.tar.gz", hash = "sha256:36ecea1fd7cc5c0c6e4a1ff075df26d50da647b75376626cc186e2212886dd3a"}, -] - -[package.dependencies] -beautifulsoup4 = "*" - -[[package]] -name = "certifi" -version = "2023.5.7" -description = "Python package for providing Mozilla's CA Bundle." -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, - {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, -] - -[[package]] -name = "charset-normalizer" -version = "3.2.0" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "main" -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, - {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, -] - -[[package]] -name = "click" -version = "8.1.5" -description = "Composable command line interface toolkit" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "click-8.1.5-py3-none-any.whl", hash = "sha256:e576aa487d679441d7d30abb87e1b43d24fc53bffb8758443b1a9e1cee504548"}, - {file = "click-8.1.5.tar.gz", hash = "sha256:4be4b1af8d665c6d942909916d31a213a106800c47d0eeba73d34da3cbc11367"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - -[[package]] -name = "colorama" -version = "0.4.6" -description = "Cross-platform colored terminal text." -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -files = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] - -[[package]] -name = "construct" -version = "2.8.8" -description = "A powerful declarative parser/builder for binary data" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "construct-2.8.8.tar.gz", hash = "sha256:1b84b8147f6fd15bcf64b737c3e8ac5100811ad80c830cb4b2545140511c4157"}, -] - -[[package]] -name = "contextlib2" -version = "21.6.0" -description = "Backports and enhancements for the contextlib module" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "contextlib2-21.6.0-py2.py3-none-any.whl", hash = "sha256:3fbdb64466afd23abaf6c977627b75b6139a5a3e8ce38405c5b413aed7a0471f"}, - {file = "contextlib2-21.6.0.tar.gz", hash = "sha256:ab1e2bfe1d01d968e1b7e8d9023bc51ef3509bba217bb730cee3827e1ee82869"}, -] - -[[package]] -name = "danmakuc" -version = "0.3.6" -description = "Faster conversion for larger Danmaku to Ass format" -category = "main" -optional = false -python-versions = ">=3.8.3" -files = [ - {file = "danmakuC-0.3.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5773fc79a9eec934073e9fdf4cf53d5751e151cc325b9ebc1f02a18f8f3dc3d7"}, - {file = "danmakuC-0.3.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4a33a9c36ad3993196dcfbe978cd8922546e870c2641edd8e2de064edb3b08a"}, - {file = "danmakuC-0.3.6-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b1ef0b10cce60c4534bc8e07001f75d89d94667320918500b41c3175ffc96fb"}, - {file = "danmakuC-0.3.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1ecb1e956968047455d1d9d46e598f60da233f2e432d14075d58d32a403828e"}, - {file = "danmakuC-0.3.6-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b3c7d62d90e96505abf30294220d9814154635f798e0ff00ee0bcd1427cd7114"}, - {file = "danmakuC-0.3.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9770ff4c47b576832233d96c4f3c2eac7370eba0e895b1357c6f6ce5703e0f44"}, - {file = "danmakuC-0.3.6-cp310-cp310-win32.whl", hash = "sha256:103b7d46cd4d93cb7b13e32e712514bd1f50f4740230b5f9a9d09874bbdbf223"}, - {file = "danmakuC-0.3.6-cp310-cp310-win_amd64.whl", hash = "sha256:6f8a6a38328c999967fd1d18a1f29ff5e8ffbb3fb269eca82d1639c5c160e2aa"}, - {file = "danmakuC-0.3.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0aedb77287e92387ac29daf720dd9b5484dc5241d7e4eda94c6e9fdd7907f1"}, - {file = "danmakuC-0.3.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:649604d848c191f6008a9911b1e6436484f2056f1ebef088a991da345737640e"}, - {file = "danmakuC-0.3.6-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19b9a319406ddec567ae04d3f500e4232e480916676f0eb9997bfc8bd2085ce6"}, - {file = "danmakuC-0.3.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:118b36fcc90eef6018a7ae50b965c7aaaad755b4ae2ba3113bf42aa27adf59e2"}, - {file = "danmakuC-0.3.6-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c34e532c5145091243fe6cb3d270c5586aacdb46dc2f2573f7abf68f4d72eeb5"}, - {file = "danmakuC-0.3.6-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a6e828b401fd0d354e39cee3eebc1b0998f98694e0d41c021b02dc35dd694f86"}, - {file = "danmakuC-0.3.6-cp311-cp311-win32.whl", hash = "sha256:41f6067a0803a2c5f1557d34e5133b0ecd10ec16882900679cb92eabecd52025"}, - {file = "danmakuC-0.3.6-cp311-cp311-win_amd64.whl", hash = "sha256:7db2224136a6a6876be0888ac54e57cc6e0d7e77ed3a8335e1b8978ac8b2ad64"}, - {file = "danmakuC-0.3.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7938e5e122e4f5615911cac2604d9bb88c98ffabe7ba3f87ce2f736673bb8d6c"}, - {file = "danmakuC-0.3.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f0c365bbc8dd1658259ce2bb094ecca0a9566c2beb6fd9dabe99b75483b24955"}, - {file = "danmakuC-0.3.6-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9aebeac1ee84acebc62311dfbee92af8d5767326f24e7f4f8ea46e95dfbfeac"}, - {file = "danmakuC-0.3.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecbae8c86ff36c0114be33129542281de928c1fe9aa04d8fe3f9e36041bc5be6"}, - {file = "danmakuC-0.3.6-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:249d6893db7086f797e3b06ea9ec7e225ce3ce50d24aa27303eddc50b08acde8"}, - {file = "danmakuC-0.3.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a89ac949a4aa2c6880dbf2f28da780e49f984186042ecd0d2d4640c03e6c62d9"}, - {file = "danmakuC-0.3.6-cp38-cp38-win32.whl", hash = "sha256:d170d870f116252b98dae204d313020181548baf0cc61026bd5f6d259cfcb3b2"}, - {file = "danmakuC-0.3.6-cp38-cp38-win_amd64.whl", hash = "sha256:e369ac6e045ec949a333e2df38d859632dab969c666113d866f50a653a454f34"}, - {file = "danmakuC-0.3.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:44c36daefb0a0d10e1cd00660668211a679df2e48c4d6b099b26821978da7499"}, - {file = "danmakuC-0.3.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4bbb9a0583f9b959c5c4ff0a27dd432b6c0efbe87faea1d4c94e1eaed85e45dc"}, - {file = "danmakuC-0.3.6-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ce83578f41a8baeb2f36cdb9d745a21d50e95d099d2c42ce12e7f475d811dcf"}, - {file = "danmakuC-0.3.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61d71be26d73e857495ede69cf972257332b9295d78f7539019b03f144f9a276"}, - {file = "danmakuC-0.3.6-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6c259440c85531ed91ac448b8822e91a2da4714334505acd9cd253ab59bb91a6"}, - {file = "danmakuC-0.3.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7a6a97a9978b185e40e883c9c67d76fb569b48490e48b217f428cc1767d6564c"}, - {file = "danmakuC-0.3.6-cp39-cp39-win32.whl", hash = "sha256:fe6a7f74a9f81374bdce25b79d38250d400819ece3b699e806c4dc516bf97f5a"}, - {file = "danmakuC-0.3.6-cp39-cp39-win_amd64.whl", hash = "sha256:aff8370b013dc23bc4c8cc67580409a7e6786636a73fa4ed5c0b368660eb6139"}, - {file = "danmakuC-0.3.6-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:429565b94d39fa0ecd64fb60b5bd3c34144b823971fa4c69e1d656c15bd9f37b"}, - {file = "danmakuC-0.3.6-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:52e6fa69270d336a6764868ccc18a1573ba392877147929fdf22d2ce73b8c5cf"}, - {file = "danmakuC-0.3.6-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba5233540d43a3fdc39263bad2ebd431a4f6919963f4b5502b3472362febba08"}, - {file = "danmakuC-0.3.6-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:1f5e1623fea532b478c554863394ed3a18154aa8de69a18406c604ba640d623a"}, - {file = "danmakuC-0.3.6-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e492bed7e716f942f6850d2484cc847f300a9908cfebae2f5df83b7441a5c8d4"}, - {file = "danmakuC-0.3.6-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8394fc159158c74e5bea3fe14d7b00c43eabfd982cc2261b5a1d8d8fc43a52fd"}, - {file = "danmakuC-0.3.6-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a290ac9cf8e7c106e09e2ecd33af6c7c6a0ca596bb774e475b81853073f10e56"}, - {file = "danmakuC-0.3.6-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:8848a20fa323c155d0d4753d0b61598a325ad3a358ce975d4521bf8343d3629c"}, - {file = "danmakuC-0.3.6.tar.gz", hash = "sha256:db6b7dcf3dba1595c08a37a6f27f925fb40b9b8c110ff013872ac575c9c30132"}, -] - -[package.dependencies] -protobuf = ">=4.21.0" - -[[package]] -name = "docopt" -version = "0.6.2" -description = "Pythonic argument parser, that will make you smile" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"}, -] - -[[package]] -name = "exceptiongroup" -version = "1.1.2" -description = "Backport of PEP 654 (exception groups)" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "exceptiongroup-1.1.2-py3-none-any.whl", hash = "sha256:e346e69d186172ca7cf029c8c1d16235aa0e04035e5750b4b95039e65204328f"}, - {file = "exceptiongroup-1.1.2.tar.gz", hash = "sha256:12c3e887d6485d16943a309616de20ae5582633e0a2eda17f4e10fd61c1e8af5"}, -] - -[package.extras] -test = ["pytest (>=6)"] - -[[package]] -name = "h11" -version = "0.14.0" -description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, - {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, -] - -[[package]] -name = "h2" -version = "4.1.0" -description = "HTTP/2 State-Machine based protocol implementation" -category = "main" -optional = false -python-versions = ">=3.6.1" -files = [ - {file = "h2-4.1.0-py3-none-any.whl", hash = "sha256:03a46bcf682256c95b5fd9e9a99c1323584c3eec6440d379b9903d709476bc6d"}, - {file = "h2-4.1.0.tar.gz", hash = "sha256:a83aca08fbe7aacb79fec788c9c0bac936343560ed9ec18b82a13a12c28d2abb"}, -] - -[package.dependencies] -hpack = ">=4.0,<5" -hyperframe = ">=6.0,<7" - -[[package]] -name = "hpack" -version = "4.0.0" -description = "Pure-Python HPACK header compression" -category = "main" -optional = false -python-versions = ">=3.6.1" -files = [ - {file = "hpack-4.0.0-py3-none-any.whl", hash = "sha256:84a076fad3dc9a9f8063ccb8041ef100867b1878b25ef0ee63847a5d53818a6c"}, - {file = "hpack-4.0.0.tar.gz", hash = "sha256:fc41de0c63e687ebffde81187a948221294896f6bdc0ae2312708df339430095"}, -] - -[[package]] -name = "httpcore" -version = "0.17.3" -description = "A minimal low-level HTTP client." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "httpcore-0.17.3-py3-none-any.whl", hash = "sha256:c2789b767ddddfa2a5782e3199b2b7f6894540b17b16ec26b2c4d8e103510b87"}, - {file = "httpcore-0.17.3.tar.gz", hash = "sha256:a6f30213335e34c1ade7be6ec7c47f19f50c56db36abef1a9dfa3815b1cb3888"}, -] - -[package.dependencies] -anyio = ">=3.0,<5.0" -certifi = "*" -h11 = ">=0.13,<0.15" -sniffio = ">=1.0.0,<2.0.0" - -[package.extras] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (>=1.0.0,<2.0.0)"] - -[[package]] -name = "httpx" -version = "0.24.1" -description = "The next generation HTTP client." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "httpx-0.24.1-py3-none-any.whl", hash = "sha256:06781eb9ac53cde990577af654bd990a4949de37a28bdb4a230d434f3a30b9bd"}, - {file = "httpx-0.24.1.tar.gz", hash = "sha256:5853a43053df830c20f8110c5e69fe44d035d850b2dfe795e196f00fdb774bdd"}, -] - -[package.dependencies] -certifi = "*" -h2 = {version = ">=3,<5", optional = true, markers = "extra == \"http2\""} -httpcore = ">=0.15.0,<0.18.0" -idna = "*" -sniffio = "*" - -[package.extras] -brotli = ["brotli", "brotlicffi"] -cli = ["click (>=8.0.0,<9.0.0)", "pygments (>=2.0.0,<3.0.0)", "rich (>=10,<14)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (>=1.0.0,<2.0.0)"] - -[[package]] -name = "hyperframe" -version = "6.0.1" -description = "HTTP/2 framing layer for Python" -category = "main" -optional = false -python-versions = ">=3.6.1" -files = [ - {file = "hyperframe-6.0.1-py3-none-any.whl", hash = "sha256:0ec6bafd80d8ad2195c4f03aacba3a8265e57bc4cff261e802bf39970ed02a15"}, - {file = "hyperframe-6.0.1.tar.gz", hash = "sha256:ae510046231dc8e9ecb1a6586f63d2347bf4c8905914aa84ba585ae85f28a914"}, -] - -[[package]] -name = "idna" -version = "3.4" -description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" -optional = false -python-versions = ">=3.5" -files = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, -] - -[[package]] -name = "internetarchive" -version = "3.5.0" -description = "A Python interface to archive.org." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "internetarchive-3.5.0.tar.gz", hash = "sha256:2a9625e1dcbe431e5b898402273a4345bf5cb46012599cbe92e664ffdc36e881"}, -] - -[package.dependencies] -docopt = ">=0.6.0,<0.7.0" -jsonpatch = ">=0.4" -requests = ">=2.25.0,<3.0.0" -schema = ">=0.4.0" -tqdm = ">=4.0.0" -urllib3 = ">=1.26.0" - -[package.extras] -all = ["black", "mypy", "pre-commit", "pytest", "pytest (==7.1.2)", "responses (==0.20.0)", "ruff (==0.0.261)", "safety", "setuptools", "tqdm-stubs (>=0.2.0)", "types-colorama", "types-docopt (>=0.6.10,<0.7.0)", "types-jsonpatch (>=0.1.0a0)", "types-pygments", "types-requests (>=2.25.0,<3.0.0)", "types-setuptools", "types-ujson (>=4.2.0)", "types-urllib3 (>=1.26.0)"] -dev = ["black", "mypy", "pre-commit", "pytest", "safety", "setuptools"] -docs = ["alabaster (==0.7.12)", "docutils (<0.18)", "sphinx (==4.5.0)", "sphinx-autodoc-typehints (==1.18.1)"] -test = ["pytest (==7.1.2)", "responses (==0.20.0)", "ruff (==0.0.261)"] -types = ["tqdm-stubs (>=0.2.0)", "types-colorama", "types-docopt (>=0.6.10,<0.7.0)", "types-jsonpatch (>=0.1.0a0)", "types-pygments", "types-requests (>=2.25.0,<3.0.0)", "types-setuptools", "types-ujson (>=4.2.0)", "types-urllib3 (>=1.26.0)"] - -[[package]] -name = "iso8601" -version = "2.0.0" -description = "Simple module to parse ISO 8601 dates" -category = "main" -optional = false -python-versions = ">=3.7,<4.0" -files = [ - {file = "iso8601-2.0.0-py3-none-any.whl", hash = "sha256:ebe10061b932edb8a8e33cc635d661926c59b9c3bed7a4f4edca8c62d400af10"}, - {file = "iso8601-2.0.0.tar.gz", hash = "sha256:739960d37c74c77bd9bd546a76562ccb581fe3d4820ff5c3141eb49c839fda8f"}, -] - -[[package]] -name = "jeepney" -version = "0.8.0" -description = "Low-level, pure Python DBus protocol wrapper." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, - {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, -] - -[package.extras] -test = ["async-timeout", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"] -trio = ["async_generator", "trio"] - -[[package]] -name = "json5" -version = "0.9.14" -description = "A Python implementation of the JSON5 data format." -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "json5-0.9.14-py2.py3-none-any.whl", hash = "sha256:740c7f1b9e584a468dbb2939d8d458db3427f2c93ae2139d05f47e453eae964f"}, - {file = "json5-0.9.14.tar.gz", hash = "sha256:9ed66c3a6ca3510a976a9ef9b8c0787de24802724ab1860bc0153c7fdd589b02"}, -] - -[package.extras] -dev = ["hypothesis"] - -[[package]] -name = "jsonpatch" -version = "1.33" -description = "Apply JSON-Patches (RFC 6902)" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" -files = [ - {file = "jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade"}, - {file = "jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c"}, -] - -[package.dependencies] -jsonpointer = ">=1.9" - -[[package]] -name = "jsonpointer" -version = "2.4" -description = "Identify specific nodes in a JSON document (RFC 6901)" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" -files = [ - {file = "jsonpointer-2.4-py2.py3-none-any.whl", hash = "sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a"}, - {file = "jsonpointer-2.4.tar.gz", hash = "sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88"}, -] - -[[package]] -name = "lz4" -version = "4.3.2" -description = "LZ4 Bindings for Python" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "lz4-4.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1c4c100d99eed7c08d4e8852dd11e7d1ec47a3340f49e3a96f8dfbba17ffb300"}, - {file = "lz4-4.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:edd8987d8415b5dad25e797043936d91535017237f72fa456601be1479386c92"}, - {file = "lz4-4.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7c50542b4ddceb74ab4f8b3435327a0861f06257ca501d59067a6a482535a77"}, - {file = "lz4-4.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f5614d8229b33d4a97cb527db2a1ac81308c6e796e7bdb5d1309127289f69d5"}, - {file = "lz4-4.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8f00a9ba98f6364cadda366ae6469b7b3568c0cced27e16a47ddf6b774169270"}, - {file = "lz4-4.3.2-cp310-cp310-win32.whl", hash = "sha256:b10b77dc2e6b1daa2f11e241141ab8285c42b4ed13a8642495620416279cc5b2"}, - {file = "lz4-4.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:86480f14a188c37cb1416cdabacfb4e42f7a5eab20a737dac9c4b1c227f3b822"}, - {file = "lz4-4.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7c2df117def1589fba1327dceee51c5c2176a2b5a7040b45e84185ce0c08b6a3"}, - {file = "lz4-4.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1f25eb322eeb24068bb7647cae2b0732b71e5c639e4e4026db57618dcd8279f0"}, - {file = "lz4-4.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8df16c9a2377bdc01e01e6de5a6e4bbc66ddf007a6b045688e285d7d9d61d1c9"}, - {file = "lz4-4.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f571eab7fec554d3b1db0d666bdc2ad85c81f4b8cb08906c4c59a8cad75e6e22"}, - {file = "lz4-4.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7211dc8f636ca625abc3d4fb9ab74e5444b92df4f8d58ec83c8868a2b0ff643d"}, - {file = "lz4-4.3.2-cp311-cp311-win32.whl", hash = "sha256:867664d9ca9bdfce840ac96d46cd8838c9ae891e859eb98ce82fcdf0e103a947"}, - {file = "lz4-4.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:a6a46889325fd60b8a6b62ffc61588ec500a1883db32cddee9903edfba0b7584"}, - {file = "lz4-4.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a85b430138882f82f354135b98c320dafb96fc8fe4656573d95ab05de9eb092"}, - {file = "lz4-4.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65d5c93f8badacfa0456b660285e394e65023ef8071142e0dcbd4762166e1be0"}, - {file = "lz4-4.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b50f096a6a25f3b2edca05aa626ce39979d63c3b160687c8c6d50ac3943d0ba"}, - {file = "lz4-4.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:200d05777d61ba1ff8d29cb51c534a162ea0b4fe6d3c28be3571a0a48ff36080"}, - {file = "lz4-4.3.2-cp37-cp37m-win32.whl", hash = "sha256:edc2fb3463d5d9338ccf13eb512aab61937be50aa70734bcf873f2f493801d3b"}, - {file = "lz4-4.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:83acfacab3a1a7ab9694333bcb7950fbeb0be21660d236fd09c8337a50817897"}, - {file = "lz4-4.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7a9eec24ec7d8c99aab54de91b4a5a149559ed5b3097cf30249b665689b3d402"}, - {file = "lz4-4.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:31d72731c4ac6ebdce57cd9a5cabe0aecba229c4f31ba3e2c64ae52eee3fdb1c"}, - {file = "lz4-4.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83903fe6db92db0be101acedc677aa41a490b561567fe1b3fe68695b2110326c"}, - {file = "lz4-4.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:926b26db87ec8822cf1870efc3d04d06062730ec3279bbbd33ba47a6c0a5c673"}, - {file = "lz4-4.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e05afefc4529e97c08e65ef92432e5f5225c0bb21ad89dee1e06a882f91d7f5e"}, - {file = "lz4-4.3.2-cp38-cp38-win32.whl", hash = "sha256:ad38dc6a7eea6f6b8b642aaa0683253288b0460b70cab3216838747163fb774d"}, - {file = "lz4-4.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:7e2dc1bd88b60fa09b9b37f08553f45dc2b770c52a5996ea52b2b40f25445676"}, - {file = "lz4-4.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:edda4fb109439b7f3f58ed6bede59694bc631c4b69c041112b1b7dc727fffb23"}, - {file = "lz4-4.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ca83a623c449295bafad745dcd399cea4c55b16b13ed8cfea30963b004016c9"}, - {file = "lz4-4.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5ea0e788dc7e2311989b78cae7accf75a580827b4d96bbaf06c7e5a03989bd5"}, - {file = "lz4-4.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a98b61e504fb69f99117b188e60b71e3c94469295571492a6468c1acd63c37ba"}, - {file = "lz4-4.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4931ab28a0d1c133104613e74eec1b8bb1f52403faabe4f47f93008785c0b929"}, - {file = "lz4-4.3.2-cp39-cp39-win32.whl", hash = "sha256:ec6755cacf83f0c5588d28abb40a1ac1643f2ff2115481089264c7630236618a"}, - {file = "lz4-4.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:4caedeb19e3ede6c7a178968b800f910db6503cb4cb1e9cc9221157572139b49"}, - {file = "lz4-4.3.2.tar.gz", hash = "sha256:e1431d84a9cfb23e6773e72078ce8e65cad6745816d4cbf9ae67da5ea419acda"}, -] - -[package.extras] -docs = ["sphinx (>=1.6.0)", "sphinx-bootstrap-theme"] -flake8 = ["flake8"] -tests = ["psutil", "pytest (!=3.3.0)", "pytest-cov"] - -[[package]] -name = "m3u8" -version = "3.5.0" -description = "Python m3u8 parser" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "m3u8-3.5.0-py3-none-any.whl", hash = "sha256:e69c76055c32643b8a6cd0d8113fa76ed37f49aec74fcc9e1b97e287545306d8"}, - {file = "m3u8-3.5.0.tar.gz", hash = "sha256:b2eeaa768de574c9d05aad135b1073992927ce0a20b968ebb13f3a183fa92488"}, -] - -[package.dependencies] -iso8601 = "*" - -[[package]] -name = "markdown-it-py" -version = "3.0.0" -description = "Python port of markdown-it. Markdown parsing, done right!" -category = "main" -optional = false -python-versions = ">=3.8" -files = [ - {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, - {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, -] - -[package.dependencies] -mdurl = ">=0.1,<1.0" - -[package.extras] -benchmarking = ["psutil", "pytest", "pytest-benchmark"] -code-style = ["pre-commit (>=3.0,<4.0)"] -compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] -linkify = ["linkify-it-py (>=1,<3)"] -plugins = ["mdit-py-plugins"] -profiling = ["gprof2dot"] -rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] -testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] - -[[package]] -name = "mdurl" -version = "0.1.2" -description = "Markdown URL utilities" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, - {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, -] - -[[package]] -name = "protobuf" -version = "4.23.4" -description = "" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "protobuf-4.23.4-cp310-abi3-win32.whl", hash = "sha256:5fea3c64d41ea5ecf5697b83e41d09b9589e6f20b677ab3c48e5f242d9b7897b"}, - {file = "protobuf-4.23.4-cp310-abi3-win_amd64.whl", hash = "sha256:7b19b6266d92ca6a2a87effa88ecc4af73ebc5cfde194dc737cf8ef23a9a3b12"}, - {file = "protobuf-4.23.4-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:8547bf44fe8cec3c69e3042f5c4fb3e36eb2a7a013bb0a44c018fc1e427aafbd"}, - {file = "protobuf-4.23.4-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:fee88269a090ada09ca63551bf2f573eb2424035bcf2cb1b121895b01a46594a"}, - {file = "protobuf-4.23.4-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:effeac51ab79332d44fba74660d40ae79985901ac21bca408f8dc335a81aa597"}, - {file = "protobuf-4.23.4-cp37-cp37m-win32.whl", hash = "sha256:c3e0939433c40796ca4cfc0fac08af50b00eb66a40bbbc5dee711998fb0bbc1e"}, - {file = "protobuf-4.23.4-cp37-cp37m-win_amd64.whl", hash = "sha256:9053df6df8e5a76c84339ee4a9f5a2661ceee4a0dab019e8663c50ba324208b0"}, - {file = "protobuf-4.23.4-cp38-cp38-win32.whl", hash = "sha256:e1c915778d8ced71e26fcf43c0866d7499891bca14c4368448a82edc61fdbc70"}, - {file = "protobuf-4.23.4-cp38-cp38-win_amd64.whl", hash = "sha256:351cc90f7d10839c480aeb9b870a211e322bf05f6ab3f55fcb2f51331f80a7d2"}, - {file = "protobuf-4.23.4-cp39-cp39-win32.whl", hash = "sha256:6dd9b9940e3f17077e820b75851126615ee38643c2c5332aa7a359988820c720"}, - {file = "protobuf-4.23.4-cp39-cp39-win_amd64.whl", hash = "sha256:0a5759f5696895de8cc913f084e27fd4125e8fb0914bb729a17816a33819f474"}, - {file = "protobuf-4.23.4-py3-none-any.whl", hash = "sha256:e9d0be5bf34b275b9f87ba7407796556abeeba635455d036c7351f7c183ef8ff"}, - {file = "protobuf-4.23.4.tar.gz", hash = "sha256:ccd9430c0719dce806b93f89c91de7977304729e55377f872a92465d548329a9"}, -] - -[[package]] -name = "pycryptodome" -version = "3.18.0" -description = "Cryptographic library for Python" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "pycryptodome-3.18.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:d1497a8cd4728db0e0da3c304856cb37c0c4e3d0b36fcbabcc1600f18504fc54"}, - {file = "pycryptodome-3.18.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:928078c530da78ff08e10eb6cada6e0dff386bf3d9fa9871b4bbc9fbc1efe024"}, - {file = "pycryptodome-3.18.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:157c9b5ba5e21b375f052ca78152dd309a09ed04703fd3721dce3ff8ecced148"}, - {file = "pycryptodome-3.18.0-cp27-cp27m-manylinux2014_aarch64.whl", hash = "sha256:d20082bdac9218649f6abe0b885927be25a917e29ae0502eaf2b53f1233ce0c2"}, - {file = "pycryptodome-3.18.0-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:e8ad74044e5f5d2456c11ed4cfd3e34b8d4898c0cb201c4038fe41458a82ea27"}, - {file = "pycryptodome-3.18.0-cp27-cp27m-win32.whl", hash = "sha256:62a1e8847fabb5213ccde38915563140a5b338f0d0a0d363f996b51e4a6165cf"}, - {file = "pycryptodome-3.18.0-cp27-cp27m-win_amd64.whl", hash = "sha256:16bfd98dbe472c263ed2821284118d899c76968db1a6665ade0c46805e6b29a4"}, - {file = "pycryptodome-3.18.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:7a3d22c8ee63de22336679e021c7f2386f7fc465477d59675caa0e5706387944"}, - {file = "pycryptodome-3.18.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:78d863476e6bad2a592645072cc489bb90320972115d8995bcfbee2f8b209918"}, - {file = "pycryptodome-3.18.0-cp27-cp27mu-manylinux2014_aarch64.whl", hash = "sha256:b6a610f8bfe67eab980d6236fdc73bfcdae23c9ed5548192bb2d530e8a92780e"}, - {file = "pycryptodome-3.18.0-cp27-cp27mu-musllinux_1_1_aarch64.whl", hash = "sha256:422c89fd8df8a3bee09fb8d52aaa1e996120eafa565437392b781abec2a56e14"}, - {file = "pycryptodome-3.18.0-cp35-abi3-macosx_10_9_universal2.whl", hash = "sha256:9ad6f09f670c466aac94a40798e0e8d1ef2aa04589c29faa5b9b97566611d1d1"}, - {file = "pycryptodome-3.18.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:53aee6be8b9b6da25ccd9028caf17dcdce3604f2c7862f5167777b707fbfb6cb"}, - {file = "pycryptodome-3.18.0-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:10da29526a2a927c7d64b8f34592f461d92ae55fc97981aab5bbcde8cb465bb6"}, - {file = "pycryptodome-3.18.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f21efb8438971aa16924790e1c3dba3a33164eb4000106a55baaed522c261acf"}, - {file = "pycryptodome-3.18.0-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4944defabe2ace4803f99543445c27dd1edbe86d7d4edb87b256476a91e9ffa4"}, - {file = "pycryptodome-3.18.0-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:51eae079ddb9c5f10376b4131be9589a6554f6fd84f7f655180937f611cd99a2"}, - {file = "pycryptodome-3.18.0-cp35-abi3-musllinux_1_1_i686.whl", hash = "sha256:83c75952dcf4a4cebaa850fa257d7a860644c70a7cd54262c237c9f2be26f76e"}, - {file = "pycryptodome-3.18.0-cp35-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:957b221d062d5752716923d14e0926f47670e95fead9d240fa4d4862214b9b2f"}, - {file = "pycryptodome-3.18.0-cp35-abi3-win32.whl", hash = "sha256:795bd1e4258a2c689c0b1f13ce9684fa0dd4c0e08680dcf597cf9516ed6bc0f3"}, - {file = "pycryptodome-3.18.0-cp35-abi3-win_amd64.whl", hash = "sha256:b1d9701d10303eec8d0bd33fa54d44e67b8be74ab449052a8372f12a66f93fb9"}, - {file = "pycryptodome-3.18.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:cb1be4d5af7f355e7d41d36d8eec156ef1382a88638e8032215c215b82a4b8ec"}, - {file = "pycryptodome-3.18.0-pp27-pypy_73-win32.whl", hash = "sha256:fc0a73f4db1e31d4a6d71b672a48f3af458f548059aa05e83022d5f61aac9c08"}, - {file = "pycryptodome-3.18.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f022a4fd2a5263a5c483a2bb165f9cb27f2be06f2f477113783efe3fe2ad887b"}, - {file = "pycryptodome-3.18.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:363dd6f21f848301c2dcdeb3c8ae5f0dee2286a5e952a0f04954b82076f23825"}, - {file = "pycryptodome-3.18.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12600268763e6fec3cefe4c2dcdf79bde08d0b6dc1813887e789e495cb9f3403"}, - {file = "pycryptodome-3.18.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4604816adebd4faf8810782f137f8426bf45fee97d8427fa8e1e49ea78a52e2c"}, - {file = "pycryptodome-3.18.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:01489bbdf709d993f3058e2996f8f40fee3f0ea4d995002e5968965fa2fe89fb"}, - {file = "pycryptodome-3.18.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3811e31e1ac3069988f7a1c9ee7331b942e605dfc0f27330a9ea5997e965efb2"}, - {file = "pycryptodome-3.18.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f4b967bb11baea9128ec88c3d02f55a3e338361f5e4934f5240afcb667fdaec"}, - {file = "pycryptodome-3.18.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:9c8eda4f260072f7dbe42f473906c659dcbadd5ae6159dfb49af4da1293ae380"}, - {file = "pycryptodome-3.18.0.tar.gz", hash = "sha256:c9adee653fc882d98956e33ca2c1fb582e23a8af7ac82fee75bd6113c55a0413"}, -] - -[[package]] -name = "pycryptodomex" -version = "3.18.0" -description = "Cryptographic library for Python" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "pycryptodomex-3.18.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:160a39a708c36fa0b168ab79386dede588e62aec06eb505add870739329aecc6"}, - {file = "pycryptodomex-3.18.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:c2953afebf282a444c51bf4effe751706b4d0d63d7ca2cc51db21f902aa5b84e"}, - {file = "pycryptodomex-3.18.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:ba95abd563b0d1b88401658665a260852a8e6c647026ee6a0a65589287681df8"}, - {file = "pycryptodomex-3.18.0-cp27-cp27m-manylinux2014_aarch64.whl", hash = "sha256:192306cf881fe3467dda0e174a4f47bb3a8bb24b90c9cdfbdc248eec5fc0578c"}, - {file = "pycryptodomex-3.18.0-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:f9ab5ef0718f6a8716695dea16d83b671b22c45e9c0c78fd807c32c0192e54b5"}, - {file = "pycryptodomex-3.18.0-cp27-cp27m-win32.whl", hash = "sha256:50308fcdbf8345e5ec224a5502b4215178bdb5e95456ead8ab1a69ffd94779cb"}, - {file = "pycryptodomex-3.18.0-cp27-cp27m-win_amd64.whl", hash = "sha256:4d9379c684efea80fdab02a3eb0169372bca7db13f9332cb67483b8dc8b67c37"}, - {file = "pycryptodomex-3.18.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:5594a125dae30d60e94f37797fc67ce3c744522de7992c7c360d02fdb34918f8"}, - {file = "pycryptodomex-3.18.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:8ff129a5a0eb5ff16e45ca4fa70a6051da7f3de303c33b259063c19be0c43d35"}, - {file = "pycryptodomex-3.18.0-cp27-cp27mu-manylinux2014_aarch64.whl", hash = "sha256:3d9314ac785a5b75d5aaf924c5f21d6ca7e8df442e5cf4f0fefad4f6e284d422"}, - {file = "pycryptodomex-3.18.0-cp27-cp27mu-musllinux_1_1_aarch64.whl", hash = "sha256:f237278836dda412a325e9340ba2e6a84cb0f56b9244781e5b61f10b3905de88"}, - {file = "pycryptodomex-3.18.0-cp35-abi3-macosx_10_9_universal2.whl", hash = "sha256:ac614363a86cc53d8ba44b6c469831d1555947e69ab3276ae8d6edc219f570f7"}, - {file = "pycryptodomex-3.18.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:302a8f37c224e7b5d72017d462a2be058e28f7be627bdd854066e16722d0fc0c"}, - {file = "pycryptodomex-3.18.0-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:6421d23d6a648e83ba2670a352bcd978542dad86829209f59d17a3f087f4afef"}, - {file = "pycryptodomex-3.18.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84e105787f5e5d36ec6a581ff37a1048d12e638688074b2a00bcf402f9aa1c2"}, - {file = "pycryptodomex-3.18.0-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6875eb8666f68ddbd39097867325bd22771f595b4e2b0149739b5623c8bf899b"}, - {file = "pycryptodomex-3.18.0-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:27072a494ce621cc7a9096bbf60ed66826bb94db24b49b7359509e7951033e74"}, - {file = "pycryptodomex-3.18.0-cp35-abi3-musllinux_1_1_i686.whl", hash = "sha256:1949e09ea49b09c36d11a951b16ff2a05a0ffe969dda1846e4686ee342fe8646"}, - {file = "pycryptodomex-3.18.0-cp35-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6ed3606832987018615f68e8ed716a7065c09a0fe94afd7c9ca1b6777f0ac6eb"}, - {file = "pycryptodomex-3.18.0-cp35-abi3-win32.whl", hash = "sha256:d56c9ec41258fd3734db9f5e4d2faeabe48644ba9ca23b18e1839b3bdf093222"}, - {file = "pycryptodomex-3.18.0-cp35-abi3-win_amd64.whl", hash = "sha256:e00a4bacb83a2627e8210cb353a2e31f04befc1155db2976e5e239dd66482278"}, - {file = "pycryptodomex-3.18.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:2dc4eab20f4f04a2d00220fdc9258717b82d31913552e766d5f00282c031b70a"}, - {file = "pycryptodomex-3.18.0-pp27-pypy_73-win32.whl", hash = "sha256:75672205148bdea34669173366df005dbd52be05115e919551ee97171083423d"}, - {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bec6c80994d4e7a38312072f89458903b65ec99bed2d65aa4de96d997a53ea7a"}, - {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d35a8ffdc8b05e4b353ba281217c8437f02c57d7233363824e9d794cf753c419"}, - {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76f0a46bee539dae4b3dfe37216f678769349576b0080fdbe431d19a02da42ff"}, - {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:71687eed47df7e965f6e0bf3cadef98f368d5221f0fb89d2132effe1a3e6a194"}, - {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:73d64b32d84cf48d9ec62106aa277dbe99ab5fbfd38c5100bc7bddd3beb569f7"}, - {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbdcce0a226d9205560a5936b05208c709b01d493ed8307792075dedfaaffa5f"}, - {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58fc0aceb9c961b9897facec9da24c6a94c5db04597ec832060f53d4d6a07196"}, - {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:215be2980a6b70704c10796dd7003eb4390e7be138ac6fb8344bf47e71a8d470"}, - {file = "pycryptodomex-3.18.0.tar.gz", hash = "sha256:3e3ecb5fe979e7c1bb0027e518340acf7ee60415d79295e5251d13c68dde576e"}, -] - -[[package]] -name = "pydantic" -version = "1.10.11" -description = "Data validation and settings management using python type hints" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pydantic-1.10.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ff44c5e89315b15ff1f7fdaf9853770b810936d6b01a7bcecaa227d2f8fe444f"}, - {file = "pydantic-1.10.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a6c098d4ab5e2d5b3984d3cb2527e2d6099d3de85630c8934efcfdc348a9760e"}, - {file = "pydantic-1.10.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16928fdc9cb273c6af00d9d5045434c39afba5f42325fb990add2c241402d151"}, - {file = "pydantic-1.10.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0588788a9a85f3e5e9ebca14211a496409cb3deca5b6971ff37c556d581854e7"}, - {file = "pydantic-1.10.11-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e9baf78b31da2dc3d3f346ef18e58ec5f12f5aaa17ac517e2ffd026a92a87588"}, - {file = "pydantic-1.10.11-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:373c0840f5c2b5b1ccadd9286782852b901055998136287828731868027a724f"}, - {file = "pydantic-1.10.11-cp310-cp310-win_amd64.whl", hash = "sha256:c3339a46bbe6013ef7bdd2844679bfe500347ac5742cd4019a88312aa58a9847"}, - {file = "pydantic-1.10.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:08a6c32e1c3809fbc49debb96bf833164f3438b3696abf0fbeceb417d123e6eb"}, - {file = "pydantic-1.10.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a451ccab49971af043ec4e0d207cbc8cbe53dbf148ef9f19599024076fe9c25b"}, - {file = "pydantic-1.10.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b02d24f7b2b365fed586ed73582c20f353a4c50e4be9ba2c57ab96f8091ddae"}, - {file = "pydantic-1.10.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f34739a89260dfa420aa3cbd069fbcc794b25bbe5c0a214f8fb29e363484b66"}, - {file = "pydantic-1.10.11-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e297897eb4bebde985f72a46a7552a7556a3dd11e7f76acda0c1093e3dbcf216"}, - {file = "pydantic-1.10.11-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d185819a7a059550ecb85d5134e7d40f2565f3dd94cfd870132c5f91a89cf58c"}, - {file = "pydantic-1.10.11-cp311-cp311-win_amd64.whl", hash = "sha256:4400015f15c9b464c9db2d5d951b6a780102cfa5870f2c036d37c23b56f7fc1b"}, - {file = "pydantic-1.10.11-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2417de68290434461a266271fc57274a138510dca19982336639484c73a07af6"}, - {file = "pydantic-1.10.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:331c031ba1554b974c98679bd0780d89670d6fd6f53f5d70b10bdc9addee1713"}, - {file = "pydantic-1.10.11-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8268a735a14c308923e8958363e3a3404f6834bb98c11f5ab43251a4e410170c"}, - {file = "pydantic-1.10.11-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:44e51ba599c3ef227e168424e220cd3e544288c57829520dc90ea9cb190c3248"}, - {file = "pydantic-1.10.11-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d7781f1d13b19700b7949c5a639c764a077cbbdd4322ed505b449d3ca8edcb36"}, - {file = "pydantic-1.10.11-cp37-cp37m-win_amd64.whl", hash = "sha256:7522a7666157aa22b812ce14c827574ddccc94f361237ca6ea8bb0d5c38f1629"}, - {file = "pydantic-1.10.11-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bc64eab9b19cd794a380179ac0e6752335e9555d214cfcb755820333c0784cb3"}, - {file = "pydantic-1.10.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8dc77064471780262b6a68fe67e013298d130414d5aaf9b562c33987dbd2cf4f"}, - {file = "pydantic-1.10.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe429898f2c9dd209bd0632a606bddc06f8bce081bbd03d1c775a45886e2c1cb"}, - {file = "pydantic-1.10.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:192c608ad002a748e4a0bed2ddbcd98f9b56df50a7c24d9a931a8c5dd053bd3d"}, - {file = "pydantic-1.10.11-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ef55392ec4bb5721f4ded1096241e4b7151ba6d50a50a80a2526c854f42e6a2f"}, - {file = "pydantic-1.10.11-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:41e0bb6efe86281623abbeeb0be64eab740c865388ee934cd3e6a358784aca6e"}, - {file = "pydantic-1.10.11-cp38-cp38-win_amd64.whl", hash = "sha256:265a60da42f9f27e0b1014eab8acd3e53bd0bad5c5b4884e98a55f8f596b2c19"}, - {file = "pydantic-1.10.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:469adf96c8e2c2bbfa655fc7735a2a82f4c543d9fee97bd113a7fb509bf5e622"}, - {file = "pydantic-1.10.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e6cbfbd010b14c8a905a7b10f9fe090068d1744d46f9e0c021db28daeb8b6de1"}, - {file = "pydantic-1.10.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abade85268cc92dff86d6effcd917893130f0ff516f3d637f50dadc22ae93999"}, - {file = "pydantic-1.10.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9738b0f2e6c70f44ee0de53f2089d6002b10c33264abee07bdb5c7f03038303"}, - {file = "pydantic-1.10.11-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:787cf23e5a0cde753f2eabac1b2e73ae3844eb873fd1f5bdbff3048d8dbb7604"}, - {file = "pydantic-1.10.11-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:174899023337b9fc685ac8adaa7b047050616136ccd30e9070627c1aaab53a13"}, - {file = "pydantic-1.10.11-cp39-cp39-win_amd64.whl", hash = "sha256:1954f8778489a04b245a1e7b8b22a9d3ea8ef49337285693cf6959e4b757535e"}, - {file = "pydantic-1.10.11-py3-none-any.whl", hash = "sha256:008c5e266c8aada206d0627a011504e14268a62091450210eda7c07fabe6963e"}, - {file = "pydantic-1.10.11.tar.gz", hash = "sha256:f66d479cf7eb331372c470614be6511eae96f1f120344c25f3f9bb59fb1b5528"}, -] - -[package.dependencies] -typing-extensions = ">=4.2.0" - -[package.extras] -dotenv = ["python-dotenv (>=0.10.4)"] -email = ["email-validator (>=1.0.3)"] - -[[package]] -name = "pygments" -version = "2.15.1" -description = "Pygments is a syntax highlighting package written in Python." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, - {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, -] - -[package.extras] -plugins = ["importlib-metadata"] - -[[package]] -name = "pymp4" -version = "1.4.0" -description = "Python parser for MP4 boxes" -category = "main" -optional = false -python-versions = ">=3.7,<4.0" -files = [ - {file = "pymp4-1.4.0-py3-none-any.whl", hash = "sha256:3401666c1e2a97ac94dffb18c5a5dcbd46d0a436da5272d378a6f9f6506dd12d"}, - {file = "pymp4-1.4.0.tar.gz", hash = "sha256:bc9e77732a8a143d34c38aa862a54180716246938e4bf3e07585d19252b77bb5"}, -] - -[package.dependencies] -construct = "2.8.8" - -[[package]] -name = "requests" -version = "2.31.0" -description = "Python HTTP for Humans." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, -] - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" -idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<3" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] - -[[package]] -name = "rich" -version = "13.4.2" -description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" -category = "main" -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "rich-13.4.2-py3-none-any.whl", hash = "sha256:8f87bc7ee54675732fa66a05ebfe489e27264caeeff3728c945d25971b6485ec"}, - {file = "rich-13.4.2.tar.gz", hash = "sha256:d653d6bccede5844304c605d5aac802c7cf9621efd700b46c7ec2b51ea914898"}, -] - -[package.dependencies] -markdown-it-py = ">=2.2.0" -pygments = ">=2.13.0,<3.0.0" - -[package.extras] -jupyter = ["ipywidgets (>=7.5.1,<9)"] - -[[package]] -name = "schema" -version = "0.7.5" -description = "Simple data validation library" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "schema-0.7.5-py2.py3-none-any.whl", hash = "sha256:f3ffdeeada09ec34bf40d7d79996d9f7175db93b7a5065de0faa7f41083c1e6c"}, - {file = "schema-0.7.5.tar.gz", hash = "sha256:f06717112c61895cabc4707752b88716e8420a8819d71404501e114f91043197"}, -] - -[package.dependencies] -contextlib2 = ">=0.5.5" - -[[package]] -name = "sniffio" -version = "1.3.0" -description = "Sniff out which async library your code is running under" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, - {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, -] - -[[package]] -name = "soupsieve" -version = "2.4.1" -description = "A modern CSS selector implementation for Beautiful Soup." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "soupsieve-2.4.1-py3-none-any.whl", hash = "sha256:1c1bfee6819544a3447586c889157365a27e10d88cde3ad3da0cf0ddf646feb8"}, - {file = "soupsieve-2.4.1.tar.gz", hash = "sha256:89d12b2d5dfcd2c9e8c22326da9d9aa9cb3dfab0a83a024f05704076ee8d35ea"}, -] - -[[package]] -name = "tqdm" -version = "4.65.0" -description = "Fast, Extensible Progress Meter" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tqdm-4.65.0-py3-none-any.whl", hash = "sha256:c4f53a17fe37e132815abceec022631be8ffe1b9381c2e6e30aa70edc99e9671"}, - {file = "tqdm-4.65.0.tar.gz", hash = "sha256:1871fb68a86b8fb3b59ca4cdd3dcccbc7e6d613eeed31f4c332531977b89beb5"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - -[package.extras] -dev = ["py-make (>=0.1.0)", "twine", "wheel"] -notebook = ["ipywidgets (>=6)"] -slack = ["slack-sdk"] -telegram = ["requests"] - -[[package]] -name = "typing-extensions" -version = "4.7.1" -description = "Backported and Experimental Type Hints for Python 3.7+" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, - {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, -] - -[[package]] -name = "urllib3" -version = "2.0.3" -description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "urllib3-2.0.3-py3-none-any.whl", hash = "sha256:48e7fafa40319d358848e1bc6809b208340fafe2096f1725d05d67443d0483d1"}, - {file = "urllib3-2.0.3.tar.gz", hash = "sha256:bee28b5e56addb8226c96f7f13ac28cb4c301dd5ea8a6ca179c0b9835e032825"}, -] - -[package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] -socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["zstandard (>=0.18.0)"] - -[metadata] -lock-version = "2.0" -python-versions = "^3.9" -content-hash = "2f5c4fdec44807fa7153da716b749ff062e04df75850b30cec784a7abfe44b56" +# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. + +[[package]] +name = "aiofiles" +version = "23.1.0" +description = "File support for asyncio." +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "aiofiles-23.1.0-py3-none-any.whl", hash = "sha256:9312414ae06472eb6f1d163f555e466a23aed1c8f60c30cccf7121dba2e53eb2"}, + {file = "aiofiles-23.1.0.tar.gz", hash = "sha256:edd247df9a19e0db16534d4baaf536d6609a43e1de5401d7a4c1c148753a1635"}, +] + +[[package]] +name = "anyio" +version = "3.7.1" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.7" +files = [ + {file = "anyio-3.7.1-py3-none-any.whl", hash = "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5"}, + {file = "anyio-3.7.1.tar.gz", hash = "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780"}, +] + +[package.dependencies] +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +idna = ">=2.8" +sniffio = ">=1.1" + +[package.extras] +doc = ["Sphinx", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme (>=1.2.2)", "sphinxcontrib-jquery"] +test = ["anyio[trio]", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (<0.22)"] + +[[package]] +name = "beautifulsoup4" +version = "4.12.2" +description = "Screen-scraping library" +optional = false +python-versions = ">=3.6.0" +files = [ + {file = "beautifulsoup4-4.12.2-py3-none-any.whl", hash = "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a"}, + {file = "beautifulsoup4-4.12.2.tar.gz", hash = "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da"}, +] + +[package.dependencies] +soupsieve = ">1.2" + +[package.extras] +html5lib = ["html5lib"] +lxml = ["lxml"] + +[[package]] +name = "bilix" +version = "0.18.4" +description = "⚡️Lightning-fast asynchronous download tool for bilibili and more" +optional = false +python-versions = ">=3.8" +files = [ + {file = "bilix-0.18.4-py3-none-any.whl", hash = "sha256:c9405a274dce609113a3266c2ab415cf74f8562d266849b841b268585c57d88e"}, + {file = "bilix-0.18.4.tar.gz", hash = "sha256:e62e030b975f338a6d4e40a56af589e65b05a1d667747a3737ecb5cdec4093f9"}, +] + +[package.dependencies] +aiofiles = ">=0.8.0" +anyio = "*" +browser-cookie3 = ">=0.17.1" +bs4 = "*" +click = ">=8.0.3" +danmakuc = ">=0.3.5" +httpx = {version = ">=0.23.3", extras = ["http2"]} +json5 = "*" +m3u8 = "*" +pycryptodome = "*" +pydantic = "==1.*" +pymp4 = ">=1.2.0" +rich = "*" + +[package.extras] +serve = ["fastapi (>=0.92.0)", "passlib[bcrypt]", "python-jose[cryptography]", "starlette"] + +[[package]] +name = "browser-cookie3" +version = "0.19.1" +description = "Loads cookies from your browser into a cookiejar object so can download with urllib and other libraries the same content you see in the web browser." +optional = false +python-versions = "*" +files = [ + {file = "browser-cookie3-0.19.1.tar.gz", hash = "sha256:3031ad14b96b47ef1e4c8545f2f463e10ad844ef834dcd0ebdae361e31c6119a"}, + {file = "browser_cookie3-0.19.1-py3-none-any.whl", hash = "sha256:114e40fe80853211d65f14bc690a7d90c4c287251593dc5767692a950a9006d4"}, +] + +[package.dependencies] +jeepney = {version = "*", markers = "python_version >= \"3.7\" and (sys_platform == \"bsd\" or sys_platform == \"linux\")"} +lz4 = "*" +pycryptodomex = "*" + +[[package]] +name = "bs4" +version = "0.0.1" +description = "Dummy package for Beautiful Soup" +optional = false +python-versions = "*" +files = [ + {file = "bs4-0.0.1.tar.gz", hash = "sha256:36ecea1fd7cc5c0c6e4a1ff075df26d50da647b75376626cc186e2212886dd3a"}, +] + +[package.dependencies] +beautifulsoup4 = "*" + +[[package]] +name = "certifi" +version = "2023.5.7" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, + {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.2.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, + {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, +] + +[[package]] +name = "click" +version = "8.1.6" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.6-py3-none-any.whl", hash = "sha256:fa244bb30b3b5ee2cae3da8f55c9e5e0c0e86093306301fb418eb9dc40fbded5"}, + {file = "click-8.1.6.tar.gz", hash = "sha256:48ee849951919527a045bfe3bf7baa8a959c423134e1a5b98c05c20ba75a1cbd"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "click-option-group" +version = "0.5.6" +description = "Option groups missing in Click" +optional = false +python-versions = ">=3.6,<4" +files = [ + {file = "click-option-group-0.5.6.tar.gz", hash = "sha256:97d06703873518cc5038509443742b25069a3c7562d1ea72ff08bfadde1ce777"}, + {file = "click_option_group-0.5.6-py3-none-any.whl", hash = "sha256:38a26d963ee3ad93332ddf782f9259c5bdfe405e73408d943ef5e7d0c3767ec7"}, +] + +[package.dependencies] +Click = ">=7.0,<9" + +[package.extras] +docs = ["Pallets-Sphinx-Themes", "m2r2", "sphinx"] +tests = ["pytest"] +tests-cov = ["coverage", "coveralls", "pytest", "pytest-cov"] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "construct" +version = "2.8.8" +description = "A powerful declarative parser/builder for binary data" +optional = false +python-versions = "*" +files = [ + {file = "construct-2.8.8.tar.gz", hash = "sha256:1b84b8147f6fd15bcf64b737c3e8ac5100811ad80c830cb4b2545140511c4157"}, +] + +[[package]] +name = "contextlib2" +version = "21.6.0" +description = "Backports and enhancements for the contextlib module" +optional = false +python-versions = ">=3.6" +files = [ + {file = "contextlib2-21.6.0-py2.py3-none-any.whl", hash = "sha256:3fbdb64466afd23abaf6c977627b75b6139a5a3e8ce38405c5b413aed7a0471f"}, + {file = "contextlib2-21.6.0.tar.gz", hash = "sha256:ab1e2bfe1d01d968e1b7e8d9023bc51ef3509bba217bb730cee3827e1ee82869"}, +] + +[[package]] +name = "danmakuc" +version = "0.3.6" +description = "Faster conversion for larger Danmaku to Ass format" +optional = false +python-versions = ">=3.8.3" +files = [ + {file = "danmakuC-0.3.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5773fc79a9eec934073e9fdf4cf53d5751e151cc325b9ebc1f02a18f8f3dc3d7"}, + {file = "danmakuC-0.3.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4a33a9c36ad3993196dcfbe978cd8922546e870c2641edd8e2de064edb3b08a"}, + {file = "danmakuC-0.3.6-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b1ef0b10cce60c4534bc8e07001f75d89d94667320918500b41c3175ffc96fb"}, + {file = "danmakuC-0.3.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1ecb1e956968047455d1d9d46e598f60da233f2e432d14075d58d32a403828e"}, + {file = "danmakuC-0.3.6-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b3c7d62d90e96505abf30294220d9814154635f798e0ff00ee0bcd1427cd7114"}, + {file = "danmakuC-0.3.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9770ff4c47b576832233d96c4f3c2eac7370eba0e895b1357c6f6ce5703e0f44"}, + {file = "danmakuC-0.3.6-cp310-cp310-win32.whl", hash = "sha256:103b7d46cd4d93cb7b13e32e712514bd1f50f4740230b5f9a9d09874bbdbf223"}, + {file = "danmakuC-0.3.6-cp310-cp310-win_amd64.whl", hash = "sha256:6f8a6a38328c999967fd1d18a1f29ff5e8ffbb3fb269eca82d1639c5c160e2aa"}, + {file = "danmakuC-0.3.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0aedb77287e92387ac29daf720dd9b5484dc5241d7e4eda94c6e9fdd7907f1"}, + {file = "danmakuC-0.3.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:649604d848c191f6008a9911b1e6436484f2056f1ebef088a991da345737640e"}, + {file = "danmakuC-0.3.6-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19b9a319406ddec567ae04d3f500e4232e480916676f0eb9997bfc8bd2085ce6"}, + {file = "danmakuC-0.3.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:118b36fcc90eef6018a7ae50b965c7aaaad755b4ae2ba3113bf42aa27adf59e2"}, + {file = "danmakuC-0.3.6-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c34e532c5145091243fe6cb3d270c5586aacdb46dc2f2573f7abf68f4d72eeb5"}, + {file = "danmakuC-0.3.6-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a6e828b401fd0d354e39cee3eebc1b0998f98694e0d41c021b02dc35dd694f86"}, + {file = "danmakuC-0.3.6-cp311-cp311-win32.whl", hash = "sha256:41f6067a0803a2c5f1557d34e5133b0ecd10ec16882900679cb92eabecd52025"}, + {file = "danmakuC-0.3.6-cp311-cp311-win_amd64.whl", hash = "sha256:7db2224136a6a6876be0888ac54e57cc6e0d7e77ed3a8335e1b8978ac8b2ad64"}, + {file = "danmakuC-0.3.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7938e5e122e4f5615911cac2604d9bb88c98ffabe7ba3f87ce2f736673bb8d6c"}, + {file = "danmakuC-0.3.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f0c365bbc8dd1658259ce2bb094ecca0a9566c2beb6fd9dabe99b75483b24955"}, + {file = "danmakuC-0.3.6-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9aebeac1ee84acebc62311dfbee92af8d5767326f24e7f4f8ea46e95dfbfeac"}, + {file = "danmakuC-0.3.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecbae8c86ff36c0114be33129542281de928c1fe9aa04d8fe3f9e36041bc5be6"}, + {file = "danmakuC-0.3.6-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:249d6893db7086f797e3b06ea9ec7e225ce3ce50d24aa27303eddc50b08acde8"}, + {file = "danmakuC-0.3.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a89ac949a4aa2c6880dbf2f28da780e49f984186042ecd0d2d4640c03e6c62d9"}, + {file = "danmakuC-0.3.6-cp38-cp38-win32.whl", hash = "sha256:d170d870f116252b98dae204d313020181548baf0cc61026bd5f6d259cfcb3b2"}, + {file = "danmakuC-0.3.6-cp38-cp38-win_amd64.whl", hash = "sha256:e369ac6e045ec949a333e2df38d859632dab969c666113d866f50a653a454f34"}, + {file = "danmakuC-0.3.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:44c36daefb0a0d10e1cd00660668211a679df2e48c4d6b099b26821978da7499"}, + {file = "danmakuC-0.3.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4bbb9a0583f9b959c5c4ff0a27dd432b6c0efbe87faea1d4c94e1eaed85e45dc"}, + {file = "danmakuC-0.3.6-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ce83578f41a8baeb2f36cdb9d745a21d50e95d099d2c42ce12e7f475d811dcf"}, + {file = "danmakuC-0.3.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61d71be26d73e857495ede69cf972257332b9295d78f7539019b03f144f9a276"}, + {file = "danmakuC-0.3.6-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6c259440c85531ed91ac448b8822e91a2da4714334505acd9cd253ab59bb91a6"}, + {file = "danmakuC-0.3.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7a6a97a9978b185e40e883c9c67d76fb569b48490e48b217f428cc1767d6564c"}, + {file = "danmakuC-0.3.6-cp39-cp39-win32.whl", hash = "sha256:fe6a7f74a9f81374bdce25b79d38250d400819ece3b699e806c4dc516bf97f5a"}, + {file = "danmakuC-0.3.6-cp39-cp39-win_amd64.whl", hash = "sha256:aff8370b013dc23bc4c8cc67580409a7e6786636a73fa4ed5c0b368660eb6139"}, + {file = "danmakuC-0.3.6-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:429565b94d39fa0ecd64fb60b5bd3c34144b823971fa4c69e1d656c15bd9f37b"}, + {file = "danmakuC-0.3.6-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:52e6fa69270d336a6764868ccc18a1573ba392877147929fdf22d2ce73b8c5cf"}, + {file = "danmakuC-0.3.6-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba5233540d43a3fdc39263bad2ebd431a4f6919963f4b5502b3472362febba08"}, + {file = "danmakuC-0.3.6-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:1f5e1623fea532b478c554863394ed3a18154aa8de69a18406c604ba640d623a"}, + {file = "danmakuC-0.3.6-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e492bed7e716f942f6850d2484cc847f300a9908cfebae2f5df83b7441a5c8d4"}, + {file = "danmakuC-0.3.6-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8394fc159158c74e5bea3fe14d7b00c43eabfd982cc2261b5a1d8d8fc43a52fd"}, + {file = "danmakuC-0.3.6-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a290ac9cf8e7c106e09e2ecd33af6c7c6a0ca596bb774e475b81853073f10e56"}, + {file = "danmakuC-0.3.6-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:8848a20fa323c155d0d4753d0b61598a325ad3a358ce975d4521bf8343d3629c"}, + {file = "danmakuC-0.3.6.tar.gz", hash = "sha256:db6b7dcf3dba1595c08a37a6f27f925fb40b9b8c110ff013872ac575c9c30132"}, +] + +[package.dependencies] +protobuf = ">=4.21.0" + +[[package]] +name = "docopt" +version = "0.6.2" +description = "Pythonic argument parser, that will make you smile" +optional = false +python-versions = "*" +files = [ + {file = "docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.1.2" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.2-py3-none-any.whl", hash = "sha256:e346e69d186172ca7cf029c8c1d16235aa0e04035e5750b4b95039e65204328f"}, + {file = "exceptiongroup-1.1.2.tar.gz", hash = "sha256:12c3e887d6485d16943a309616de20ae5582633e0a2eda17f4e10fd61c1e8af5"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "h2" +version = "4.1.0" +description = "HTTP/2 State-Machine based protocol implementation" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "h2-4.1.0-py3-none-any.whl", hash = "sha256:03a46bcf682256c95b5fd9e9a99c1323584c3eec6440d379b9903d709476bc6d"}, + {file = "h2-4.1.0.tar.gz", hash = "sha256:a83aca08fbe7aacb79fec788c9c0bac936343560ed9ec18b82a13a12c28d2abb"}, +] + +[package.dependencies] +hpack = ">=4.0,<5" +hyperframe = ">=6.0,<7" + +[[package]] +name = "hpack" +version = "4.0.0" +description = "Pure-Python HPACK header compression" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "hpack-4.0.0-py3-none-any.whl", hash = "sha256:84a076fad3dc9a9f8063ccb8041ef100867b1878b25ef0ee63847a5d53818a6c"}, + {file = "hpack-4.0.0.tar.gz", hash = "sha256:fc41de0c63e687ebffde81187a948221294896f6bdc0ae2312708df339430095"}, +] + +[[package]] +name = "httpcore" +version = "0.17.3" +description = "A minimal low-level HTTP client." +optional = false +python-versions = ">=3.7" +files = [ + {file = "httpcore-0.17.3-py3-none-any.whl", hash = "sha256:c2789b767ddddfa2a5782e3199b2b7f6894540b17b16ec26b2c4d8e103510b87"}, + {file = "httpcore-0.17.3.tar.gz", hash = "sha256:a6f30213335e34c1ade7be6ec7c47f19f50c56db36abef1a9dfa3815b1cb3888"}, +] + +[package.dependencies] +anyio = ">=3.0,<5.0" +certifi = "*" +h11 = ">=0.13,<0.15" +sniffio = "==1.*" + +[package.extras] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] + +[[package]] +name = "httpx" +version = "0.24.1" +description = "The next generation HTTP client." +optional = false +python-versions = ">=3.7" +files = [ + {file = "httpx-0.24.1-py3-none-any.whl", hash = "sha256:06781eb9ac53cde990577af654bd990a4949de37a28bdb4a230d434f3a30b9bd"}, + {file = "httpx-0.24.1.tar.gz", hash = "sha256:5853a43053df830c20f8110c5e69fe44d035d850b2dfe795e196f00fdb774bdd"}, +] + +[package.dependencies] +certifi = "*" +h2 = {version = ">=3,<5", optional = true, markers = "extra == \"http2\""} +httpcore = ">=0.15.0,<0.18.0" +idna = "*" +sniffio = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] + +[[package]] +name = "hyperframe" +version = "6.0.1" +description = "HTTP/2 framing layer for Python" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "hyperframe-6.0.1-py3-none-any.whl", hash = "sha256:0ec6bafd80d8ad2195c4f03aacba3a8265e57bc4cff261e802bf39970ed02a15"}, + {file = "hyperframe-6.0.1.tar.gz", hash = "sha256:ae510046231dc8e9ecb1a6586f63d2347bf4c8905914aa84ba585ae85f28a914"}, +] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "internetarchive" +version = "3.5.0" +description = "A Python interface to archive.org." +optional = false +python-versions = ">=3.7" +files = [ + {file = "internetarchive-3.5.0.tar.gz", hash = "sha256:2a9625e1dcbe431e5b898402273a4345bf5cb46012599cbe92e664ffdc36e881"}, +] + +[package.dependencies] +docopt = ">=0.6.0,<0.7.0" +jsonpatch = ">=0.4" +requests = ">=2.25.0,<3.0.0" +schema = ">=0.4.0" +tqdm = ">=4.0.0" +urllib3 = ">=1.26.0" + +[package.extras] +all = ["black", "mypy", "pre-commit", "pytest", "pytest (==7.1.2)", "responses (==0.20.0)", "ruff (==0.0.261)", "safety", "setuptools", "tqdm-stubs (>=0.2.0)", "types-colorama", "types-docopt (>=0.6.10,<0.7.0)", "types-jsonpatch (>=0.1.0a0)", "types-pygments", "types-requests (>=2.25.0,<3.0.0)", "types-setuptools", "types-ujson (>=4.2.0)", "types-urllib3 (>=1.26.0)"] +dev = ["black", "mypy", "pre-commit", "pytest", "safety", "setuptools"] +docs = ["alabaster (==0.7.12)", "docutils (<0.18)", "sphinx (==4.5.0)", "sphinx-autodoc-typehints (==1.18.1)"] +test = ["pytest (==7.1.2)", "responses (==0.20.0)", "ruff (==0.0.261)"] +types = ["tqdm-stubs (>=0.2.0)", "types-colorama", "types-docopt (>=0.6.10,<0.7.0)", "types-jsonpatch (>=0.1.0a0)", "types-pygments", "types-requests (>=2.25.0,<3.0.0)", "types-setuptools", "types-ujson (>=4.2.0)", "types-urllib3 (>=1.26.0)"] + +[[package]] +name = "iso8601" +version = "2.0.0" +description = "Simple module to parse ISO 8601 dates" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "iso8601-2.0.0-py3-none-any.whl", hash = "sha256:ebe10061b932edb8a8e33cc635d661926c59b9c3bed7a4f4edca8c62d400af10"}, + {file = "iso8601-2.0.0.tar.gz", hash = "sha256:739960d37c74c77bd9bd546a76562ccb581fe3d4820ff5c3141eb49c839fda8f"}, +] + +[[package]] +name = "jeepney" +version = "0.8.0" +description = "Low-level, pure Python DBus protocol wrapper." +optional = false +python-versions = ">=3.7" +files = [ + {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, + {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, +] + +[package.extras] +test = ["async-timeout", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"] +trio = ["async_generator", "trio"] + +[[package]] +name = "json5" +version = "0.9.14" +description = "A Python implementation of the JSON5 data format." +optional = false +python-versions = "*" +files = [ + {file = "json5-0.9.14-py2.py3-none-any.whl", hash = "sha256:740c7f1b9e584a468dbb2939d8d458db3427f2c93ae2139d05f47e453eae964f"}, + {file = "json5-0.9.14.tar.gz", hash = "sha256:9ed66c3a6ca3510a976a9ef9b8c0787de24802724ab1860bc0153c7fdd589b02"}, +] + +[package.extras] +dev = ["hypothesis"] + +[[package]] +name = "jsonpatch" +version = "1.33" +description = "Apply JSON-Patches (RFC 6902)" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +files = [ + {file = "jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade"}, + {file = "jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c"}, +] + +[package.dependencies] +jsonpointer = ">=1.9" + +[[package]] +name = "jsonpointer" +version = "2.4" +description = "Identify specific nodes in a JSON document (RFC 6901)" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +files = [ + {file = "jsonpointer-2.4-py2.py3-none-any.whl", hash = "sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a"}, + {file = "jsonpointer-2.4.tar.gz", hash = "sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88"}, +] + +[[package]] +name = "lz4" +version = "4.3.2" +description = "LZ4 Bindings for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "lz4-4.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1c4c100d99eed7c08d4e8852dd11e7d1ec47a3340f49e3a96f8dfbba17ffb300"}, + {file = "lz4-4.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:edd8987d8415b5dad25e797043936d91535017237f72fa456601be1479386c92"}, + {file = "lz4-4.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7c50542b4ddceb74ab4f8b3435327a0861f06257ca501d59067a6a482535a77"}, + {file = "lz4-4.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f5614d8229b33d4a97cb527db2a1ac81308c6e796e7bdb5d1309127289f69d5"}, + {file = "lz4-4.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8f00a9ba98f6364cadda366ae6469b7b3568c0cced27e16a47ddf6b774169270"}, + {file = "lz4-4.3.2-cp310-cp310-win32.whl", hash = "sha256:b10b77dc2e6b1daa2f11e241141ab8285c42b4ed13a8642495620416279cc5b2"}, + {file = "lz4-4.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:86480f14a188c37cb1416cdabacfb4e42f7a5eab20a737dac9c4b1c227f3b822"}, + {file = "lz4-4.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7c2df117def1589fba1327dceee51c5c2176a2b5a7040b45e84185ce0c08b6a3"}, + {file = "lz4-4.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1f25eb322eeb24068bb7647cae2b0732b71e5c639e4e4026db57618dcd8279f0"}, + {file = "lz4-4.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8df16c9a2377bdc01e01e6de5a6e4bbc66ddf007a6b045688e285d7d9d61d1c9"}, + {file = "lz4-4.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f571eab7fec554d3b1db0d666bdc2ad85c81f4b8cb08906c4c59a8cad75e6e22"}, + {file = "lz4-4.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7211dc8f636ca625abc3d4fb9ab74e5444b92df4f8d58ec83c8868a2b0ff643d"}, + {file = "lz4-4.3.2-cp311-cp311-win32.whl", hash = "sha256:867664d9ca9bdfce840ac96d46cd8838c9ae891e859eb98ce82fcdf0e103a947"}, + {file = "lz4-4.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:a6a46889325fd60b8a6b62ffc61588ec500a1883db32cddee9903edfba0b7584"}, + {file = "lz4-4.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a85b430138882f82f354135b98c320dafb96fc8fe4656573d95ab05de9eb092"}, + {file = "lz4-4.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65d5c93f8badacfa0456b660285e394e65023ef8071142e0dcbd4762166e1be0"}, + {file = "lz4-4.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b50f096a6a25f3b2edca05aa626ce39979d63c3b160687c8c6d50ac3943d0ba"}, + {file = "lz4-4.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:200d05777d61ba1ff8d29cb51c534a162ea0b4fe6d3c28be3571a0a48ff36080"}, + {file = "lz4-4.3.2-cp37-cp37m-win32.whl", hash = "sha256:edc2fb3463d5d9338ccf13eb512aab61937be50aa70734bcf873f2f493801d3b"}, + {file = "lz4-4.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:83acfacab3a1a7ab9694333bcb7950fbeb0be21660d236fd09c8337a50817897"}, + {file = "lz4-4.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7a9eec24ec7d8c99aab54de91b4a5a149559ed5b3097cf30249b665689b3d402"}, + {file = "lz4-4.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:31d72731c4ac6ebdce57cd9a5cabe0aecba229c4f31ba3e2c64ae52eee3fdb1c"}, + {file = "lz4-4.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83903fe6db92db0be101acedc677aa41a490b561567fe1b3fe68695b2110326c"}, + {file = "lz4-4.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:926b26db87ec8822cf1870efc3d04d06062730ec3279bbbd33ba47a6c0a5c673"}, + {file = "lz4-4.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e05afefc4529e97c08e65ef92432e5f5225c0bb21ad89dee1e06a882f91d7f5e"}, + {file = "lz4-4.3.2-cp38-cp38-win32.whl", hash = "sha256:ad38dc6a7eea6f6b8b642aaa0683253288b0460b70cab3216838747163fb774d"}, + {file = "lz4-4.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:7e2dc1bd88b60fa09b9b37f08553f45dc2b770c52a5996ea52b2b40f25445676"}, + {file = "lz4-4.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:edda4fb109439b7f3f58ed6bede59694bc631c4b69c041112b1b7dc727fffb23"}, + {file = "lz4-4.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ca83a623c449295bafad745dcd399cea4c55b16b13ed8cfea30963b004016c9"}, + {file = "lz4-4.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5ea0e788dc7e2311989b78cae7accf75a580827b4d96bbaf06c7e5a03989bd5"}, + {file = "lz4-4.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a98b61e504fb69f99117b188e60b71e3c94469295571492a6468c1acd63c37ba"}, + {file = "lz4-4.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4931ab28a0d1c133104613e74eec1b8bb1f52403faabe4f47f93008785c0b929"}, + {file = "lz4-4.3.2-cp39-cp39-win32.whl", hash = "sha256:ec6755cacf83f0c5588d28abb40a1ac1643f2ff2115481089264c7630236618a"}, + {file = "lz4-4.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:4caedeb19e3ede6c7a178968b800f910db6503cb4cb1e9cc9221157572139b49"}, + {file = "lz4-4.3.2.tar.gz", hash = "sha256:e1431d84a9cfb23e6773e72078ce8e65cad6745816d4cbf9ae67da5ea419acda"}, +] + +[package.extras] +docs = ["sphinx (>=1.6.0)", "sphinx-bootstrap-theme"] +flake8 = ["flake8"] +tests = ["psutil", "pytest (!=3.3.0)", "pytest-cov"] + +[[package]] +name = "m3u8" +version = "3.5.0" +description = "Python m3u8 parser" +optional = false +python-versions = ">=3.6" +files = [ + {file = "m3u8-3.5.0-py3-none-any.whl", hash = "sha256:e69c76055c32643b8a6cd0d8113fa76ed37f49aec74fcc9e1b97e287545306d8"}, + {file = "m3u8-3.5.0.tar.gz", hash = "sha256:b2eeaa768de574c9d05aad135b1073992927ce0a20b968ebb13f3a183fa92488"}, +] + +[package.dependencies] +iso8601 = "*" + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +optional = false +python-versions = ">=3.8" +files = [ + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, +] + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + +[[package]] +name = "protobuf" +version = "4.23.4" +description = "" +optional = false +python-versions = ">=3.7" +files = [ + {file = "protobuf-4.23.4-cp310-abi3-win32.whl", hash = "sha256:5fea3c64d41ea5ecf5697b83e41d09b9589e6f20b677ab3c48e5f242d9b7897b"}, + {file = "protobuf-4.23.4-cp310-abi3-win_amd64.whl", hash = "sha256:7b19b6266d92ca6a2a87effa88ecc4af73ebc5cfde194dc737cf8ef23a9a3b12"}, + {file = "protobuf-4.23.4-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:8547bf44fe8cec3c69e3042f5c4fb3e36eb2a7a013bb0a44c018fc1e427aafbd"}, + {file = "protobuf-4.23.4-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:fee88269a090ada09ca63551bf2f573eb2424035bcf2cb1b121895b01a46594a"}, + {file = "protobuf-4.23.4-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:effeac51ab79332d44fba74660d40ae79985901ac21bca408f8dc335a81aa597"}, + {file = "protobuf-4.23.4-cp37-cp37m-win32.whl", hash = "sha256:c3e0939433c40796ca4cfc0fac08af50b00eb66a40bbbc5dee711998fb0bbc1e"}, + {file = "protobuf-4.23.4-cp37-cp37m-win_amd64.whl", hash = "sha256:9053df6df8e5a76c84339ee4a9f5a2661ceee4a0dab019e8663c50ba324208b0"}, + {file = "protobuf-4.23.4-cp38-cp38-win32.whl", hash = "sha256:e1c915778d8ced71e26fcf43c0866d7499891bca14c4368448a82edc61fdbc70"}, + {file = "protobuf-4.23.4-cp38-cp38-win_amd64.whl", hash = "sha256:351cc90f7d10839c480aeb9b870a211e322bf05f6ab3f55fcb2f51331f80a7d2"}, + {file = "protobuf-4.23.4-cp39-cp39-win32.whl", hash = "sha256:6dd9b9940e3f17077e820b75851126615ee38643c2c5332aa7a359988820c720"}, + {file = "protobuf-4.23.4-cp39-cp39-win_amd64.whl", hash = "sha256:0a5759f5696895de8cc913f084e27fd4125e8fb0914bb729a17816a33819f474"}, + {file = "protobuf-4.23.4-py3-none-any.whl", hash = "sha256:e9d0be5bf34b275b9f87ba7407796556abeeba635455d036c7351f7c183ef8ff"}, + {file = "protobuf-4.23.4.tar.gz", hash = "sha256:ccd9430c0719dce806b93f89c91de7977304729e55377f872a92465d548329a9"}, +] + +[[package]] +name = "pycryptodome" +version = "3.18.0" +description = "Cryptographic library for Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "pycryptodome-3.18.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:d1497a8cd4728db0e0da3c304856cb37c0c4e3d0b36fcbabcc1600f18504fc54"}, + {file = "pycryptodome-3.18.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:928078c530da78ff08e10eb6cada6e0dff386bf3d9fa9871b4bbc9fbc1efe024"}, + {file = "pycryptodome-3.18.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:157c9b5ba5e21b375f052ca78152dd309a09ed04703fd3721dce3ff8ecced148"}, + {file = "pycryptodome-3.18.0-cp27-cp27m-manylinux2014_aarch64.whl", hash = "sha256:d20082bdac9218649f6abe0b885927be25a917e29ae0502eaf2b53f1233ce0c2"}, + {file = "pycryptodome-3.18.0-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:e8ad74044e5f5d2456c11ed4cfd3e34b8d4898c0cb201c4038fe41458a82ea27"}, + {file = "pycryptodome-3.18.0-cp27-cp27m-win32.whl", hash = "sha256:62a1e8847fabb5213ccde38915563140a5b338f0d0a0d363f996b51e4a6165cf"}, + {file = "pycryptodome-3.18.0-cp27-cp27m-win_amd64.whl", hash = "sha256:16bfd98dbe472c263ed2821284118d899c76968db1a6665ade0c46805e6b29a4"}, + {file = "pycryptodome-3.18.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:7a3d22c8ee63de22336679e021c7f2386f7fc465477d59675caa0e5706387944"}, + {file = "pycryptodome-3.18.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:78d863476e6bad2a592645072cc489bb90320972115d8995bcfbee2f8b209918"}, + {file = "pycryptodome-3.18.0-cp27-cp27mu-manylinux2014_aarch64.whl", hash = "sha256:b6a610f8bfe67eab980d6236fdc73bfcdae23c9ed5548192bb2d530e8a92780e"}, + {file = "pycryptodome-3.18.0-cp27-cp27mu-musllinux_1_1_aarch64.whl", hash = "sha256:422c89fd8df8a3bee09fb8d52aaa1e996120eafa565437392b781abec2a56e14"}, + {file = "pycryptodome-3.18.0-cp35-abi3-macosx_10_9_universal2.whl", hash = "sha256:9ad6f09f670c466aac94a40798e0e8d1ef2aa04589c29faa5b9b97566611d1d1"}, + {file = "pycryptodome-3.18.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:53aee6be8b9b6da25ccd9028caf17dcdce3604f2c7862f5167777b707fbfb6cb"}, + {file = "pycryptodome-3.18.0-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:10da29526a2a927c7d64b8f34592f461d92ae55fc97981aab5bbcde8cb465bb6"}, + {file = "pycryptodome-3.18.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f21efb8438971aa16924790e1c3dba3a33164eb4000106a55baaed522c261acf"}, + {file = "pycryptodome-3.18.0-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4944defabe2ace4803f99543445c27dd1edbe86d7d4edb87b256476a91e9ffa4"}, + {file = "pycryptodome-3.18.0-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:51eae079ddb9c5f10376b4131be9589a6554f6fd84f7f655180937f611cd99a2"}, + {file = "pycryptodome-3.18.0-cp35-abi3-musllinux_1_1_i686.whl", hash = "sha256:83c75952dcf4a4cebaa850fa257d7a860644c70a7cd54262c237c9f2be26f76e"}, + {file = "pycryptodome-3.18.0-cp35-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:957b221d062d5752716923d14e0926f47670e95fead9d240fa4d4862214b9b2f"}, + {file = "pycryptodome-3.18.0-cp35-abi3-win32.whl", hash = "sha256:795bd1e4258a2c689c0b1f13ce9684fa0dd4c0e08680dcf597cf9516ed6bc0f3"}, + {file = "pycryptodome-3.18.0-cp35-abi3-win_amd64.whl", hash = "sha256:b1d9701d10303eec8d0bd33fa54d44e67b8be74ab449052a8372f12a66f93fb9"}, + {file = "pycryptodome-3.18.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:cb1be4d5af7f355e7d41d36d8eec156ef1382a88638e8032215c215b82a4b8ec"}, + {file = "pycryptodome-3.18.0-pp27-pypy_73-win32.whl", hash = "sha256:fc0a73f4db1e31d4a6d71b672a48f3af458f548059aa05e83022d5f61aac9c08"}, + {file = "pycryptodome-3.18.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f022a4fd2a5263a5c483a2bb165f9cb27f2be06f2f477113783efe3fe2ad887b"}, + {file = "pycryptodome-3.18.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:363dd6f21f848301c2dcdeb3c8ae5f0dee2286a5e952a0f04954b82076f23825"}, + {file = "pycryptodome-3.18.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12600268763e6fec3cefe4c2dcdf79bde08d0b6dc1813887e789e495cb9f3403"}, + {file = "pycryptodome-3.18.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4604816adebd4faf8810782f137f8426bf45fee97d8427fa8e1e49ea78a52e2c"}, + {file = "pycryptodome-3.18.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:01489bbdf709d993f3058e2996f8f40fee3f0ea4d995002e5968965fa2fe89fb"}, + {file = "pycryptodome-3.18.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3811e31e1ac3069988f7a1c9ee7331b942e605dfc0f27330a9ea5997e965efb2"}, + {file = "pycryptodome-3.18.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f4b967bb11baea9128ec88c3d02f55a3e338361f5e4934f5240afcb667fdaec"}, + {file = "pycryptodome-3.18.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:9c8eda4f260072f7dbe42f473906c659dcbadd5ae6159dfb49af4da1293ae380"}, + {file = "pycryptodome-3.18.0.tar.gz", hash = "sha256:c9adee653fc882d98956e33ca2c1fb582e23a8af7ac82fee75bd6113c55a0413"}, +] + +[[package]] +name = "pycryptodomex" +version = "3.18.0" +description = "Cryptographic library for Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "pycryptodomex-3.18.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:160a39a708c36fa0b168ab79386dede588e62aec06eb505add870739329aecc6"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:c2953afebf282a444c51bf4effe751706b4d0d63d7ca2cc51db21f902aa5b84e"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:ba95abd563b0d1b88401658665a260852a8e6c647026ee6a0a65589287681df8"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-manylinux2014_aarch64.whl", hash = "sha256:192306cf881fe3467dda0e174a4f47bb3a8bb24b90c9cdfbdc248eec5fc0578c"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:f9ab5ef0718f6a8716695dea16d83b671b22c45e9c0c78fd807c32c0192e54b5"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-win32.whl", hash = "sha256:50308fcdbf8345e5ec224a5502b4215178bdb5e95456ead8ab1a69ffd94779cb"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-win_amd64.whl", hash = "sha256:4d9379c684efea80fdab02a3eb0169372bca7db13f9332cb67483b8dc8b67c37"}, + {file = "pycryptodomex-3.18.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:5594a125dae30d60e94f37797fc67ce3c744522de7992c7c360d02fdb34918f8"}, + {file = "pycryptodomex-3.18.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:8ff129a5a0eb5ff16e45ca4fa70a6051da7f3de303c33b259063c19be0c43d35"}, + {file = "pycryptodomex-3.18.0-cp27-cp27mu-manylinux2014_aarch64.whl", hash = "sha256:3d9314ac785a5b75d5aaf924c5f21d6ca7e8df442e5cf4f0fefad4f6e284d422"}, + {file = "pycryptodomex-3.18.0-cp27-cp27mu-musllinux_1_1_aarch64.whl", hash = "sha256:f237278836dda412a325e9340ba2e6a84cb0f56b9244781e5b61f10b3905de88"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-macosx_10_9_universal2.whl", hash = "sha256:ac614363a86cc53d8ba44b6c469831d1555947e69ab3276ae8d6edc219f570f7"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:302a8f37c224e7b5d72017d462a2be058e28f7be627bdd854066e16722d0fc0c"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:6421d23d6a648e83ba2670a352bcd978542dad86829209f59d17a3f087f4afef"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84e105787f5e5d36ec6a581ff37a1048d12e638688074b2a00bcf402f9aa1c2"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6875eb8666f68ddbd39097867325bd22771f595b4e2b0149739b5623c8bf899b"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:27072a494ce621cc7a9096bbf60ed66826bb94db24b49b7359509e7951033e74"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-musllinux_1_1_i686.whl", hash = "sha256:1949e09ea49b09c36d11a951b16ff2a05a0ffe969dda1846e4686ee342fe8646"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6ed3606832987018615f68e8ed716a7065c09a0fe94afd7c9ca1b6777f0ac6eb"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-win32.whl", hash = "sha256:d56c9ec41258fd3734db9f5e4d2faeabe48644ba9ca23b18e1839b3bdf093222"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-win_amd64.whl", hash = "sha256:e00a4bacb83a2627e8210cb353a2e31f04befc1155db2976e5e239dd66482278"}, + {file = "pycryptodomex-3.18.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:2dc4eab20f4f04a2d00220fdc9258717b82d31913552e766d5f00282c031b70a"}, + {file = "pycryptodomex-3.18.0-pp27-pypy_73-win32.whl", hash = "sha256:75672205148bdea34669173366df005dbd52be05115e919551ee97171083423d"}, + {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bec6c80994d4e7a38312072f89458903b65ec99bed2d65aa4de96d997a53ea7a"}, + {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d35a8ffdc8b05e4b353ba281217c8437f02c57d7233363824e9d794cf753c419"}, + {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76f0a46bee539dae4b3dfe37216f678769349576b0080fdbe431d19a02da42ff"}, + {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:71687eed47df7e965f6e0bf3cadef98f368d5221f0fb89d2132effe1a3e6a194"}, + {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:73d64b32d84cf48d9ec62106aa277dbe99ab5fbfd38c5100bc7bddd3beb569f7"}, + {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbdcce0a226d9205560a5936b05208c709b01d493ed8307792075dedfaaffa5f"}, + {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58fc0aceb9c961b9897facec9da24c6a94c5db04597ec832060f53d4d6a07196"}, + {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:215be2980a6b70704c10796dd7003eb4390e7be138ac6fb8344bf47e71a8d470"}, + {file = "pycryptodomex-3.18.0.tar.gz", hash = "sha256:3e3ecb5fe979e7c1bb0027e518340acf7ee60415d79295e5251d13c68dde576e"}, +] + +[[package]] +name = "pydantic" +version = "1.10.11" +description = "Data validation and settings management using python type hints" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pydantic-1.10.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ff44c5e89315b15ff1f7fdaf9853770b810936d6b01a7bcecaa227d2f8fe444f"}, + {file = "pydantic-1.10.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a6c098d4ab5e2d5b3984d3cb2527e2d6099d3de85630c8934efcfdc348a9760e"}, + {file = "pydantic-1.10.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16928fdc9cb273c6af00d9d5045434c39afba5f42325fb990add2c241402d151"}, + {file = "pydantic-1.10.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0588788a9a85f3e5e9ebca14211a496409cb3deca5b6971ff37c556d581854e7"}, + {file = "pydantic-1.10.11-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e9baf78b31da2dc3d3f346ef18e58ec5f12f5aaa17ac517e2ffd026a92a87588"}, + {file = "pydantic-1.10.11-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:373c0840f5c2b5b1ccadd9286782852b901055998136287828731868027a724f"}, + {file = "pydantic-1.10.11-cp310-cp310-win_amd64.whl", hash = "sha256:c3339a46bbe6013ef7bdd2844679bfe500347ac5742cd4019a88312aa58a9847"}, + {file = "pydantic-1.10.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:08a6c32e1c3809fbc49debb96bf833164f3438b3696abf0fbeceb417d123e6eb"}, + {file = "pydantic-1.10.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a451ccab49971af043ec4e0d207cbc8cbe53dbf148ef9f19599024076fe9c25b"}, + {file = "pydantic-1.10.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b02d24f7b2b365fed586ed73582c20f353a4c50e4be9ba2c57ab96f8091ddae"}, + {file = "pydantic-1.10.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f34739a89260dfa420aa3cbd069fbcc794b25bbe5c0a214f8fb29e363484b66"}, + {file = "pydantic-1.10.11-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e297897eb4bebde985f72a46a7552a7556a3dd11e7f76acda0c1093e3dbcf216"}, + {file = "pydantic-1.10.11-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d185819a7a059550ecb85d5134e7d40f2565f3dd94cfd870132c5f91a89cf58c"}, + {file = "pydantic-1.10.11-cp311-cp311-win_amd64.whl", hash = "sha256:4400015f15c9b464c9db2d5d951b6a780102cfa5870f2c036d37c23b56f7fc1b"}, + {file = "pydantic-1.10.11-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2417de68290434461a266271fc57274a138510dca19982336639484c73a07af6"}, + {file = "pydantic-1.10.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:331c031ba1554b974c98679bd0780d89670d6fd6f53f5d70b10bdc9addee1713"}, + {file = "pydantic-1.10.11-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8268a735a14c308923e8958363e3a3404f6834bb98c11f5ab43251a4e410170c"}, + {file = "pydantic-1.10.11-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:44e51ba599c3ef227e168424e220cd3e544288c57829520dc90ea9cb190c3248"}, + {file = "pydantic-1.10.11-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d7781f1d13b19700b7949c5a639c764a077cbbdd4322ed505b449d3ca8edcb36"}, + {file = "pydantic-1.10.11-cp37-cp37m-win_amd64.whl", hash = "sha256:7522a7666157aa22b812ce14c827574ddccc94f361237ca6ea8bb0d5c38f1629"}, + {file = "pydantic-1.10.11-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bc64eab9b19cd794a380179ac0e6752335e9555d214cfcb755820333c0784cb3"}, + {file = "pydantic-1.10.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8dc77064471780262b6a68fe67e013298d130414d5aaf9b562c33987dbd2cf4f"}, + {file = "pydantic-1.10.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe429898f2c9dd209bd0632a606bddc06f8bce081bbd03d1c775a45886e2c1cb"}, + {file = "pydantic-1.10.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:192c608ad002a748e4a0bed2ddbcd98f9b56df50a7c24d9a931a8c5dd053bd3d"}, + {file = "pydantic-1.10.11-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ef55392ec4bb5721f4ded1096241e4b7151ba6d50a50a80a2526c854f42e6a2f"}, + {file = "pydantic-1.10.11-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:41e0bb6efe86281623abbeeb0be64eab740c865388ee934cd3e6a358784aca6e"}, + {file = "pydantic-1.10.11-cp38-cp38-win_amd64.whl", hash = "sha256:265a60da42f9f27e0b1014eab8acd3e53bd0bad5c5b4884e98a55f8f596b2c19"}, + {file = "pydantic-1.10.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:469adf96c8e2c2bbfa655fc7735a2a82f4c543d9fee97bd113a7fb509bf5e622"}, + {file = "pydantic-1.10.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e6cbfbd010b14c8a905a7b10f9fe090068d1744d46f9e0c021db28daeb8b6de1"}, + {file = "pydantic-1.10.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abade85268cc92dff86d6effcd917893130f0ff516f3d637f50dadc22ae93999"}, + {file = "pydantic-1.10.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9738b0f2e6c70f44ee0de53f2089d6002b10c33264abee07bdb5c7f03038303"}, + {file = "pydantic-1.10.11-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:787cf23e5a0cde753f2eabac1b2e73ae3844eb873fd1f5bdbff3048d8dbb7604"}, + {file = "pydantic-1.10.11-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:174899023337b9fc685ac8adaa7b047050616136ccd30e9070627c1aaab53a13"}, + {file = "pydantic-1.10.11-cp39-cp39-win_amd64.whl", hash = "sha256:1954f8778489a04b245a1e7b8b22a9d3ea8ef49337285693cf6959e4b757535e"}, + {file = "pydantic-1.10.11-py3-none-any.whl", hash = "sha256:008c5e266c8aada206d0627a011504e14268a62091450210eda7c07fabe6963e"}, + {file = "pydantic-1.10.11.tar.gz", hash = "sha256:f66d479cf7eb331372c470614be6511eae96f1f120344c25f3f9bb59fb1b5528"}, +] + +[package.dependencies] +typing-extensions = ">=4.2.0" + +[package.extras] +dotenv = ["python-dotenv (>=0.10.4)"] +email = ["email-validator (>=1.0.3)"] + +[[package]] +name = "pygments" +version = "2.15.1" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.7" +files = [ + {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, + {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, +] + +[package.extras] +plugins = ["importlib-metadata"] + +[[package]] +name = "pymp4" +version = "1.4.0" +description = "Python parser for MP4 boxes" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "pymp4-1.4.0-py3-none-any.whl", hash = "sha256:3401666c1e2a97ac94dffb18c5a5dcbd46d0a436da5272d378a6f9f6506dd12d"}, + {file = "pymp4-1.4.0.tar.gz", hash = "sha256:bc9e77732a8a143d34c38aa862a54180716246938e4bf3e07585d19252b77bb5"}, +] + +[package.dependencies] +construct = "2.8.8" + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "rich" +version = "13.4.2" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "rich-13.4.2-py3-none-any.whl", hash = "sha256:8f87bc7ee54675732fa66a05ebfe489e27264caeeff3728c945d25971b6485ec"}, + {file = "rich-13.4.2.tar.gz", hash = "sha256:d653d6bccede5844304c605d5aac802c7cf9621efd700b46c7ec2b51ea914898"}, +] + +[package.dependencies] +markdown-it-py = ">=2.2.0" +pygments = ">=2.13.0,<3.0.0" + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<9)"] + +[[package]] +name = "schema" +version = "0.7.5" +description = "Simple data validation library" +optional = false +python-versions = "*" +files = [ + {file = "schema-0.7.5-py2.py3-none-any.whl", hash = "sha256:f3ffdeeada09ec34bf40d7d79996d9f7175db93b7a5065de0faa7f41083c1e6c"}, + {file = "schema-0.7.5.tar.gz", hash = "sha256:f06717112c61895cabc4707752b88716e8420a8819d71404501e114f91043197"}, +] + +[package.dependencies] +contextlib2 = ">=0.5.5" + +[[package]] +name = "sniffio" +version = "1.3.0" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, + {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, +] + +[[package]] +name = "soupsieve" +version = "2.4.1" +description = "A modern CSS selector implementation for Beautiful Soup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "soupsieve-2.4.1-py3-none-any.whl", hash = "sha256:1c1bfee6819544a3447586c889157365a27e10d88cde3ad3da0cf0ddf646feb8"}, + {file = "soupsieve-2.4.1.tar.gz", hash = "sha256:89d12b2d5dfcd2c9e8c22326da9d9aa9cb3dfab0a83a024f05704076ee8d35ea"}, +] + +[[package]] +name = "tqdm" +version = "4.65.0" +description = "Fast, Extensible Progress Meter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tqdm-4.65.0-py3-none-any.whl", hash = "sha256:c4f53a17fe37e132815abceec022631be8ffe1b9381c2e6e30aa70edc99e9671"}, + {file = "tqdm-4.65.0.tar.gz", hash = "sha256:1871fb68a86b8fb3b59ca4cdd3dcccbc7e6d613eeed31f4c332531977b89beb5"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["py-make (>=0.1.0)", "twine", "wheel"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + +[[package]] +name = "typing-extensions" +version = "4.7.1" +description = "Backported and Experimental Type Hints for Python 3.7+" +optional = false +python-versions = ">=3.7" +files = [ + {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, + {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, +] + +[[package]] +name = "urllib3" +version = "2.0.3" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.7" +files = [ + {file = "urllib3-2.0.3-py3-none-any.whl", hash = "sha256:48e7fafa40319d358848e1bc6809b208340fafe2096f1725d05d67443d0483d1"}, + {file = "urllib3-2.0.3.tar.gz", hash = "sha256:bee28b5e56addb8226c96f7f13ac28cb4c301dd5ea8a6ca179c0b9835e032825"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[metadata] +lock-version = "2.0" +python-versions = "^3.9" +content-hash = "e4300e1d250f776c84a8b16a34ad793d919c4f896370cdd258e33721990ed78a" diff --git a/pyproject.toml b/pyproject.toml index 01b4ab0..674d27b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ version = "0.0.37" description = "" authors = ["yzqzss "] readme = "README.md" -packages = [{include = "biliarchiver"}] +packages = [{ include = "biliarchiver" }] [tool.poetry.dependencies] python = "^3.9" @@ -12,13 +12,11 @@ bilix = "0.18.4" internetarchive = "^3.5.0" danmakuc = "^0.3.6" browser-cookie3 = "^0.19.1" +click = "^8.1.6" +click-option-group = "^0.5.6" [tool.poetry.scripts] -bili_archive_bvids = "biliarchiver.cli_tools:bili_archive_bvids.main" -bili_upload = "biliarchiver.cli_tools:bili_upload.main" -bili_get_bvids = "biliarchiver.cli_tools:bili_get_bvids.main" -biliarchiver = "biliarchiver.cli_tools:biliarchiver.main" - +biliarchiver = "biliarchiver.cli_tools.biliarchiver:biliarchiver" [build-system] requires = ["poetry-core"]