9层回退解析链:VideoDownloadHelper的ParseVideo引擎是如何嗅探视频URL的?
【免费下载链接】VideoDownloadHelperChrome Extension to Help Download Video for Some Video Sites.项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper
VideoDownloadHelper 是一款开源的浏览器视频下载扩展,它的核心是 ParseVideo 引擎:打开弹窗时自动嗅探当前页面,用一条 9 层回退解析链从"最专用"到"最通用"逐层扫描页面源码,把藏在 JSON、meta 标签、HTML5 视频标签、HLS 播放列表甚至直链里的视频 URL逐一揪出来,供你一键下载、复制或批量处理。全程本地运行、零依赖、无服务器。
为什么视频嗅探这么难
视频页面上的真实地址,往往以各种形态"藏"着:
- 站点私有的 JSON 字段,如
"video_url": "https://…" - Open Graph 的 meta 标签,如
<meta property="og:video" content="…"> - 标准 HTML5 的
<video src>/<source src>标签 - 带
.m3u8后缀的流媒体播放列表 - 直接嵌在页面里的
.mp4、.webm、.mp3等媒体文件链接
每个站点的写法都不一样,页面结构还可能随时改版。因此最可靠的策略是:从最专用的策略开始逐层尝试,命中即停,失败就立刻换下一招。这正是 parsevideo.js 里Parse()入口方法的设计哲学。
9层回退解析链总览
这条回退链像一场接力赛:每一层没找到就"交棒"给下一层,任何一层成功就短路返回,后面的层直接跳过。
| 层级 | 策略 | 扫描目标 |
|---|---|---|
| 1️⃣ | 站点专用解析器 | 秒拍、微博、TED、Vimeo、Dailymotion 等 9 大站点 |
| 2️⃣ | 通用 video_url 字段 | 页面 JSON 中的"video_url":"https://…"片段 |
| 3️⃣ | mp4 URL 片段 | mp4,"url":"https://…"这类播放器配置 |
| 4️⃣ | og:video meta 标签 | 页面头部<meta property="og:video"…>声明 |
| 5️⃣ | <video>标签 | HTML5 视频元素的 src 属性 |
| 6️⃣ | <source>标签 | video/audio 元素内 source 子元素的 src |
| 7️⃣ | .m3u8 播放列表 | HLS 流媒体地址 |
| 8️⃣ | 媒体文件直链 | 以 .mp4/.webm/.mkv/.mov/.mp3/.m4a 结尾的直链 |
| 9️⃣ | 兜底交接 | 引擎放弃后,由内容脚本的 DOM 嗅探与 DevTools 网络嗅探接管 |
这个"短路返回"的设计至关重要:越专用的层命中率越可靠,排在越前面;越通用的层误报率越高,排在越后面。只有 8 层全部落空,引擎才返回空值,把战场交给第 9 层。
第一层:9个站点的专用解析器
引擎先用 functions.js 中的extractDomain()取出页面域名(并去掉www.前缀),再查一张"域名 → 解析器"的调度表。9 个站点各自拥有量身定制的解析器:
| 站点 | 嗅探思路(简化版) |
|---|---|
| miaopai.com | 最省事的一招:不看页面内容,直接把页面 URL 中的 ID 拼进视频 CDN 地址 |
| xiaokaxiu.com | 在player.swf?scid=参数里找到视频 ID,拼出流地址 |
| weibo.com | 查找video_src=参数并做 URL 解码 |
| facebook.com | 按优先级依次尝试hd_src/sd_src等 4 组高清、标清字段 |
| dailymotion.com | 先找播放器元数据 JSON 里的 HLS 清单,再找渐进式 MP4 流 |
| vimeo.com | 在播放器配置的progressive数组里找 MP4 地址 |
| ted.com | 匹配 low / medium / high 多清晰度字段 |
| msdn.com | og:video meta + 页面内 .mp4 直链双管齐下 |
| pearvideo.com | 匹配hdUrl/sdUrl/ldUrl三档清晰度变量 |
专用解析器"最精准但最不通用",所以被放在链首:命中时结果几乎必然正确;不命中时,付出的代价只是几条正则表达式的工夫。
第2至8层:通用回退如何运作
对剩下千千万万没有"定制服务"的站点,引擎依次回退到 7 个通用策略,从"半专用"走向"全通用":
- 第 2 层 video_url 字段:很多站点会把真实地址直接写进页面 JSON,引擎用正则在整个 HTML 里搜索
video_url: "https://…"。 - 第 3 层 mp4 URL:部分播放器的配置长这样:
mp4, "url": "https://…",于是引擎备了专属模式。 - 第 4 层 og:video meta 标签:Open Graph 标准允许站点在页面头部声明视频链接,是最"标准"的通用来源。
- 第 5、6 层
<video>/<source>标签:原生 HTML5 视频页面最常见的形态。 - 第 7 层 .m3u8 播放列表:流媒体站点的 HLS 地址;找到后弹窗还能进一步展开 TS 分片列表(见 video.js 的 m3u8 展开逻辑)。
- 第 8 层 媒体文件直链:最"激进"的兜底——只要页面里出现以已知视频/音频扩展名结尾的链接就收进来。扩展名清单通过
VIDEO_EXTENSIONS/AUDIO_EXTENSIONS与 functions.js 共享,新增格式只需改一处。
第 8 层被刻意放在最后:它命中率最高,但误报也最多,只有前面所有层都失败时才轮到它出场。
三道质量关卡:FixURL、ValidURL 与去重
细心你会发现,每一个正则命中的结果都不会直接返回,而是先过同一套"海关":
FixURL()先修复:真实页面里满是脏数据——JSON 转义过的https:\/\/…、协议相对的//…开头地址,这里统一修好;ValidURL()再校验:用严格正则确认它是真实可访问的 URL,并拒绝blob:这类伪地址;uniq()后去重:同一地址出现多次只保留一次。
三道关全部通过后,结果以"单个返回字符串,多个返回数组"的形式交出去——比如一个页面同时给出 480P 和 1080P,弹窗就能统一渲染成多条结果。
从嗅探到下载:完整流程
引擎并非孤军奋战,它只是 manifest.json 声明的 Manifest V3 扩展中的一个环节,完整链路是:
- 注入:点击工具栏图标,background.js 通过
chrome.scripting.executeScript把构建好的内容脚本注入当前页面(仅限 http/https 普通网页,自动跳过受限页面)。 - 采集:内容脚本 getPagesSource.js 抓取整页 HTML,构造
new ParseVideo(url, html)。 - 解析:调用
Parse(),跑完上面的 9 层回退链。 - 上报:结果经
chrome.runtime.sendMessage发给弹窗,同时驱动工具栏图标上的数字角标——几眼就能看出这页嗅到了几条媒体地址。 - 展示:弹窗界面为每条地址打上 视频 / 音频 / 图片 标签,提供 下载、复制、全部下载、全部复制 四种操作;下载走浏览器原生下载管理器,文件名还会根据页面标题自动生成。
如果 ParseVideo 引擎真的什么也没找到,也不是故事的结尾——第 9 层的兜底交接随之启动:内容脚本会在 DOM 里继续翻找meta[property*='video']、source[type='video/mp4']、video 元素属性等线索,甚至在 DevTools 网络面板监听超过 100KB 的大请求做"网络级嗅探"。等这些也全部失败,才会认定此页确实无视频可下。
如何亲手验证这套解析器
项目在 test/ 目录下用 Mocha + Chai 搭了完整单测,每一层回退策略都有专属测试文件,真实页面片段作为样本存放在 test/data/,例如:
- test_parsevideo.js ——
Parse()整体回退流程 - test_parsevideo_m3u8.js —— .m3u8 层
- test_parsevideo_video_tag.js / test_parsevideo_source_tag.js —— HTML5 标签层
- test_functions.js ——
ValidURL/FixURL等质量关卡
只需安装 Node.js 18+,在仓库根目录执行npm install与npm test即可跑通全部用例,npm run coverage还能生成覆盖率报告。想为新站点补解析器?先看看 tested-urls.txt 里已验证的真实页面样例,以及 todo-urls.txt 中的待支持清单。
小结:三条可迁移的设计智慧
回看这条 9 层回退链,有三点值得记住:
- 从专用到通用:最可靠的先试、最激进的垫底,经典的"先小锤后大锤"思维;
- 先验证后返回:页面 HTML 都是不可信输入,修复 → 校验 → 去重三道关全过才允许出引擎;
- 零依赖:整个引擎是纯 JavaScript 正则实现,没有引入任何第三方解析库,扩展因此轻量、快速、易审计。
下次你点开 VideoDownloadHelper 看到地址出现在列表里时,你就知道:那是 9 层回退链在不到一秒钟内悄悄跑完的"淘汰赛"。
【免费下载链接】VideoDownloadHelperChrome Extension to Help Download Video for Some Video Sites.项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考