Releases: MuZiCul/XDownload
Release list
XDownload v2.10.2
Changed
- perf: 降低下载时的渲染压力(进度节流 + 订阅切片)(v2.10.2)
Other
- chore: 移除前端测试文件并同步 CI(不再跑 vitest)
XDownload v2.10.1
Fixed
- fix: 重新下载改为历史信息直接回填,去掉 4 秒解析等待(v2.10.1)
XDownload v2.10.0
🚀 v2.10.0 带来两项修复:下载历史去重(同一条视频只保留一条最新记录,重下自动替换旧记录)与 ffmpeg 更新检测修复(不再"更新完还反复提示",也不会白下约 195MB)。
🐛 关键修复
下载历史出现「失败 + 成功」两条记录
- 现象:某条视频下载失败后重新下载成功,下载历史里却同时留下两条卡片(一条失败、一条成功),失败那条怎么也去不掉。
- 根因:历史记录的唯一键
video_id有两个来源——批量下载 / 深链 / 书签同步写入的是 URL 里的推文 status id,而单链下载 / 历史页重新下载写入的是 yt-dlp 解析出的媒体 id。两者多数情况相同,但偶尔指向不同 id,于是同一条视频被写成两条记录,重新下载自然覆盖不掉另一条键上的旧记录。 - 修复:全链路统一历史键为推文 status id(新增
utils::url::history_key作为唯一规则):- 入队时归一化任务
video_id; - 解析视频信息时,回传给前端的
id也归一化,保证「已下载」判断、打开文件位置、重新下载都落在同一个键上; - 写历史时再次兜底归一化,任何入口都不会再产生第二个键。
- 入队时归一化任务
- 效果:重新下载成功 → 旧的失败记录被替换;重新下载仍失败 → 只保留最新那次失败记录。
ffmpeg「更新后仍提示更新」,怎么点都消不掉
-
现象:更新 ffmpeg 之后仍持续提示有 ffmpeg 更新;再点一次更新会重新下载约 195MB,提示依旧。
-
根因:旧逻辑把两个语义不同的时间直接比较——
- 远端基准 = BtbN release 的
published_at(发布完成时刻); - 本地基准 =
bin/ffmpeg.exe的 mtime,而解压代码刻意把它恢复成 zip 内文件时间(构建打包时刻)。
构建产物要打包上传完(一次构建 49 个资产、2GB+)release 才发布,
published_at恒晚于 zip 内文件时间(实测差 49 分钟)。于是只要装的是当时的最新版,就永远判定"有更新"。 - 远端基准 = BtbN release 的
-
修复:判定改为两级指纹比对:
- 资产 ETag 优先:向远端资产发一次请求只读响应头(不下载 body),ETag 与"上次安装时记录的 ETag"比对,不同即内容变过;
- 资产上传时刻保底:取不到 ETag 时,用该资产在 GitHub API 里的
updated_at与"本地安装时刻"比较;老版本升级上来、没有安装记录时用ffmpeg.exemtime +6 小时容差兜底(覆盖发布延迟)。
-
安装 ffmpeg 成功后会写入安装时刻 + 资产 ETag(存在
config/data.db),所以"刚装完还提示有更新"不会再出现。
🔧 内部改进
历史记录一次性合并迁移
- 启动时执行一次幂等迁移(写
config表的 marker,只跑一次):把已有记录的键统一为推文 status id,同一条视频的多条记录只保留最新的一条,其余删除并写入日志。 - 迁移失败只告警、不阻塞启动;重跑安全(marker 未写入时会重新执行)。
附带收益
- 书签页的「已下载」标记、书签目录的下载状态、下载页的「已下载」提示不再因键不一致而漏判。
- ffmpeg 判定结果新增
up_to_date字段,区分"确认已是最新"与"检查没成功"。
✨ 改进
下载前二次校验,不再白下 195MB
- 设置页点「更新」时会先强制刷新一次检查:后端确认"已是最新"则直接提示已是最新并跳过下载;只有确实有新构建才会开始下载。(用户主动"重新下载"仍照常执行。)
📦 安装
从 GitHub Releases 下载:
- Windows:
XDownload_v2.10.0_x64-setup.exe(NSIS) /.msi
首次启动会自动下载 yt-dlp + ffmpeg,也可以手动放入 bin/ 目录。
🙏 致谢
XDownload v2.9.9
🚀 v2.9.9 聚焦应用内统计与日志:新增苹果风格的下载统计面板(ECharts 图表);日志查看器移入应用内(深色主题、ANSI 着色、内容可复制);隐私模式补全书签标题遮挡;并清理浏览器版日志服务死代码。
✨ 新功能
📊 下载统计
- 统计面板:设置页「统计」打开苹果风格统计页——大标题 + 数字卡片(累计下载 / 累计存储 / 成功率 / 使用天数 / 平均时长)
- ECharts 图表:每日下载趋势(渐变折线)、来源分布(环形图)、Top 作者(横向柱状)、Top 账号(南丁格尔玫瑰图)
- 离线可用:ECharts 以本地文件打包(不再依赖网络 CDN),图表首次打开自动修复 WebView2 白屏时序
📜 日志查看器(应用内)
- 移入应用内:设置页「软件日志」直接在应用内打开深色日志页,不再跳转浏览器(移除本地 HTTP 服务,少一个端口暴露面)
- ANSI 着色:时间戳半透明、等级彩色(INFO 绿 / WARN 黄 / ERROR 红),重构为 React 原生渲染确保 WebView2 下颜色生效
- 日志内容可复制:日志行可选中复制,界面其他元素仍禁止选中
- 轮询静默:2 秒自动刷新不再产生「get_logs」噪音日志
🔖 隐私模式补全
- 书签标题遮挡:隐私开关开启时,「查看书签」弹窗标题与「书签同步」预览文本同步显示
***(此前仅下载页/历史页生效)
🛠 开发体验
- 清理死代码:移除已被应用内页面替代的浏览器版日志查看器(
log_webHTTP 服务、open_logs_dir命令、前端openLogsDir绑定),代码净减约 400 行 - 移除多余依赖:echarts 不再作为 npm 依赖安装(改用本地 vendor 文件),
package.json/ lock 清理 - 日志页优化:ANSI 色表与解析函数提升为模块级常量,2 秒刷新不再重复分配
📦 安装
从 GitHub Releases 下载:
- Windows:
XDownload_v2.9.9_x64-setup.exe(NSIS) /.msi
首次启动会自动下载 yt-dlp + ffmpeg,也可以手动放入 bin/ 目录。
⚠️ 升级说明
- 本版无数据库结构变化,升级后历史 / 书签数据原样保留
- 若此前通过浏览器使用过日志查看器,浏览器标签页可关闭(功能已移入应用内)
🙏 致谢
XDownload v2.9.8
🚀 v2.9.8 聚焦设置体验重构与账号识别:彻底移除「配置保存/应用/导入/导出」体系,所有设置更改即自动保存;代理能力增强(系统代理重开恢复、输入校验、开关自动联动);书签管理新增登录用户名识别(Cookie 指纹缓存)与「获取/重载用户」按钮。
✨ 新功能 / 改进
⚙️ 设置
- 设置即自动保存:移除配置保存 / 应用 / 导入 / 导出 / 恢复默认体系,所有设置项(下载目录、代理、Cookies、多任务、HLS、语言)改动即时保存并生效,不再有保存/应用按钮
- 保存竞态修复:新增全局串行「读-改-写」机制,快速连续改动多个设置不再互相覆盖
- 设置标签精简:并发数 / 重试次数 / 持久化 / 防休眠 / 限速 / 使用代理,完整说明移入问号提示
- 问号提示统一:提示弹窗统一为「总述 + 条目前缀 + 悬挂缩进」风格
🌐 代理
- 系统代理重开恢复:修复系统代理关闭后再打开无法恢复的问题(此前开关会一直禁用)
- 手动代理强制应用:系统 → 手动切换即时生效
- 输入校验:端口仅允许 1-65535(超限/非数字直接拒输),主机地址仅允许合法字符
- 开关自动联动:「使用代理」开关随代理状态实时同步(代理关闭自动关开关)
🔖 书签管理
- 登录用户名识别:标题显示当前 x.com 登录用户(
● 已登录用户: @xxx),基于 Cookie 指纹缓存,重启后浏览器来源不变则不重复探测 - 获取 / 重载用户:按钮手动刷新;未获取到用户时显示红色状态提示,同步/查看书签自动禁用
- 未登录保护:无法识别用户时禁用同步与查看,避免无效操作
🛠 其他
- 日志查看器:浏览器标签页补上应用图标(favicon)
- 日志增强:ffmpeg 缓存命中、代理开关变更、队列持久化/防休眠开关变更均有日志记录
📦 安装
从 GitHub Releases 下载:
- Windows:
XDownload_v2.9.8_x64-setup.exe(NSIS) /.msi
首次启动会自动下载 yt-dlp + ffmpeg,也可以手动放入 bin/ 目录。
🙏 致谢
XDownload v2.9.7
🚀 v2.9.7 聚焦工具下载体验与 ffmpeg 更新检测:下载 yt-dlp / ffmpeg 时实时显示直连 / 代理模式、可一键切换「代理下载」,ffmpeg 彻底弃用 gyan.dev 改为 GitHub BtbN 统一检测(24 小时缓存不再频繁联网),并全链路补齐排查日志。
🐛 关键修复
- 取消下载不再误弹失败:修复取消后
download_with_fallback把"用户取消"当"直连失败"继续走代理、错误信息被with_context覆盖导致前端误判——现在取消即透传,静默关闭无弹窗,也不再发多余代理请求 - ffmpeg 更新检测不再持续误报:本地基准改用解压时恢复的 zip 内构建时间戳(此前是下载时刻,BtbN 高频构建导致一直提示有更新);远端发布时间解析失败不再污染 24h 缓存
- 下载失败残留临时文件清理:超时 / 读错 / 写错等所有失败路径统一删除
.tmp半成品(此前仅取消分支清理) - 工具下载失败展示真实原因:错误串保留 cause 链,前端能区分超时 / 连接拒绝 / DNS 等并展示
✨ 新功能 / 改进
工具下载(设置 → Tools)
- 实时显示网络模式:下载时提示「正在通过直连下载 / 正在通过代理下载」,直连失败自动切代理时提示实时更新
- 「代理下载」开关:开启后工具下载直接走代理(不再先试直连);未配置代理时开关自动禁用并提示;开关即时保存(无需点「保存」)
- 慢速下载提醒:超过 3 分钟无进度时提示,提供「继续等待 / 前往网页下载」入口(GitHub BtbN 页面)
- 取消下载静默:识别"下载已取消",不再弹失败弹窗
ffmpeg 更新检测
- 彻底移除 gyan.dev:首次下载(GitHub BtbN)与更新检测(GitHub API 发布时间)统一数据源
- 24 小时跨进程缓存:远端发布时间存
data.db,启动 / 重复检查不联网(毫秒级本地对比),解决 GitHub API 未认证限流(60 次/h) - 手动检查强制刷新:点「检查更新」绕过缓存立即请求 GitHub 并更新记录
- API 限流后备:GitHub API 403 时自动走 Web 页面解析(
<relative-time>),全程日志可查
下载历史
- 新增 handle 字段:从 URL 提取用户 id(如
yung_dimsum)写入历史记录,老库自动迁移 + 存量回填
移动中状态
- 下载完成后进入合并阶段显示「移动中」徽标与循环条,与下载 / 合并阶段明确区分
🎨 UI 优化
- 退出弹窗:点击遮罩(弹窗外空白处)取消退出(此前会误触发最小化)
- 书签查看弹窗:打开时自动实时刷新下载状态(监听
download-finished) - 版本显示:ffmpeg 底部版本号解析兼容 BtbN master(
N-<git号>),更新后不再显示问号
🛠 日志补全(排查不再黑盒)
- 代理测试:入口 / 结果 / 耗时 / 失败原因全记录
- cookie 验证:浏览器选择、auth_token 提取、x.com 验证状态码
- 网络检测:直连 / 代理可达性、GitHub / Google / x.com 预检
- 命令执行:spawn 失败、超时被杀、非零退出码(含 stderr 摘要)
- 数据库:连接池借用失败、初始化失败
- Web fallback:403 后自动降级执行过程全程留痕
📦 安装
从 GitHub Releases 下载:
- Windows:
XDownload_2.9.7_x64-setup.exe(NSIS) /.msi - 浏览器扩展: 沿用已发布版本即可(本版未改扩展)
⚠️ 升级说明
- 本次发版同时包含 v2.9.6 的改动:「下载时防休眠」开关(Windows
SetThreadExecutionState,队列有活跃任务时阻止系统休眠,任务结束 / 暂停 / 清空 / 主动退出自动恢复)、视频保存位置卡片改版、设置页下载目录显示绝对路径 - ffmpeg 更新检测逻辑变更:旧版数字版本(如
7.1)与新版N-构建统一走 GitHub 检测,无需迁移 - 升级无需迁移配置,历史与书签数据保留
🙏 致谢
- yt-dlp — 视频解析与下载引擎
- Tauri — 轻量级桌面应用框架
- ffmpeg — 音视频处理
- BtbN/FFmpeg-Builds — Windows ffmpeg 构建
XDownload v2.9.5
🚀 v2.9.5 聚焦下载可靠性:彻底移除断点续传(所有下载一律从头,杜绝碎文件导致的 ffmpeg 合并异常),重做退出确认弹窗(最小化到托盘 / 真正退出由你决定),并修复多个队列与查重 bug。
🐛 关键修复
- 断点续传彻底移除:删除
resume_support开关;每次下载前清空缓存目录 + 强制从头下载(暂停→开始、失败重试、重启恢复均从头) - 碎文件不再积累:暂停 / 取消任务后立即清理该任务的暂存缓存目录,残分片与
.part不会残留 - 退出不误报失败:保存进度退出后重启,正在下载的任务不再被记录为"下载失败"(kill 的 worker 静默收尾)
- 删除任务队列停滞:删除正在下载的任务后,等待中的任务立即开始(此前会卡住)
- 深链查重:扩展发送的链接若已下载过,弹出确认框(重新下载 / 取消),不再重复入队
- 历史来源显示错误:修复
list_download_history漏传 source 字段导致全部显示「单链」
✨ 新功能 / 改进
退出确认弹窗
- 关闭窗口(X)总是弹窗:最小化到托盘 / 真正退出(无任务也弹窗)
- 托盘退出只显示「退出 + 取消」;设置页退出与 X 同逻辑
- 有任务且未自动保存时提供「保存进度并退出 / 直接退出 / 最小化 / 取消」
- 精简模式文案独立,不再误显示"有任务正在执行"
任务页动态分栏
- 活跃任务 ≥ 2 个:上 50% / 下 50%
- 0~1 个:上 30% / 下 70%(历史区获得更多空间)
来源徽标增强
- 新增深链来源(独立于批量 / 书签),四种来源一眼可辨
设置页按钮配色
- hover 配色重构:普通按钮中性灰、退出按钮淡红、隐私按钮琥珀,卡片光晕改中性(不再与 Tab 选中蓝色撞色)
📦 安装
从 GitHub Releases 下载:
- Windows:
XDownload_2.9.5_x64-setup.exe(NSIS) /.msi - 浏览器扩展: 沿用已发布版本即可(本版未改扩展)
⚠️ 升级说明
- 设置中的「断点续传」开关已移除,旧配置自动忽略
- 暂停 / 重新开始的下载将从头开始(不再从断点继续)——这是刻意设计,为保证合并完整性
- 升级无需迁移配置,历史与书签数据保留
🙏 致谢
XDownload v2.9.4
Fixed
- fix: 历史记录显示修复 + 历史页 UI 优化
XDownload v2.9.3
New
- feat: 队列状态方法抽取重构 + 测试覆盖补齐
- feat: 缓存清理去 hack + 历史页分栏虚拟化 - 缓存清理改为 mtime 保留 7 天:废弃残留自动回收,不再按日期含 4 全量清空破坏断点续传 - 移除日期 hack / marker / 死代码 ensure_download_cache_dir,新增缓存清理测试 - 历史页改为上下分栏(正在下载 30% / 下载完成 70%),两区独立滚动 - 历史列表接入 @tanstack/react-virtual 虚拟化(动态行高,失败展开自适应),几千条记录仍流畅 - 版本号 2.9.1 → 2.9.2
- feat: 任务来源徽标 + 数据库读并发优化
Changed
- docs: RELEASE 描述去掉版本号标题(约定:发版正文不写标题)
XDownload v2.9.0
🚀 v2.9.0 重点重构书签同步:从自动轮询改为手动触发 + 预览确认,引入下载历史即游标、书签目录持久化(SQLite)与全局同步模态。配套扩展升级 v1.3.0(自动捕获并推送 queryId)。
🔖 书签同步(重点)
手动触发 + 预览确认
- 删除自动轮询,改为设置页「同步书签」按钮手动触发
- 同步后弹出全局同步模态:显示真实步骤进度(读取 Cookies → 拉取书签 → 保存本地 → 比对历史),同步期间无法关闭,切换任意 Tab 仍置顶
- 预览弹窗列出所有含视频书签(含已下载),用不同底色区分已下载/未下载,默认勾选未下载
- 支持勾选批量入队 / 单个入队;已下载的书签也可勾选重新下载(复用批量下载逻辑,队列内判重仍生效)
- queryId 失效时展示拟态窗错误与扩展引导步骤
下载历史即游标
- 废除
bookmarks_state.json游标:只有下载完成才视为"已处理" - 未下载的(含入队后被删除的)书签,下次同步会重新提示——不再出现"删除任务后书签消失"的问题
书签目录持久化
- 同步发现的书签(含视频与无视频)持久化到 SQLite
bookmarks表(自增 id 主键 + video_id UNIQUE 去重,含has_video/downloaded字段) - 新增「查看书签」拟态窗:离线浏览历次同步的书签,每条显示下载状态,可单独下载 / 重新下载
- 查看时实时核对文件是否仍存在并回写状态
queryId 自动捕获(扩展 v1.3.0)
- 扩展 popup 新增「推送 queryId 到桌面端」:打开 x.com 书签页时自动捕获最新 queryId 并推送
- 桌面端存入 SQLite
config表,同步时优先使用,未推送时退回内置常量
💾 存储架构
- 下载历史迁移至 SQLite:
config/data.db的downloads表(video_id主键、file_pathsJSON、status 0/1),替换旧downloads.json读写 - 旧
downloads.json历史记录不导入(新库从空开始),旧文件保留作手动备份 settings.json/queue.json/ 清理日期标记保持 JSON;日志保持文本文件(按本地日期轮转)- 修复
DB_LOCK互斥锁死锁(书签持久化在持锁期间调用下载历史服务导致卡死,已改为锁外取快照)
🐛 Bug 修复
- 下载时长丢失:HLS/多分片任务时长解析浮点截断,历史记录 duration=0 → 已修复(浮点解析 + 队列快照刷新)
- 书签入队信息获取时机:入队任务改为"先排队、逐任务获取信息、再按并发启动下载",卡片始终有封面/标题/作者
- 最近下载徽标不立即显示:慢刷新时钟把刚下载完成记录误判为"未来时间"而隐藏徽标 → 负数边界 clamp + 下载完成即刷新时钟
- 同步后切换 Tab 卡死:
bookmarks_store持DB_LOCK时再次调用is_downloaded死锁 → 锁外构建快照
🎨 UI 优化
- 设置页顶部按钮固定:保存/应用/目录/日志/隐私/退出 在滚动时固定于顶部,位置不再跳动
- 8 个设置卡片标题问号徽标:点击弹出说明拟态窗(多行展示每个功能点)
- 勾选框改滑动开关:多任务卡片的「队列持久化」「断点续传」改为滑动开关
- 「书签同步」卡片改名「书签管理」
🛠 开发体验
- 日志双写:同一份日志同时写入
logs/文件与 stdout(debug 控制台实时滚动);控制台启用 VT 处理正确显示 ANSI 颜色 debug_build.bat自动部署:构建成功后自动终止旧进程、复制xdownload.exe+xdownload_lib.dll到D:\XDownload、并自动启动新版本
📦 安装
下载预构建包
从 GitHub Releases 下载对应平台安装包:
- Windows:
XDownload_2.9.0_x64-setup.exe(NSIS) /.msi - 浏览器扩展:
xdownload-extension-v1.3.0.zip(见「书签同步」章节)
从源码构建
# 环境要求:Rust (MSVC)、Node.js 18+、pnpm
pnpm dev # 开发模式
.\build.bat # Windows 打包
.\debug_build.bat # 快速调试构建(不打包安装程序)⚠️ 升级说明
- 从 v2.8.x 升级无需迁移配置:下载历史自动迁移到 SQLite,
downloads.json保留不删除 - 书签功能从 v2.9.0 起为手动触发(设置页「书签管理」→「同步书签」),旧的
bookmarks_state.json已废弃可删除 - 浏览器扩展请升级到 v1.3.0(新增 queryId 推送)