本文档详细介绍了 drpy-plugin 中 mediaProxy (由 Go 编写的视频代理服务,即 goProxy) 的完整开发、测试、调试及编译打包流程。
确保您的本地开发环境已安装以下工具:
- Go: 建议 1.21 或更高版本(用于编译
proxy.go) - Python: 3.x(用于运行模拟播放器及测试脚本)
- PowerShell: Windows 环境默认自带(用于执行编译及打包脚本)
- Git: 用于版本控制
- UPX: 可选,用于压缩编译后的可执行文件(在 Android 环境下能大幅缩小体积)
在开发阶段,我们直接使用 Go 命令在本地启动代理服务。服务默认运行在 5575 端口。
cd mediaProxy
go run proxy.go -port 5575如果需要查看更详细的调试信息(例如每个分片的下载情况、错误日志),请添加 -debug 参数:
go run proxy.go -debug -port 5575在本地服务启动后,需要验证代理是否能正确处理视频的完整播放以及拖拽操作(即 HTTP Range 请求)。
在 mediaProxy 目录下创建一个名为 playinfo.txt 的文件,将你需要测试的视频直链(例如迅雷等网盘解析出的原始播放链接)粘贴进去。
我们编写了两个 Python 脚本来模拟不同场景的测试:
-
基础流程测试 (
test_proxy.py): 该脚本模拟了完整下载、拖拽到中部、拖拽到尾部以及拖拽后继续播放四个场景。python test_proxy.py
预期结果: 各个场景返回
206 Partial Content,并且能正确下载对应字节数的数据。 -
播放器模拟测试 (
test_player_sim.py): 该脚本更贴近实际播放器的行为,通过读取playinfo.txt中的链接,发起不同Range的请求,并打印响应头,方便检查Content-Range和Content-Length是否正确。python test_player_sim.py
当遇到播放截断、无法拖拽等问题时,通常是因为 HTTP Range 处理或并发控制不当。以下是常见的排查点:
- 观察 Debug 日志:
检查
go run proxy.go -debug输出的日志,特别关注statusCode、Range以及ProxyRead/ProxyWorker相关的报错。 - 416 错误处理:
网盘(如迅雷)在请求到达文件末尾时常返回
416 Range Not Satisfiable。这不是一个致命错误,代理不应该直接中断。正确的做法是跳出当前分片的下载循环,平滑结束。 - 429/503 频率限制:
多线程并发请求可能触发服务器的防刷机制。需要加入退避重试(Retry Backoff)机制,并在
handleGetMethod中限制最大线程数(如限制为 16)。 - Context 与协程泄漏:
使用
context.WithCancel控制并发任务的生命周期。当主请求结束(如用户关闭播放器)时,通过cancel()通知所有 worker 退出,避免后台持续下载导致内存和连接泄漏。
修改建议: 所有代理逻辑的核心在
ConcurrentDownload、ProxyRead以及ProxyWorker三个函数中,修改时需仔细处理channel和buffer的读写。
在本地测试通过后,需要将 proxy.go 交叉编译为 Android 平台可执行文件。
在 mediaProxy 目录下,直接运行提供的 PowerShell 脚本:
.\scripts\build_goproxy.ps1脚本主要工作:
- 设置环境变量
GOOS=linux,分别针对GOARCH=arm(32位) 和GOARCH=arm64(64位) 进行编译。 - 禁用 CGO (
CGO_ENABLED=0),移除调试信息 (-ldflags="-s -w") 以减小体积。 - 输出文件存放至
goProxy/goProxy-arm和goProxy/goProxy-arm64。 - (可选) 如果系统中存在
upx命令,脚本会自动对编译结果进行 UPX 压缩。
编译好的 Android 可执行文件最终需要打包进 custom_spider.jar 中的 assets 目录下供 TVBox 等客户端使用。
在 mediaProxy 目录下,运行打包脚本:
.\scripts\update_jar.ps1脚本主要工作:
- 将
goProxy目录下的goProxy-arm和goProxy-arm64添加或更新到上一级目录的custom_spider.jar的assets/路径中。 - 自动计算更新后
custom_spider.jar的 MD5 值。 - 将生成的 MD5 值写入
custom_spider.jar.md5文件中。
至此,整个开发、测试、编译、打包的闭环流程完成。你可以将生成的 custom_spider.jar 和 custom_spider.jar.md5 发布到你的源中供用户更新。