diff --git a/app/modules/filemanager/transhandler.py b/app/modules/filemanager/transhandler.py index 12fe45c4..9e999e81 100644 --- a/app/modules/filemanager/transhandler.py +++ b/app/modules/filemanager/transhandler.py @@ -298,7 +298,7 @@ class TransHandler: logger.info( f"目的文件系统中已经存在同名文件 {target_file},当前整理覆盖模式设置为 {overwrite_mode}" ) - # 触发覆盖检查事件,允许插件提供目标文件真实大小 + # 触发覆盖检查事件,允许插件提供源/目标文件真实大小 # 或直接给出覆盖决策(例如 .strm 文件指向网盘原始文件) overwrite_event_data = TransferOverwriteCheckEventData( fileitem=fileitem, @@ -313,18 +313,22 @@ class TransHandler: overwrite_event_data, ) plugin_overwrite: Optional[bool] = None + plugin_source_size: Optional[int] = None plugin_target_size: Optional[int] = None if overwrite_event and overwrite_event.event_data: overwrite_event_data = overwrite_event.event_data plugin_overwrite = overwrite_event_data.overwrite + plugin_source_size = overwrite_event_data.source_size plugin_target_size = overwrite_event_data.target_size if ( plugin_overwrite is not None + or plugin_source_size is not None or plugin_target_size is not None ): logger.info( f"覆盖检查事件由 {overwrite_event_data.source} 处理:" f"overwrite={plugin_overwrite}, " + f"source_size={plugin_source_size}, " f"target_size={plugin_target_size}, " f"reason={overwrite_event_data.reason}" ) @@ -349,12 +353,17 @@ class TransHandler: overflag = True elif overwrite_mode == "size": # 存在时大覆盖小 + source_size = ( + plugin_source_size + if plugin_source_size is not None + else fileitem.size + ) target_size = ( plugin_target_size if plugin_target_size is not None else target_item.size ) - if target_size < fileitem.size: + if target_size < source_size: logger.info( f"目标文件文件大小更小,将覆盖:{new_file}" ) diff --git a/app/schemas/event.py b/app/schemas/event.py index 0e52eedb..fb0592ac 100644 --- a/app/schemas/event.py +++ b/app/schemas/event.py @@ -317,9 +317,9 @@ class TransferOverwriteCheckEventData(ChainEventData): """ TransferOverwriteCheck 事件的数据模型 - 在覆盖模式判断(如按文件大小覆盖)执行之前触发,允许插件提供目标文件 - 的真实大小(例如本地 .strm 文件指向的网盘原始文件大小),或者直接给出 - 覆盖决策。 + 在覆盖模式判断(如按文件大小覆盖)执行之前触发,允许插件提供源文件与 + 目标文件的真实大小(例如本地 .strm 文件指向的网盘原始文件大小),或者 + 直接给出覆盖决策。 Attributes: # 输入参数 @@ -332,6 +332,8 @@ class TransferOverwriteCheckEventData(ChainEventData): options (dict): 其他参数 # 输出参数 + source_size (Optional[int]): 由插件提供的源文件真实大小,覆盖 + fileitem.size 用于 size 模式比较;为 None 时表示不修改 target_size (Optional[int]): 由插件提供的目标文件真实大小,覆盖 target_item.size 用于 size 模式比较;为 None 时表示不修改 overwrite (Optional[bool]): 由插件直接给出的覆盖决策,非 None 时 @@ -350,6 +352,9 @@ class TransferOverwriteCheckEventData(ChainEventData): options: Optional[dict] = Field(default=None, description="其他参数") # 输出参数 + source_size: Optional[int] = Field( + default=None, description="插件提供的源文件真实大小" + ) target_size: Optional[int] = Field( default=None, description="插件提供的目标文件真实大小" )