Repository navigation
Releases: Downvid/downvid
Release list
v1.5.0
📦 下载对照表
| 平台 | 架构 | 安装包 |
|---|---|---|
| Windows | x64 | 安装版 .exe(推荐) |
| Windows | x64 | 便携版 .exe |
| macOS | Apple 芯片(M 系列) | .dmg(推荐) |
| macOS | Intel | .dmg(推荐) |
| Linux | x64 | .AppImage(推荐) |
| Linux | x64 | .deb |
| Linux | x64 | .rpm |
| Linux | arm64 | .AppImage |
运行依赖 yt-dlp / ffmpeg 不随安装包分发:启动后会自动识别机器上已安装的版本并复用,
识别不到时在「设置 → 运行依赖」里一键下载即可,无需提前手动安装。
🐳 Docker / NAS 用户
容器镜像发布在 GHCR(amd64 + arm64 多架构),不需要下载上面的安装包:
docker pull ghcr.io/Downvid/downvid:latest
# 或升级已有的容器
docker compose pull downvid && docker compose up -d downvid容器版不能自更新(进程跑在只读镜像层上),升级方式就是上面这两条命令;
界面里检测到新版本时也会给出它们。详见 docs/docker.md。
⚠️ 各平台注意事项
- Windows:安装版会创建开始菜单与桌面快捷方式;便携版解压即用,但不支持自动更新
- macOS:应用未做代码签名,首次打开需在「系统设置 → 隐私与安全性」中允许;Apple 芯片请勿选 Intel 版
- Linux:
.AppImage需先chmod +x;.deb/.rpm可通过包管理器安装
📝 更新内容
这一版同时发布两套产物:Electron 版(老用户走自动更新)与
Wails 版(新架构预览,手动下载,文件名前缀DownVid-Wails-)。
新增
- 新架构预览版(Wails):Go + Wails + Svelte,单文件约 18 MB(Electron 版 128 MB)。
依赖探测、解析、下载、历史、设置、更新检查全部走 Go 核心(app/internal/下 14 个包,
互相零依赖)。产物独立命名,不进老用户的更新通道。 - 过渡版能检测到新架构版本:设置 → 更新里会出现提示,显示可用的
DownVid-Wails-*
产物名。迁移由用户手动确认 —— 装上新架构后回不到 Electron,这是单向门。 - 直链下载器:抖音 / 快手的 CDN 直链走独立路径(分块队列、
.part断点续传、
429/503 降并发并遵守Retry-After)。这两家的直链有效期只有几分钟,
交给 yt-dlp 会二次请求平台接口、拿不到同一份地址。 - 代理真正生效:此前只有 yt-dlp 走
--proxy,应用自己的 HTTP(直链下载、
依赖下载、更新检查)全部直连。现在统一走internal/netx。
「测试」按钮也从「正则校验」改成真实连通性探测(带回延迟毫秒数)。 - 更新日志读真实 CHANGELOG:关于页的版本列表此前是硬编码的三条,
内容还是占位词条。现在解析内嵌的CHANGELOG.md,支持 Markdown 粗体 /
行内代码 / 链接,默认只显示标题、点开看展开说明。
修复
- 滑块拖不动 / 加速设置不生效:
updateSetting('key', value)被写成了
单参数签名,运行时把字符串按字符下标展开成{0:'m',1:'a',…},
一个字段都没改且不报错。同类问题还有 Go 侧的accelEnabled/
accelConnections只在启动时初始化、a.proxy从不从设置读回。 - 同链接不同清晰度无法再次下载:原来只比 URL,下过 1080P 就再也下不了 4K。
改为 URL + 清晰度 + 模式三项判定;文件名同时补清晰度后缀,
否则不同清晰度算出同名文件、yt-dlp 静默跳过却报成功。 - 续传用错格式:暂停后点「继续」读的是解析面板当前选中的格式,
而用户此时可能已经换视频了。改为把选择固化在任务上。 - YouTube 多音轨选择无效:
DownloadRequest里根本没有AudioTrack字段,
用户选了日语下下来还是默认音轨。 - 加速页永远显示「未找到 aria2」:后端 kind 是
aria2,前端按aria2c查找。 - 窗口拖不动、左上角被红绿灯压住:macOS 用
TitleBarHiddenInset(内容铺到顶部),
而顶栏没设成拖拽区。 - 关于页看起来「打不开」:实际是内容被右侧「传输」浮层盖住(窄窗口下
position: fixed且默认展开)。同时修了ChangelogHistory返回 nil 导致
整页白屏(Go 的 nil 切片 JSON 化是null,前端.length直接抛)。 - 「作者的话」永远停在打包那天:
fetchAnnouncement()早就写好了却从没被调用。
同时换掉已失效的ghproxy.com(它现在返回 301 跳首页,会被当成公告正文),
并加内容校验防止代理返回 HTML 被当 Markdown 解析。 - 粘贴按钮弹出权限框:
navigator.clipboard在 WebView 里要授权,
改为 Go 侧读系统剪贴板(pbpaste/Get-Clipboard/wl-paste)。 - 设置页的文件夹按钮是「打开」不是「选择」:点一下弹出 Finder,
想换保存位置只能自己敲路径。 - 依赖页只剩一条:Wails 版打出来的 app 里根本没有依赖边车
(Wails 没有 electron-builder 的extraResources)。改为内嵌进主二进制。
工程
- CI 七处长期红叉全清,五条工作流(Linux / macOS / Windows / Docker / CodeQL)全绿。
其中两处是真 bug:process_tree.go在 Windows 上根本编译不过
(syscall.Kill不存在)、runtime包的数据竞争(并行探测互相重置扫描预算,
go test -race抓到)。 - 新增三条 CI 检查:
svelte-check(.svelte里的类型错误,tsc看不见)、
lint:i18n:app(中英词条成对 / 无演示文案 /t()引用的 key 存在)、
sync:changelog(内嵌副本与根部 CHANGELOG 一致)。 - 删除
core/空壳目录(Wails 方案里可复用的核心是 Go 的app/internal/*)。
lint:boundaries改为守护 Go 分层:internal包之间不得互相 import。
完整历史见 CHANGELOG.md · 遇到问题请先看 故障排除
v1.4.0
📦 下载对照表
| 平台 | 架构 | 安装包 |
|---|---|---|
| Windows | x64 | 安装版 .exe(推荐) |
| Windows | x64 | 便携版 .exe |
| macOS | Apple 芯片(M 系列) | .dmg(推荐) |
| macOS | Intel | .dmg(推荐) |
| Linux | x64 | .AppImage(推荐) |
| Linux | x64 | .deb |
| Linux | x64 | .rpm |
| Linux | arm64 | .AppImage |
运行依赖 yt-dlp / ffmpeg 不随安装包分发:启动后会自动识别机器上已安装的版本并复用,
识别不到时在「设置 → 运行依赖」里一键下载即可,无需提前手动安装。
⚠️ 各平台注意事项
- Windows:安装版会创建开始菜单与桌面快捷方式;便携版解压即用,但不支持自动更新
- macOS:应用未做代码签名,首次打开需在「系统设置 → 隐私与安全性」中允许;Apple 芯片请勿选 Intel 版
- Linux:
.AppImage需先chmod +x;.deb/.rpm可通过包管理器安装
📝 更新内容
新增
- 关于页新增官网入口,以及赞助 / 商务合作接洽方式:关于页原来只有 GitHub 与「问题反馈」两个入口,
想找官网或谈合作只能去翻 README。现在多一个官网入口(下载安装包、看功能介绍),
并在「支持 DownVid」里列出赞助支持与商务合作(广告位)两个邮箱入口,点开即带好邮件主题。
官网、README 与关于页用的是同一个地址(shared/app.ts的CONTACT_EMAIL),
新增tests/app-links.test.ts与lint:website的一致性校验——邮箱写错不会报错,
只是信寄不到,要等对方放弃才知道 - 界面支持中英双语:此前界面是 1217 处硬编码中文(29 个文件),海外用户装上就是纯中文界面。
现在 254 条词条 × zh-CN / en-US,t()读响应式 ref,切换语言立即重渲染;设置里新增
「界面语言」(默认「跟随系统」),选择器放在「下载」分区最上面——海外用户第一件事就是找它。
刻意不引 vue-i18n:只有两种语言、没有复数/日期格式化需求,与「不引 ESLint/Prettier」同一套理由。
新增pnpm lint:i18n并挂进三个ci-*.yml,拦下四类不会报错的失效:词条缺英文
(该处永远显示中文)、占位符集合不一致(永远显示{count})、t()用了不存在的键
(界面直接显示 key)、src/下新写的硬编码中文 - 官网下载按钮按系统直链安装包:打开页面即识别系统(Chrome / Edge 还能读到芯片架构),
主按钮直接指向releases/latest里对应的产物直链——点一下就下载,不再跳到 Releases 页面。
同平台的其他格式(便携版、Intel 版、deb / rpm)在展开菜单里;识别不准或拉取失败一律退回
Releases 页面,不留死链。平台图标也换成各系统的标准品牌标识 - 官网按参考 deepseek.com/harness 重做版式:居中 hero + 大预览图、两列卡片网格、
「安装与运行」代码块(带复制按钮)、居中的社区 CTA、极简页脚;顶栏改成浮动圆角胶囊,
滚动时钉在顶部并加深底色,且去掉了「功能 / 下载 / FAQ / GitHub」那排导航链接
(页面一路往下滑),品牌在左、中英切换在右。顶栏有两种形态:贴顶时是通栏细条(原样),
往下滑超过 12px 才收成浮动圆角胶囊并钉住,滑回顶部自动还原;下载按钮改为分体按钮,
主按钮直链当前系统的安装包,右侧箭头展开全部平台与格式;「查看源码」补上 GitHub 品牌图标。
配色仍取自应用本身 - 官网「能做什么」的卡片改成和桌面端一样能点:平台 / 画质 / 浏览器分组单选(画质会带出
对应体积)、下载加速可以开始 / 暂停并让进度条走起来、依赖识别逐个检出、「检查更新」用
真实拉到的最新版本号作答。纯前端演示,不联网改状态 - 官网 hero 的预览图换成应用主界面的可交互复刻:结构 / 文案 / 配色照
src/components/
的下载界面组件搬过来,解析视频信息、格式单选、立即下载(任务进右侧队列并跑进度)、
下载历史 / 关于软件 标签页都能点;默认就停在「已粘贴 + 已解析 + 正在下载」的样子,
缩略图用原链接的预览图(src/assets/demo-thumb.jpg)。画布按应用窗口的 1100px 宽度设计再
等比缩放,lint:website会比对复刻里抄来的@theme颜色 token - 官网下载量与星标改用 README 同款 shields.io 徽章,数字实时,不再需要发布后手动刷新;
原先的scripts/gen-website-stats.mjs(pnpm website:stats)已删除 pnpm lint:website新增校验,拦的是本地看不出来的失效:页面脚本里的仓库坐标、
下载产物名模板与electron-builder.json5的artifactName是否一致、脚本拼装文案的
中英词条是否成对、shields.io 徽章里的仓库坐标是否正确;另加
tests/website-download.test.ts(36 例),用真实产物列表(含.blockmap、latest*.yml
等干扰项)钉住「哪个系统拿哪个包」与菜单分组
修复
- 依赖探测可能挂住几十秒到几分钟:超时后只杀直接子进程,而候选可能是
shell 脚本或 PyInstaller 启动器,其孙进程仍持有 stdout 管道,cmd.Run()
会一直等 I/O。实测一个sleep 300的假二进制把 5 秒预算的探测拖成 300 秒;
用户侧表现是界面卡住、最后报「依赖检测达到时限」。现在用cmd.WaitDelay
兜住管道(单元测试里真实复现并回归) - 卡死的系统副本会拖垮整次检测:候选执行预算改为按来源区分——
托管副本 15 秒(官方 macOS 构建首次执行最慢实测 12.4 秒),系统副本 5 秒
(通常是 0.2 秒的 zipapp)。此前一律 15 秒,候选表里十几个路径时最坏能把
一次检测拖到几分钟。这个问题由 CI 的 Windows 原生回归抓出 - 浏览器 Cookie 库读不出来时整个解析直接失败(#53):yt-dlp 会在浏览器目录下挑最新的那个
Cookies文件来读,它若是空库、不是 SQLite 或拷贝时损坏,yt-dlp 只打出 sqlite3 的原始异常
(如ERROR: no such table: meta)。这类报错此前不算「Cookie 读取失败」,于是不换来源,
后面的浏览器、快照和「不带 Cookie」一个都轮不到。现在照常换来源:不需要登录的视频直接解析成功,
该浏览器十分钟内跳过;确实需要登录时给出 Cookie 提示。下载走同一套回退,一并修复。
四种报错形态都用真实 yt-dlp 复现过
工程
-
README 与官网都加上赞助 / 商务合作入口:README 顶部导航行与正文各放一处,
官网在「加入开源社区」之后新增独立区块。两处都写明软件本身不含任何广告——
README 的卖点里有「无任何弹窗广告」,只加合作入口而不作区分,读者会以为要往安装包里塞广告 -
CI 按平台拆成三个工作流(
ci-linux/ci-windows/ci-macos):
失败时一眼看出是哪个平台哪一层,Windows/macOS 排队也不再拖住 Linux 的结论。
macOS 侧新增三项只有那里能验的检查:产物确实未签名、边车在本机能执行且架构正确、
Info.plist 版本与 package.json 一致(不一致会让用户永远看到「有新版本」)。 -
新增三层回归脚本(此前完全没有自动化覆盖):
test:updater(14 例,
更新流程)、test:settings:migration(15 例,设置兼容)、
test:package(9 例,真实打包产物内容)。含公共骨架scripts/lib/harness.mjs。 -
发布流程新增 gate job:全量测试通过才允许构建;新增
prerelease选项,
让测试版本不进稳定用户的更新通道。 -
设置读取统一到
readSettings():此前deps.ts/download.ts/
DownloadView.vue各复制了一份读法,filenameTemplate因此出现过两个不同的默认值。 -
scripts/test-parse-integration.mjs此前从未接进任何工作流(能通过但没人跑),
现已挂上。 -
版本与清单一致时仍显示「更新」按钮:界面只看「该依赖由 DownVid 托管」就渲染
「更新」,与版本无关。用户点下去白下 37MB,下完还是同一个版本,看起来像更新失败。
现在由后端回传requiredVersion,界面用isOutdated()比对当前版本与清单要求,
一致时显示「已是最新」;只有确实落后才给「更新」。系统自带的那份永不提示更新
(覆盖它会踩到用户的包管理器) -
更新检查失败时会静默回答「已是最新」:
electron-updater走
releases.atom+/releases/latest两步,任一环节被网络或限流打断就进 catch,
而 catch 里直接返回hasUpdate: false—— 用户看到的就是「检测不到新版本」。
现在失败时改用 GitHub API 兜底(只需一个请求),两条路都失败才如实报错 -
更新流程一条日志都不写,打包应用出问题只能靠猜。现在检查的每个阶段
(开始 / 缓存复用 / 结果 / 兜底 / 失败)都写进userData/downvid.log
完整历史见 CHANGELOG.md · 遇到问题请先看 故障排除
v1.3.4
📦 下载对照表
| 平台 | 架构 | 安装包 |
|---|---|---|
| Windows | x64 | 安装版 .exe(推荐) |
| Windows | x64 | 便携版 .exe |
| macOS | Apple 芯片(M 系列) | .dmg(推荐) |
| macOS | Intel | .dmg(推荐) |
| Linux | x64 | .AppImage(推荐) |
| Linux | x64 | .deb |
| Linux | x64 | .rpm |
| Linux | arm64 | .AppImage |
运行依赖 yt-dlp / ffmpeg 不随安装包分发:启动后会自动识别机器上已安装的版本并复用,
识别不到时在「设置 → 运行依赖」里一键下载即可,无需提前手动安装。
⚠️ 各平台注意事项
- Windows:安装版会创建开始菜单与桌面快捷方式;便携版解压即用,但不支持自动更新
- macOS:应用未做代码签名,首次打开需在「系统设置 → 隐私与安全性」中允许;Apple 芯片请勿选 Intel 版
- Linux:
.AppImage需先chmod +x;.deb/.rpm可通过包管理器安装
📝 更新内容
修复
- 下载运行依赖后仍显示「下载」、根本无法使用(紧急):用户点「下载」看着进度条跑完,
界面仍然显示「下载」,反复点也没用。根因不在下载而在下载后的回读:
yt-dlp 的 macOS 官方构建是 PyInstaller 打包的(约 37MB),--version本机实测要
8~10 秒,刚下载完的首次执行最慢 12.4 秒(ad-hoc 签名校验与页面缓存都还没热);
而探测单个候选只有 3 秒预算,于是刚装好的托管副本被判为
「执行超时,文件可能损坏」而被跳过,结果回落到系统里的旧版本(或直接报缺失)。
Homebrew / uv 装的是 Python zipapp,0.2 秒就能应答——所以只有
「没有可用系统副本、必须走托管副本」的机器会踩到。现在:- 单候选预算 3 秒 → 15 秒;每个依赖 15 → 30 秒;检测总时限 45 → 80 秒
(Electron 侧 60 → 90 秒),扫描预算 3 → 18 秒 - 超时后重试一次:暖机后 8~10 秒即可应答,避免「第二次点才行」的体验
- 超时提示不再断言「文件可能损坏」——下载好的文件同样会超时,
这个措辞会把人引向反复重下(见 AGENTS.md 的「运行依赖」一节,
这几个数字不要再随手调小)
- 单候选预算 3 秒 → 15 秒;每个依赖 15 → 30 秒;检测总时限 45 → 80 秒
完整历史见 CHANGELOG.md · 遇到问题请先看 故障排除
v1.3.3
📦 下载对照表
| 平台 | 架构 | 安装包 |
|---|---|---|
| Windows | x64 | 安装版 .exe(推荐) |
| Windows | x64 | 便携版 .exe |
| macOS | Apple 芯片(M 系列) | .dmg(推荐) |
| macOS | Intel | .dmg(推荐) |
| Linux | x64 | .AppImage(推荐) |
| Linux | x64 | .deb |
| Linux | x64 | .rpm |
| Linux | arm64 | .AppImage |
运行依赖 yt-dlp / ffmpeg 不随安装包分发:启动后会自动识别机器上已安装的版本并复用,
识别不到时在「设置 → 运行依赖」里一键下载即可,无需提前手动安装。
⚠️ 各平台注意事项
- Windows:安装版会创建开始菜单与桌面快捷方式;便携版解压即用,但不支持自动更新
- macOS:应用未做代码签名,首次打开需在「系统设置 → 隐私与安全性」中允许;Apple 芯片请勿选 Intel 版
- Linux:
.AppImage需先chmod +x;.deb/.rpm可通过包管理器安装
📝 更新内容
修复
- 贡献者列表报 403:原先启动时请求 GitHub 的
/contributors与/commits,
而未认证请求限额是 60 次/小时且按来源 IP 共享 —— 一次刷新 3 个请求,
多人共用出口 IP 时很容易耗尽。现改为固定名单,不再请求接口:
稳定、离线可用、也没有失败态 - 「继续下载」点了没反应、任务卡在「下载中」:
resumeTask先把状态置为
downloading,而processProcess开头的守卫正是拒绝该状态,把自己挡了回去 - 字幕任务「继续下载」报
An object could not be cloned:subtitles恢复时
来自响应式对象(Vue Proxy),而 Proxy 无法被 structured clone - 直链断点续传与暂停竞态(@hailaij):保留
.part与逐段检查点,恢复时只请求
未写入范围;校验 URL / 总长度 / ETag / Last-Modified / 文件长度 / 分段布局,
不把预分配长度当作完成进度;快速恢复时旧结果不再覆盖新任务 - 文件名模板重复追加扩展名(@hailaij):模板已含
%(ext)时不再补 - 下载目录生效时机(@hailaij):新任务立即读取最新目录,暂停任务保留原目录以续用片段
- 国内网络下应用完全打不开(@jwfstars):字体样式表改为异步加载,
不再阻塞首屏脚本执行
新增
- 可配置的下载加速(@hailaij):直链改为小块工作队列(默认 8 路、上限 16 路),
快连接不必等慢连接;可选 aria2c(>= 1.36)用于 yt-dlp 的 HTTP 多连接,
缺失自动回退内置、不自动安装、不改系统 PATH。含 429/503 降并发与 Retry-After 等待、
30 秒无数据超时重试、aria2 片段隔离。本地受控场景实测约为旧四段实现的 1.88 倍
(不是对真实站点速度的承诺 —— 多连接解决不了服务器总限速、总带宽与 DRM) - 自动更新可显式控制:设置里新增「更新」分区 —— 「启动时自动检查更新」(默认开)
与「发现新版本时自动下载」(默认关)。此前自动更新是隐式的:启动 3 秒后静默检查一次,
用户既看不到也关不掉 - 关于页贡献者改为固定名单 + 格子布局:不再显示提交次数(那是个会变的数字),
也不再需要缓存与失败态 - 产品官方落地页(Vercel 静态托管):新增
website/单文件落地页(无第三方打包依赖、响应式、纯前端双语),由vercel.json托管静态目录并以 Vercel 的 Git 集成自动发布,提供直观的跨平台下载与功能介绍 - 官网展示累计下载量:hero 增加「已被下载 N 次」,数字取 GitHub Releases 全部产物的
download_count之和。
刻意不做实时拉取(官网零第三方依赖,且未认证 API 限额按出口 IP 共享,见上一节),
改为pnpm website:stats一条命令刷新
改进
- 更新弹窗里正确渲染 Markdown:此前
v-html直接把 Release 正文当 HTML 显示,
而它是 Markdown,于是### 修复、- **…**原样显示成一大坨纯文本。
现用marked转换,并关掉breaks(否则 CHANGELOG 里 ~80 字符的手工折行
会被当成硬换行,一段话被切成好几行) - 关于页区块顺序调整为「贡献者 → 开源组件 → 技术栈 → 开源协议 → 支持」,顶部描述精简
- 真人贡献者此前没有任何身份标(只有 DEV / BOT / AI),现补上
CONTRIBUTOR - README 徽章与视觉全面升级:
- 徽章栏全线升级为带品牌官方矢量 Logo 与专属配色(Downloads、Release、Stars、AlternativeTo、CodeQL、License)
- 中英文 README 项目简介(About)大幅充实扩展,结构化呈现跨平台与无水印下载亮点
- 新增
### 贡献者动态头像网格(contrib.rocks),展示社区贡献者 - 新增 AlternativeTo 软件条目收录链接与 CodeQL 自动化安全扫描状态
- 补充 OpenGraph 社交预览卡片与生成脚本(
scripts/gen-social-preview.mjs)
package.json补齐中英双语详细描述与搜索关键词标签(keywords)
工程
Dependency Review在仓库未开启 Dependency graph 时不再报错,改为给出明确提示并跳过
(该开关只能手动在网页设置里打开,GitHub API 不提供)。此前多位贡献者被这个红叉误导- 删除已无用的
electron/utils/contributors.ts(163 行)与相关 IPC、缓存、脚本 - 删除
Deploy website工作流(pages.yml):仓库从未在 Settings → Pages 里选过发布源,
actions/configure-pages因此每次都稳定报Get Pages site failed,却没有任何东西依赖它。
官网改由 Vercel 的 Git 集成发布,原先那套站点自检(引用资源存在、中英词条成对)
重写成可本地运行的pnpm lint:website,挂到test.yml的 frontend job——
官网的坑是「改完不报错、线上才裂」,值得留在 CI 里而不是随工作流一起删掉
完整历史见 CHANGELOG.md · 遇到问题请先看 故障排除
v1.3.2
📦 下载对照表
| 平台 | 架构 | 安装包 |
|---|---|---|
| Windows | x64 | 安装版 .exe(推荐) |
| Windows | x64 | 便携版 .exe |
| macOS | Apple 芯片(M 系列) | .dmg(推荐) |
| macOS | Intel | .dmg(推荐) |
| Linux | x64 | .AppImage(推荐) |
| Linux | x64 | .deb |
| Linux | x64 | .rpm |
| Linux | arm64 | .AppImage |
运行依赖 yt-dlp / ffmpeg 不随安装包分发:启动后会自动识别机器上已安装的版本并复用,
识别不到时在「设置 → 运行依赖」里一键下载即可,无需提前手动安装。
⚠️ 各平台注意事项
- Windows:安装版会创建开始菜单与桌面快捷方式;便携版解压即用,但不支持自动更新
- macOS:应用未做代码签名,首次打开需在「系统设置 → 隐私与安全性」中允许;Apple 芯片请勿选 Intel 版
- Linux:
.AppImage需先chmod +x;.deb/.rpm可通过包管理器安装
📝 更新内容
修复
-
Windows(及所有 x64 平台)无法下载运行依赖:平台键用的是 Go 命名
(windows/amd64)而资产表是 electron-builder 命名(win32/x64),查表必然失败,
点「下载」报「暂不支持 windows/amd64 平台的 yt-dlp 下载」。三个 x64 平台都受影响,
arm64 只因两种命名恰好一致而正常 -
「继续下载」点了没反应、任务卡在「下载中」:
resumeTask先把状态置为
downloading,而processDownload开头的守卫正是拒绝该状态,于是把自己挡了回去 -
字幕任务「继续下载」报
An object could not be cloned:subtitles在恢复时
来自响应式对象(Vue Proxy),而 Proxy 无法被 structured clone。现统一在交给 IPC
前做一次拍平(toPlainData),不再逐字段展开——逐字段太容易漏 -
在设置里点「保存」会丢失依赖的手动指定路径:设置面板与依赖面板各写各的整个
settings对象,前者字段里没有depPaths,整体覆盖时把它抹掉。现改为合并写入
(新增src/stores/settings.ts),并统一了全部 6 个写入点 -
winget 装的依赖检测不到:候选目录只覆盖用户级的
WinGet\Links,漏掉了
WinGet\Packages(zip + nested portable 真正解压的位置)与机器级
(--scope machine)的整套路径 -
国内网络下应用完全打不开(纯白窗口):
index.html里的 Google Fonts 是跨域且
render-blocking 的样式表,当fonts.googleapis.com请求一直 pending(国内直连基本必挂)时,
Chromium 会连带阻塞后面的<script type="module">,Vue 永不挂载 —— 窗口停在纯白,
日志里连did-finish-load都不出现。改为media="print"+onload异步加载,
连不上时回退到系统字体栈(感谢 @jwfstars) -
依赖探测会把「执行失败的文件」当成可用:原先只要输出了版本号就认,不看退出码;
现在要求命令成功退出且版本格式匹配。同时给检测加了总时限(45 秒 / 单依赖 15 秒 /
单候选 3 秒),避免依次等待多个候选时超过 Electron 的 60 秒超时 -
损坏或过旧的副本会遮蔽正常版本:扫描遇到不可用的同名副本后继续遍历,而不是直接放弃
-
Windows 的 WinGet / Scoop / Chocolatey 路径改为读实际环境变量,支持自定义目录与
迁移后的LOCALAPPDATA;补齐 WinGet 用户级与机器级、Scoop、.deno/bin的查找 -
Windows 上暂停后仍在继续下载:先杀 yt-dlp 父进程再
taskkill /T时,
PyInstaller 子进程可能存活并继续下载(界面已显示暂停、文件却最终下完)。
现改为先终止完整进程树并等待退出;恢复任务会等待暂停请求完成,避免旧调用清理复用
taskId 的新任务(感谢 @hailaij) -
下载历史出现重复记录 / 文件状态不同步:历史改为按本地文件合并,并同步文件是否存在
(感谢 @hailaij)
新增
- 依赖的保底扫描:已知位置都没命中时,在常见目录做一次有界扫描,
避免"明明装了却提示缺失"。结果标记为「扫描发现」并以不同颜色显示。
三道闸限制耗时:深度 4 层、目录数 3000、wall-clock 3 秒
修复
- 在设置里点「保存」会丢失依赖的手动指定路径:设置面板与依赖面板各写各的整个
settings对象,而设置面板的字段里没有depPaths,整体覆盖时把它抹掉。
现改为合并写入(新增src/stores/settings.ts),并统一了全部 6 个写入点——
这类"每加字段就要改所有写入点"的 bug 不会再出现 - winget 装的依赖检测不到:候选目录只覆盖
WinGet\Links,漏掉了
yt-dlp.FFmpeg这类 zip + nested portable 真正解压出来的WinGet\Packages路径
新增
- 依赖的保底扫描:已知安装位置都没命中时,会在常见目录(下载/桌面/文档、
Homebrew、Program Files 等)做一次有界扫描,避免"明明装了却提示缺失"。
扫描结果标记为「扫描发现」并在界面上以不同颜色提示,便于判断来源。
限制深度、访问条目数与跳过目录,不会拖慢启动
修复
An object could not be cloned:开始下载时把手动的响应式数组(Vue Proxy)直接传给了
主进程,而 structured clone 无法克隆 Proxy,因此报错。IPC 载荷统一拍平为普通对象/数组- 缺依赖的提示出现时机不对:开始下载前会
await deps.refresh()——它会启动 Go 边车做一次
完整探测(冷启动 1~3 秒),用户每次点下载都要白等,且提示可能落在"正在提取元数据"之后。
元数据解析本就不需要 ffmpeg(只需要 yt-dlp,而解析成功已证明它可用),因此改为读已有缓存
状态,不重新探测 - 暂停后按钮消失、只能重新下载:主进程在暂停时返回
{ paused: true },但界面无条件把
结果标成"已完成";且 pause 之后残留的 completed 进度事件会把状态覆盖回去、清掉暂停标记 - 下载历史出现重复记录:此前无论成功、暂停还是失败都写入历史,现在只在确实拿到文件时写
改进
- 下载速度大幅提升:此前只对分片流(HLS/DASH)做了并发,而 YouTube 等站点给的是
单个 mp4 直链,走单连接,会被 CDN 限速。改为分块请求后,同一个 17.6 MB 文件实测
从 109 秒(0.16 MB/s)降到约 3 秒(5 MB/s 量级),快 30 倍以上。
对不支持分块的服务器会自动退化为普通下载
致谢
这一版有三位社区贡献者提交了高质量的修复,质量与自证程度都值得记录:
- @jwfstars(#41)
修掉了国内网络下应用完全打不开的问题。报告里用 headless Chrome 做了对照实验,
用一个「accept 之后永不响应」的本地服务冒充被墙的字体域名——比 connection refused
更贴近真实情况——并给出readyState/#app的前后对比。这种复现方式比我自己的
第一版尝试更准确。 - @hailaij(#42、#44)
连续提交了三处 Windows 相关的修复(依赖探测与时限、损坏副本不再遮蔽正常版本、
暂停时终止完整进程树),并实际安装构建产物做真机验收:下载 30 MB 文件核对
暂停/续传后的 SHA-256 一致、确认 yt-dlp 父子进程确实退出。同时给 Windows CI 加了
原生 exe 集成回归,还如实标注了未覆盖范围(仅公开 MP4 / Generic 路径)。
他们都在 PR 里做了变异验证(破坏被测逻辑确认用例会失败),这与本仓库的约定一致。
完整历史见 CHANGELOG.md · 遇到问题请先看 故障排除
v1.3.1
📦 下载对照表
| 平台 | 架构 | 安装包 |
|---|---|---|
| Windows | x64 | 安装版 .exe(推荐) |
| Windows | x64 | 便携版 .exe |
| macOS | Apple 芯片(M 系列) | .dmg(推荐) |
| macOS | Intel | .dmg(推荐) |
| Linux | x64 | .AppImage(推荐) |
| Linux | x64 | .deb |
| Linux | x64 | .rpm |
| Linux | arm64 | .AppImage |
运行依赖 yt-dlp / ffmpeg 不随安装包分发:启动后会自动识别机器上已安装的版本并复用,
识别不到时在「设置 → 运行依赖」里一键下载即可,无需提前手动安装。
⚠️ 各平台注意事项
- Windows:安装版会创建开始菜单与桌面快捷方式;便携版解压即用,但不支持自动更新
- macOS:应用未做代码签名,首次打开需在「系统设置 → 隐私与安全性」中允许;Apple 芯片请勿选 Intel 版
- Linux:
.AppImage需先chmod +x;.deb/.rpm可通过包管理器安装
📝 更新内容
修复
- 点击解析后额外多开一个 DownVid(严重):YouTube 解析时会把 Electron 二进制
当作 JS 运行时交给 yt-dlp(并误标为deno),yt-dlp 执行它于是又拉起了一整个应用。
现在只使用真正的 node / deno,并新增单实例锁——重复启动只会聚焦已有窗口 - 应用内更新弹窗混入下载引导区:更新弹窗此前会把 Release 正文里的下载徽章、
平台对照表一并显示(渲染成一堆图片链接)。现在只显示真正的更新内容
完整历史见 CHANGELOG.md · 遇到问题请先看 故障排除
v1.3.0
📦 下载对照表
| 平台 | 架构 | 安装包 |
|---|---|---|
| Windows | x64 | 安装版 .exe(推荐) |
| Windows | x64 | 便携版 .exe |
| macOS | Apple 芯片(M 系列) | .dmg(推荐) |
| macOS | Intel | .dmg(推荐) |
| Linux | x64 | .AppImage(推荐) |
| Linux | x64 | .deb |
| Linux | x64 | .rpm |
| Linux | arm64 | .AppImage |
运行依赖 yt-dlp / ffmpeg 不随安装包分发:启动后会自动识别机器上已安装的版本并复用,
识别不到时在「设置 → 运行依赖」里一键下载即可,无需提前手动安装。
⚠️ 各平台注意事项
- Windows:安装版会创建开始菜单与桌面快捷方式;便携版解压即用,但不支持自动更新
- macOS:应用未做代码签名,首次打开需在「系统设置 → 隐私与安全性」中允许;Apple 芯片请勿选 Intel 版
- Linux:
.AppImage需先chmod +x;.deb/.rpm可通过包管理器安装
📝 更新内容
升级提示:本版起安装包不再内置 yt-dlp 与 ffmpeg。升级后如果机器上没有这两个工具,
DownVid 会在「设置 → 运行依赖」中提示,点一下即可自动下载安装(带 SHA-256 校验)。
如果你已用 Homebrew / winget / apt 等装过,会自动识别并直接复用,无需任何操作。
重要变更
- 安装包不再内置 yt-dlp 与 ffmpeg,改为运行时按「系统优先,缺失才下载」的顺序解析:
手动指定的路径 → DownVid 托管目录(userData/runtime/bin/)→ 登录 shell 的 PATH 与
各平台常见安装目录(Homebrew / MacPorts / scoop / winget / apt)→ 裸命令名。
代价是首次使用若两侧都没有,需要点一下「下载」;收益是安装包体积减小约 30%
(macOS arm64 从 182.6 MB 降到 128.8 MB),且不再重复占用磁盘 - 仓库移除
bin/目录与 Git LFS 追踪(此前.git已膨胀到 804 MB)
新增
- 运行依赖管理:「设置 → 运行依赖」显示每个依赖的版本、来源(系统安装 / DownVid 托管 /
手动指定)、完整路径与未找到的原因;支持逐个下载、更新、取消与打开安装目录 - 缺依赖时一键下载引导:启动检测、解析失败、开始下载前三处都会拦截并给出下载入口,
而不是丢一句「未找到 yt-dlp」让用户自己猜 - 依赖下载带 SHA-256 校验,先校验后解压安装,写入 DownVid 自己的目录,不污染系统;
macOS 上自动去除隔离属性并做 ad-hoc 签名(否则 Apple Silicon 会直接killed: 9) - 进阶设置可手动指定 yt-dlp / ffmpeg / ffprobe 的绝对路径
- Cookie 使用引导浮窗:说明自动读取与手动导入两种方式,并提供一键跳到 Cookie 设置;
不再跳转仓库 wiki - 关于页新增「开源组件」致谢(Material Symbols / yt-dlp / FFmpeg 等及其许可)
- 新增
pnpm deps:manifest与「更新运行依赖清单」工作流:从上游抓取版本号与 SHA-256
修复
- macOS 上 Logo 不显示:Header 为避让原生红绿灯按钮留出了左内边距,但 Logo 被
v-if="!isMac"排除了,那块位置一直空着 - Windows 多出一条菜单栏:应用菜单在所有平台注册,而 Windows/Linux 的 Electron 会把它
渲染成窗口内的菜单栏,与自绘标题栏重复;改为仅 macOS 注册 - Cookie 提示误报:此前仅按 URL 域名就提示「需要 Cookie」,即使用户已配好、上次解析也
成功读到登录态;现在依据真实的 Cookie 来源状态决定是否提示 - macOS 读取 Safari Cookie 失败会导致整个解析失败:权限错误
(Operation not permitted ... Cookies.binarycookies)未被识别为「Cookie 读取失败」,
因而没有退到下一个浏览器来源。现会正确跳过并继续尝试 - 任务队列的文件夹图标点了没反应:用的是"用系统程序打开文件"(视频会直接播放)而不是
定位目录,且失败时静默;改为在文件管理器中定位并选中,失败时给出提示 - 代理测试结果不可信:原实现没有真正走代理(用全局 fetch,既不读参数也不读环境变量),
实际只在测「本机能否直连 google.com」——代理挂掉也会报成功。现改为通过一次性 session
真实请求,并加直连对照与错误原因翻译 - 界面路径暴露用户名:下载目录等改为显示成
~/Downloads/DownVid,悬停仍可看到完整路径 - 解析进度条此前是虚构的百分比(与真实进度无关),改为不确定进度条 + 已用时间
- 检查更新重复点击每次都发请求:加 60 秒结果缓存与并发合并,下载完成后失效缓存
- 图标字体改为内嵌,修掉离线或网络受限时图标退化成文字的问题;并修复
high_definition(不是有效的 Material Symbols 名,会渲染成文字「HIGH_DEFINITION」)
改进
- 应用菜单(仅 macOS)新增「设置…」⌘,
- 设置改为居中模态浮窗(与错误 / 更新提示同一形态),并修掉打开慢的问题:
依赖探测曾阻塞首帧渲染(需启动 Go 边车,冷启动 1~3 秒),现改为后台进行 - 打包排除 asar 内的
node_modules(依赖已被内联进构建产物),asar 40 MB → 3.8 MB - 图标、按钮与状态标签补齐图标;技术栈徽章更新并补上 Go 与 Vitest
文档与工程
- 新增安全政策、贡献者行为准则、
仓库规范、发布流程、项目结构、
.github/CODEOWNERS - Release 正文顶部新增「点徽章即下载」引导区,链接按实际产物生成,不会死链
- 文档记录真实的下载量口径:release 资源下载量总和会被
latest*.yml(每次检查更新都请求)
与*.blockmap(仅自动更新)放大,不能直接当作装机量 - 明确不引入客户端匿名统计,理由与替代口径见
docs/release.md - CI 新增 CodeQL 扫描、依赖审查、Go 检查、单元测试与图标名 / IPC 契约校验
- 引入 Vitest 与 57 个纯逻辑单测(格式选择、依赖错误识别、yt-dlp 参数组装、
解析器共用工具、Cookie 错误识别) - 拆分超长文件:
electron/ipc/download.ts445 → 95 行;
UpdateModal.vue467 → 344 行(更新状态机抽为composables/useUpdater.ts);
抖音与快手抽出共用的parsers/shared.ts - 仓库坐标与外部链接集中到
shared/app.ts(此前散落 9 处) - 修正架构文档中已不存在的内置二进制描述
移除
bin/目录、bin/download-deps.sh与pnpm download-deps*脚本- 「更新二进制」工作流(由「更新运行依赖清单」取代)
- 解析页的「支持解析平台」区块(占版面,信息已在文档中)
完整历史见 CHANGELOG.md · 遇到问题请先看 故障排除
v1.2.1
修复
- macOS 上解析全部失败,报
EEXIST: file already exists, mkdir '.../downvid/cookies'(#31):macOS/Windows 文件系统不区分大小写,Cookie 快照目录cookies与 Electron 自身的Cookies数据库文件冲突。目录改名为ytdlp-cookies;目录不可用时退回系统临时目录,仍不可用则不导出快照;Cookie 准备阶段的任何异常只跳过该来源,不再导致解析失败 - 浏览器 Cookie 读取失败(如 Windows 上 Chrome 运行中报
Could not copy Chrome cookie database,#9)时,解析不再整体失败而是继续尝试其他来源;若视频最终仍需要登录,错误弹窗会给出具体解决办法(退出浏览器重试、改用 Firefox 登录、手动导入 cookies.txt)
v1.2.0
新增
- 抖音/快手直链支持多连接分段下载(CDN 限速场景下提速约 4 倍),分段失败自动断点重试,并支持暂停
- HLS/DASH 分片并发下载;下载直接复用解析结果,不再重复解析,开始下载更快
- 下载进度显示速度、剩余时间与文件大小(此前这些字段始终为空)
- 应用内更新:macOS 支持自动下载安装(自动去除隔离属性并重新签名,安装失败自动回滚);启动时自动移除应用自身的隔离属性
- 便携版、tar.gz 等不支持自动安装的方式,检测到新版本时引导前往下载页
- 关于页完整展示所有贡献者,包含匿名作者、Bot 与 AI 共同作者
- Windows 便携版随版本一同发布(
DownVid-Portable-x.y.z.exe)
修复
- X (Twitter) 视频无法下载:解析时格式被全部过滤;下载时选择器退化为只下载音频;多视频推文解析失败;访客接口失败时自动回退
- 浏览器 Cookie 读取失败(Chrome 运行中锁库、Windows 解密失败、macOS 钥匙串等)导致解析/下载整体失败:现依次尝试各浏览器 → Cookie 快照 → 无 Cookie,并在下载时复用解析时的 Cookie
- Linux 内置 ffmpeg 读取 MPEG-TS 时崩溃,HLS 视频合并全部失败
- macOS Apple Silicon 内置的 ffmpeg 实为 x86_64 版本(需 Rosetta 转译,合并缓慢,无 Rosetta 时失败),替换为原生 arm64
- 存储空间始终显示"未知"(Windows 11 24H2 已移除 wmic;下载目录不存在时查询失败;目录切换后不刷新)
- 应用内更新:下载完成后界面一直停留在"正在下载";启动自动检查新版本不弹窗;检查时即在后台静默下载;更新请求不走设置的代理
- Windows 自动更新校验失败:安装包被同名便携版覆盖,与更新清单不一致(旧版本升级到本版本起恢复正常)
- Linux deb/rpm 安装无法自动更新:更新清单缺少对应安装包
- 贡献者头像上的 DEV/BOT 标签与悬停名称被裁切不可见
- 依赖升级后构建失败:TypeScript 回退至 5.x(vue-tsc 不支持 TypeScript 7),样式迁移至 Tailwind CSS v4
- 设置面板左侧导航选中项背景色此前未生效
变更
- 内置 yt-dlp 更新至 nightly 2026.09.16,ffmpeg 更新至 8.1(Windows/Linux)
- 更新失败时给出具体原因(网络、校验、限流、权限、磁盘空间),并提供重试与"前往下载页手动更新"
说明
- macOS 1.1.0 及更早版本的应用内更新依赖代码签名,无法完成,请手动下载安装一次本版本,此后即可应用内自动更新
- Windows 与 Linux (AppImage/deb/rpm) 旧版本可直接通过应用内更新升级
v1.1.0
新增
- 自定义错误弹窗:可复制错误信息 + 一键提交 GitHub Issue
- 代理设置:全局代理支持 http/https/socks5,保存即生效,带连接测试
- 启动时自动检查更新,有新版本自动弹窗提醒
- 解析结果缓存:同一 URL 30 分钟内重复解析秒出
- 任务队列实时显示磁盘可用空间
- 贡献者页面显示 Bot 标签和开发者标签
- macOS/Windows/Linux 窗口行为适配:自定义标题栏、拖拽、窗口控制按钮
- 设置页面改为右侧浮层面板 + 左侧栏分类导航(下载/Cookies/代理)
- 解析结果分辨率标签智能清理:自动将
1080p60、hd1080、sd480等格式转为标准显示 - Puppeteer 浏览器实例复用池,解析速度大幅提升
- GitHub Dependabot 自动依赖更新
修复
- 下载任务 status 误设为 downloading 导致 IPC 调用永不执行
- 下载历史"打开文件夹"在 macOS 上路径错误(Windows 路径分隔符问题)
- 进度条超过 100% 的问题
- 进度条动画平滑度优化(指数衰减)
- 文件大小估算逻辑:优先使用平台提供的 quality_label 而非像素推算
- 下载进度实时更新:stderr 进度解析 + 本地速度计算兜底
- 所有 alert() 替换为自定义弹窗
- 解析流程添加顶层 try-catch,防止未捕获异常导致 renderer 崩溃
- Renderer 崩溃后自动重载
变更
- 进度更新节流从 500ms 降至 200ms
- yt-dlp 解析添加
--no-warnings --quiet减少开销 - 自动更新不再需要手动点击检查