这是Chrome插件(亦支持Firefox), 能进行知乎视频嗅探以及下载功能。支持下载为TS格式( MPEG2-TS 格式) 或者 MP4 格式。
Firefox 用户请下载 1.0.9 版本以后的zip文件. See #12
更多介绍/下载信息请访问: https://github.com/shellvon/zh-downloader
下载本代码之后执行 npm install && npm run build
之后在 chrome://extensions/
中选择"加载已解压的扩展程序" 选择 dist
目录即可。
或者你可以选择已经打包好的CRX/ZIP格式插件(1.0.3开始不再提供CRX,参见 #6 ),可以前往这里下载:https://github.com/shellvon/zh-downloader/releases/
本次计划使用 Vue,因此选择了 Kocal/vue-web-extension 模版
本插件主要由 Popup Script 以及 Background Script 合作完成,参见:Understanding Google Chrome Extensions
大体步骤:
-
使用 chrome.webRequest.onBeforeRequest 监听所有知乎发起的视频请求,根据简单抓包可以看到知乎当有视频的时候会向这个地址:https://v.vzuu.com/video/ZHIHU_VIDEO_ID 发起请求,其中
ZHIHU_VIDEO_ID
即为知乎视频ID. 之后利用知乎 API: https://lens.zhihu.com/api/videos/ZHIHU_VIDEO_ID 找到视频的 m3u8 地址。 -
利用 M3U8-Parser 解析上述 API 返回的数据,并提交数据至 Popup 页面进行查看。
-
提交数据利用了 Vue 的 Store 状态管理,由于 Popup 生命周期的原因,因此将 Store 也存入了 chrome.storage 进行持久化, 插件是
vuex-webextensions
。 -
Popup(前端)接受用户下载请求,利用
chrome.runtime.connect
连接 Port 与 Background.js (后端)进行双向通讯,通知其下载请求。 -
Background.js 遍历所有 TS 数据包并将起合并为一个 TS 包,如果发现下载的是 mp4 格式,则利用
mpegts_to_mp4
或则mux.js
进行数据转化。 -
利用 Port 实时通知 Popup 页的下载进度以及下载结果。
⚠️ 注意: MP4 尝试了mpegts_to_mp4
,mux.js
,videoconverter.js
效果均不是很理想。因此不建议下载MP4。
- mpegts_to_mp4:
读取 SPS 信息的时候宽度/高度信息错误(调研发现是没有去掉 Emulation Prevention Bytes. 目前已经修复)) - mux.js 能正常读取宽/高,但是无法正常解析Duration(See videojs/mux.js#210),另一个有趣的问题是部分知乎用户的视频没有音频,因此不会触发 mux.js 的
data
事件(See videojs/mux.js#194),因此需要分开处理音频/视频。 - videoconverter.js Node 直接就爆内存错误
- 下载过程中不能关闭 Popup 页,否则后端无法与之通信然后通知下载结果
- 不知道视频链接过期时间, 因此下载过程中会出现403,这时候可以点击ID进入知乎将自动刷新
- 转化的MP4格式宽高不正确,因此普通视频播放器可能难以播放, 请尝试用
mplayer
播放。 或者下载 TS 之后用ffmpeg
或者 https://cloudconvert.com/ 在线转换
- 用户可自定义设置
- 已下载视频增加打开功能
- 自动删除采集超过一定时间的视频(时间/策略?)
-
用户忽略某些条件的视频采集(如大小/清晰度/作者/视频名)?(似乎没什么用,此功能不打算实现) -
直接搜索知乎视频(不知道有API没有)知乎推荐视频(无法搜索) - 修复导出 MP4 格式的问题,无论是
mux.js
还是mpegts_to_mp4
,任一即可 - 发布至 Google Chrome 商店Install from Google Chrome Store
关于本项目的 Change Logs 您可以访问 https://github.com/shellvon/zh-downloader 查看详情 或者可以查看 docs/changelog.json
文件。