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

发布时间:2026/8/27 15:08:05

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),仅供参考

相关新闻

Manus 揭秘自己的7大核心技术:上下文工程架构设计与落地经验

Manus 揭秘自己的7大核心技术:上下文工程架构设计与落地经验

2026/8/27 14:58:05

前言 随着 AI 智能体技术的快速发展,如何高效构建和优化 AI 智能体系统已成为业界关注的焦点。本文是对 7月19日 Manus 联合创始人兼首席科学家季逸超(Yichao ‘Peak’ Ji)在撰写的《Context Engineering for AI Agents: Lessons from Buildi…

基于相似性推理的博弈论方法:多智能体协作中的理性合作策略

基于相似性推理的博弈论方法:多智能体协作中的理性合作策略

2026/8/27 14:58:05

多个大模型智能体在协作时,经常遇到一个经典困境:每个模型都只优化自己的目标,结果整体表现反而更差。最近研究里被反复提到的一个思路,是用博弈论来解释基础模型之间的交互,并通过相似性推理(Similarity I…

【AI大模型实战】企业RAG实战之探索Function Calling(函数调用)实现智能客服系统,看到就是赚到!!

【AI大模型实战】企业RAG实战之探索Function Calling(函数调用)实现智能客服系统,看到就是赚到!!

2026/8/27 14:58:05

前言 RAG赋予大模型访问私有知识库的能力,而Function Calling则使其能够读取和写入数据库。这两种能力的协同作用,将使智能客服变得更加智能、高效和个性化。 1.Function Calling可以解决什么问题? RAG虽然解决了知识覆盖问题,但对…

IINA 完整实操教程:免费安装 macOS 视频播放器,3 分钟跑起来

IINA 完整实操教程:免费安装 macOS 视频播放器,3 分钟跑起来

2026/8/27 16:08:08

IINA 完整实操教程:免费安装 macOS 视频播放器,3 分钟跑起来 【免费下载链接】iina The modern video player for macOS. 项目地址: https://gitcode.com/gh_mirrors/iin/iina IINA 是一款基于 mpv 引擎的免费开源 macOS 视频播放器,M…

MATLAB相关性分析实战:Pearson、Spearman、Kendall系数详解与数模应用

MATLAB相关性分析实战:Pearson、Spearman、Kendall系数详解与数模应用

2026/8/27 16:08:08

1. 项目概述:相关性分析在数模中的核心地位在数学建模竞赛和数据分析的实战中,我们常常会面对一个最基础也最核心的问题:这两个变量之间有关系吗?如果有,关系有多强?是正相关还是负相关?这个问题…

如何让Windows支持免费多人远程桌面:RDP Wrapper 实操指南

如何让Windows支持免费多人远程桌面:RDP Wrapper 实操指南

2026/8/27 16:08:08

如何让Windows支持免费多人远程桌面:RDP Wrapper 实操指南 【免费下载链接】rdpwrap RDP Wrapper Library 项目地址: https://gitcode.com/gh_mirrors/rd/rdpwrap 装好之后,一台家庭版Windows也能开多用户远程桌面,2到15个人同时连进同…

XUnity Auto Translator:5分钟搞定Unity游戏汉化,对话菜单秒变中文

XUnity Auto Translator:5分钟搞定Unity游戏汉化,对话菜单秒变中文

2026/8/27 16:08:08

XUnity Auto Translator:5分钟搞定Unity游戏汉化,对话菜单秒变中文 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity Auto Translator 是一款面向 Unity 引擎游戏的实时自动汉…

VBA-JSON 快速上手指南:一份 .bas 文件搞定 Excel 里的 JSON 解析与生成

VBA-JSON 快速上手指南:一份 .bas 文件搞定 Excel 里的 JSON 解析与生成

2026/8/27 16:08:08

VBA-JSON 快速上手指南:一份 .bas 文件搞定 Excel 里的 JSON 解析与生成 【免费下载链接】VBA-JSON JSON conversion and parsing for VBA 项目地址: https://gitcode.com/gh_mirrors/vb/VBA-JSON 结论先行:VBA-JSON 解决什么问题 VBA-JSON 是一…

如果关注瑞德克斯规则边界做得细吗?

如果关注瑞德克斯规则边界做得细吗?

2026/8/27 15:58:07

谈到瑞德克斯使用规范边界做得细吗,比起空泛判断,更值得看的是完成身份确认里的实际细节。页面组织是否顺手、提示是否靠前、提示是否能接得上,这些位置处理得稳,瑞德克斯在规则边界上的整体质感就会更完整。 用户关心资金安排时&…

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

2026/8/27 11:10:02

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

2026/8/27 7:25:23

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

2026/8/26 17:50:58

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

Go语言构建企业级AI服务网关:统一管理英伟达等AI接口调用

Go语言构建企业级AI服务网关:统一管理英伟达等AI接口调用

2026/8/27 0:07:12

1. 项目概述:从零构建一个企业级的AI服务网关 最近在帮一个做内容审核的团队做技术架构升级,他们原来的业务里,每天有几十万张图片和短视频需要过审,最初是接了几个开源的AI模型自己部署,但效果和性能一直不太稳定。后…

LeetCode Hot100(51-60)算法精解与面试技巧

LeetCode Hot100(51-60)算法精解与面试技巧

2026/8/27 0:07:12

1. 题目背景与核心价值"hot100(51-60)"这个标题看起来像是某个编程题库或算法练习集中的一组题目编号。在技术社区中,类似命名通常指向LeetCode、牛客网等平台的热门题目集合。作为刷过300题的算法老手,我理解这类题目的核心价值在于&#xff…

CRC校验实战:从模2除法到HJ212协议排错

CRC校验实战:从模2除法到HJ212协议排错

2026/8/27 0:07:12

1. 为什么一个“校验码”能扛住工业现场90%的数据 corruption? 你有没有遇到过这样的场景:嵌入式设备通过RS-485上传温湿度数据,上位机偶尔收到一帧乱码——温度显示成-273℃,湿度跳到999%,但串口波形看起来完全正常&a…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/22 2:02:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/26 18:07:30

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/26 17:57:52

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…