Spooty:自托管 Spotify 内容下载器

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:

  1. 访问 Spotify Developer Dashboard
  2. 登录您的 Spotify 账户
  3. 点击 “Create an App”
  4. 填写应用名称与描述(任意)
  5. 记录生成的 Client ID 与 Client Secret
  6. 在 “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.sqliteSQLite 数据库存储路径
FE_PATH../frontend/browser前端静态资源目录
DOWNLOADS_PATH./downloads音频文件下载目录
FORMATmp3输出音频格式(依赖 FFmpeg 支持)
PORT3000Web 服务端口
REDIS_HOST / REDIS_PORTlocalhost / 6379Redis 连接配置
RUN_REDISfalse是否由 Spooty 启动内嵌 Redis(仅限 Docker)
SPOTIFY_CLIENT_ID必需,从 Spotify 开发者控制台获取
SPOTIFY_CLIENT_SECRET必需
YT_DOWNLOADS_PER_MINUTE3每分钟最大 YouTube 下载任务数(防限流)
YT_COOKIES可选,用于绕过 YouTube 年龄/区域限制

如何获取 YouTube Cookies(可选)

部分 YouTube 音频受区域或登录状态限制。您可提供已登录的 cookies 提升成功率:

  1. 打开 https://www.youtube.com 并登录
  2. 按 F12 打开开发者工具
  3. 切换到 Application(Chrome)或 Storage(Firefox)
  4. 展开 Cookies → 选择 https://www.youtube.com
  5. 复制所有 name=value 对,用分号连接:VISITOR_INFO1_LIVE=xxx; YSC=yyy; SID=zzz; ...
  6. 将此字符串填入 YT_COOKIES 环境变量

🔒 Cookies 包含敏感信息,请勿泄露或提交到公共仓库。

使用建议

  • 仅用于个人备份或离线收听,勿分发下载内容
  • 定期更新容器镜像以获取 bug 修复与新功能
  • 若下载失败,检查 YouTube 是否存在匹配音频(Spooty 依赖关键词搜索)
  • 使用 YT_DOWNLOADS_PER_MINUTE 限制请求频率,避免触发 YouTube 限流

评论