Spooty 是一个开源、自托管的工具,用于从 Spotify 提取音乐元数据(如歌曲名、艺术家、专辑),并在 YouTube 上搜索匹配音频,自动下载并转换为本地音频文件(如 MP3)。它支持:
- 单曲、专辑、播放列表的按需下载
- 自动订阅艺术家或播放列表,新歌发布时自动抓取
- Web 界面管理(基于 Angular)
- 后台任务调度与下载队列(基于 NestJS)
⚠️ 重要提示:
Spooty 不从 Spotify 直接下载音频,仅调用其公开 API 获取元数据。最终音频来自 YouTube(通过yt-dlp等工具)。
请仅下载您拥有合法使用权的音乐内容。开发者不对任何版权侵权行为负责。
技术架构
- 后端:NestJS(Node.js)
- 前端:Angular(静态 SPA)
- 依赖组件:
- Redis(任务队列与缓存)
- FFmpeg(音频格式转换)
- Python 3(用于
yt-dlp或相关脚本)
- 部署方式:Docker(推荐)或从源码构建
Spotify 应用配置(必需)
Spooty 需要 Spotify 开发者凭据以访问 API:
- 访问 Spotify Developer Dashboard
- 登录您的 Spotify 账户
- 点击 “Create an App”
- 填写应用名称与描述(任意)
- 记录生成的 Client ID 与 Client Secret
- 在 “Edit Settings” 中添加重定向 URI:
http://localhost:3000/api/callback(若部署在其他域名/端口,请替换为实际地址)
这些凭据将用于 OAuth 授权,使 Spooty 能安全读取公开的 Spotify 内容信息。
🐳 快速部署(推荐:Docker)
使用 docker run
docker run -d \
--name spooty \
-p 3000:3000 \
-v /your/downloads/path:/spooty/backend/downloads \
-e SPOTIFY_CLIENT_ID="your_client_id" \
-e SPOTIFY_CLIENT_SECRET="your_client_secret" \
raiper34/spooty:latest
使用 docker-compose.yml
services:
spooty:
image: raiper34/spooty:latest
container_name: spooty
restart: unless-stopped
ports:
- "3000:3000"
volumes:
- /your/downloads/path:/spooty/backend/downloads
environment:
- SPOTIFY_CLIENT_ID=your_client_id
- SPOTIFY_CLIENT_SECRET=your_client_secret
# 可选:配置 YouTube cookies 或其他参数
启动后,访问 http://localhost:3000 即可使用 Web 界面。
从源码构建(高级用户)
环境要求
- Node.js v18.19.1(建议使用
nvm管理) - Redis(运行中)
- FFmpeg(已安装并加入 PATH)
- Python 3(用于音频下载工具链)
构建步骤
# 1. 切换 Node 版本
nvm install 18.19.1 && nvm use 18.19.1
# 2. 安装依赖
npm install
# 3. 配置环境变量
cp src/backend/.env.default src/backend/.env
# 编辑 .env,填入 Spotify 凭据等
# 4. 构建项目
npm run build
# 5. 启动服务
npm run start
构建后的前端静态文件位于 dist/frontend/browser,后端服务监听 3000 端口。
环境变量配置
| 变量名 | 默认值 | 说明 |
|---|---|---|
DB_PATH | ./config/db.sqlite | SQLite 数据库存储路径 |
FE_PATH | ../frontend/browser | 前端静态资源目录 |
DOWNLOADS_PATH | ./downloads | 音频文件下载目录 |
FORMAT | mp3 | 输出音频格式(依赖 FFmpeg 支持) |
PORT | 3000 | Web 服务端口 |
REDIS_HOST / REDIS_PORT | localhost / 6379 | Redis 连接配置 |
RUN_REDIS | false | 是否由 Spooty 启动内嵌 Redis(仅限 Docker) |
SPOTIFY_CLIENT_ID | — | 必需,从 Spotify 开发者控制台获取 |
SPOTIFY_CLIENT_SECRET | — | 必需 |
YT_DOWNLOADS_PER_MINUTE | 3 | 每分钟最大 YouTube 下载任务数(防限流) |
YT_COOKIES | — | 可选,用于绕过 YouTube 年龄/区域限制 |
如何获取 YouTube Cookies(可选)
部分 YouTube 音频受区域或登录状态限制。您可提供已登录的 cookies 提升成功率:
- 打开 https://www.youtube.com 并登录
- 按
F12打开开发者工具 - 切换到 Application(Chrome)或 Storage(Firefox)
- 展开 Cookies → 选择
https://www.youtube.com - 复制所有
name=value对,用分号连接:VISITOR_INFO1_LIVE=xxx; YSC=yyy; SID=zzz; ... - 将此字符串填入
YT_COOKIES环境变量
🔒 Cookies 包含敏感信息,请勿泄露或提交到公共仓库。
使用建议
- 仅用于个人备份或离线收听,勿分发下载内容
- 定期更新容器镜像以获取 bug 修复与新功能
- 若下载失败,检查 YouTube 是否存在匹配音频(Spooty 依赖关键词搜索)
- 使用
YT_DOWNLOADS_PER_MINUTE限制请求频率,避免触发 YouTube 限流











评论