观澜 Wavegazer:我把 PT 全家桶写成了一个文件

开源地址:https://github.com/zkzkeep/packseed (MIT) 观澜,Wavegazer——观影观澜,站在岸上看自己的海。 今天想庆祝一下:我的 PT 全家桶「观澜」正式毕业了。从一个赌气的周末脚本,长成一个我自己每天都在用、并且觉得精致的 app。这篇把整个上线过程记下来。 一、起因:一口没咽下去的气 我的保种流程原本是业界标配:MoviePilot 管下载刮削,cross-seed 管辅种,IYUU 补刀。直到有一天,我发现 cross-seed 对着我硬盘里的《无耻之徒 S01-S11》《真探 S01-S03》这种多季合集包视而不见——它依赖 release 命名规范做匹配,PT 站常见的中文合集、非标准命名,它直接跳过。 可辅种的本质明明很简单:同样的文件内容,在另一个站找到对应种子,把 tracker 换过去继续做种。判断依据应该是"文件是否一致",而不是"名字长得像不像"。 行,你不认名字,我就不看名字。周末写了个脚本:体积预筛(±0.3%)+ 文件清单精确比对——把本地种子的相对路径和字节数做成集合,和候选种子的清单硬碰硬。名字爱叫什么叫什么。 第一次全量跑完:白色巨塔从 1 个站辅到 27 个站。cross-seed 拒收的合集包,全辅上了。 二、演化:从辅种脚本到全家桶 赌气脚本能跑之后,野心就藏不住了。既然 Prowlarr 已经聚合了我全部站点,那搜索下载为什么还要开 MP?既然下载完成事件我自己就能监听,那刮削入库为什么要靠别人? 于是它一步步吃掉了整条流水线: 面板搜索 → 一键推 qb 下载 ↓ 下载完成(自动检测) 识别 → TMDB 匹配 → 硬链接进媒体库「中文名 (年份)/」 ↓ ↓ 通知 Emby 刷新 转种到 Transmission 保种 ↓ 扫描 tr → 全站辅种(体积+清单比对) 硬链接三方共享同一份文件:qb 下的、Emby 播的、tr 做种的,不重复占一个字节。 中间攻克的硬骨头,每一块都值得单独写一篇: 动漫识别:[字幕组][标题][01-24]、第1123话这种番组命名专门解析;海贼王柯南这类千集长寿番,按话数自动匹配到最早开播的原版条目,不会配到重制版或真人版 音乐流水线:识别 FLAC/APE 特征 → 原结构入 Navidrome 库 → 自动配歌词 .lrc 和专辑封面 企业微信双向交互:纯标准库手写 AES-256-CBC 回调解密(S 盒都是伽罗瓦域现算的),微信里发片名→回片单→回数字→自动下载,还能 30 分钟内撤回 Emby 驯服记:这是血泪最浓的一章。Emby 的 NFO 读取是玄学,RemoteSearch 会按名字瞎搜(把《火线》认成《穿越火线》),ReplaceAllMetadata=true 的刷新会把你刚写进去的身份自己拆掉重新瞎识别。最终唯一可靠的路:直接 POST 完整 dto 写死 Name/ProviderIds/年份/简介,之后永远只做增量刷新。从此 Emby 降级为纯播放器,刮削自给自足——每次入库自动生成 NFO + 海报 + 同人画 + 标准重命名,媒体包自包含,换任何播放器即插即用 MP 正式退休那天,我把它的容器停了,没舍得删。留个纪念。 ...

July 23, 2026 · 2 min