视觉按最新原型,业务按已确认PRD。现有代码为满足设计而改造。执行见按设计实施与任务卡;技术增量和文档复审不等于产品完成。
终端直连与零视频出口
2026-10-03 · 播放路线调整 · 本轮增量
默认让用户的播放器直接连接视频源。网站只处理登录、目录、地址解析和观看记录,不读取、缓存或转发视频。后台明确选择“允许转发”后,才开放此前的内存转发与解码能力。
本页替代此前“所有媒体统一走网站网关”的默认路线。代理与内存转发保留为允许转发时的能力,不再作为默认播放路径。产品继续按已确认设计实施,目标是不显示渠道或代理名称;本轮直连失败只返回简短通用提示,来源诊断留在后台。旧列表与其他界面的来源隐藏仍按产品任务验收。
用户操作与判断
| 操作 | 实际处理 |
|---|---|
| 点击某集 | 网站鉴权,按来源 API 解析当前集的 HTTPS 地址;不向视频源发 HEAD、Range、清单、分片或密钥请求 |
| 开始播放 | 终端播放器使用源地址加载;元数据、HEAD 成功和服务器能连通都不能算播放成功 |
| 验证可播放 | 浏览器检测首帧或 Android 原生实际渲染首帧,并观察前台播放位置持续推进。判断仅代表该终端当次尝试 |
| 浏览器禁止自动播放 | 显示“点击播放”;不据此判定源无法访问,不自动转发 |
| 地址过期、短时断流 | 当前集最多刷新一次源地址,保留 run、位置、倍速和暂停状态。旧尝试不得覆盖新进度或触发下一集 |
| 仍无法播放 | 显示失败;唯一刷新已耗尽时返回选集。零出口不偷偷换到服务器转码、中转或下载 |
| 切换网络 | 继续健康播放;出现真实停滞才进入有限恢复。不用地区、IP 或服务器网络状态代替用户实播 |
| 切集、退出、进入后台 | 取消当前加载及计时;旧事件失效。暂停不计入播放停滞超时 |
| 手机已缓存某集 | 继续使用手机本地文件,不请求网站视频接口 |
首帧只是初步能力证据,后续分片、密钥、音轨和拖动仍可能失败。不能承诺首次成功就代表整集、所有清晰度或下次网络环境都成功。播放器开始取流本身就是检测,不另下载一份样本再播放。前台未暂停时连续 15 秒没有有效画面与位置推进,进入有限恢复;暂停和后台不计时,恢复后重新采集该播放器的首帧证据,已消耗的刷新机会不复原。
后台控制与接口
| 配置 | 含义 |
|---|---|
| routePolicy=direct-only | 默认;只发直连候选。旧配置缺少此字段也按此处理,旧客户端不支持则明确拒绝 |
| routePolicy=relay-allowed | 管理员明确允许网站承担视频流量,开放后端与 Web 的显式网关能力;新 App 本轮仍只直连。兼容处理使用有限 RAM,不写视频文件 |
渠道绑定的 HTTP / HTTPS / SOCKS5 代理在零出口模式下仅用于目录、详情、地址解析等元数据请求。服务器能直接访问源时,管理员可对该渠道明确选择服务器直连,减少代理的元数据费用。
播放计划继续使用现有 session / episode / run。新客户端声明 client.direct=true,计划返回 delivery=direct_candidate、当前集外部 HTTPS URL、player、已知时长和清晰度、routePolicy、attempt。candidate 表示等待终端验证,不代表网站已证实可播放。不通过网站 302 伪装直连;未知的时长、编码或源链接期限不能补造。
同集恢复使用 refresh=true、当前 run 和递增 version;尝试版本改变,run 与观看票据保持。每次打开只允许一次地址刷新,重新打开的正常观看规则仍按产品额度执行。客户端不能用 mode=proxy 或兼容回退覆盖后台零出口配置。
网站统一关闭旧视频出口,包括播放网关、旧 stream、HLS open / assets、App 下载转发与 Emby 视频请求;闸门在解析视频、FFmpeg、缓存和读取历史视频文件之前。旧视频文件和任务保留。切回零出口时,取消正在转发的会话,清理视频缓存。后台链接刷新始终只解析元数据,允许转发也不读取视频或 HLS 清单;普通目录、详情与测试连接也禁止自动跳转到视频,已知媒体响应在读取正文前拒绝。
双端能力
| 平台 | 本轮路线与限制 |
|---|---|
| Web | MP4 复用 HTML 视频并设 anonymous;直连 HLS 使用 hls.js FetchLoader、credentials=omit,逐项校验 HTTPS / 外部地址并拒绝自动跳转。没有 MSE / ManagedMediaSource 能力时提示选择 MP4,不绕到无法逐项控制的原生 HLS。清单、音轨、分片、初始化段与密钥都必须在用户网络中可访问,CORS与编码按真实加载判断 |
| Android App | 复用 react-native-video / ExoPlayer;媒体数据源独立,不继承 API Cookie、Authorization、X-Juku 或上一个播放器的请求头。使用真实渲染事件,不把 STATE_READY 当成首帧。本轮页面仅接直连,允许转发配置也不自动或人工切网关 |
| iOS App | 新页面本轮在线播放明确拒绝,手机本地播放保留。AVPlayer 默认 Cookie 存储不能靠空 headers 或删除全局 Cookie 注入关闭;独立来源网络会话需要另行实现并实测后开放 |
浏览器首帧判断见 requestVideoFrameCallback,anonymous 的凭据范围见 crossorigin。iOS 的默认 Cookie 行为见 Apple AVURLAssetHTTPCookiesKey。本轮继续复用开源 react-native-video,不替换原生解码内核。
媒体请求与站点 API 请求分开。直连不能附带网站会话或源 API、代理凭据;原生来源头只接受明确白名单。直连候选必须是外部公共 HTTPS 443 地址,不接受 userinfo、片段或本网站 API 主机。HLS 子资源、密钥及音轨同样受终端地址门禁约束;域名大小写与末尾点按同一主机比较。来源自己的短期视频 URL 参数属于授权播放地址,不等于可公开源 API 的长期密钥。
后端仅对初始地址做 DNS 安全检查,不连接视频源。它不能证明用户所在地连通,也不能在不读取 HLS 清单时担保所有子资源。终端逐项限制资源和重定向;Android 网络层检查实际解析地址,浏览器无法可靠读取终端 DNS 结果,不宣称解决所有恶意 DNS 重绑定。
HTML MP4 的浏览器原生加载也不能由 JavaScript 逐跳拦截;其约束是初始 HTTPS / 外部地址及 anonymous,而不是完整 FetchLoader 网络拦截。保留这项平台差异,Safari 表现须另行验证。地址解析期间的服务器 API / HTML 请求禁止自动跳转到媒体,已知媒体响应在读取正文前拒绝,并有正文大小上限。
源方要求服务器持有的 CENC、带外密钥、秘密 Cookie,或签名绑定解析服务器 IP 时,现有终端路径可能无法播放。零出口模式明确失败,不在后台偷偷解码。Web 无法随意设置 Referer;不能保证 Android 可播的来源在浏览器也可播。
来源 API 同时提供加密高清与未加密低清时,优先从已知元数据中选择可直连版本。当前统一剧目、跨渠道同集映射仍未交付,本轮不自动猜测另一渠道的对应剧集;失败只刷新当前授权地址一次,不把来源名称或搜索相似标题当作集数映射。
与原业务的取舍
零出口能消除网站承担的受控视频转发字节;目录、封面、登录和地址解析仍有小量流量,供应商接口或内容授权费用按其合同计,不能承诺网站总费用为零。
源链接一旦发给用户,就可能被复制或分享。网站可以限制正规入口的每日地址授权、记录进度及登录权益,不能仅靠本站网关撤回已发出的第三方链接,或可靠阻止该链接被额外观看。严格每日 10 / 50 集、即时封禁、防复制和可信邀请观看奖励,需要源方支持短期、按用户绑定的令牌或可信回调。客户端首帧和进度报告不能直接作为防刷奖励凭证。
界面不显示渠道名称仍可实现;用户在浏览器开发者工具或网络请求中可以看到源域名。隐藏网络来源与视频直接由来源发送不能同时由本站保证。
App 在线缓存原入口通过网站下载转发,零出口下关闭。未来的终端直存属于 O00 / O01 的独立交付:需要登录、离线授权、源方可下载能力、限次地址与手机空间管理;本轮不把打开直连播放等同于完成离线缓存。
分阶段测试
| 技术卡 | 交付与证据 |
|---|---|
| DIR00 零出口闸门 | 默认 / 旧配置迁移、所有历史视频入口、策略切换取消;真实默认服务端中媒体 GET / HEAD、FFmpeg 和视频缓存为零 |
| DIR01 元数据候选 | 内置 / 标准渠道、来源 revision、秘密不出 DTO、公共 HTTPS、当前集归属、未知能力不伪造、源无法迁移到终端的错误 |
| DIR02 Web 实播 | Chrome 实际 MP4 / HLS 首帧与拖动;全部子资源凭据抓取、失败 / 自动播放 / 超时 / 一次刷新 / 旧回调;不请求本站视频出口 |
| DIR03 Android 实播 | 原生无 Cookie 数据源、旧网关到直连切换、实际渲染事件、有限恢复、同 run 位置与倍速;自动测试与原生编译不替代真机 |
| DIR04 上线关口 | 实体设备与真实来源、Safari、网络变化、源 token 及额度 / 邀请能力;网站入口统计零视频字节,代理统计仅元数据字节 |
升级需要新版 Go 与包含原生补丁的 Android 安装包;只更换 JS / OTA 不能提供凭据隔离能力。旧包缺少能力常量时明确提示更新,不降级到服务器视频出口。先在测试环境联调,再按所选零出口策略升级真实服务;本轮只更新代码与静态文档,不发布 API、安装包或 OTA。
这些技术卡补充既有 25 张产品任务,保留 149 个设计状态。登录、真实去重与服务端分页、可信额度 / 邀请、逐集记录及离线授权仍按原产品任务交付,受本页的直连边界约束。
本轮验证记录
| 范围 | 实际结果 |
|---|---|
| Go 后端 | 全量 go test ./... 通过,app 包 38.591 秒;14 组直连、后台刷新与错误隐藏专项 race 通过,9.626 秒;构建与差异检查通过 |
| Web | 79 项 Node 测试通过。Chrome 9 个实际 TLS 媒体场景与 3 个生命周期场景通过:MP4 / AES HLS / MP4 跳转实际解码并拖动定位;跨域、恶意清单、HLS 跳转、坏 MP4、仅元数据及纯音频失败均只刷新一次同一 run,不误完成或切集 |
| Android App | 50 项自动测试与类型检查通过,其中 8 组运行真实 React PlayerScreen 组件,验证旧回调、无新首帧、暂停、后台取消、切集及 15 秒恢复期限。补丁中的实际 JukuMediaClient 完成 JVM HTTPS 请求,覆盖 Cookie / 头隔离、HLS 资源、重定向、TLS、私网与混合 DNS、API 主机变体。Android 播放器库 Kotlin / Java 编译通过,未打包或运行真机 |
| 持久补丁 | 精确固定 react-native-video 6.19.2;使用与锁文件相同 integrity 的干净归档加补丁,重构的 6 个源文件逐个 SHA-256 与本地原生源码一致。postinstall 补丁应用检查通过;原生能力门禁拒绝只有新 JS 的旧安装包 |
浏览器媒体在本机生成,经测试专用 CONNECT 映射提供公开主机名、HTTPS 443 与 TLS;仅测试环境忽略自签证书错误,没有放宽生产地址规则。检查到来源 Cookie / Authorization / X-Juku 为零,本站视频接口请求为零。自动播放拒绝使用 play 拒绝夹具,后台变化使用 visibility 状态模拟;其恢复行为已验证,不等于覆盖所有真实浏览器策略。真实来源、实体设备与 Safari 尚未验收。
独立子 agent 对抗复审发现的 7 类问题已关闭:后台刷新读取媒体、App 旧回调恢复有效、Web 无画面误完成,及 Web 子资源地址、App 主机变体、后台取消误报、错误暴露来源名称。复审也核对了 Android 持久补丁与实际原生源码一致。通过范围为源码、上述测试与夹具;本页是本轮网络增量,不能据此认定邮箱登录、真实额度核销、邀请或全部产品功能已交付。
在线文档只发布静态页面和文档包。真实后端与 Android 安装包尚未发布,不能以此次文档更新认定已经产生生产流量节约。