feat(transfer): TransferOverwriteCheck 支持插件提供源文件真实大小

strm → strm 整理场景下,源 .strm 的 fileitem.size 同样不准,
size 模式比较仍会失效,新增 source_size 输出字段允许插件同时
覆盖源/目标的真实媒体大小。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
DDSRem
2026-04-08 16:03:07 +08:00
committed by jxxghp
parent 4d9f17b083
commit 1b489ba581
2 changed files with 19 additions and 5 deletions

View File

@@ -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}"
)

View File

@@ -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="插件提供的目标文件真实大小"
)