mirror of
https://github.com/amtoaer/bili-sync.git
synced 2026-08-07 13:23:21 +08:00
feat: recheck 对分 p 视频做适配,为所有的数据库批量操作指定 batch_size
This commit is contained in:
31
commands.py
31
commands.py
@@ -13,17 +13,32 @@ from utils import aexists, aremove
|
||||
|
||||
async def recheck():
|
||||
"""刷新数据库中视频的状态,如果发现文件不存在则标记未下载,以便在下次任务重新下载,在自己手动删除文件后调用"""
|
||||
items = await FavoriteItem.filter(type=MediaType.VIDEO, status=MediaStatus.NORMAL, downloaded=True)
|
||||
exists = await asyncio.gather(*[aexists(item.video_path) for item in items])
|
||||
for item, exist in zip(items, exists):
|
||||
if isinstance(exist, Exception):
|
||||
logger.error("Error when checking file {} {}: {}.", item.bvid, item.name, exist)
|
||||
|
||||
async def is_ok(item: FavoriteItem) -> bool:
|
||||
if len(item.pages):
|
||||
# 多 p 视频全部存在才算存在
|
||||
return all(await asyncio.gather(*[aexists(page.video_path) for page in item.pages]))
|
||||
return await aexists(item.video_path)
|
||||
|
||||
items = await FavoriteItem.filter(
|
||||
type=MediaType.VIDEO, status=MediaStatus.NORMAL, downloaded=True
|
||||
).prefetch_related("pages")
|
||||
items_to_update = []
|
||||
for item in items:
|
||||
for page in item.pages:
|
||||
# 疑似 tortoise 的 bug,prefetch_related 不会更新反向引用的字段,这里手动更新一下
|
||||
page.favorite_item = item
|
||||
items_ok = await asyncio.gather(*[is_ok(item) for item in items], return_exceptions=True)
|
||||
for item, ok in zip(items, items_ok):
|
||||
if isinstance(ok, Exception):
|
||||
logger.error("Error when checking file {} {}: {}.", item.bvid, item.name, ok)
|
||||
continue
|
||||
if not exist:
|
||||
logger.info("File {} {} not exists, mark as not downloaded.", item.bvid, item.name)
|
||||
if not ok:
|
||||
logger.info("Lack of file detected for {} {}, mark as not downloaded.", item.bvid, item.name)
|
||||
item.downloaded = False
|
||||
items_to_update.append(item)
|
||||
logger.info("Updating database...")
|
||||
await FavoriteItem.bulk_update(items, fields=["downloaded"])
|
||||
await FavoriteItem.bulk_update(items_to_update, fields=["downloaded"], batch_size=300)
|
||||
logger.info("Database updated.")
|
||||
|
||||
|
||||
|
||||
@@ -46,7 +46,7 @@ async def update_favorite_item(medias: list[dict], fav_list: FavoriteList) -> No
|
||||
uppers = [
|
||||
Upper(mid=media["upper"]["mid"], name=media["upper"]["name"], thumb=media["upper"]["face"]) for media in medias
|
||||
]
|
||||
await Upper.bulk_create(uppers, on_conflict=["mid"], update_fields=["name", "thumb"])
|
||||
await Upper.bulk_create(uppers, on_conflict=["mid"], update_fields=["name", "thumb"], batch_size=300)
|
||||
items = [
|
||||
FavoriteItem(
|
||||
name=media["title"],
|
||||
@@ -67,6 +67,7 @@ async def update_favorite_item(medias: list[dict], fav_list: FavoriteList) -> No
|
||||
items,
|
||||
on_conflict=["bvid", "favorite_list_id"],
|
||||
update_fields=["name", "type", "desc", "cover", "ctime", "pubtime", "fav_time"],
|
||||
batch_size=300,
|
||||
)
|
||||
|
||||
|
||||
@@ -173,7 +174,10 @@ async def process_favorite_item(
|
||||
single_page = True
|
||||
else:
|
||||
pages = await FavoriteItemPage.bulk_create(
|
||||
pages, on_conflict=["favorite_item_id", "page"], update_fields=["cid", "name", "image"]
|
||||
pages,
|
||||
on_conflict=["favorite_item_id", "page"],
|
||||
update_fields=["cid", "name", "image"],
|
||||
batch_size=300,
|
||||
)
|
||||
if process_nfo:
|
||||
try:
|
||||
|
||||
Reference in New Issue
Block a user