视觉按最新原型,业务按已确认PRD。现有代码为满足设计而改造。执行见按设计实施与任务卡;技术增量和文档复审不等于产品完成。
代理线路与无落盘转发
2026-10-03 · 用户追加确认 · 本地开发与上线关口
最新路线见终端直连与零视频出口。默认由终端直接取视频,本站不取媒体或转发;本页保留为后台明确允许转发时的能力与此前验证记录。后台“服务器直连出网”和“终端直连播放”是不同设置。
网站负责转发视频,服务器不保存视频文件。允许短时内存缓存,目的是减少重复回源和代理流量费用;缓存有容量上限、绝对有效期,到期后即使无人访问也释放。配置、剧目、观看记录与额度账本仍需持久保存。App 用户主动缓存到手机属于另一项已确认功能。
本模块沿用已确认的 Dramivio 设计。消费者页面不显示渠道、代理名称或凭据。运营在后台配置线路;当前嵌入式 Web 是可用的过渡管理入口,最终迁入成熟开源后台,不替代首页、登录、追剧与播放器的设计验收。
请求路径
Web / App → 网站鉴权媒体网关 → 渠道绑定的出网线路 → 视频源。返回画面时走相反路径。选择“直连”仅表示服务器直接访问来源,客户端仍通过网站网关观看。
支持 HTTP、HTTPS、SOCKS5 出网代理,分别绑定内置渠道或自定义标准 API 渠道。目录、搜索、详情、封面和视频请求使用同一来源配置;HLS 子清单、分片与密钥不能漏出线路。绑定或凭据修改后,旧版本请求、播放与缓存失效,重新取得计划;线路失败不自动改为直连。
节省流量的规则
| 场景 | 规则 |
|---|---|
| 兼容原生播放的 MP4 / HLS | 优先原始转发,复用现有 Range、清单与解码能力;不为正常媒体额外转码 |
| 热点小片段或 MP4 相同范围 | 完整读取后在内存短期复用;同来源版本、URL、Range 和相关请求头一致才命中 |
| 同一片段并发请求 | 等待已在进行的请求完成,最长等待 2 秒;失败或超时允许重试,不能用等待结果绕过用户授权 |
| 大文件、读取中断、错误响应 | 直接按请求流式转发,不把整集读完后再响应,不保留未完整片段 |
| 源要求重新验证或禁止缓存 | 不进入热点缓存;拒绝 no-store、private、no-cache、Vary。响应头到达时核对 Date / Age / max-age / s-maxage / Expires,取更早期限;读取耗时计入,不从读完重新计时 |
| 兼容解码 | FFmpeg 输出到本机私有 HTTP 内存接收器,不生成临时视频目录;每次按需生成当前集最多 4 个约 2 秒片段 |
| 暂停、拖动、离开 | Web HLS 暂停停止继续取片,恢复从当前位置加载;暂停拖动不请求新画面预览。已开始的小解码窗口可能完成,退出关闭会话取消处理 |
| 下一集 | 只预热元数据;未授权下一集不解析视频地址、不取密钥、不拉视频;自动下一集先经过同一授权关口 |
需要窗口解码的 MP4 必须实测支持正确的范围响应;不支持的源明确拒绝窗口解码,避免每次拖动重新从头下载。原始流如果客户端本身兼容,仍可走原始转发。HLS 窗口需要可分段的点播来源,不宣称支持所有直播、DRM 或自定义加密。
节约发生在重复片段复用和减少无用预取上。冷门视频的首次观看仍需要读取实际媒体,网站向用户发送视频也仍有带宽消耗。没有真实上游及计费测量,不给出节省百分比。
内存与资源边界
| 部分 | 当前实现上限与释放方式 |
|---|---|
| 原始热点缓存 | 每服务进程 64 MiB;单条 8 MiB;最多 256 条;最多 16 个合并中的请求;从上游响应头到达时计算绝对 TTL 30 秒,命中与读取完成均不续期 |
| 解码片段 | 单片 16 MiB;每会话 96 MiB、最多 24 片;全局最多 128 片,并受现有 cacheMB 总预算限制 |
| 解码有效期 | 片段绝对 TTL 90 秒;后台定期清理,即使播放器暂停也不永久保留;关闭释放会话缓存 |
| 窗口执行时限 | 每次最多 4 片的 FFmpeg 任务独立 90 秒绝对超时;请求等待超时不是唯一防线,悬挂源也释放处理槽与未完成缓冲 |
| 正在接收的解码输出 | 按分配容量计入全局预算,包括扩容时的新旧缓冲,不仅计算已使用字节;超过上限拒绝,无磁盘降级 |
| 并发和慢客户端 | 沿用媒体/视频处理并发限制;输出取消与写入期限限制悬挂请求。正在发送的片段也要纳入资源管理 |
| 配置变更 | 取消受影响请求和会话、清热点缓存;旧版本不能靠缓存继续取流 |
cacheMB 当前默认 512 MiB,可用已有管理接口配置。原始热点的 64 MiB 是独立预算,不能把两者合并称作“总进程内存 64 MiB”。FFmpeg、播放器、网络缓冲、索引和正在发送的数据也占内存;必须压测 RSS、并发和慢读者,不能只验证缓存计数。
Web hls.js 缓冲目标为 8 秒,最大目标 12 秒;App Android 配置 8–12 秒,iOS 指定向前缓冲建议 8 秒。Safari 原生 HLS、HTML MP4 与 RN 原生内核的真实预取行为由平台管理,仍需设备验证;这些配置不承诺暂停瞬间零流量。Web HLS 控制采用现有插件的 stopLoad 与 startLoad。
兼容输出为真实 H.264 / AAC 视频处理,计划的 processing 返回 video。它比原始转发消耗更多 CPU,并可能改变码率、画质;关闭视频处理时必须明确拒绝,不能当作轻量封装绕过 maxVideoTranscodes。原始媒体优先,真实设备首帧、弱网和画质对比是上线关口。
新站媒体计划默认启用。旧 playback-settings.json 中显式 enabled:false 继续尊重,此时旧服务器返回 legacy,当前 App 不接受该计划;升级旧站须由管理员启用媒体计划后再验收 App。不能为了原生端绕过管理员明确关闭,也不能把默认无法播放留成隐藏部署前提。
后台线路管理
入口:“更多 → 代理线路”。填写名称、代理地址、启用状态。账号与密码采用“保留 / 更新 / 清除”三种明确操作,读取只显示“已配置凭据”,不返回密码。代理地址不能内嵌 userinfo、路径或参数。
测试使用独立的公共 HTTPS 目标,只返回成功状态与耗时,不保存草稿、不展示上游正文。测试成功表示连接与 TLS 可用,不代表所有剧集、地区和格式均可播放。
内置渠道在该页绑定线路;标准 API 渠道在“渠道管理”绑定。停用线路保留绑定并使后续请求失败,不偷偷清空。归档前必须解除全部引用。编辑、绑定、停用与归档均校验 revision,冲突保留草稿,管理员显式读取最新版本后再提交。
| 接口 | 用途 |
|---|---|
| GET / POST /api/ui/admin/proxy-routes | 查询、添加、更新、启停 |
| POST /api/ui/admin/proxy-routes/test | 测试未保存草稿 |
| POST /api/ui/admin/proxy-routes/archive | 无引用后归档 |
| GET / POST /api/ui/admin/proxy-route-bindings | 内置来源绑定,空 ID 明确表示服务器直连 |
| GET / POST /api/ui/admin/channels | 标准 API 来源包含 proxyRouteId;修改带原 revision |
HTTP(S) 与 SOCKS5 使用现有 Go 网络组件,不新增付费代理 SDK。配置按服务实例隔离,以专用 0600 文件存储,凭据仅供代理握手;本轮没有引入外部密钥库或主密钥加密。配置文件需要按敏感运维资料管理,它不是视频缓存。当前注册表只支持单进程写入,不能多个实例共享文件共同修改。
代理端点可由可信管理员填写本机或局域网地址;源目标仍限定公共 HTTPS 443。目标所有 DNS 结果检查后固定公网 IP,CONNECT / SOCKS 不把目标解析权交给代理;保留原 Host / SNI,TLS 验证不关闭,重定向再检查。管理员接口执行真实会话、权限、同源与请求校验,客户端 admin 字段不授予权限。
未绑定代理的内置来源也执行相同的公共目标检查,不沿用旧的环境代理或 TLS 直拨钩子。旧 HTTP、私网或非 443 媒体地址不再被该网站出网路径接受;接入前应确认来源提供符合要求的 HTTPS 地址。
网站禁止视频落盘
在线播放、兼容解码和 App 下载转发均不能创建 .mp4、.ts、.m4s 或临时视频文件。不是先写临时文件再删除,也不能在内存不足时改用文件或对象存储。
网站服务的新建、更新补集、重试、恢复服务器下载和合并均关闭;启动不能自动恢复旧下载队列。旧任务、目录和文件保留,已有本地文件可只读播放。播放准备遇到缺失本地片段,返回在线播放,不能隐式排入服务器下载。剧库元数据更新、封面、索引、观看记录、配置及 Emby 文本索引不属于视频字节。
App 的 playback/download 在线分支由 FFmpeg stdout 流式响应,已有本地文件则只读发送;两者都不创建服务器视频输出文件。新下载的媒体写入由 App 在用户手机上完成。离线权限、队列与许可证仍按 O00 / O01 继续实现,当前流式能力不能替代登录与离线授权验收。历史 CLI 下载工具与网站运行实例分开,不将其写盘能力暴露成网站开关。
写视频的旧接口返回 HTTP 403 与 code=server_video_storage_disabled,提示“网站不保存视频,请在 App 缓存”。前端不能据此自动重试或在后台补集。暂停、取消和只读列出旧任务仍可使用,启动时不得执行旧的待删除标志。
可选 Redis 协议缓存
本轮先用服务内 RAM,没有接入 Redis / Valkey。这样单实例不增加服务依赖;多实例共享热点是后续独立技术卡,不用数据库保存视频二进制。
如需要共享缓存,只采用开源方案并单独部署纯缓存实例,例如 Valkey。媒体缓存禁止 RDB、AOF、快照、备份与磁盘交换;与需要持久化的身份/任务数据实例隔离。RDB 的关闭方式及 AOF 含义见 Valkey 持久化文档,容量淘汰见 Key eviction。建议配置示例:
save ""
appendonly no
maxmemory 256mb
maxmemory-policy allkeys-lru
所有媒体键设置绝对 TTL,读取不续期;键包含来源、版本、片段或 Range,不能把授权结果当成共享缓存。上线前验证实际配置、复制节点和平台备份策略,应用账号禁止持久化命令;不能确认无持久化则关闭共享媒体缓存,继续受限 RAM / 流式路径,不能降级磁盘。仅设置 appendfsync no 仍会写 AOF,不能作为无落盘设置。主机 swap、崩溃转储、反向代理响应暂存也要在部署配置中关闭视频写盘;本地测试不替代这些运维证明。
分阶段交付与验证
| 技术卡 | 交付 | 必须通过的测试 |
|---|---|---|
| NET00 线路管理 | 注册表、HTTP(S)/SOCKS5、凭据操作、内置/标准来源绑定 | 真实本地代理握手、原 Host/SNI、固定公共目标、恶意 DNS/重定向、CAS、引用归档、权限与跨站请求 |
| NET01 无落盘取流 | 原始网关、热点复用、RAM 输出、小窗口索引、网站禁止服务器下载 | 同片并发及 Range 语义;失败/中断不缓存;绝对 TTL/容量;撤销旧命中;CENC/长 GOP/完整音画/远端拖动;无 Range 无重复整集拉取;旧队列启动不写视频 |
| NET02 双端与后台联调 | Web 表单及缓冲、App 网关与缓冲、经典播放器接入 | 390/1280 后台真实浏览器;普通用户不请求管理 API;HLS pause / resume / 切集清理;Android/iOS与Safari/Chrome实际播放和缓存计费字节 |
| NET03 部署与费用测量 | 成熟后台迁移、真实源试播、容量与计费监测、可选共享缓存 PoC | 重复片/冷门片/暂停/拖动/弱网/慢读者的源入字节、代理传输字节、网关出字节、命中率、RSS、CPU、首帧、重缓冲;部署所有层视频无文件证明 |
NET00–02 是当前追加增量,NET03 是正式上线关口。费用指标分开记录缓存命中、真实回源、重试与丢弃字节;不能用命中次数冒充省掉的计费流量。当前尚未接入代理计费 API 或运营图表,不能宣称已有可查看的费用看板。
这四张网络技术卡补充原 25 张产品任务,既有 149 个设计页面/状态的基线保持不变。P00 / P01、O00 / O01 和 M00 在正式联调时必须带上本模块边界,先交付再由子 agent 复审。
本轮证据
2026-10-03,本地代码增量经实现 agent 与独立复审 agent 交叉检查,本轮已发现的 P1 / P2 均已关闭。关闭项包括旧网站下载队列仍可能写视频、默认计划与 App 不兼容、直连绕过公共目标校验、悬挂解码窗口不释放资源,以及缓存容量、过期和配置撤销的边界。文档复审又发现慢响应可延长源有效期,已补充 Date / Age / 源期限与实际慢读取回归。此结论仅覆盖本轮网络增量,不表示原 25 张产品任务完成。
| 验证 | 实际结果与范围 |
|---|---|
| Go 全量测试与构建 | 最终缓存补修后的 go test ./... 通过,internal/app 用时 38.439 秒;go build ./... 通过 |
| 定向并发检测 | 原始缓存、代理线路、网站存储策略、默认计划、内存解码与元数据预热的 race 回归通过,用时 17.731 秒;最后缓存时序补修独立 race 通过,用时 1.803 秒 |
| 真实协议与媒体 | 本地 HTTP CONNECT、HTTPS 双层 TLS、SOCKS5 握手;实际 FFmpeg 长 GOP / CENC、跨窗口续播、远距离拖动、无临时视频输出、超时与关闭释放;不等同生产来源验证 |
| 网站禁止写视频 | 实际启动旧任务及待删除标志保留文件;写盘接口拒绝、内部队列不启动、缺失播放不排队、已有文件只读播放与 App 流式下载路径分别验证 |
| Web 自动检查 | 69 项 Node 测试通过,含 HLS 暂停 / 恢复 / 换集清理;实际 Chrome 在 390 / 1280 宽度验证后台表单、冲突、凭据及普通用户权限,API 为模拟响应 |
| App 自动检查 | 32 项测试与 TypeScript 检查通过;本轮未构建安装包、执行真机或发布 OTA |
上线前仍须执行 NET03:真实付费代理计费字节、生产 RSS / CPU 及慢读者、实体 Android / iOS、Safari 原生缓冲、部署系统与反向代理无视频暂存验证。当前没有 Redis / Valkey 共享缓存、代理费用图表或生产容量结论;在线文档更新不包含真实 API / App 部署。
