Skip to content

[功能请求] 删除种子时安全清理未被引用的附件及图床文件 #441

Description

@fei152

问题描述

当前种子简介通过 [attach]dlkey[/attach] 引用 attachments 表中的附件。删除种子时,deletetorrent() 会清理种子、评论、 peers、文件列表等数据,但不会处理种子简介中引用的附件。

因此,种子删除后会持续产生孤立数据:

  • attachments 表中的无效记录
  • local 驱动保存在 attachments/ 目录中的原图和缩略图
  • chevereto、lsky 等远端图床中的孤立图片

这个问题与具体图床无关,所有附件存储驱动都受影响。站点长期运行后会持续占用数据库、本地磁盘或远端图床容量。

相关位置:

  • include/functions.php 中的 deletetorrent()
  • nexus/Attachment/Storage.php
  • public/attachment.php
  • attachments 表的 dlkey、location、driver 字段

建议行为

建议增加统一的附件生命周期管理,而不是在单个图床驱动中单独处理:

  1. 删除种子前,从种子简介及相关自定义字段中提取 [attach]dlkey[/attach]。
  2. 删除附件前检查它是否仍被其他种子、论坛帖子等内容引用,避免误删复用附件。
  3. 在附件存储抽象中增加删除能力,例如 delete(string $location),或新增可选的 DeleteCapableStorage 接口。
  4. local 驱动删除原图及 .thumb.jpg 缩略图。
  5. 远端驱动根据各自 API 删除远端文件;不支持删除或缺少远端标识时应记录警告,不应阻塞种子删除。
  6. 删除实际文件成功或确认无需保留后,清理 attachments 表记录及相关缓存。
  7. 远端删除建议使用队列、失败重试和操作日志,避免外部图床故障阻塞种子删除流程。

兼容性建议

  • 建议提供后台开关,允许站点选择是否在删除种子时清理未引用附件。
  • 手工插入的 [img]URL[/img] 不应自动删除,因为无法可靠确认所有权。
  • 被多个内容复用的 [attach] 附件必须保留。
  • 对现有站点可增加一个 Artisan 命令或定时任务,扫描并清理历史孤立附件;建议支持 dry-run。
  • 历史远端附件可能没有保存删除所需的 remote ID/delete key,应兼容为“仅清理可安全识别和删除的附件”。

当前实际表现

deletetorrent() 当前没有解析附件引用,也没有调用任何存储驱动的删除逻辑。附件存储抽象目前只有上传和生成访问地址的能力,因此 local、chevereto、lsky 都会产生相同的孤立数据问题。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions