SakiDown是一个遵循Chrome Manifest V3标准的哔哩哔哩视频下载和管理插件。基于原生JavaScript开发,无任何外部依赖,开箱即用。
- 流式合并算法:采用原生JavaScript实现了DASH音视频流的解封装与无损合并,配合OPFS存储技术,解决了ffmpeg.wasm在合并大文件时遇到的内存墙问题。
- 透明隐私保护:SakiDown承诺不收集任何用户数据,除Bilibili官方接口外无任何网络请求。代码完全开源且未混淆,逻辑清晰透明。用户可随时查阅或使用AI工具辅助审计源代码,确保数据安全。
- 数据安全:坚持“本地优先”原则,所有运行数据均存储于用户本地。可以完整导出已完成任务的json数据。
- 极简交互体验:集成于浏览器,无需额外登录账号。下载单个视频,在打开视频页面后只需要点击2次鼠标(批量下载点击3次)。可以不点击Chrome插件图标完成插件的全部操作。
- 支持全面:支持当前用户观看范围内非DRM加密的个人投稿/番剧/课堂,完整支持合集/播放列表/稍后再看。支持封面和XML弹幕下载。
git clone https://github.com/weiyunjun/sakidown.git在GitHub页面点击Code -> Download ZIP下载并解压。
在GitHub页面点击Releases,选择你需要的版本。
本项目基于原生JavaScript开发,开箱即用,无需任何构建流程。
- 打开浏览器,打开设置 - 扩展程序。
- 开启开发者模式。
- 选择:加载未打包的项目程序。
- 选择项目文件夹。
- 打开浏览器,打开设置 - 扩展。
- 开启开发人员模式。
- 选择:加载解压缩的扩展。
- 选择项目文件夹。
在项目文件夹内打开终端,执行以下命令即可同步最新代码:
git pull然后在浏览器的扩展管理页面点击刷新或更新图标即可。
删除旧文件夹,重新下载zip包或release的zip包并解压到原文件夹(需要确保文件夹名称一致,否则不会被Chrome视为同一个插件)。
然后在浏览器的扩展管理页面点击刷新或更新图标即可。
默认文件夹名称:sakidown-main
- 更新插件或者日常使用时,请不要移除插件,移除操作会直接清空插件数据!
- 重装系统且清除系统盘数据通常会清除浏览器数据,请提前做好数据导出工作。
非技术向的详细使用教程请参阅 用户指南。
支持导出已完成的任务数据,格式为.json。
任务数据包括视频的元数据(task.metadata),下载该视频的下载策略配置(task.preference),该视频的下载状态(task.status)。
一次最多导出10000条数据,如果数据大于10000条,会分为多个.json文件导出。
导入功能开发中,敬请期待。
下面是一份示例数据:
点击查看完整数据结构示例 (JSON)
{
"metadata": {
"type": "ugc",
"aid": 657756942,
"bvid": "BV1na4y1c7bR",
"cid": 1179447493,
"ep_id": null,
"is_current": true,
"season_title": "MyGO!!!!! 原创MV",
"section_title": null,
"episode_title": null,
"part_title": null,
"part_num": 1,
"is_multi_part": null,
"title": "栞 (Shiori)",
"author_mid": 1459104794,
"author_name": "MyGO_AveMujica",
"author_image": "https://i2.hdslb.com/bfs/face/5f70adc443b0739c237847ef29acaea07a13db71.jpg",
"author_url": "https://space.bilibili.com/1459104794",
"duration": 267,
"pubdate": 1688119200,
"page_url": "https://www.bilibili.com/video/BV1na4y1c7bR",
"cover_url": "https://i2.hdslb.com/bfs/archive/f07dad2340feb0d0f92a8bbddde843ab40cad63b.jpg",
"thumbnail_url": "https://i2.hdslb.com/bfs/archive/f07dad2340feb0d0f92a8bbddde843ab40cad63b.jpg@320w_180h_1c_!web-home-common-cover.avif",
"thumbnail_id": "BV1na4y1c7bR",
"danmaku_url": "https://comment.bilibili.com/1179447493.xml",
"collection_title": "MyGO!!!!! 原创MV"
},
"preference": {
"strategy_config": {
"audio": true,
"video": true,
"quality": {
"primary": "best",
"secondary": "dolby"
},
"codec": {
"primary": "av1",
"secondary": "hevc"
},
"merge": true,
"cover": true,
"cover_format": "jpg",
"danmaku": true,
"danmaku_format": "xml",
"name": "最佳画质视频+封面+弹幕"
}
},
"status": {
"uid": "afbf5eb0-6789-43ba-8ac2-fffa83237692",
"phase": "done",
"phase_text": "已完成",
"retry_count": 0,
"error": null,
"download_ids": {
"full_video": 3207,
"video_stream": null,
"audio_stream": null,
"cover": 3208,
"danmaku": 3209
},
"finish_time": 1770820519286,
"audio_candidates": [
{
"urls": [],
"bandwidth": 233545,
"id": 30280,
"codec_label": "AAC",
"size": 7766769
}
],
"video_candidates": [
{
"id": 112,
"urls": [],
"bandwidth": 638501,
"width": 1920,
"height": 1080,
"frame_rate": "24.024",
"quality_label": "1080P+",
"codec_label": "AV1",
"codecid": 13,
"size": 21288136
}
],
"attachments": [
{
"type": "cover",
"format": "jpg",
"status": "success"
},
{
"type": "danmaku",
"format": "xml",
"status": "success"
}
]
}
}尽管我已经努力测试覆盖所有可能的情况,但受限于自身技术能力和Chrome Manifest V3扩展的沙箱机制的双重限制,本项目在部分场景下仍存在以下已知局限:
由于Manifest V3严格的安全策略与生命周期管理,部分功能在实现上存在物理瓶颈:
- 无法“真”暂停:由于流式合并算法(DASH -> MP4)涉及复杂的二进制缓冲区管理,目前的架构不支持中途暂停下载。点击“取消”即意味着销毁任务。
- UI交互限制:Chrome限制了扩展程序对原生“下载栏”的控制权,使得静默通知难以真正实现。
本项目采用Service Worker ↔ Offscreen ↔ Web Worker的三层通信架构。
- 高延迟IO环境:当下载目标路径位于NAS且通过无线网络传输时,IO写入速度可能低于下载流的积压速度。
- 后果:这可能导致内存缓冲区溢出或数据写入不完整。
- 建议:在下载高码率视频时,建议优先保存至本地硬盘。
SakiDown采用了策略优先的设计哲学,这可能不符合手动选择下载内容的用户的习惯:
- 自动化决策:为了优化批量下载,插件强制通过预设的下载策略来决定下载内容。
- 无单独选项:不提供单次任务的下载选项。所有选项只能在下载策略中调整。
- 可维护性:本项目是我在学习JavaScript一段时间后的练习性质的作品,主要角色更接近传统项目中的架构师+产品经理+测试。大部分具体业务代码由AI生成。虽然核心功能稳定,但可维护性有待于我对业务代码的进一步学习。
- 边缘情况:目前的测试覆盖率主要集中在主流场景。在极端网络环境或特定硬件配置下,可能会出现未定义的行为。欢迎提交Issue反馈。
基于实际开发情况和功能复杂度,目前预估v0.2.0完整版本将于4月初发布。期间会陆续更新下列待办事项中的内容。
- 测试流程:单元测试、环境兼容性测试。
- 文档:技术文档和贡献者文档。
- 注释:数据嗅探、后端、合并算法部分,完善注释。
- 功能:任务数据的导入功能。
- 功能:ASS和JSON格式的弹幕下载。
- 功能:内嵌元数据到视频中。
- 功能:任务管理,筛选功能。
- 功能:任务管理,排序功能。
- 性能:优化后端性能(具体内容待补充...)。
- 测试流程:集成测试、性能与压力测试。
- 界面交互:UI/UX优化。
- 注释:UI/UX部分,完善注释。
SakiDown的开发工作,是出于对二创社区的爱,一时冲动下开启的。如果没有以下存在,SakiDown完全没机会坚持到开源的这一天:
- 哔哩哔哩It's MyGO!!!!! & Ave Mujica二创社区:谢谢你们带给我的美好回忆。对所有二创作者,致以最深,最深的敬意。
- bilibili-API-collect:谢谢你提供的API的详细文档,没有它,我会无从下手。
- mp4box:虽然代码部分无法提供直接参考,但在开发初期,
mp4box -info在测试和验证DASH流合并算法时提供了巨大的帮助。 - hakadao:感谢你的bewlybewly插件,从你这里我知道了It's MyGO!!!!!这部作品。你的遭遇,让我鼓起勇气真正去在乎我爱的人。
- 我的家人和Steam家庭组的朋友。谢谢你们包容我像疯子一样的开发状态,还有...让我白嫖游戏。
- MD5算法
- 来源:JavaScript implementation of RSA Data Security, Inc. MD5 Message Digest Algorithm.
- 作者:Paul Johnston et al.
- 协议:BSD License
- 注:源代码已包含完整版权声明。
- 默认音效
- 文件:
assets/default.wav - 来源:Directory Audio - Email Notification Gentle Ping
- 协议:CC0 1.0 Universal (Public Domain)
- 文件:
- 软件许可:本项目基于MIT License开源。在遵守协议的前提下,你可以自由地使用、修改或分发本软件。
- 内容版权:本软件仅作为下载工具。用户使用本软件下载的任何内容(包括但不限于视频、音频、封面),其版权归原作者或平台所有。
- 使用责任:用户需自行承担因使用本软件下载、传播版权内容而产生的任何法律责任。开发者不对用户的具体使用行为负责。
