优化 transfer.py 中任务处理逻辑,增强错误信息反馈

This commit is contained in:
jxxghp
2026-01-21 23:55:20 +08:00
parent 90c86c056c
commit bbe831a57c

View File

@@ -219,7 +219,7 @@ class JobManager:
def remove_job(self, task: TransferTask) -> Optional[TransferJob]: def remove_job(self, task: TransferTask) -> Optional[TransferJob]:
""" """
移除作业 移除任务对应的作业
""" """
with job_lock: with job_lock:
__mediaid__ = self.__get_media_id(media=task.mediainfo, season=task.meta.begin_season) __mediaid__ = self.__get_media_id(media=task.mediainfo, season=task.meta.begin_season)
@@ -470,7 +470,12 @@ class TransferChain(ChainBase, ConfigReloadMixin, metaclass=Singleton):
整理完成后处理 整理完成后处理
""" """
def __all_finished(): # 状态
ret_status = True
# 错误信息
ret_message = ""
def __notify():
""" """
完成时发送消息、刮削事件、移除任务等 完成时发送消息、刮削事件、移除任务等
""" """
@@ -492,6 +497,7 @@ class TransferChain(ChainBase, ConfigReloadMixin, metaclass=Singleton):
se_str = f"{task.meta.season} {StringUtils.format_ep(season_episodes)}" se_str = f"{task.meta.season} {StringUtils.format_ep(season_episodes)}"
else: else:
se_str = f"{task.meta.season}" se_str = f"{task.meta.season}"
# 发送入库成功消息
self.send_transfer_message(meta=task.meta, self.send_transfer_message(meta=task.meta,
mediainfo=task.mediainfo, mediainfo=task.mediainfo,
transferinfo=transferinfo, transferinfo=transferinfo,
@@ -508,12 +514,10 @@ class TransferChain(ChainBase, ConfigReloadMixin, metaclass=Singleton):
'overwrite': False 'overwrite': False
}) })
# 移除已完成的任务
self.jobview.remove_job(task)
transferhis = TransferHistoryOper() transferhis = TransferHistoryOper()
# 转移失败
if not transferinfo.success: if not transferinfo.success:
# 转移失败
logger.warn(f"{task.fileitem.name} 入库失败:{transferinfo.message}") logger.warn(f"{task.fileitem.name} 入库失败:{transferinfo.message}")
# 新增转移失败历史记录 # 新增转移失败历史记录
@@ -548,83 +552,89 @@ class TransferChain(ChainBase, ConfigReloadMixin, metaclass=Singleton):
link=settings.MP_DOMAIN('#/history') link=settings.MP_DOMAIN('#/history')
)) ))
# 整理失败 # 设置任务失败
self.jobview.fail_task(task) self.jobview.fail_task(task)
# 全部整理完成且有成功的任务时 # 全部整理完成且有成功的任务时
if self.jobview.is_finished(task): if self.jobview.is_finished(task):
# 发送消息、刮削事件、移除任务 # 发送消息、刮削事件
__all_finished() __notify()
return False, transferinfo.message # 返回失败
ret_status = False
ret_message = transferinfo.message
# task转移成功 else:
self.jobview.finish_task(task) # 转移成功
logger.info(f"{task.fileitem.name} 入库成功:{transferinfo.target_diritem.path}")
logger.info(f"{task.fileitem.name} 入库成功:{transferinfo.target_diritem.path}") # 新增task转移成功历史记录
transferhis.add_success(
fileitem=task.fileitem,
mode=transferinfo.transfer_type if transferinfo else '',
downloader=task.downloader,
download_hash=task.download_hash,
meta=task.meta,
mediainfo=task.mediainfo,
transferinfo=transferinfo
)
# 新增task转移成功历史记录 # task整理完成事件
transferhis.add_success( if self.__is_media_file(task.fileitem):
fileitem=task.fileitem, self.eventmanager.send_event(EventType.TransferComplete, {
mode=transferinfo.transfer_type if transferinfo else '', 'fileitem': task.fileitem,
downloader=task.downloader, 'meta': task.meta,
download_hash=task.download_hash, 'mediainfo': task.mediainfo,
meta=task.meta, 'transferinfo': transferinfo,
mediainfo=task.mediainfo, 'downloader': task.downloader,
transferinfo=transferinfo 'download_hash': task.download_hash,
) })
# task整理完成事件 # task登记转移成功文件清单
if self.__is_media_file(task.fileitem): target_dir_path = transferinfo.target_diritem.path
self.eventmanager.send_event(EventType.TransferComplete, { target_files = transferinfo.file_list_new
'fileitem': task.fileitem, with job_lock:
'meta': task.meta, if self._success_target_files.get(target_dir_path):
'mediainfo': task.mediainfo, self._success_target_files[target_dir_path].extend(target_files)
'transferinfo': transferinfo, else:
'downloader': task.downloader, self._success_target_files[target_dir_path] = target_files
'download_hash': task.download_hash,
})
# task登记转移成功文件清单 # 设置任务成功
target_dir_path = transferinfo.target_diritem.path self.jobview.finish_task(task)
target_files = transferinfo.file_list_new
with job_lock:
if self._success_target_files.get(target_dir_path):
self._success_target_files[target_dir_path].extend(target_files)
else:
self._success_target_files[target_dir_path] = target_files
# 全部整理成功时 # 全部整理成功时
if self.jobview.is_success(task): if self.jobview.is_success(task):
# 移动模式删除空目录 # 移动模式删除空目录
if transferinfo.transfer_type in ["move"]: if transferinfo.transfer_type in ["move"]:
# 所有成功的业务 # 所有成功的业务
tasks = self.jobview.success_tasks(task.mediainfo, task.meta.begin_season) tasks = self.jobview.success_tasks(task.mediainfo, task.meta.begin_season)
# 获取整理屏蔽词 # 获取整理屏蔽词
transfer_exclude_words = SystemConfigOper().get(SystemConfigKey.TransferExcludeWords) transfer_exclude_words = SystemConfigOper().get(SystemConfigKey.TransferExcludeWords)
for t in tasks: for t in tasks:
if t.download_hash and self._can_delete_torrent(t.download_hash, t.downloader, if t.download_hash and self._can_delete_torrent(t.download_hash, t.downloader,
transfer_exclude_words): transfer_exclude_words):
if self.remove_torrents(t.download_hash, downloader=t.downloader): if self.remove_torrents(t.download_hash, downloader=t.downloader):
logger.info(f"移动模式删除种子成功:{t.download_hash}") logger.info(f"移动模式删除种子成功:{t.download_hash}")
if t.fileitem: if t.fileitem:
StorageChain().delete_media_file(t.fileitem, delete_self=False) StorageChain().delete_media_file(t.fileitem, delete_self=False)
# 全部整理完成且有成功的任务时 # 全部整理完成且有成功的任务时
if self.jobview.is_finished(task): if self.jobview.is_finished(task):
# 发送消息、刮削事件、移除任务 # 发送消息、刮削事件
__all_finished() __notify()
# 全部整理完成不管成功还是失败 # 全部整理完成不管成功还是失败
if self.jobview.is_done(task): if self.jobview.is_done(task):
# 所有任务 # 查询作业中的所有任务
tasks = self.jobview.all_tasks(task.mediainfo, task.meta.begin_season) tasks = self.jobview.all_tasks(task.mediainfo, task.meta.begin_season)
for t in tasks: for t in tasks:
if t.download_hash: if t.download_hash:
# 设置种子状态为已整理 # 设置种子状态为已整理
self.transfer_completed(hashs=t.download_hash, downloader=t.downloader) self.transfer_completed(hashs=t.download_hash, downloader=t.downloader)
# 清理作业
self.jobview.remove_job(task)
return True, "" return ret_status, ret_message
def put_to_queue(self, task: TransferTask): def put_to_queue(self, task: TransferTask):
""" """