fix transfer

This commit is contained in:
jxxghp
2024-12-24 14:06:45 +08:00
parent 84f5d1c879
commit a2c913a5b2
+54 -27
View File
@@ -230,13 +230,14 @@ class TransferChain(ChainBase, metaclass=Singleton):
self._transfer_thread = threading.Thread(target=self.__start_transfer, daemon=True) self._transfer_thread = threading.Thread(target=self.__start_transfer, daemon=True)
self._transfer_thread.start() self._transfer_thread.start()
def __default_callback(self, task: TransferTask, transferinfo: TransferInfo, /): def __default_callback(self, task: TransferTask,
transferinfo: TransferInfo, /) -> Tuple[bool, str]:
""" """
整理完成后处理 整理完成后处理
""" """
if not transferinfo: if not transferinfo:
logger.error("文件转移模块运行失败") logger.error("文件转移模块运行失败")
return return False, "文件转移模块运行失败"
if not transferinfo.success: if not transferinfo.success:
# 转移失败 # 转移失败
@@ -264,7 +265,7 @@ class TransferChain(ChainBase, metaclass=Singleton):
# 移除已完成的任务 # 移除已完成的任务
if self.jobview.is_finished(task.mediainfo, task.meta.begin_season): if self.jobview.is_finished(task.mediainfo, task.meta.begin_season):
self.jobview.remove_job(task.mediainfo, task.meta.begin_season) self.jobview.remove_job(task.mediainfo, task.meta.begin_season)
return return False, transferinfo.message
# 转移成功 # 转移成功
logger.info(f"{task.fileitem.name} 入库成功:{transferinfo.target_diritem.path}") logger.info(f"{task.fileitem.name} 入库成功:{transferinfo.target_diritem.path}")
@@ -321,6 +322,8 @@ class TransferChain(ChainBase, metaclass=Singleton):
# 清除作业 # 清除作业
self.jobview.remove_job(task.mediainfo, task.meta.begin_season) self.jobview.remove_job(task.mediainfo, task.meta.begin_season)
return True, ""
def put_to_queue(self, task: TransferTask, callback: Optional[Callable] = None): def put_to_queue(self, task: TransferTask, callback: Optional[Callable] = None):
""" """
添加到待整理队列 添加到待整理队列
@@ -376,9 +379,11 @@ class TransferChain(ChainBase, metaclass=Singleton):
text=__process_msg, text=__process_msg,
key=ProgressKey.FileTransfer) key=ProgressKey.FileTransfer)
# 整理 # 整理
if self.__handle_transfer(task=item.task, callback=item.callback): state, err_msg = self.__handle_transfer(task=item.task, callback=item.callback)
if state:
processed_num += 1 processed_num += 1
else: else:
logger.warn(f"{item.task.fileitem.name} 整理失败:{err_msg}")
fail_num += 1 fail_num += 1
except queue.Empty: except queue.Empty:
if not __queue_start: if not __queue_start:
@@ -399,12 +404,13 @@ class TransferChain(ChainBase, metaclass=Singleton):
except Exception as e: except Exception as e:
logger.error(f"整理队列处理出现错误:{e}") logger.error(f"整理队列处理出现错误:{e}")
def __handle_transfer(self, task: TransferTask, callback: Optional[Callable] = None) -> bool: def __handle_transfer(self, task: TransferTask,
callback: Optional[Callable] = None) -> Tuple[bool, str]:
""" """
处理整理任务 处理整理任务
""" """
if not task: if not task:
return False return False, ""
# 执行整理 # 执行整理
transferinfo: TransferInfo = self.transfer(fileitem=task.fileitem, transferinfo: TransferInfo = self.transfer(fileitem=task.fileitem,
meta=task.meta, meta=task.meta,
@@ -419,11 +425,13 @@ class TransferChain(ChainBase, metaclass=Singleton):
library_category_folder=task.library_category_folder) library_category_folder=task.library_category_folder)
if not transferinfo: if not transferinfo:
logger.error("文件整理模块运行失败") logger.error("文件整理模块运行失败")
return False return False, "文件整理模块运行失败"
# 回调,位置传参:任务、整理结果 # 回调,位置传参:任务、整理结果
if callback: if callback:
return callback(task, transferinfo) return callback(task, transferinfo)
return False
return transferinfo.success, transferinfo.message
def recommend_name(self, meta: MetaBase, mediainfo: MediaInfo) -> Optional[str]: def recommend_name(self, meta: MetaBase, mediainfo: MediaInfo) -> Optional[str]:
""" """
@@ -604,7 +612,8 @@ class TransferChain(ChainBase, metaclass=Singleton):
library_type_folder: bool = None, library_category_folder: bool = None, library_type_folder: bool = None, library_category_folder: bool = None,
season: int = None, epformat: EpisodeFormat = None, min_filesize: int = 0, season: int = None, epformat: EpisodeFormat = None, min_filesize: int = 0,
downloader: str = None, download_hash: str = None, downloader: str = None, download_hash: str = None,
force: bool = False, src_match: bool = False) -> Tuple[bool, str]: force: bool = False, src_match: bool = False,
background: bool = True) -> Tuple[bool, str]:
""" """
执行一个复杂目录的整理操作 执行一个复杂目录的整理操作
:param fileitem: 文件项 :param fileitem: 文件项
@@ -624,6 +633,7 @@ class TransferChain(ChainBase, metaclass=Singleton):
:param download_hash: 下载记录hash :param download_hash: 下载记录hash
:param force: 是否强制整理 :param force: 是否强制整理
:param src_match: 是否源目录匹配 :param src_match: 是否源目录匹配
:param background: 是否后台运行
返回:成功标识,错误信息 返回:成功标识,错误信息
""" """
@@ -639,6 +649,9 @@ class TransferChain(ChainBase, metaclass=Singleton):
""" """
return True if not _min_filesize or _size > _min_filesize * 1024 * 1024 else False return True if not _min_filesize or _size > _min_filesize * 1024 * 1024 else False
# 是否全部成功
all_success = True
# 自定义格式 # 自定义格式
formaterHandler = FormatParser(eformat=epformat.format, formaterHandler = FormatParser(eformat=epformat.format,
details=epformat.detail, details=epformat.detail,
@@ -712,6 +725,7 @@ class TransferChain(ChainBase, metaclass=Singleton):
if not force: if not force:
transferd = self.transferhis.get_by_src(file_item.path, storage=file_item.storage) transferd = self.transferhis.get_by_src(file_item.path, storage=file_item.storage)
if transferd and transferd.status: if transferd and transferd.status:
all_success = False
logger.info(f"{file_item.path} 已成功整理过,如需重新处理,请删除历史记录。") logger.info(f"{file_item.path} 已成功整理过,如需重新处理,请删除历史记录。")
continue continue
@@ -726,6 +740,7 @@ class TransferChain(ChainBase, metaclass=Singleton):
file_meta.begin_season = season file_meta.begin_season = season
if not file_meta: if not file_meta:
all_success = False
logger.error(f"{file_path} 无法识别有效信息") logger.error(f"{file_path} 无法识别有效信息")
err_msgs.append(f"{file_path} 无法识别有效信息") err_msgs.append(f"{file_path} 无法识别有效信息")
continue continue
@@ -777,6 +792,7 @@ class TransferChain(ChainBase, metaclass=Singleton):
file_mediainfo = mediainfo file_mediainfo = mediainfo
if not file_mediainfo: if not file_mediainfo:
all_success = False
logger.warn(f'{file_path} 未识别到媒体信息') logger.warn(f'{file_path} 未识别到媒体信息')
# 新增整理失败历史记录 # 新增整理失败历史记录
his = self.transferhis.add_fail( his = self.transferhis.add_fail(
@@ -836,26 +852,37 @@ class TransferChain(ChainBase, metaclass=Singleton):
target_storage=target_storage) target_storage=target_storage)
# 后台整理 # 后台整理
self.put_to_queue( transfer_task = TransferTask(
task=TransferTask( fileitem=file_item,
fileitem=file_item, meta=file_meta,
meta=file_meta, mediainfo=file_mediainfo,
mediainfo=file_mediainfo, target_directory=target_directory or dir_info,
target_directory=target_directory or dir_info, target_storage=target_storage,
target_storage=target_storage, target_path=target_path,
target_path=target_path, transfer_type=transfer_type,
transfer_type=transfer_type, episodes_info=episodes_info,
episodes_info=episodes_info, scrape=scrape,
scrape=scrape, library_type_folder=library_type_folder,
library_type_folder=library_type_folder, library_category_folder=library_category_folder,
library_category_folder=library_category_folder, downloader=downloader,
downloader=downloader, download_hash=download_hash
download_hash=download_hash )
if background:
self.put_to_queue(
task=transfer_task
) )
) logger.info(f"{file_path.name} 已添加到整理队列")
logger.info(f"{file_path.name} 已添加到整理队列") else:
state, err_msg = self.__handle_transfer(
task=transfer_task,
callback=self.__default_callback
)
if not state:
all_success = False
logger.warn(f"{file_path.name} 整理失败:{err_msg}")
err_msgs.append(err_msg)
return True, "\n".join(err_msgs) if err_msgs else f"{fileitem.name} 已添加到整理任务队列" return all_success, "\n".join(err_msgs)
def remote_transfer(self, arg_str: str, channel: MessageChannel, def remote_transfer(self, arg_str: str, channel: MessageChannel,
userid: Union[str, int] = None, source: str = None): userid: Union[str, int] = None, source: str = None):