Phlex fetchers 模块拆解:如何统一调度 Radarr、Lidarr 与 Watcher 的下载任务

发布时间:2026/11/1 2:51:50

Phlex fetchers 模块拆解:如何统一调度 Radarr、Lidarr 与 Watcher 的下载任务 Phlex fetchers 模块拆解如何统一调度 Radarr、Lidarr 与 Watcher 的下载任务【免费下载链接】PhlexA super-sexy voice interface for the Plex HTPC项目地址: https://gitcode.com/gh_mirrors/phl/PhlexPhlex 是一个面向 Plex 家庭影院HTPC的语音控制助手而它的fetchers模块正是语音一句话就能自动下载电影、剧集和音乐背后的核心。本文带你拆解fetchers模块如何把Radarr电影、Lidarr音乐与Watcher影片三大下载服务统一调度起来——从按媒体类型路由、并行抓取清单到数据归一化与统一分发下载让你彻底看懂这套开箱即用的语音下载架构。为什么需要 fetchers 模块语音下载的痛点传统家庭影院中想下载一部电影你得手动打开 Radarr 的网页搜索、添加、选质量配置。语音助手的价值就在于一句话完成但难点随之而来接口不统一Radarr 用movie端点Lidarr 用artist端点Watcher 用addmovie模式返回的 JSON 结构各不相同。配置分散每个服务的地址URL和密钥Token都要单独管理。避免重复同一部电影可能在 Radarr 和 Watcher 里都该加但不能重复添加。fetchers模块用一个调度中枢 多个服务适配器的思路把这三件事一次性解决。fetchers 模块的整体架构一张图看懂调度流程整个模块的调用链可以概括为四步流水线路由scanFetchers根据媒体类型挑出启用的下载器并行抓取multiCurl同时向各服务拉取媒体库清单归一化parseFetchers把不同格式统一成标准媒体对象分发下载downloadMedia按命名约定调用对应的下载函数。这四个阶段全部集中在 php/fetchers.php 中实现真正面向各服务的 API 调用则封装在独立的适配器里。第一步按媒体类型路由扫描任务scanFetchers 如何挑出该用哪些下载器入口函数scanFetchers($type, $id)首先根据媒体类型决定扫描哪些服务这是统一调度的第一道闸门电影movie→ CouchPotato、Radarr、Watcher剧集/单集show、episode→ SickRage、Sonarr音乐music、artist、album→ Headphones、Lidarr代码中通过$_SESSION[radarrEnabled]等开关判断服务是否启用只有启用的才会进入扫描队列。每个scanRadarr()、scanLidarr()、scanWatcher()函数职责单一从会话里读取 URL 与 Token拼出该服务的查询接口地址。长尾提示这套按类型路由的设计正是它能同时驾驭 Radarr、Lidarr 与 Watcher 的关键——你只需启用需要的服务其余自动跳过。第二步并行抓取各服务库的清单multiCurl 并行请求告别串行等待如果逐个请求各服务延迟会叠加。Phlex 用 php/multiCurl.php 中的multiCurl类基于 PHP 的curl_multi把多个请求并行发出一次性拿到全部服务的返回数据。这样做的好处很直观无论启用了几个下载器总耗时约等于最慢的那个服务而不是所有服务耗时之和。对语音交互体验而言这意味着开口问到有回应的等待时间被压到最短。第三步把异构数据统一成标准媒体对象parseFetchers 归一化让不同服务说同一种语言各服务返回的字段五花八门Radarr 有tmdbId、overviewWatcher 是tmdbid、plotSickRage 则是show_name、tvdbid。parseFetchers(array $data)用一个switch把每个服务的原始输出交给各自的解析函数parseRadarr、parseLidarr、parseWatcher…最终全部转成统一的媒体对象title、year、imdbId、tmdbId、summary、source其中source字段标记了这条数据来自哪个下载器为后续去重和来源展示打下基础。数据一旦归一化上层逻辑就再也不用关心底层是哪个服务在返回数据。第四步downloadMedia 统一调度下载命名约定分发新增服务几乎零成本真正执行添加下载的是downloadMedia(array $data, array $fetchers)。它用了一个非常优雅的命名约定$function download.ucfirst($fetcher); // 如 downloadRadarr也就是说只要有一个名为downloadRadarr的函数存在调度器就能自动找到并调用它。想接入新服务只需实现一个downloadXxx函数并让服务名进入启用列表调度中枢几乎不用改动。去重避免重复添加在api.php的实际调用中downloadMedia执行前会先比对已扫描到的媒体清单——如果某部电影已存在于某个服务库里按title匹配就把它从待下载列表里剔除并记入existing已存在名单。配合matchVideoMedia按tmdbId / imdbId / tvdbId做精确比对有效防止同一作品被重复加入多个下载器。最终返回结果是[fetched 各服务下载结果, existing 已存在来源]语音端据此播报已添加还是你的库里已经有了。三大下载器的职责分工每个下载器都是一个独立、可复用的 Composer 适配器统一放在digitalhigh命名空间下基于 Guzzle 封装 HTTP 请求Radarr 负责电影php/fetchers/digitalhigh/radarr/src/Radarr.php 封装了 Radarr 的 API。核心方法getMoviesLookup按标题搜索电影拿到完整元数据postMovie把电影加入下载队列getRootFolder、getProfiles获取根目录与质量配置。downloadRadarr会先用tmdbId精确匹配电影再带上monitored、rootFolderPath、qualityProfileId等参数提交给 Radarr并自动触发搜索该影片。Lidarr 负责音乐php/fetchers/digitalhigh/lidarr/src/Lidarr.php 面向音乐场景getArtist、postArtist、updateAlbum管理艺术家与专辑postCommand则下发ArtistSearch/AlbumSearch命令触发搜索。downloadLidarr会判断是整个艺术家还是单张专辑走不同的添加与监控逻辑。Watcher 负责影片php/fetchers/digitalhigh/watcher/src/Watcher.php 最简洁addMovie($id, $source)支持 IMDb 或 TMDB 两种 ID。downloadWatcher自动根据手头是tmdbId还是imdbId来选择参数类型一次请求即可把影片加入 Watcher。连接测试与配置testConnection 让配置更省心在用户录入服务信息时testConnection($serviceName)会主动验证连接是否通畅拉取各服务的质量配置Profile列表供用户选择获取根文件夹路径作为默认下载目录把选中的配置写回会话后续下载直接复用。对 Radarr / Sonarr / Lidarr 这类同名服务代码用统一的Uri/Token命名约定批量处理进一步降低了配置成本。如何扩展一个新的下载器得益于这套架构接入一个全新下载服务只需要三步在php/fetchers/digitalhigh/下新建一个适配器类如newsvc/src/NewSvc.php封装其 API在 php/fetchers.php 中补一个scanNewsvc()拼查询地址、parseNewsvc()归一化输出与downloadNewsvc()执行添加在scanFetchers的类型路由与listFetchers启用列表里登记服务名。调度中枢本身几乎无需改动——这正是统一调度设计带来的可维护性红利。总结Phlex 的fetchers模块用路由 → 并行抓取 → 归一化 → 命名约定分发四步流水线把 Radarr、Lidarr、Watcher 等接口各异的下载服务整合成一个对语音端透明的整体。它让说一句就下载变得又快又稳并行请求压缩等待时间统一数据模型屏蔽接口差异命名约定分发让扩展新服务几乎零成本。理解这套架构你不仅搞懂了 Phlex 的语音下载能力也收获了一套可直接复用的多服务统一调度工程范式。【免费下载链接】PhlexA super-sexy voice interface for the Plex HTPC项目地址: https://gitcode.com/gh_mirrors/phl/Phlex创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/11/1 2:51:02

自建数据集与YOLOv8训练:停车位检测实战全流程解析

简介:从目标检测的基础概念出发,探讨垂直场景下数据集的构建价值与模型训练方法。在智慧停车应用中,通用预训练模型因场景差异大、车位线特征细微而难以稳定工作,自建高质量数据集成为提升模型效果的关键。结合YOLOv8的Anchor-Fre…

2026/11/1 2:01:37

1.c++入门篇

1.c中的关键字asmdoifreturntrycontinueautodoubleinlineshorttypedefforbooldynamic_castintsignedtypeidpublicbreakelselongsizeoftypenamethrowcaseenummutablestaticunionwchar_tcatchexplicitnamespacestatic_castunsigneddefaultcharexportnewstructusingfriendclassext…

2026/11/1 2:01:37

《江灯合声》:有可行的分框版,也仍可以选择连续鸣谢

武汉江岸区栎坡合唱团在免费节目册《江灯合声》中,以表格集中鸣谢资助者。各家共同要求改为独立小框,团里仍想保留表格。现有全名与支持事项清楚可见,双方此前未承诺具体排版。我支持保留表格。补充的试排材料让选择更具体:分框能…

2026/11/1 2:01:37

关于“贾子猜想”的数学地位、结构特征与讨论边界

关于“贾子猜想”的数学地位、结构特征与讨论边界摘要 本文对“贾子猜想”进行基于公开表述与现有数学事实的分析。该猜想主张:当正整数 n3m>5(即 n6,9,12,15,…)时,方程x₁ⁿ x₂ⁿ ⋯ xₙⁿ yⁿ不存在正整数解。文章首先…

2026/11/1 2:01:37

启动报Port 8088 was already in use?先查是谁占的

启动报Port 8088 was already in use?先查是谁占的 项目启动报 Port 8088 was already in use,意思很直白:这个端口已经有人占了。 先说原理:端口是"门牌号",一间房只住一个进程 端口就是一台机器上的门牌号…

2026/11/1 2:01:37

担心文档上云?本地运行的办公AI才敢放心用

单位上周开了个会,主题是"AI 提效",散会时领导补了一句:涉及客户资料的文档,不许往云端传。这话一出,会议室里本来跃跃欲试的同事全蔫了——大家平时用的那些在线 AI,文档一上传就不知道存哪儿去…

2026/11/1 1:56:37

华为OD机试真题 新系统 2026-10-28 JavaGoC【社交网络消息转发】

目录 题目 思路 Code 题目 题目内容: 在一个社交网络中,有 N 个用户(编号 0 到 N−1);每个用户都有一个「转发名单」(整数),该数二进制格式中的第 i 位为 1 表示此用户会把消息转发给第 i 个用户。 给定一个整数数组 forwardLists 和一个整数 initialSenders,请…

2026/11/1 0:01:26

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/1 1:01:33

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/1 0:01:26

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/1 1:01:33

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/1 0:01:26

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/1 1:01:33

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑