2026/9/21 16:03:07

beets SubsonicUpdate 插件完全指南:库变更自动触发 Subsonic 扫描

beets SubsonicUpdate 插件完全指南:库变更自动触发 Subsonic 扫描 音频CLI【免费下载链接】beetsmusic library manager and MusicBrainz tagger项目地址https://gitcode.com/gh_mirrors/be/beets点击查看免费下载本文围绕 beets 的subsonicupdate插件展开介绍如何让 beets 在每次音乐库发生变化导入、修改、删除后自动调用 Subsonic 的startScan接口刷新服务端索引涵盖插件启用、subsonic:配置段详解、token/password 两种认证方式、与 smartplaylist 的联动以及故障排查。读完本文你将能在一份config.yaml内完成 Subsonic 服务端的自动同步配置并理解其底层的事件驱动实现原理。插件定位与适用场景subsonicupdate是 beets 官方自带的一个极简插件核心作用只有一个当你的 beets 音乐库发生变化时自动通知 Subsonic 服务器重新扫描媒体库从而让 Subsonic 及其兼容客户端如 Airsonic、Navidrome 等实现startScan端点的服务能及时反映 beets 中新增、删除或编辑过的曲目。它本质上是一个触发器本身不做元数据整理、不做扫描而是把扫描动作委托给 Subsonic 服务端完成。插件源码位于 beetsplug/subsonicupdate.py整个实现仅由一个SubsonicUpdate插件类构成。需要特别说明的适用前提来自官方文档 docs/plugins/subsonicupdate.rst需要 Subsonic 持有有效 Premium 许可证或处于试用期或使用任何实现了 Subsonic REST API 的兼容服务器实现startScan端点即可由于当前 Subsonic API 的限制该用户可见的所有媒体库都会被扫描无法只针对某个目录做精确扫描。启用插件在config.yaml的plugins:配置项中加入subsonicupdate即可启用关于插件启用的通用说明可参考 docs/plugins/index.rst 中的 Using Plugins 一节plugins: subsonicupdateplugins的值可以是空格分隔的插件名列表也可以是 YAML 列表形式如[subsonicupdate, smartplaylist]。启用后可通过beet version命令确认插件是否被加载。配置详解在config.yaml中添加一个subsonic:配置段来指定服务器连接信息。官方文档给出的完整示例subsonic: url: https://example.com:443/subsonic user: username pass: password auth: token各配置项的含义与默认值如下默认值来自源码 beetsplug/subsonicupdate.py 中的self.config.add(...)配置项含义默认值urlSubsonic 服务器的资源地址含 context pathhttp://localhost:4040user用于调用 API 的 Subsonic 用户名adminpass该用户的密码可以是明文也可以是带enc:前缀的十六进制编码adminauth认证方式可选token或passwordtoken关于auth的官方建议优先使用token认证因为它不会在请求中发送明文密码发送的是加盐 MD5 摘要对于不支持 token 认证的旧版 Subsonic 服务器则改用password。源码 docstringbeetsplug/subsonicupdate.py中也给出了对应的两种配置写法# 新版 Subsonic使用 token 认证推荐 subsonic: url: https://mydomain.com:443/subsonic user: username pass: password auth: token # 旧版 Subsonic不支持 token改用 password subsonic: url: https://mydomain.com:443/subsonic user: username pass: password auth: pass注意旧写法中auth的值写的是pass而文档表格中描述为password——这是源码中实际分支判断的取值两者对应同一种认证逻辑见下文认证机制配置时以源码为准。另外源码将user与pass两个配置项标记为redact Truebeetsplug/subsonicupdate.py意味着在 beets 输出配置信息时这些敏感值会被打码隐藏避免日志泄露凭据。认证机制token 与 password在发起startScan请求前插件根据auth配置选择不同的认证参数构造方式beetsplug/subsonicupdate.pytoken 认证对应auth: token默认。插件会生成一个 6 位随机盐由大小写字母和数字组成将密码与盐拼接计算 MD5 得到 token在请求参数中携带ttoken、ssalt、u用户名API 版本号固定为1.13.0。核心实现位于__create_token方法beetsplug/subsonicupdate.py其请求参数为uuser tmd5(passwordsalt) ssalt v1.13.0 cbeets fjsonpassword 认证对应auth: password源码中分支为elif auth password。插件会将明文密码十六进制编码并以enc:前缀形式放入p参数API 版本号固定为1.12.0uuser penc:hex(password) v1.12.0 cbeets fjson如果auth既不是token也不是password插件会直接返回、不发送任何请求。两种方式下请求都以cbeets标识客户端名称、以fjson要求服务器返回 JSON 格式响应。工作流程从库变更到触发扫描插件并不在库变更的瞬间立刻请求服务器而是采用标记 退出时执行的延迟策略beetsplug/subsonicupdate.py插件启动时监听两个事件database_change和smartplaylist_update当任一事件触发即库发生了写入/删除或智能播放列表被更新插件注册cli_exit监听器当本次 beets 命令行操作结束时cli_exit事件由 beets/ui/init.py 在主命令执行完毕后发送插件调用start_scan向 Subsonic 发送一次 REST 请求。这种设计把多次库变更合并为一次扫描避免在一次导入过程中反复请求服务器。触发事件在 beets 中的来源database_change由 beets 的数据库模型层发出。在 beets/library/models.py 中store()写入字段和_remove()删除对象完成后都会发送plugins.send(database_change, libself.db, modelself)。也就是说无论是一次beet import导入、beet modify修改标签还是beet remove删除曲目只要数据库发生变更事件都会被触发。smartplaylist_update由 smartplaylist 插件在生成/更新播放列表后发出见 beetsplug/smartplaylist.py 的plugins.send(smartplaylist_update)。事件类型定义在 beets/events.py其中database_change携带lib与model两个参数smartplaylist_update与cli_exit则属于无参或携带lib的事件。startScan 请求与响应处理start_scan方法beetsplug/subsonicupdate.py执行以下步骤读取user、auth、url配置通过__format_url(startScan)拼接出完整端点 URL见下文URL 拼接规则按认证方式构造参数以requests.get发起请求10 秒超时解析 JSON 响应并记录日志状态为ok且返回scanStatus.count时记录Updating Subsonic; scanning N tracksN 为待扫描曲目数状态为failed时输出服务器返回的错误消息如Wrong username or password.非 JSON 响应或网络异常时记录对应的错误日志。URL 拼接规则__format_urlbeetsplug/subsonicupdate.py负责构造请求地址优先使用url配置项并自动去除末尾多余的斜杠例如http://localhost:4040/subsonic/会被规范为http://localhost:4040/subsonic若url为空则回退到已废弃的host、port、contextpath三个旧配置项拼接出http://{host}:{port}{context_path}最终请求路径为{url}/rest/{endpoint}例如https://example.com/subsonic/rest/startScan。测试用例 test/plugins/test_subsonicupdate.py 覆盖了带 context pathhttp://localhost:4040/contextPath/、带末尾斜杠、缺端口、缺协议等 URL 变体验证了拼接逻辑的健壮性。与 smartplaylist 插件的联动官方文档明确指出如果同时启用了 smartplaylist 插件那么每次创建或修改智能播放列表也会触发一次 Subsonic 扫描。这一联动正是通过smartplaylist_update事件实现的smartplaylist 插件在写入 m3u 播放列表后发送该事件beetsplug/smartplaylist.pysubsonicupdate 监听到后同样挂上cli_exit监听在命令退出时请求startScan。这意味着你可以放心地在 beets 侧维护智能播放列表 音乐库的组合Subsonic 侧的索引与播放列表数据会自动跟上。smartplaylist 本身的配置方式smartplaylist:段、playlists列表、query 语法可参考 docs/plugins/smartplaylist.rst。故障排查与验证插件把运行细节写入 beets 日志使用self._log排查问题时可以通过beet -v查看调试输出重点关注URL is ...与auth type is ...两行调试日志确认最终请求地址与认证方式符合预期beetsplug/subsonicupdate.py成功时形如Updating Subsonic; scanning 1000 tracks的 info 日志失败时可能出现的错误日志Subsonic server returned a non-JSON response from ... (HTTP ...)——服务器返回了 HTML 等非 JSON 内容通常是端点路径错误或服务未就绪如请求被发往了不存在的/rest/startScnError connecting to Subsonic server: ...——网络不可达、超时或 TLS 问题Error: {subsonic-response][error][message]——服务器返回业务错误例如凭据错误测试中的FAILED_BODY即为Wrong username or password.。上述各失败路径在 test/plugins/test_subsonicupdate.py 中均有对应的测试用例成功、凭据错误、404、服务不可达、非 JSON 响应可作为排查问题的参照清单。小结subsonicupdate是一个小而专的自动化插件通过监听database_change与smartplaylist_update事件、在 CLI 退出时统一触发一次startScanREST 调用把 beets 的库维护结果无缝同步到 Subsonic 生态。配置上只需一个subsonic:段与四个配置项认证上优先使用 token 以避免明文密码传输。对于使用 Subsonic 及兼容服务如 Airsonic、Navidrome管理音乐的用户它能在不引入任何额外守护进程的前提下保持 beets 与 Subsonic 两侧数据的一致性。赞分享音频CLI【免费下载链接】beetsmusic library manager and MusicBrainz tagger项目地址https://gitcode.com/gh_mirrors/be/beets点击查看免费下载相关推荐beets embyupdate 插件媒体库变更时自动刷新 Emby 服务器beets embyupdate 插件媒体库变更时自动刷新 Emby 服务器 embyupdate 是 beets 的一个官方插件它监听 beets 库的变音频CLIfastest-levenshtein核心API完全指南distance与closest函数详解fastest levenshtein核心API完全指南distance与closest函数详解 fastest levenshtein是JavaScriptbeets Discogs 插件完全指南为自动标签器接入 Discogs 音乐数据库beets Discogs 插件完全指南为自动标签器接入 Discogs 音乐数据库 导读 本文全面讲解 beets 音乐库管理器中的 discogs 插件音频CLI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考