多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

用AV_Data_Capture实现本地影库元数据刮削自动化

用AV_Data_Capture实现本地影库元数据刮削自动化 简介面向本地影音媒体管理场景这款AV_Data_Capture命令行工具提供了一套完整的电影元数据抓取、分类与整理方案适合正在使用Emby、Jellyfin、Kodi等媒体管理系统的用户也适合需要批量维护本地影片库的Python开发者。其围绕刮削流程设计内置多个影视站点解析模块通过统一配置文件与核心处理函数即可完成自动识别、命名归类及元数据写入降低手动维护成本。资源包共44个文件以18个Python脚本为主体辅以INI/JSON配置、Shell/PowerShell辅助脚本、Dockerfile及YAML编排可在Windows、Linux或容器化环境中快速部署压缩包整体仅272KB轻量且结构清晰。目前已有16366人学习下载关注度较高。除命令行主程序外还附带Plex/Kodi/Emby相关配置参考、部署脚本和README说明能让读者快速将整理后的影片库稳定接入主流媒体平台。1. 本地影库的元数据之痛为什么我最后留下了 AV_Data_Capture1.1 裸奔的影库连家里人都不想打开如果你也跟我一样下载这件事坚持了好几年那么大概率会面临同一个问题硬盘里躺着几百上千部影片文件名五花八门——有些还带着发布组的标识和乱七八糟的分辨率后缀有些干脆就是一串数字加字母。打开 Emby 一看整个媒体库就是一面巨大的“文件管理器墙”没有海报没有简介没有演员表连影片年份都要靠猜。家里人想找一部片子翻了五分钟放弃了回头问我“你这些东西到底存了些什么”。这不是懒是原始文件本来就没有携带任何可用元数据。视频文件里通常只有编码信息标题、简介、演职员表、封面这些内容全都需要从外部数据库获取。这个补齐信息的过程玩 NAS 的人都习惯叫它“刮削”。而 AV_Data_Capture 做的就是把刮削这件原本分散在多个人工环节里的工作整合成一条可以自动跑完的流水线。我当时把市面上主流方案都试过一轮Emby 自带的刮削器对英文大片表现不错但遇到命名不规范或者冷门一点的片子经常匹配失败Kodi 的插件体系足够灵活可每次一开电视就要等它转圈圈体验实在谈不上流畅。最后换成 AV_Data_Capture 先对本地文件做一轮“预处理”把所有元数据和图片落盘再让 Emby 直接读本地 NFO 文件影库瞬间就从“能看”变成了“好看”。1.2 同类的刮削工具不少为什么它能让我用满一年社区里类似的工具其实挺多TinyMediaManager 是老牌选手功能全、界面友好但它更偏向图形化操作适合一部一部精雕细琢。对于一个动辄上千部影片、还希望以后每新增一部都能自动处理的场景我更倾向于命令行工具因为它可以挂在服务器上定时跑也可以跟前端自动化流程串起来。AV_Data_Capture 让我留下的理由主要有三点第一它的处理链路是完整的——扫描文件夹、识别影片标识、请求元数据源、生成 NFO 文件、下载海报和剧照、按模板重命名归档一气呵成不需要我中间介入第二它对媒体服务器非常友好输出的 NFO 文件名和图片命名都符合 Emby/Jellyfin/Plex 的识别约定刮削完直接在媒体服务器里指定目录就能用第三它把缓存做进了数据库同一批数据反复扫描的时候不会重复请求远程接口这对于跑全量库来说效率天差地别。当然它也不是零门槛要装依赖、要配数据库、要申请元数据源 API Key、还要理解重命名模板的语法。上手的第一天我确实花了不少时间看日志。但一旦跑通了后续新增文件基本就是丢进目录、执行一次命令、刷新媒体库三步。1.3 这套方案适合谁不适合谁我个人的判断是如果你手里影片数量已经超过一两百部且你有那么点折腾服务器的耐心那么 AV_Data_Capture 值得花一个晚上去配置。它尤其适合把影库跑在 NAS、小主机或者长期开机的电脑上的人因为一次配置完后面全都是增量工作。反过来说如果你只有十几部片子随手一翻就能定位那真的没必要上这套工具——媒体服务器自带的在线刮削足够应付手动改几份 NFO 也比你研究配置文件快得多。2. 一条视频文件的完整“净化”链路识别、抓取、落地三阶段2.1 第一跳从文件堆里捞出有效目标我第一次跑全量的时候数据目录里堆了三块硬盘的资料什么子目录都有还有几个文件夹是旧的备份里面很多文件是重复的。AV_Data_Capture 的扫描逻辑是从根目录递归下去按照扩展名过滤出视频文件同时跳过已经处理过、已有刮削结果的条目。这看似简单但有个细节很值得一说它的去重不是只看文件名而是会结合文件大小、修改时间甚至对内容做哈希判断。我当时就有一批不同目录下的同名文件如果不做哈希去重后面会生成一堆重复的 NFO 和海报把媒体库搞得一团糟。扫描完成之后工具会把每个候选文件送入识别模块。识别模块干的第一件事就是从文件名里提取“影片标识”。这个标识是从外部数据库检索的关键依据也是整个刮削流程里最核心的一步。文件名里的年份、分辨率、视频编码、发布组标记都会被剥离掉剩下的核心单词和数字组合才是它要去数据库里搜索的钥匙。2.2 第二跳向元数据源发起匹配拿回结构化信息拿到标识之后工具会组装一个查询请求发到元数据源。这里我用的是 TMDB 的 API当时花了几分钟申请了一个 Key配进配置文件之后所有请求都走它。查询结果会返回一个候选列表工具再根据标题相似度、年份是否吻合等字段给每个候选打分自动选出最高分的那一项。这一步非常考验匹配逻辑的严谨程度。不同年份的同名影片、系列片的多部作品、标题里带特殊符号的片子都容易让匹配出现偏差。我当时实测下来的建议是文件名里尽量保留年份匹配准确率会明显上升。年份是区分同名影片最有效的信号比任何模糊评分都好使。匹配成功后工具会把一整块结构化元数据拉回来包括主标题、原文标题、简介、发行日期、评分、类型、演职员表、海报 URL、背景图 URL 等等。这些信息会先写进本地数据库做缓存。我特别认可这个设计——元数据本身就带有一定的时效性和网络成本一旦写入缓存后续对同一部影片执行任何操作都无需再次请求在跑全量库或者多次调整配置的时候能省下大量时间和 API 配额。2.3 第三跳NFO、海报、重命名一起落地元数据到手后工具会在影片对应的目录里生成一份 NFO 文件。NFO 本质上是 XMLEmby、Jellyfin、Kodi 都把它作为优先读取的本地元数据来源。文件里按固定结构写好了标题、原名、简介、年份、评分、制作人、演员列表这些字段。紧接着就是图片素材的下载。工具的默认命名约定和媒体服务器完全对齐主海报存成 poster.jpg背景图存成 fanart.jpg有时候还会拉一张 thumb.jpg 用作缩略图。媒体服务器扫描到这些文件时会直接把它们当作影片封面和背景不再自己去网上重新拉取。最后一步是重命名与归档。这一步才是“整理”二字的实体化体现。工具可以按照模板把原先的裸文件名改写成“片名年份.mkv”这样的规范格式甚至可以将文件移动到预设的目录结构里比如按“影片名/片名年份/”分目录存放。我在配置时把原始文件保留了下来处理过程中没有删过任何数据即便碰到不满意的结果回滚也很方便。这三跳走完一条原始视频文件就变成了媒体服务器可以优雅展示的标准条目。整个过程几乎不需要人工介入这也是我把它称为“一体化解决方案”的原因。3. 从零跑通环境、配置与首轮全量刮削的实操记录3.1 环境准备里最容易忽略的版本问题AV_Data_Capture 是 Python 项目依赖项都在 requirements.txt 里列好了理论上安装很简单。但我在实际操作中踩了几个跟环境相关的坑这里单独提醒一下。首先是 Python 版本。如果你主机上装的是 Python 3.6 或更老的版本部分依赖可能装不上太新的版本比如 3.12又可能碰上一两个包还没适配。我当时用的是 Python 3.8 环境执行 pip install -r requirements.txt 一路顺畅建议按这个版本区间来。其次是数据库。工具需要一张表来缓存元数据和记录处理状态我部署的版本默认支持 MySQL也可以换成其他兼容协议的关系型数据库。我在 NAS 上用 Docker 跑了一个 MariaDB 实例新建了独立库和专用账号。这里特别提醒数据库的字符集一定要设置成 utf8mb4否则拉回来的中文标题和简介写入时会直接报错或者乱码。这个坑隐蔽得很日志里只会出现一句模糊的数据写入异常不往字符集方向排查能卡一晚上。3.2 配置文件里最值得调的几个参数首次运行前需要编辑一份配置文件我把它理解成整个工具的“控制面板”。几个关键项直接决定了成品的质量和运行动作配置项作用我的建议值媒体服务器类型输出 NFO 时适配不同的字段结构emby 或 jellyfin按实际使用选元数据语言控制拉取简介和标题的偏好语言zh-CN 优先备用 en-USAPI Key元数据源访问凭据填你自己申请的 Key数据库连接缓存元数据和记录状态本地 MySQL独立库独立账号重命名模板最终文件/目录命名格式片名年份/片名年份-分辨率.ext是否保留原始文件处理时是否删除源文件第一次务必保留确认无误后再改这里面最容易被低估的是“元数据语言”。如果你希望影库里中文优先那么语言参数必须显式配置否则可能拉回来的全是英文标题和英文简介。但这里有个平衡冷门片的非英语元数据不一定齐全所以我建议把备用语言也填上遇到中文信息缺失时自动降级到英文至少保证条目信息完整而不是直接空白。3.3 第一次跑全量节奏远比速度重要绝大多数人包括我第一次上手都会犯同一个错误上来就把整个媒体库目录丢给工具然后盯着屏幕等结果。结果通常是一堆失败日志、匹配错误和乱码文件名。正确的做法是先建一个测试目录里面放五到十部不同类型、不同命名风格的文件跑完一轮打开生成的 NFO 和图片检查一遍确认符合预期再把数据目录扩展出去。全量刮削的时间不要想得太乐观上千部文件从扫描到全部完成几个小时很正常。我的经验是可以把批处理调小一点避免同一时间发出大量请求。工具支持暂停和断点续跑日志里记录了每部影片的处理状态中途断了也不怕重新执行一次它会自动跳过已经处理完的文件。3.4 与 Emby/Jellyfin 对接的初始化刮削完成后媒体服务器的接入反倒是最简单的部分。在 Emby 里新增媒体库时指向工具输出目录然后把“元数据读取器”里的 NFO 选项打开把“图片获取器”里的本地图片选项打开再把在线抓取的优先级顺序调到本地文件之后。这里有一个关键点如果在接媒体库之前你开着 Emby 让它自动扫描它可能会抢先把在线数据写进去等你后面想用本地 NFO 覆盖时就得清空媒体库重新扫描。所以我的操作顺序是先配置好本地读取优先再指向目录最后触发扫描。这样 Emby 看到的永远是 AV_Data_Capture 处理过的标准结果。4. 刮削精度的核心战场文件命名、编号识别与重命名策略4.1 90% 的刮削失败都能从文件名上找到原因我用这套工具一段时间后把失败案例汇总了一遍结论非常直接绝大多数匹配不上或者匹配错误的问题根源都在文件名。命名规范的文件识别模块从文件名里提取标识几乎不会失误而那些命名混乱、信息残缺的文件后面的匹配基本靠运气。举个例子一个标准的命名可能是“影片名.2022.1080p.BluRay.x264”识别模块能轻松剥离分辨率、年份、编码、发布组剩下的片名拿去搜索准确率很高。但如果文件名是“xxx_2022_abc_efg.mkv”这种毫无规律的结构工具就只能在里面硬找可能的标识结果经常跑偏。所以如果你打算长期维护一个影库我强烈建议从源头就建立命名规范。下载完后第一时间把文件名整理好这比任何刮削工具都有效。工具可以帮你自动完成这个过程但第一步的原始命名越规范后面的自动化就越省心。4.2 识别码的提取规则与正则很多视频文件名里会包含一段独特的识别编码形如字母加数字的组合或者年份加序号的结构。AV_Data_Capture 的识别模块会对文件名做正则提取把这类编码当作查询数据库的第一优先依据。因为它比普通标题更唯一匹配速度和准确率都更高。我在配置里调整过几次这段提取规则。默认规则覆盖了常见的编码格式但如果你手里的资源命名风格比较特殊比如中间带有额外的分隔符号或者字母数字之间插入了横线默认规则可能识别不出。这时候需要自己在正则表达式里把这种格式补充进去。我后来维护了一份自己的规则表把平时遇到过的几十种命名变体都覆盖进去再执行批量处理失败率明显下降。4.3 重命名模板既要强迫症友好也要兼容媒体服务器重命名模板这步我建议花心思设计因为一旦文件数量大了重命名之后再想调整目录结构会非常痛苦。我的输出模板最终定为“片名年份/片名年份-分辨率.ext”。这样一部影片一个文件夹文件夹内放着视频文件、NFO、海报和背景图Emby 扫描时识别效率最高。文件夹名和文件名都不带特殊字符也避开了 Windows 和主流 NAS 文件系统的非法字符问题。如果你处理的对象主要是剧集可能还需要在模板里加入季和集的占位符保证每集都能落到正确的位置。这里要特别提醒同名影片的问题。不同版本的剧场版和加长版年份一样工具很可能把两个文件合并到同一个文件夹里。我的解决办法是在模板里预留一个“版本”字段或者在文件名里主动加一个自定义标签强制把它们区分开。宁可在文件名里多几个字也不要让媒体库因为同名冲突而漏掉某一部。4.4 匹配失败的兜底方案手动标识比猜标题更可靠即使识别规则再完善也总会有几部片子匹配不上冷门独立电影、某些自制内容、老电影的非标准发行版都容易撞上这堵墙。我的经验是别硬靠标题去猜直接把数据库里的 ID 写进文件名让工具按 ID 去精确查询。这个操作比人工改 NFO 简单得多。只需要把文件名改成“影片标识.片名.年份.ext”的格式工具在识别阶段读到标准 ID就不会再走模糊匹配流程而是直接抓取该 ID 对应的完整元数据。我在跑完第一轮全量后把匹配失败的清单导出逐个补上 ID重新跑一遍基本上全都救回来了。5. 高频故障排查与个人心得日志优先的排错思路5.1 先看日志再猜故障用这类工具最忌讳的就是不看日志盲目重试。AV_Data_Capture 的日志写得相当详细每一步处理、每一次请求、每一条匹配结果都有记录。我后来把日志级别调到调试模式再回看处理流程很多“莫名其妙”的失败其实一眼就能定位。常见的故障大致分为四类我整理了一个排查对照表故障现象常见根因处理方向匹配率很低大量“未找到”文件名标识提取失败检查识别规则补齐正则请求返回超时或错误码API Key 失效或请求频率过高核对 Key调大请求间隔开启缓存中文标题/简介乱码数据库字符集不是 utf8mb4重建库并设置字符集文件处理成功但没有生成图片图片 URL 下载超时或目录权限不足检查目录写权限手动重试该条目5.2 两个我卡了最久的坑第一个坑是缓存数据库目录搞错。我在 NAS 上把数据库挂到了另一个卷结果权限没配对工具启动时连接正常但一写入就失败。日志里报的是数据插入异常但实际上是 MySQL 账号对目标数据库没有写权限。这个排查花了我不少时间最后用客户端连进数据库手动执行了几条 SQL才发现账号权限默认只开了只读工具有心写数据也使不上劲。解决办法很简单给专用账号重新授权之后一切正常。第二个坑是图片下载大量失败。排查之后确认不是元数据问题而是某个数据源在短时间内连续请求后被限流。解决办法是先停掉全量任务把请求间隔调大再配合数据库缓存重新跑增量图片断点续下最终全部补齐。这个坑告诉我全量任务不要开太高并发稳妥的节奏反而总耗时更短。5.3 效率与资源占用的平衡刮削的本质是大量网络请求加磁盘写入。我在小主机上跑全量时曾经同时跑了好几个任务进程结果 API 限流和磁盘 IO 占满轮番出现。后来我把任务拆成小批量每个批次几百部跑完一批再跑下一批中间设置等待时间整体速度反而更稳定。如果你也在 NAS 上跑建议把执行时间安排在凌晨配合计划任务自动执行既不占用白天用网高峰也能在家人睡觉时把新入库的影片悄悄整理好。第二天打开影库新片已经挂上海报和简介了。5.4 刮削器的边界它整理的是文件不是内容用过半年后我对这类工具有了一个更清醒的认识。刮削器的核心价值不是“把任何片子都变成精美条目”而是“把你能通过命名表达的信息稳定翻译成元数据”。那些数据库里本身就缺失的内容或者资源本身的命名混乱到无法提炼任何信息再强大的工具也无能为力。所以不要把刮削器当成万能药它更像是影库管理流水线上最重要的一环但前面依赖规范的命名后面依赖媒体服务器的正确配置。三者配合好了才是真正的“一体化”。最后分享一个我自己一直在用的小习惯每季度把 NFO 和图片目录单独备份一份。影片本体丢了还能重新下载但手动补过的标识、手动改过的简介这些心血花一次就够了。有了这套备份哪怕未来换媒体服务器、换刮削工具我的影库也能几分钟内完整还原。本文还有配套的精品资源点击获取
返回列表