fix: 修复开启处理分 p 视频后执行 refresh 导致历史视频分 p 刷新的问题,修复分 p 图片不存在问题

This commit is contained in:
amtoaer
2024-02-26 23:56:26 +08:00
parent 911ce84f5a
commit 28ed22dc1b
2 changed files with 58 additions and 60 deletions

View File

@@ -64,6 +64,7 @@ async def _refresh_favorite_item_info(
process_nfo=process_nfo, process_nfo=process_nfo,
process_upper=process_upper, process_upper=process_upper,
process_subtitle=process_subtitle, process_subtitle=process_subtitle,
refresh_mode=True,
) )
for item in items for item in items
], ],

View File

@@ -71,6 +71,18 @@ async def update_favorite_item(medias: list[dict], fav_list: FavoriteList) -> No
) )
async def update_favorite_item_page(pages: list[dict], item: FavoriteItem):
pages = [
FavoriteItemPage(
favorite_item=item, cid=page["cid"], page=page["page"], name=page["part"], image=page.get("first_frame", "")
)
for page in pages
]
await FavoriteItemPage.bulk_create(
pages, on_conflict=["favorite_item_id", "page"], update_fields=["cid", "name", "image"], batch_size=300
)
async def process() -> None: async def process() -> None:
global anchor global anchor
if (today := datetime.date.today()) > anchor: if (today := datetime.date.today()) > anchor:
@@ -131,6 +143,7 @@ async def process_favorite_item(
process_nfo=True, process_nfo=True,
process_upper=True, process_upper=True,
process_subtitle=True, process_subtitle=True,
refresh_mode=False,
) -> None: ) -> None:
logger.info("Start to process video {} {}.", fav_item.bvid, fav_item.name) logger.info("Start to process video {} {}.", fav_item.bvid, fav_item.name)
if fav_item.type != MediaType.VIDEO: if fav_item.type != MediaType.VIDEO:
@@ -155,66 +168,50 @@ async def process_favorite_item(
single_page = False single_page = False
if settings.paginated_video: if settings.paginated_video:
pages = None pages = None
try: if not refresh_mode:
pages = await v.get_pages() # 非手动触发的情况下,会刷新一下 pages
pages = [ try:
FavoriteItemPage( tmp_pages = await v.get_pages()
favorite_item=fav_item, if len(tmp_pages) <= 1:
cid=page["cid"], single_page = True
page=page["page"],
name=page["part"],
image=page["first_frame"],
)
for page in pages
]
except Exception:
logger.exception("Failed to get pages of video {} {}.", fav_item.bvid, fav_item.name)
if pages:
if len(pages) == 1:
single_page = True
else:
# 如果有多个分 p那么先创建记录
await FavoriteItemPage.bulk_create(
pages,
on_conflict=["favorite_item_id", "page"],
update_fields=["cid", "name", "image"],
batch_size=300,
)
# 重新拉一下数据,不能用 bulk create 的返回值,因为 bulk_create 不会填充主键
pages = await FavoriteItemPage.filter(favorite_item=fav_item).order_by("page")
for page in pages:
page.favorite_item = fav_item
if process_nfo:
try:
await get_nfo(fav_item.tvshow_nfo_path, obj=fav_item, mode=NfoMode.TVSHOW)
except FileExistsError:
logger.info("Nfo of {} {} already exists, skipped.", fav_item.bvid, fav_item.name)
except Exception:
logger.exception("Failed to process nfo of video {} {}.", fav_item.bvid, fav_item.name)
if process_poster:
try:
await get_file(fav_item.cover, fav_item.tvshow_poster_path)
except FileExistsError:
logger.info("Poster of {} {} already exists, skipped.", fav_item.bvid, fav_item.name)
except Exception:
logger.exception("Failed to process poster of video {} {}.", fav_item.bvid, fav_item.name)
await asyncio.gather(
*[
process_favorite_item_page(
page, v, process_poster, process_video, process_nfo, process_subtitle
)
for page in pages
],
return_exceptions=True,
)
fav_item.downloaded = all(page.downloaded for page in pages)
page_status = {page.status for page in pages}
if MediaStatus.INVISIBLE in page_status:
fav_item.status = MediaStatus.INVISIBLE
elif MediaStatus.DELETED in page_status:
fav_item.status = MediaStatus.DELETED
else: else:
fav_item.status = MediaStatus.NORMAL await update_favorite_item_page(tmp_pages, fav_item)
except Exception:
logger.exception("Failed to get pages of video {} {}.", fav_item.bvid, fav_item.name)
# 从表中查出 pages
pages = await FavoriteItemPage.filter(favorite_item=fav_item).order_by("page")
for page in pages:
page.favorite_item = fav_item
if pages and not single_page:
if process_nfo:
try:
await get_nfo(fav_item.tvshow_nfo_path, obj=fav_item, mode=NfoMode.TVSHOW)
except FileExistsError:
logger.info("Nfo of {} {} already exists, skipped.", fav_item.bvid, fav_item.name)
except Exception:
logger.exception("Failed to process nfo of video {} {}.", fav_item.bvid, fav_item.name)
if process_poster:
try:
await get_file(fav_item.cover, fav_item.tvshow_poster_path)
except FileExistsError:
logger.info("Poster of {} {} already exists, skipped.", fav_item.bvid, fav_item.name)
except Exception:
logger.exception("Failed to process poster of video {} {}.", fav_item.bvid, fav_item.name)
await asyncio.gather(
*[
process_favorite_item_page(page, v, process_poster, process_video, process_nfo, process_subtitle)
for page in pages
],
return_exceptions=True,
)
fav_item.downloaded = all(page.downloaded for page in pages)
page_status = {page.status for page in pages}
if MediaStatus.INVISIBLE in page_status:
fav_item.status = MediaStatus.INVISIBLE
elif MediaStatus.DELETED in page_status:
fav_item.status = MediaStatus.DELETED
else:
fav_item.status = MediaStatus.NORMAL
if single_page or not settings.paginated_video: if single_page or not settings.paginated_video:
if process_nfo: if process_nfo:
try: try:
@@ -291,7 +288,7 @@ async def process_favorite_item_page(
) )
if process_poster: if process_poster:
try: try:
await get_file(fav_page.image, fav_page.poster_path) await get_file(fav_page.image or fav_page.favorite_item.cover, fav_page.poster_path)
except FileExistsError: except FileExistsError:
logger.info( logger.info(
"Poster of {} {} page {} already exists, skipped.", "Poster of {} {} page {} already exists, skipped.",