From c18b2a4517bb305bf7e06cbc3413e320f8067bd8 Mon Sep 17 00:00:00 2001 From: OverflowCat Date: Fri, 25 Aug 2023 22:37:57 +0800 Subject: [PATCH] feat: delete after upload --- biliarchiver/_biliarchiver_upload_bvid.py | 44 ++++++++++++++++--- biliarchiver/cli_tools/down_command.py | 6 ++- biliarchiver/cli_tools/up_command.py | 29 +++++++++--- biliarchiver/locales/biliarchiver.pot | 6 +++ .../locales/en/LC_MESSAGES/biliarchiver.po | 6 +++ 5 files changed, 79 insertions(+), 12 deletions(-) diff --git a/biliarchiver/_biliarchiver_upload_bvid.py b/biliarchiver/_biliarchiver_upload_bvid.py index 6731f72..187ae7f 100644 --- a/biliarchiver/_biliarchiver_upload_bvid.py +++ b/biliarchiver/_biliarchiver_upload_bvid.py @@ -7,6 +7,10 @@ from urllib.parse import urlparse from internetarchive import get_item from requests import Response from rich import print +from pathlib import Path +from shutil import rmtree +from biliarchiver.i18n import _ + from biliarchiver.exception import ( VideosBasePathNotFoundError, VideosNotFinishedDownloadError, @@ -20,12 +24,23 @@ from biliarchiver.version import BILI_ARCHIVER_VERSION from biliarchiver.i18n import _ -def upload_bvid(bvid: str, *, update_existing: bool = False, collection: str): +def upload_bvid( + bvid: str, + *, + update_existing: bool = False, + collection: str, + delete_after_upload: bool = False, +): try: lock_dir = config.storage_home_dir / ".locks" / bvid - os.makedirs(lock_dir, exist_ok=True) + lock_dir.mkdir(parents=True, exist_ok=True) with UploadLock(lock_dir): # type: ignore - _upload_bvid(bvid, update_existing=update_existing, collection=collection) + _upload_bvid( + bvid, + update_existing=update_existing, + collection=collection, + delete_after_upload=delete_after_upload, + ) except AlreadyRunningError: print(_("已经有一个上传 {} 的进程在运行,跳过".format(bvid))) except VideosBasePathNotFoundError: @@ -37,7 +52,13 @@ def upload_bvid(bvid: str, *, update_existing: bool = False, collection: str): raise e -def _upload_bvid(bvid: str, *, update_existing: bool = False, collection: str): +def _upload_bvid( + bvid: str, + *, + update_existing: bool = False, + collection: str, + delete_after_upload: bool = False, +): access_key, secret_key = read_ia_keys(config.ia_key_file) # identifier format: BiliBili-{bvid}_p{pid}-{upper_part} @@ -54,7 +75,8 @@ def _upload_bvid(bvid: str, *, update_existing: bool = False, collection: str): if not (videos_basepath / "_all_downloaded.mark").exists(): raise VideosNotFinishedDownloadError(f"{videos_basepath}") - for local_identifier in os.listdir(videos_basepath): + local_identifiers = [f.name for f in videos_basepath.iterdir() if f.is_dir()] + for local_identifier in local_identifiers: remote_identifier = f"{local_identifier}-{upper_part}" if ( os.path.exists(f"{videos_basepath}/{local_identifier}/_uploaded.mark") @@ -271,6 +293,18 @@ def _upload_bvid(bvid: str, *, update_existing: bool = False, collection: str): f.write("") print(f"==== {remote_identifier} {_('上传完成')} ====") + if delete_after_upload and len(local_identifiers) > 0: + try: + for local_identifier in local_identifiers: + rmtree(f"{videos_basepath}/{local_identifier}") + print( + "[yellow]" + + _("已删除视频文件夹 {}").format(", ".join(local_identifiers)) + + "[/yellow]" + ) + except Exception as e: + print(e) + def read_ia_keys(keysfile): """Return: tuple(`access_key`, `secret_key`)""" diff --git a/biliarchiver/cli_tools/down_command.py b/biliarchiver/cli_tools/down_command.py index 281698f..e517f01 100644 --- a/biliarchiver/cli_tools/down_command.py +++ b/biliarchiver/cli_tools/down_command.py @@ -5,7 +5,11 @@ from biliarchiver.i18n import _ @click.command(help=click.style(_("从哔哩哔哩下载"), fg="cyan")) @click.option( - "--bvids", type=click.STRING, required=True, help=_("空白字符分隔的 bvids 列表(记得加引号),或文件路径") + "--bvids", + "-i", + type=click.STRING, + required=True, + help=_("空白字符分隔的 bvids 列表(记得加引号),或文件路径"), ) @click.option( "--skip-ia-check", diff --git a/biliarchiver/cli_tools/up_command.py b/biliarchiver/cli_tools/up_command.py index 1065f5f..fadbc1c 100644 --- a/biliarchiver/cli_tools/up_command.py +++ b/biliarchiver/cli_tools/up_command.py @@ -26,9 +26,10 @@ BILIBILI_VIDEOS_SUB_1_COLLECTION = "bilibili_videos_sub_1" @click.command(help=click.style(_("上传至互联网档案馆"), fg="cyan")) -@click.option("--bvids", type=click.STRING, default=None, help=_("bvids 列表的文件路径")) +@click.option("--bvids", "-i", type=click.STRING, default=None, help=_("bvids 列表的文件路径")) @click.option( "--by-storage-home-dir", + "-a", is_flag=True, default=False, help=_("使用 `$storage_home_dir/videos` 目录下的所有视频"), @@ -36,6 +37,7 @@ BILIBILI_VIDEOS_SUB_1_COLLECTION = "bilibili_videos_sub_1" @click.option("--update-existing", is_flag=True, default=False, help=_("更新已存在的 item")) @click.option( "--collection", + "-c", default=DEFAULT_COLLECTION, type=click.Choice( [ @@ -47,23 +49,38 @@ BILIBILI_VIDEOS_SUB_1_COLLECTION = "bilibili_videos_sub_1" help=_("欲上传至的 collection. (非默认值仅限 collection 管理员使用)") + f" [default: {DEFAULT_COLLECTION}]", ) +@click.option( + "--delete-after-upload", + "-d", + is_flag=True, + default=False, + help=_("上传后删除视频文件"), +) def up( bvids: TextIOWrapper, by_storage_home_dir: bool, update_existing: bool, collection: str, + delete_after_upload: bool, ): from biliarchiver._biliarchiver_upload_bvid import upload_bvid from biliarchiver.config import config + ids = [] + 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) - + ids.append(bvid) elif bvids: - for bvid in read_bvids(bvids): - upload_bvid(bvid, update_existing=update_existing, collection=collection) + ids = read_bvids(bvids) + + for id in ids: + upload_bvid( + id, + update_existing=update_existing, + collection=collection, + delete_after_upload=delete_after_upload, + ) diff --git a/biliarchiver/locales/biliarchiver.pot b/biliarchiver/locales/biliarchiver.pot index db748ab..59d4e61 100644 --- a/biliarchiver/locales/biliarchiver.pot +++ b/biliarchiver/locales/biliarchiver.pot @@ -425,3 +425,9 @@ msgstr "" #: biliarchiver/_biliarchiver_upload_bvid.py:80 msgid "没有下载完成" msgstr "" + +msgid "上传后删除视频文件" +msgstr "" + +msgid "已删除视频文件夹 {}" +msgstr "" \ No newline at end of file diff --git a/biliarchiver/locales/en/LC_MESSAGES/biliarchiver.po b/biliarchiver/locales/en/LC_MESSAGES/biliarchiver.po index 73a3017..dc66034 100644 --- a/biliarchiver/locales/en/LC_MESSAGES/biliarchiver.po +++ b/biliarchiver/locales/en/LC_MESSAGES/biliarchiver.po @@ -420,3 +420,9 @@ msgstr "{} is not the correct local_identifier that starts with {}" #: biliarchiver/_biliarchiver_upload_bvid.py:80 msgid "没有下载完成" msgstr "Download not finished" + +msgid "上传后删除视频文件" +msgstr "Delete video files after upload" + +msgid "已删除视频文件夹 {}" +msgstr "Deleted video folder {}"