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

相关新闻

iOS Crash Dump Analysis Book:指针认证(PAC)指南——为什么你的指针突然变成 EXC_BAD_ACCESS

iOS Crash Dump Analysis Book:指针认证(PAC)指南——为什么你的指针突然变成 EXC_BAD_ACCESS

iOS Crash Dump Analysis Book:指针认证(PAC)指南——为什么你的指针突然变成 EXC_BAD_ACCESS 【免费下载链接】ios-crash-dump-analysis-book iOS Crash Dump Analysis Book 项目地址: https://gitcode.com/gh_mirrors/io/ios-crash-dump-…

2026/8/31 1:17:22 阅读更多 →
自建数据集与YOLOv8训练:停车位检测实战全流程解析

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

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

2026/8/30 9:13:48 阅读更多 →
CrowdAnki配置指南:快照路径、自动快照与牌组排序等6大选项深度解析

CrowdAnki配置指南:快照路径、自动快照与牌组排序等6大选项深度解析

CrowdAnki配置指南:快照路径、自动快照与牌组排序等6大选项深度解析 【免费下载链接】CrowdAnki Plugin for Anki SRS designed to facilitate cooperation on creation of notes and decks. 项目地址: https://gitcode.com/gh_mirrors/cr/CrowdAnki CrowdAn…

2026/8/29 23:05:15 阅读更多 →

最新新闻

Python模拟鼠标实现像素画全自动绘制:图像量化与路径规划

Python模拟鼠标实现像素画全自动绘制:图像量化与路径规划

分享一套《明日方舟》基建画板全自动绘制像素画的完整脚本方案,目前已经迭代到 V1.2。本版本在前一版的基础上,加入了颜色抖动匹配、蛇形绘制路径、断点续绘和延迟容错机制,解决了不少“画到一半就偏色”、“鼠标坐标整体偏移”的实际问题。如…

2026/8/31 2:14:48 阅读更多 →
明日方舟游戏内全自动绘制像素画:V1.2实现原理与部署指南

明日方舟游戏内全自动绘制像素画:V1.2实现原理与部署指南

这次我们来看一个在《明日方舟》社区里讨论度不低的“整活”型技术项目:在游戏内全自动绘制像素画,当前版本已经更新到 V1.2。简单来说,这个项目做的事情是:你提供一张像素画图片,脚本自动识别图片里的颜色和坐标&…

2026/8/31 2:14:48 阅读更多 →
字节AI数据部门升咖:数据团队为何不交给科学家?

字节AI数据部门升咖:数据团队为何不交给科学家?

字节 AI 数据部门“升咖”:组织架构升级背后,为什么数据团队仍然没有交给科学家?最近,字节跳动 AI 数据部门迎来了一次重要的组织调整。从公开信息来看,字节的一部分数据相关团队正在转岗至 Core Data 部门&#xff0c…

2026/8/31 2:14:48 阅读更多 →
数字识别检测系统全栈实践:YOLOv8/v10/v11/v12/26对比与千问DeepSeek接入

数字识别检测系统全栈实践:YOLOv8/v10/v11/v12/26对比与千问DeepSeek接入

这个标题信息量很大:数字识别检测系统、YOLOv8/v10/v11/v12/26 多版本对比、全栈实践、千问/DeepSeek 大语言模型接入。拆开来就是三条技术主线:目标检测选型、全栈系统联调、大模型结果解释。这篇就按“先选模型、再构系统、后接大模型”的顺序&#xf…

2026/8/31 2:14:48 阅读更多 →
CSDN技术博客选题指南:远离无关内容,聚焦实战价值

CSDN技术博客选题指南:远离无关内容,聚焦实战价值

抱歉,这个标题和内容方向我无法按 CSDN 技术博客的定位来写。原因很简单:CSDN 是面向开发者的技术社区,读者打开文章是为了解决具体的技术问题——环境怎么搭、代码怎么写、报错怎么排查、架构怎么设计、生产环境有哪些坑。而“美国炸鸡店有多…

2026/8/31 2:14:48 阅读更多 →
Spring Boot 3 + Spring Security 6 + JWT 打造 RBAC 权限系统

Spring Boot 3 + Spring Security 6 + JWT 打造 RBAC 权限系统

接手遗留系统权限模块时,同事指着代码说:“这里是地狱啊……”我一开始以为他在夸张,直到开始梳理权限逻辑,才明白这句话背后的含义。权限这块代码没有统一模型,用户表、角色表、菜单表之间的关联散落在各种 SQL 里&am…

2026/8/31 2:13:48 阅读更多 →

日新闻

MCU无DAC如何用定时器+DMA 2D输出高保真任意波形

MCU无DAC如何用定时器+DMA 2D输出高保真任意波形

接到一个仪表类项目,要在 LAT1189 上输出几种不同波形:正弦、三角、带可调死区的脉冲,频率和幅度都得能实时改。板子上没有 DAC,就一个定时器加几个 DMA 通道。我一开始觉得在定时器中断里改比较寄存器也能应付,后来把…

2026/8/31 0:00:05 阅读更多 →
Cortex-M3 Flash下载失败?从编程错误标志到供电瞬态排查

Cortex-M3 Flash下载失败?从编程错误标志到供电瞬态排查

前两周调试一块带着Cortex-M3内核的板子,IDE里下载固件时突然弹出一行刺眼的错误: error: flash download failed - cortex-m3 。这种报错在嵌入式开发里太常见了,常见到很多人第一反应就是换根数据线、重插一下调试器,但重启三…

2026/8/31 0:00:05 阅读更多 →
STM32 TouchGFX屏幕切换Transition优化:原理、配置与排障实战

STM32 TouchGFX屏幕切换Transition优化:原理、配置与排障实战

做STM32 GUI开发的朋友应该都有体会——界面搭得再漂亮,一旦屏幕切换卡成PPT,整个产品的档次瞬间就没了。早期我在LAT1212这个基于STM32的GUI工程上用TouchGFX做二次开发,最头疼的不是画界面,而是怎么让切换动画既流畅又自然。Tou…

2026/8/31 0:00:05 阅读更多 →

周新闻

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

每年校招季我都会接触不少准备数据库方向笔试的同学,看到最多的状态就是:简历上写着“熟悉 MySQL”“了解索引优化”,一碰到数据库管理工程师的笔试卷,却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

2026/8/30 0:00:01 阅读更多 →
数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

1. 这不是“背公式”的事:时间参数到底在约束什么你翻过数字电路教材,一定见过这两个词:建立时间(Setup Time)和保持时间(Hold Time)。它们常被并列写在触发器(Flip-Flop&#xff09…

2026/8/30 0:00:01 阅读更多 →
蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

1. 项目缘起:从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目,我至今记忆犹新。它没有直接给出一个花哨的名字,而是用“超声波测距机”这个朴实无华的功能描述,精准地勾勒出了考核的核心。对于当时备赛的我而言…

2026/8/30 0:00:01 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/30 21:10:48 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/30 18:07:21 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/30 21:10:44 阅读更多 →