阿牛下载 1.0.0 发布:浏览即下载,模型、视频、字幕一键到本地
下载这件事,本来不该这么麻烦。
想下一个模型,得先打开 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 · 浏览即下载,模型、视频、字幕一键到本地

