feat: 添加网易云音乐同步到Navidrome的功能
新增NetEase-sync模块,实现将网易云音乐歌单同步到Navidrome的功能 修复iOS设备自动播放问题,优化播放器体验
This commit is contained in:
131
CLAUDE.md
Normal file
131
CLAUDE.md
Normal file
@@ -0,0 +1,131 @@
|
||||
# CLAUDE.md
|
||||
|
||||
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
||||
|
||||
## 项目概述
|
||||
|
||||
没事Music 是一个基于 Web 的音乐播放器应用,采用单文件 React 架构,支持多平台音乐搜索、播放和同步功能。
|
||||
|
||||
## 架构设计
|
||||
|
||||
### 前端架构 (index.html)
|
||||
|
||||
**单文件应用模式**:
|
||||
- 所有前端代码集中在 `index.html` (~89KB)
|
||||
- 使用 Babel Standalone 在浏览器端编译 JSX
|
||||
- React 18 + Tailwind CSS + Font Awesome (均通过 CDN 引入)
|
||||
|
||||
**核心组件结构**:
|
||||
```
|
||||
App (主容器)
|
||||
├── SideDrawer (侧边栏设置)
|
||||
├── MiniPlayer (迷你播放器)
|
||||
├── FullPlayer (全屏播放器)
|
||||
├── PlaylistDrawer (播放列表)
|
||||
└── TopListPage (排行榜页面)
|
||||
```
|
||||
|
||||
**状态管理**:
|
||||
- 使用 React Hooks (useState, useEffect, useRef, useMemo, useCallback)
|
||||
- 数据持久化: localStorage (前缀 `th_`)
|
||||
- 关键状态: playlist, favorites, currentSong, syncToken, syncMode
|
||||
|
||||
**数据规范化**:
|
||||
- `normalizeSongId()`: 全局强制歌曲 ID 为字符串类型
|
||||
- `normalizeSongList()`: 批量规范化歌曲列表
|
||||
- `getSongDurationSeconds()`: 统一处理不同来源的时长字段 (duration/dt/time/interval/length/playTime)
|
||||
|
||||
### 后端架构 (sync-server/server.js)
|
||||
|
||||
**KV 存储服务**:
|
||||
- 基于 Node.js 原生 HTTP 服务器
|
||||
- 文件系统存储: `data/{token}_{key}.json`
|
||||
- API 端点: `GET/POST /kv/:key?token=...`
|
||||
- Token 用于用户隔离
|
||||
|
||||
**后台下载管理器**:
|
||||
- 自动检测歌曲列表数据并触发下载
|
||||
- 文件命名: `{歌手} - {歌名} [{平台}_{ID}]`
|
||||
- 文件名清理: Unicode 规范化 (NFC) + 非法字符替换
|
||||
- 存储路径: `MUSIC_DIR` (默认 `./music`)
|
||||
|
||||
### 同步策略
|
||||
|
||||
**两种同步模式**:
|
||||
1. **私有云同步** (`syncMode: 'server'`):
|
||||
- 基于 Token 的 KV 存储
|
||||
- 增量同步: 计算本地与上次同步的差异 (added/removed)
|
||||
- 自动同步: 每 15 分钟执行一次
|
||||
|
||||
2. **网易云歌单同步** (`syncMode: 'netease_playlist'`):
|
||||
- 通过 TuneHub API 获取歌单
|
||||
- 导入即替换逻辑
|
||||
- 自动同步: 每 15 分钟执行一次
|
||||
|
||||
**同步流程**:
|
||||
```
|
||||
拉取远程 → 计算差异 → 合并本地(非覆盖) → 推送至私有云
|
||||
```
|
||||
|
||||
### 外部 API 集成
|
||||
|
||||
**TuneHub API** (https://music-dl.sayqz.com):
|
||||
- 搜索: `/api/?type=search&keyword=...&source=...`
|
||||
- 歌词: `/api/?source=...&id=...&type=lrc`
|
||||
- 排行榜列表: `/api/?source=...&type=toplists`
|
||||
- 排行榜歌曲: `/api/?source=...&id=...&type=toplist`
|
||||
- 歌单详情: `/api/?type=playlist&id=...&source=...`
|
||||
|
||||
**支持平台**: netease, kuwo, qq, kugou
|
||||
|
||||
## 部署架构
|
||||
|
||||
### Docker Compose
|
||||
|
||||
```yaml
|
||||
services:
|
||||
music-canvas: # 前端静态网站
|
||||
ports: 7481:3000
|
||||
|
||||
sync-service: # 同步服务
|
||||
ports: 7482:3001
|
||||
volumes:
|
||||
- ./data:/app/data # KV 数据存储
|
||||
- ./music:/app/music # 音乐文件存储
|
||||
```
|
||||
|
||||
### Nginx 配置
|
||||
|
||||
- 前端: `/` → `http://127.0.0.1:7481`
|
||||
- 同步 API: `/api/` → `http://127.0.0.1:7482/` (去掉 `/api` 前缀)
|
||||
|
||||
## 开发注意事项
|
||||
|
||||
### 代码修改原则
|
||||
|
||||
1. **ID 类型一致性**: 所有歌曲 ID 必须保持字符串类型,使用 `normalizeSongId()` 处理
|
||||
2. **文件名清理**: 使用 Unicode NFC 规范化 + 非法字符替换,避免跨平台问题
|
||||
3. **状态同步**: 修改 favorites/playlist 后,确保同步逻辑正确触发
|
||||
4. **API 调用**: 所有外部 API 调用通过 TuneHub API,不要直接调用各平台 API
|
||||
|
||||
### 关键常量
|
||||
|
||||
```javascript
|
||||
API_BASE = "https://music-dl.sayqz.com"
|
||||
SYNC_API_BASE = "/api" // 相对路径,依赖 Nginx 代理
|
||||
SOURCES = ['netease', 'kuwo', 'qq', 'kugou']
|
||||
```
|
||||
|
||||
### 本地开发
|
||||
|
||||
前端无需构建,直接用浏览器打开 `index.html` 即可。如需测试同步功能:
|
||||
```bash
|
||||
cd sync-server
|
||||
node server.js # 默认端口 3001
|
||||
```
|
||||
|
||||
### 环境变量 (sync-server)
|
||||
|
||||
- `DATA_DIR`: KV 数据存储目录 (默认 `./data`)
|
||||
- `MUSIC_DIR`: 音乐文件存储目录 (默认 `./music`)
|
||||
- `PORT`: 服务端口 (默认 `3001`)
|
||||
Reference in New Issue
Block a user