1. 先把“壳”和“仓”分清楚TVbox接口配置的整体思路TVbox接口配置这件事说穿了就是两件事壳认得什么格式仓里装了什么内容。很多人一上来就到处找“能用的源”结果今天能播明天失效反复折腾根源在于没搞明白壳和仓是分离的。TVbox本身只是一个播放器外壳它不生产内容只负责把一份结构化的描述文件读进来然后按描述去搜索、解析、播放。这份描述文件就是接口而把多个接口组织在一起、带分类和切换能力的就是多仓聚合源。影视仓则是进一步把接口、直播、解析、筛选规则打包成一个可维护的仓库。搞懂这层关系后面的配置和排查才有落脚点。这篇文章面向的是已经装好壳、想自己维护一套稳定接口的读者也适合刚接触、被各种失效源折磨过的新手。下面我按“结构—字段—实操—排查—维护”的顺序把我在实际配置中积累的东西摊开讲。1.1 壳负责播放仓负责描述内容TVbox这类壳的设计思路很像浏览器浏览器本身不知道网页内容它只负责渲染 HTML网页地址变了、页面改版了浏览器不会背锅。壳也一样它读的是 JSON 描述描述里写了站点叫什么、用什么方式取数据、搜索走哪个入口。只要描述结构和壳的版本对得上壳就能工作内容站点改版、接口地址失效那是仓的问题不是壳的问题。把这个边界划清楚排查时就不会乱先确认壳能正常加载接口文件再确认接口文件里的站点还能不能取到数据最后才看播放链路。我见过不少新手把“接口失效”直接等同于“壳坏了”于是反复卸载重装其实壳根本没变变的是仓里某个站点的地址或者参数。也见过有人把所有站点塞进一个文件改一个字段就要整体重新分发维护成本极高。壳与仓分离的好处就在这儿壳可以长期不动仓可以按需更新、按版本回滚甚至可以为不同设备准备不同的仓。1.2 单仓、多仓与聚合仓的取舍单仓就是一份 JSON里面直接列 sites、lives、parses 这些数组。优点是结构简单、加载快、排查直观缺点是所有内容耦合在一起任何一个站点出问题都得改整份文件而且不方便做分类管理。多仓则是把若干份单仓接口的地址列在一个“总目录”里壳加载总目录后让你选择具体进哪个仓。它的价值在于解耦仓库 A 挂了不影响仓库 B你可以按内容类型分仓也可以按维护者分仓。聚合仓更近一步它不只是列地址还会带名称、分组、图标等元信息壳端呈现为一个可切换的列表。实际使用中我的建议是自己维护的内容用单仓结构清晰好改把多个来源整合时用多仓避免单点故障。不要为了“看起来源多”而堆砌几十个仓加载慢、排查难而且大部分你根本不会点进去。仓库数量控制在三到五个每个仓职责明确比堆一大堆更有用。1.3 一个接口文件的字段分层一份典型的单仓接口大致可以分成四层。第一层是站点层sites 数组描述每个点播站点第二层是直播层lives 描述直播源第三层是解析层parses 描述播放解析方式第四层是辅助层flags 定义筛选别名ijk 配置播放器参数spider 指定抓取模块的地址。这四层不是平级的站点层是主体其余都是为它服务的。理解分层的好处是排查时有顺序。站点搜不到先看 sites搜到了播不了先看 parses 和播放器筛选条件显示异常看 flags整个接口加载失败看文件本身和 spider 地址。很多人排查时东一榔头西一棒子就是因为没有按层走。下面我会逐层拆重点放在真正影响可用性的字段上。2. 接口JSON逐字段拆解哪些参数真正决定可用性接口文件看着字段多实际上决定“能不能用”的就那么几个。剩下的要么是展示用的元信息要么是特定场景才生效的开关。我把常见字段按重要性排了一遍先讲站点层的四件套再讲辅助块最后讲多仓文件的写法。这里给的示例都用占位地址你替换成自己的实际地址即可。2.1 sites数组key、type、api、ext四件套sites 里每个对象代表一个站点最关键的四个字段是 key、type、api、ext。key 是站点的唯一标识壳用它来区分站点、缓存配置重复的 key 会导致后加载的覆盖前面的或者干脆不显示所以命名要有前缀比如用demo_开头。type 决定取数方式常见的有直接 JSON 接口、XML 接口、以及依赖抓取模块的 spider 类型。不同类型的 api 字段含义完全不同JSON 类型填接口地址spider 类型填模块里的类名。ext 是最容易被忽略、也最容易出问题的字段。它通常是一个字符串里面可能塞着 JSON、也可能是一个简单的标识具体含义由站点自己的实现决定。我踩过的坑是从别处抄来一个站点api 和 type 都对就是 ext 空着结果搜索一直转圈。后来把 ext 补上对应的参数才通。所以抄配置时ext 一定要连引号一起核对别看它长得像空字符串就随手删掉。{ sites: [ { key: demo_site_a, name: 示例站点A, type: 3, api: csp_DemoA, searchable: 1, quickSearch: 1, filterable: 1, ext: }, { key: demo_site_b, name: 示例站点B, type: 1, api: https://example.com/api/site-b, searchable: 1, quickSearch: 0, filterable: 0, ext: {\token\:\your-token\} } ] }searchable 和 quickSearch 决定这个站点参不参与搜索、参不参与快速搜索。站点多了以后全开会让搜索变慢我的做法是把不常用的站点 searchable 设为 0只留几个主力站点参与搜索。filterable 控制筛选如果站点本身不支持分类筛选开了也没用反而多一次无效请求。2.2 spider、parses、flags、lives这些辅助块spider 字段在接口根级指向抓取模块的地址通常是某个 jar 文件。所有 type 为 spider 的站点都依赖它。这个地址失效整批 spider 站点一起挂表现为“能加载接口但所有站点都搜不到”。排查时先确认这个地址能不能在浏览器里直接下载再看版本对不对。jar 更新后类名可能变api 里填的类名也要跟着改这是批量失效的常见原因。parses 是解析块描述播放地址怎么解。每个解析器有 name、type、url 等字段。这里的坑在于解析器不是越多越好多个解析器同时存在时壳会按顺序尝试前面的超时会拖慢整体播放。我的习惯是只留两三个确认可用的把不稳定的删掉宁可少一个备选也不要每次播放都等超时。flags 定义筛选条件的别名比如把“类型”“地区”“年份”映射成统一的键。这个块不影响取数但影响筛选界面能不能正常显示。lives 是直播源结构和站点类似key、name、url 三件套url 可以是 m3u 或 txt 列表。直播源时效性比点播更强建议单独分文件维护别和点播混在一起否则改直播要动整个仓。2.3 多仓聚合文件的写法与命名规范多仓文件的本质是一个“目录”壳识别 urls 字段后把它当成多仓入口。结构大致如下{ name: 我的聚合仓, urls: [ { name: 点播仓, url: https://example.com/tvbox/vod.json }, { name: 直播仓, url: https://example.com/tvbox/live.json } ] }命名规范很重要。name 不要用“仓库1”“仓库2”这种过两天你自己都忘了哪个是哪个。我的做法是按用途加版本比如“点播-主力”“点播-备用”“直播-常用”。url 一定要用能长期访问的地址别用临时分享链接那种链接往往几天就失效。多仓文件本身也要放在稳定位置它挂了下面所有仓都进不去。注意多仓文件里的 url 必须是完整的、可直接访问的 JSON 地址不能是网页地址也不能是需要登录才能下载的地址。壳不会帮你处理跳转和鉴权。3. 影视仓实战从目录规划到TVbox端加载这一节讲具体怎么落地。我假设你要维护一套自己的仓内容来源是你有权限使用的媒体资源或者公开的合法接口。整个流程分四步规划目录、发布文件、壳端配置、接入自建媒体库。每一步都有细节照着做能少走不少弯路。3.1 目录结构与版本号设计目录规划的原则是“改什么放什么”。我的结构是这样根目录下分vod、live、parse、spider四个子目录分别放点播接口、直播接口、解析配置、抓取模块。接口文件按版本命名比如vod-v3.json同时保留一个vod.json作为当前版本的副本。这样做的目的是回滚方便新版本出问题把vod.json换回旧版本的文件名即可不用改壳里的地址。版本号不要用日期日期看不出改了什么。用语义化的方式大改升主版本加站点升次版本修字段升修订号。文件里也可以加一个version字段做备注虽然壳不一定读但你自己排查时有用。另外每个接口文件建议配一份同名的说明文件记下这次改了什么、哪个站点新增、哪个站点删除时间久了这就是你的维护日志。3.2 用静态HTTP服务把接口发出去接口文件必须通过 HTTP 访问壳不支持直接读本地文件部分版本支持本地导入但不利于多设备同步。最省事的做法是用静态文件服务。局域网内可以用一台常开的机器跑 Nginx把目录映射出去# 以某 Linux 主机为例把接口目录挂到 8080 端口 cd /data/tvbox python3 -m http.server 8080这是临时验证用的长期用还是建议 Nginx配置一个 location 指向目录开启 gzip关掉目录列表。注意两点一是文件编码必须是 UTF-8不能带 BOM带 BOM 的 JSON 有些壳解析会失败二是 Content-Type 最好是application/json虽然多数壳不严格校验但规范一点没坏处。如果要多设备、外网访问可以把文件放到对象存储的静态托管里或者用支持静态页面的代码托管服务。不管用哪种发布后第一件事是用浏览器直接打开接口地址确认能看到 JSON 原文而不是下载弹窗或者 404 页面。这个动作能挡掉一半的“加载失败”问题。3.3 TVbox端的配置与切换操作壳端的操作不复杂但顺序要对。打开设置找到“配置地址”一栏填入你的多仓文件地址或者单仓地址确认后返回首页壳会拉取并解析。如果填的是多仓地址通常会弹出一个仓库列表让你选如果没弹检查文件里是不是真的有 urls 字段以及字段拼写对不对。切换仓的时候壳一般会保留上一次的选择。如果你发现换了地址但内容没变先确认是不是缓存没清。多数壳在配置页有“清除缓存”或者重新加载的入口点一下再试。还有一个细节有些壳对地址里的查询参数敏感比如带?t123的地址可能被当成不同配置导致重复加载。尽量用干净的地址版本通过文件名区分不要靠参数。提示配置成功后先随便搜一个关键词看看能不能出结果。能搜到说明接口层和站点层都通了搜不到再往下查别急着换源。3.4 接入自建媒体库的稳妥做法如果你有自己的媒体文件最稳妥的方式是通过自建媒体服务对外提供而不是依赖来路不明的接口。常见的做法是在局域网机器上部署媒体服务器把影片整理好刮削元数据然后通过它提供的接口或者目录服务接入。壳这边可以通过 WebDAV 或者 HTTP 目录的方式读取具体取决于壳版本支持的类型。这样做的好处是内容可控、时效稳定不会今天能看明天失效。缺点是前期整理费时间命名、分类、封面都要自己弄。我的经验是先把目录结构定好按“类型/年份/名称”三层放刮削工具识别率会高很多。整理完之后接口文件里对应的站点 type 和 api 按壳的文档填ext 里放路径参数。这一步不要抄网上的配置因为每个人的目录结构不一样抄过来大概率对不上。4. 失效排查实录从现象到根因的定位路径接口失效是常态关键是有没有一套固定的排查路径。我的习惯是按层走接口层、站点层、播放层一层一层往下每层都有明确的判断标准。下面这些场景都是我实际遇到过的处理思路可以直接套用。4.1 接口层先确认文件本身能不能拿到现象是壳提示“配置加载失败”或者首页空白。第一步不是改文件是用浏览器或者命令行直接请求接口地址curl -I https://example.com/tvbox/vod.json curl -s https://example.com/tvbox/vod.json | head -c 200第一条看状态码200 才算通301/302 要确认跳转后的地址壳能不能跟403/404 说明地址错了或者权限有问题。第二条看返回内容的前 200 个字符确认是 JSON 而不是 HTML 错误页。很多人遇到的是服务器返回了一个 404 页面但状态码是 200壳解析失败看起来像接口坏了其实是路径写错。内容拿到了再校验 JSON 合法性。用jq或者在线校验工具都行curl -s https://example.com/tvbox/vod.json | jq . /dev/null echo JSON OK报错就看提示的行号常见问题是多余逗号、引号没闭合、BOM 头。BOM 头用十六进制工具看开头是不是EF BB BF有的话用编辑器另存为无 BOM 的 UTF-8。4.2 站点层单站失效与批量失效的区别接口能加载但某些站点搜不到先区分是单站还是批量。单站失效通常是站点改版、地址变了、ext 参数过期批量失效大概率是 spider 模块地址挂了或者壳版本和接口结构不匹配。单站排查把该站点的 api 地址单独拿出来请求看返回什么。如果是 spider 类型api 是类名没法直接请求那就看 spider 指向的 jar 能不能下载下载后看文件大小是否正常太小可能是错误页。再看 ext 是不是空很多站点 ext 为空就工作不正常。批量排查先注释掉一半站点看剩下的一半是否恢复用二分法定位是哪个站点拖垮了整体。有些站点请求超时特别长会卡住整个搜索把它 searchable 设为 0 就能明显提速。这个技巧我用了很多次比逐个删站点快得多。4.3 播放层能搜到却播不了怎么查搜得到、点进去转圈或者黑屏问题在解析和播放链路。先看 parses 里配置的解析器是不是还有效把播放地址复制出来单独请求看返回。再看播放器参数ijk 块里的配置如果和片源编码不匹配会出现有声无画或者直接闪退。还有一种情况是链接有时效搜索时拿到的是临时地址过几分钟就失效。这种不是配置问题是源本身的机制换解析器或者换站点解决。排查时注意看壳的日志如果有日志里通常会打印请求失败的原因比盲猜快得多。没有日志就看现象转圈是网络或解析问题黑屏是解码问题闪退是播放器参数问题分类清楚再动手。4.4 常见问题速查表现象最可能的原因排查动作处理方式配置加载失败地址不可达或 JSON 非法浏览器直接打开地址jq 校验修正地址、去掉 BOM、补逗号首页空白但配置成功sites 为空或 key 重复检查 sites 数组和 key 唯一性补站点、改 key 前缀搜索一直转圈某站点请求超时二分法注释站点超时站点设 searchable0所有 spider 站点失效spider 地址失效或类名变更下载 jar 确认可访问更新地址和 api 类名搜到播放黑屏解析器失效或编码不匹配单独请求播放地址换解析器、调播放器参数筛选条件不显示flags 缺失或键名不符对照站点实际分类补 flags 映射多仓切换后内容没变缓存未清或地址带参数清缓存、用干净地址重新加载配置5. 长期维护的几个习惯与避坑清单仓能不能长期用不取决于你一开始找了多少源而取决于你怎么维护。我见过太多人一次性堆几百个站点两周后全挂然后放弃。真正省力的做法是少而精、有版本、有记录。5.1 版本管理、灰度与回滚接口文件一定要留历史版本。我的做法是每次修改前先复制一份带日期后缀的备份改完先在单台设备上验证确认没问题再替换主文件。这就是最简单的灰度一台设备当小白鼠稳定了再全量。回滚更简单把备份文件改回主文件名即可壳端不用动。另外改动要小步走。一次只加一个站点或者只改一个字段出问题容易定位。一次性大改出了问题你都不知道是哪个改动引起的。这个道理和写代码一样但在接口维护上很多人就忘了。5.2 合规边界与内容来源这一点必须说清楚接口文件只承载结构不承载内容。站点指向的资源是否可用、是否有授权取决于你自己。我的建议是优先使用自建媒体库和公开的合法资源不要用来路不明的聚合源既不稳定也有风险。自己整理的内容虽然前期麻烦但可控性完全不一样不会因为别人的一次改版就全部失效。注意不要在任何公开场合分发包含具体资源地址的接口文件也不要把别人的接口直接当成自己的成果发布。结构可以学习内容要自己负责。5.3 我踩过的坑第一个坑是 ext 字段看着像空字符串就删了结果站点不工作。后来养成习惯抄配置时原样保留哪怕是空串也留着。第二个坑是 key 重复两个站点用了同一个 key壳只显示一个排查了半天才发现。第三个坑是 jar 更新后没改类名所有 spider 站点静默失效没有报错特别难查。第四个坑是把接口放在带跳转的地址上壳不跟随跳转一直加载失败。这些坑的共同点是现象和原因隔得远靠猜没用只能按层排查。所以我现在配置任何新仓第一件事就是搭好验证流程浏览器能打开、jq 能通过、单站能搜到、播放能出画面四步都过才算配置完成。这个流程看着笨但比事后救火省时间。最后分享一个小习惯给每个仓配一个“健康检查”页面把关键站点的请求结果列出来定期跑一遍。不用很复杂一个脚本请求几个地址看状态码和返回长度就行。这样站点失效你能提前知道而不是等用户反馈。维护这件事主动永远比被动省力。