Skip to content

Repository files navigation

Browser Media Bridge 使用说明

仓库名称仍为 telegram-web-mpv-bridge,但当前版本已经从 Telegram 专用工具扩展为 mpv-lazy 的本机浏览器媒体中继,并同时承载斗鱼直播弹幕 helper。

仓库:luoxue03/telegram-web-mpv-bridge

当前发布版本:v0.3.0

这个工具是做什么的

它解决两类浏览器到 mpv 的交接问题:

  1. Telegram Web 的视频依赖浏览器登录态,mpv 无法直接请求。
  2. 斗鱼弹幕需要一个独立于网页标签页的长连接,并通过 MPV JSON IPC 送入独立的 MPV OSD Overlay。

Telegram 媒体链路:

Telegram Web
  -> External Player 捕获媒体
  -> WebSocket 9000
  -> bridge.py
  -> HTTP Range/HLS 8999
  -> mpv

斗鱼弹幕链路:

External Player
  -> bridge.py 启动 Node helper
  -> 斗鱼弹幕 WebSocket
  -> 每次启动专用 MPV IPC pipe
  -> douyu_danmaku.lua
  -> 单个常驻 ass-events Overlay

斗鱼视频本身是签名直链,不经过中继。中继或弹幕失败时,视频仍应正常启动。

文件

文件 作用
bridge.py 本机 HTTP + WebSocket 服务,负责媒体 Range/HLS 转发和斗鱼弹幕进程生命周期。
start_browser_relay.ps1 隐藏窗口启动 bridge,并等待 8999 端口就绪。
douyu_danmaku_client.js 斗鱼弹幕协议客户端,输出有界 JSON 消息。
douyu_danmaku.lua 独立的斗鱼实时弹幕渲染器;使用一个常驻 ass-events Overlay,不创建字幕轨也不修改 vf
telegram-web-mpv-bridge.user.js 旧的 Telegram 独立 userscript;使用最新版 External Player 时通常不需要。
build_windows.ps1 可复现构建两个 Windows x64 单文件 EXE。
requirements.txt / requirements-build.txt 固定 Python 运行与 PyInstaller 构建依赖。
package.json / package-lock.json 固定 Node ws@yao-pkg/pkg 构建依赖。
tests/ Python、Node 和 Lua 路由测试。

整合包中的对应位置:

tools\telegram-web-mpv-bridge\
portable_config\scripts\telegram_web_mpv_bridge.lua
portable_config\scripts\douyu_danmaku.lua
portable_config\scripts\uosc_danmaku\

普通用户安装

mpv-lazy 的正式 config 包包含两个 EXE 和启动脚本:

tools\telegram-web-mpv-bridge\browser-media-bridge.exe
tools\telegram-web-mpv-bridge\douyu-danmaku-client.exe
tools\telegram-web-mpv-bridge\start_browser_relay.ps1

同时也包含 MPV Lua 脚本和斗鱼弹幕配置:

portable_config\scripts\telegram_web_mpv_bridge.lua
portable_config\scripts\douyu_danmaku.lua
portable_config\script-opts\douyu_danmaku.conf

已有 mpv-lazy 安装只需覆盖同版本的 config 包;全新安装仍需先解压 base,再覆盖 config。最终用户不需要安装 Python、Node、.venvnode_modules。启动脚本和 MPV 菜单都会优先运行 browser-media-bridge.exe

单独使用本仓库时,也可以从 GitHub Releases 下载两个 EXE,并与 start_browser_relay.ps1 放在同一目录:

<mpv-lazy>\tools\telegram-web-mpv-bridge\

不要从其他电脑复制 .venv/node_modules/、日志或缓存。

源码开发与构建

源码模式是开发回退,不是普通用户的安装要求。

安装开发依赖

cd tools\telegram-web-mpv-bridge
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements.txt
npm ci

源码启动时:

.\.venv\Scripts\python.exe bridge.py `
  --host 127.0.0.1 `
  --http-port 8999 `
  --ws-port 9000 `
  --mpv-path ..\..\mpv.exe

构建 Windows EXE

构建机需要 Python 3.10+ 与 Node.js,最终生成物不需要:

.\build_windows.ps1

输出:

dist\browser-media-bridge.exe
dist\douyu-danmaku-client.exe

脚本使用锁定版本的 PyInstaller 和 @yao-pkg/pkg。首次构建会下载对应的 Node 基础运行时;如果构建机通过本机代理访问 GitHub,可以仅对本次构建传入代理,不修改系统配置:

.\build_windows.ps1 -Proxy http://127.0.0.1:7897

URL Scheme 自动启动

url-scheme-handler.exe 中新增:

名称 路径
BrowserRelay C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

最新版 External Player 点击 Telegram 或启动斗鱼弹幕时,会自动调用:

-NoProfile -NonInteractive -ExecutionPolicy Bypass -File ".\tools\telegram-web-mpv-bridge\start_browser_relay.ps1"

因此日常使用不需要先在 mpv 菜单手动开启 bridge。

使用

Telegram Web

  1. 安装最新版 External Player
  2. 登录 Telegram Web K 或 Web Z。
  3. 更新脚本后完整刷新页面。
  4. 打开目标视频并点击 External Player 的 MPV 按钮。
  5. 脚本会自动启动中继、注册当前媒体并拉起 mpv。

不需要 Telegram API ID/Hash,也不需要下载完整文件。拖动进度条通过 HTTP Range 在线读取。

播放期间必须保持对应 Telegram 标签页打开,因为真正带登录态的媒体请求仍由浏览器执行。

斗鱼直播弹幕

  1. 在斗鱼房间点击 External Player 的 MPV 按钮。
  2. External Player 直接把新鲜签名直播流交给 mpv。
  3. 同时请求 bridge 启动该房间的弹幕 helper。
  4. helper 只绑定这次 mpv 启动生成的 IPC pipe。
  5. mpv 关闭或 pipe 消失后,bridge 自动结束 helper。

斗鱼弹幕始终走独立 Overlay,不等待或调用 uosc_danmaku,也不会创建字幕轨。字体、字号、透明度、描边、阴影、显示区域、速度与刷新率上限由 douyu_danmaku.conf 单独控制。

MPV 菜单

手动控制入口:

工具 > 浏览器媒体中继 开关
工具 > 浏览器媒体中继 状态
工具 > 浏览器媒体中继 启动通知开关(默认关闭)

这些入口主要用于诊断。External Player 的自动启动与菜单开关使用同一套 8999/9000 服务。

手动启动

正式包:

cd tools\telegram-web-mpv-bridge
.\browser-media-bridge.exe --host 127.0.0.1 --http-port 8999 --ws-port 9000 --mpv-path ..\..\mpv.exe

未构建 EXE 时,start_browser_relay.ps1 会回退到 .venv\Scripts\python.exe + bridge.py。两种模式都默认只监听本机回环地址。

状态与接口

默认端口:

  • HTTP:127.0.0.1:8999
  • WebSocket:127.0.0.1:9000

查看状态:

Invoke-RestMethod http://127.0.0.1:8999/status

主要本机接口:

路径 作用
/status 服务、浏览器连接与当前来源状态。
/stream/current 兼容旧版的当前媒体入口。
/s/<token>/stream 单次注册媒体的稳定 HTTP Range 入口。
/s/<token>/master.m3u8 中继重写后的 HLS 主清单入口。
/play/current 让 bridge 直接启动当前媒体。

这些接口只供本机使用,不应通过端口转发暴露到局域网或公网。

设置与运行状态

  • bridge.out.logbridge.err.log:自动生成日志。
  • .venv/:本机 Python 环境。
  • node_modules/:本机 Node 依赖。
  • __pycache__/:Python 缓存。

以上均被 .gitignore 排除,不应上传 GitHub。

斗鱼弹幕与 uosc_danmaku 的番剧弹幕样式彼此独立;默认值对齐当前 uosc_danmaku 的 SimHei、16 号字、55% 不透明度、描边 1、无阴影、粗体、10 秒速度和顶部 25%(1/4 屏)显示区域。可在 portable_config\script-opts\douyu_danmaku.conf 设置字体、字号、透明度、描边、阴影、速度、显示区域、轨道间距、来源颜色和刷新率上限;可复制仓库中的 douyu_danmaku.conf.example 作为起点。

高流量房间会按 max_launch_rate 平滑放出消息,排队超过 max_queue_age 秒的旧弹幕会被丢弃。Bridge 在 MPV IPC 尚未建立或写入队列拥塞时也会丢弃旧批次, 避免窗口启动后突然灌入一整屏历史弹幕。直播弹幕优先保持实时性,不保证每条消息都显示。

常见问题

点击 Telegram 后没有 mpv

  1. 检查 ush://MPVush://BrowserRelay 是否都已注册。
  2. 检查 browser-media-bridge.exe 是否与 start_browser_relay.ps1 位于同一目录。
  3. 访问 http://127.0.0.1:8999/status
  4. 查看 bridge.err.log
  5. 更新 External Player 后完整刷新 Telegram 页面。

Telegram 打开 mpv 但黑屏

  • 不要关闭 Telegram 标签页。
  • 确认页面视频本身可以播放。
  • 确认 External Player 控制台参数是本机 /s/<token>/stream/master.m3u8
  • 旧页面捕获状态可能失效,完整刷新后重新点击。

斗鱼有视频但没有弹幕

  • 这是允许的降级行为,视频链路与弹幕链路互不阻塞。
  • 确认 douyu-danmaku-client.exe 与 bridge EXE 位于同一目录。
  • 源码开发模式下,才需要确认 Node.js 和 npm ci
  • 检查 bridge.err.log 是否提示 Douyu danmaku helper is unavailable
  • 在 mpv 中确认 工具 > 弹幕 > 开关弹幕 没有关闭。
  • 通过弹幕设置保存一次跨进程默认样式,随后重新拉起直播。

端口被占用

Get-NetTCPConnection -LocalPort 8999,9000 -State Listen

结束冲突程序,或同时修改 bridge 启动参数、External Player 与 mpv Lua 控制脚本。三处端口必须一致。

CPU 占用异常

  • 检查是否重复启动多个 bridge。
  • 检查是否有旧版 Telegram userscript 和 External Player 同时注册来源。
  • 关闭不再使用的 mpv 进程后,斗鱼 helper 应随 IPC pipe 消失而停止。

开发验证

Python:

python -m unittest discover -s tests -p "test_*.py"

Node:

npm test

Lua 路由集成测试需要整合包中的 mpv:

mpv.exe --no-config --vo=null --ao=null --force-window=no --script=douyu_danmaku.lua --script=tests\douyu_danmaku_router_test.lua "av://lavfi:testsrc2=duration=3:size=16x16:rate=30"

测试重点包括 Range/HLS 转发、来源隔离、斗鱼 helper 命令选择、进程停止、MPV pipe 消失、消息限长/限量,以及独立 Overlay 的刷新、颜色、队列与清理行为。

安全边界

  • 服务仅绑定 127.0.0.1
  • 不保存 Telegram API 凭据。
  • 不把浏览器 Cookie 写入仓库。
  • 不缓存斗鱼签名直播地址。
  • WebSocket 消息、文件名、会话 ID 和 MPV pipe 名都经过边界检查。
  • 日志、会话、缓存和本机依赖不得提交。