阿牛下载 1.0.0 发布:浏览即下载,模型、视频、字幕一键到本地

萝卜2026-09-30

下载这件事,本来不该这么麻烦。

想下一个模型,得先打开 HuggingFace 找到仓库,复制仓库名,再切到终端敲 huggingface-cli download;国内网络还得自己找镜像、配 HF_ENDPOINT。想下一条视频,得先装 yt-dlp,还得配好 ffmpeg;遇到高清码流和字幕,又得把浏览器的登录态导出来,带上再跑一遍。

每一步都不难,但每一步都要切窗口、查命令、配环境。这些活我平时也在干,干久了只留下一个感受:整条流程里真正需要我动手的,其实只有一件事——看中了,点一下。

阿牛下载 1.0.0 就是照这个想法做的:一个内置了浏览器和 Python 运行时的桌面下载器。

一句话说清它是什么

左边是网页,右边是这一页能下什么。

打开视频站或模型站的页面,右侧栏只列出这一页真能下的东西:一条视频(标题加一个下载按钮)、它有哪些语言的字幕、或者这个仓库(模型库 / 数据集,加一个整仓下载按钮)。看中了点一下,下载交给包内自带的 Python 运行时,不需要你装任何环境。

视频页自动解析:右侧栏列出视频与字幕

它不是一个「专门下模型」的工具,也不是一个「专门下视频」的工具。两件事共用同一套东西:同一个浏览器、同一个侧栏、同一个下载队列、同一份历史记录。视频与字幕是更普遍的需求,所以默认书签和站点介绍都把这排在了前面。

支持的站点

站点 内容 怎么下
哔哩哔哩 / YouTube / ... 视频 / 字幕 yt-dlp,带上当前页面的登录态
huggingface.co 模型 / 数据集 官方库整仓快照下载
hf-mirror.com 模型 / 数据集 走官方 HF_ENDPOINT 镜像,取数失败自动退避重试
modelscope.cn 模型 / 数据集 官方 API

站点适配只做一件事:把 URL 认出来(是哪个站、是模型还是数据集)。整仓快照下载、视频解析、字幕提取,全部交给 huggingface_hub、modelscope、yt-dlp 这些官方库,不自己实现站点接口——否则网站一改版,软件就得跟着挂。

视频与字幕

打开视频页,侧栏只会有两个区块:视频(标题 + 下载按钮)和字幕(每种语言一行,各带一个下载按钮,自动生成的字幕标一个「自动」)。上传者、时长、封面这些信息都不占位置——这里要做的决定只有「下不下」。没有视频的普通网页,侧栏会直接说「当前页面未发现可下载资源」。

  • 视频按码流下,高清自动合并:ffmpeg 已经内置(走 imageio-ffmpeg 的静态二进制),不用你另外装
  • 字幕按语言单独挑:想下日语就下日语,不用整包搬
  • 登录态只按当前页域名下发:bilibili 的高清码流与字幕列表都要求登录,匿名接口一律返回空。所以下载前,只把「浏览器本来就会发给这个域名」的 cookie 导成一个临时文件,权限 0600 落在系统临时目录,子进程结束立即删除;不缓存、不写进配置目录、不发给其他站点

模型与数据集

打开 HF、HF 镜像或魔搭的仓库页,侧栏给出仓库名与站点标记,下面只有一个按钮:下载整个模型库 / 下载整个数据集,后面跟着文件数(如「35 个文件」)。文件清单不逐条列出,只在后台用来标出这个仓库有多大;清单没拉到时会提示一句「未能获取文件数量」,按钮照用不误。模型按「组织 / 名称」两层落到本地,数据集同一个入口。

模型仓库页:给出仓库与整仓下载按钮

国内网络下,HF 镜像不用单独适配,用的是官方支持的 HF_ENDPOINT 环境变量;hf-mirror 对匿名接口有频率限制,取数操作带了退避重试。

队列、历史与书签

  • 下载队列:最多 3 个任务并行,随时可取消;进行中的任务和排队中的任务分开显示
  • 历史记录:任务结束(完成 / 失败 / 取消)后自动归档,保留最近 200 条。因为历史条目里存着原始参数,关掉软件再打开也能一键重下;「打开目录」会在文件管理器里直接定位到落盘位置
  • 视频与模型分开放:默认落在 ~/Downloads/阿牛下载 下的 video/ 与 model/ 两个目录,都可以改
  • 书签:常见视频站与模型站默认收录,地址栏里的星标一键收藏,侧栏书签面板支持拖拽排序,还能把常用站点设为新建标签页的主页
  • 运行日志:运行时解压、装依赖、列目录、每次下载的进度,全部汇成一条时间线。设置页点「显示 log」从底部抽屉看,出问题一眼能看到是哪一步

下载队列与历史:进行中、历史记录、一键重下

视频编码偏好:为什么默认不是最高画质

这一项值得单独说,因为默认值看起来「不够好」。

yt-dlp 的默认排序把 AV1 / VP9 排在 H.264 前面,于是「最佳画质」常常选中 AV1;而 AV1 塞进 mp4 之后,大多数播放器只解得出音轨——表现就是有声音、没画面。所以软件里给了两套档案:

档案 编码与容器 代价
兼容优先(默认) H.264 + AAC / mp4 QuickTime、Windows 自带播放器、手机通吃;4K 源会降到 1080p
画质优先 AV1 / VP9 / HEVC / mkv 4K 拉满,但要 IINA、VLC 这类播放器才放得顺

设置页「视频」卡片里随时切换。默认选「通吃」,想拉满 4K 再手动切——这是刻意的取舍,不是没做到。

装完即用:运行时与依赖

  • 软件自带 Python 3.12 运行时(python-build-standalone),装在 ~/.a-niu-download/python,不动你系统里的任何环境
  • 依赖为 huggingface_hub / modelscope / yt-dlp / imageio-ffmpeg,打包时按构建平台只带对应那一份运行时,安装包不会为此膨胀四倍
  • pip 镜像回退链:阿里 → 清华 → 腾讯 → 官方,国内网络通常第一个就够
  • 首次启动会在后台解压运行时、装依赖,状态就在「设置 → Python 依赖」卡片上(未就绪时下载按钮是禁用的,会告诉你原因);整个过程写进运行日志,卡住也好排查
  • 版本检查走 thinking.vip/version 接口,有新版时标签条右侧会出现「去升级」

几个做的时候踩的坑

写出来给后来人省点时间:

  • 视频进度条要走成一条单调曲线:yt-dlp 会先下视频流再下音频流,各自回调一次。照着回调上报,进度条会「走满一次又从 0 重来」。所以下载前先空跑一次解析,拿到所有码流大小,回调里按「已下完码流 + 当前码流」累加,只发一条曲线(实测 0% → 92.7% 换流 → 99.9%)
  • yt-dlp 的原生进度条会破坏 JSON 协议:Python 子进程与主进程之间用「一行一个 JSON」通信,而 yt-dlp 的进度条同样写在 stdout、靠 \r 原地刷新,会把事件行粘成非 JSON 被整条丢弃(界面表现是进度永远停在 0)。解决是显式关掉原生进度条,解析侧也把 \r 当行界兜底
  • 关掉 tqdm 的原生渲染后,进度必须自己累加:disable=True 会让 update() 提前返回,self.n 恒为初始值,直接读它进度条永远停在 0%,直到结束才跳变
  • 原生视图会吞掉鼠标事件:网页内容由 WebContentsView 渲染,它压在界面上层,指针进去之后事件就归它了。所以拖拽侧栏宽度时先临时隐藏视图,松手再恢复,否则往里拖到一半就卡住

已知取舍

  • HF 大仓库的文件数量统计在 2000 条处截断(显示成「2000+ 个文件」),只影响这个数字,整仓下载不受影响
  • 需要登录或反爬严格的站点,探测可能失败;失败时侧栏会给出原因,不会静悄悄地什么都不显示
  • 默认「兼容优先」,4K 素材要手动切「画质优先」
  • 首次启动要等运行时解压和依赖安装,之后都是秒起

下载

Windows 与 macOS 都提供 ZIP 安装包,解压即用,包内自带 Python 与 ffmpeg,不用自己配环境。免费使用,本地运行。

👉 官网下载体验:https://thinking.vip/a-niu-download

阿牛下载 1.0.0 · 浏览即下载,模型、视频、字幕一键到本地

2026-09-30 14:23:2888 次阅读