feat: 实现网易云音乐同步服务核心功能与UI改进

添加完整的网易云音乐同步到Navidrome的功能实现,包括:
1. 新增Docker支持与相关配置文件
2. 实现歌单同步逻辑与Navidrome API集成
3. 改进前端UI界面与交互体验
4. 添加状态监控与错误处理机制
5. 实现定时同步功能与进度显示
This commit is contained in:
史悦
2026-01-12 20:03:30 +08:00
parent 89a28e1bc5
commit 50f7869a05
11 changed files with 2331 additions and 386 deletions

150
Netease-sync/README.md Normal file
View File

@@ -0,0 +1,150 @@
# Netease Sync to Navidrome
将网易云音乐歌单同步到 Navidrome 的服务。
## 功能特性
- 支持通过歌单ID或分享链接添加网易云音乐歌单
- 自动下载歌单中的歌曲(通过 sync-server
- 在 Navidrome 中创建同名歌单
- 自动匹配并添加已下载的歌曲到 Navidrome 歌单
- 定时自动同步默认每300秒
- 增量同步,只添加新歌曲
- 实时同步状态反馈
- Web 界面管理
## 环境变量
在启动服务前,需要配置以下环境变量:
| 变量名 | 说明 | 默认值 |
|--------|------|--------|
| `PORT` | 服务端口 | 3000 |
| `DATA_DIR` | 数据存储目录 | /app/data |
| `NAVIDROME_URL` | Navidrome 服务地址 | http://navidrome:4533 |
| `NAVIDROME_USERNAME` | Navidrome 用户名 | admin |
| `NAVIDROME_PASSWORD` | Navidrome 密码 | - |
| `SYNC_INTERVAL` | 定时同步间隔(秒) | 300 |
| `SYNC_SERVER_URL` | Sync-Server 服务地址 | http://sync-service:3001 |
| `SYNC_SERVER_TOKEN` | Sync-Server 认证令牌 | default |
| `TUNEHUB_API_URL` | TuneHub API 地址 | https://music-dl.sayqz.com |
## 使用方法
### 1. 配置环境变量
复制 `.env.example``.env` 并修改配置:
```bash
cp .env.example .env
```
编辑 `.env` 文件,设置 Navidrome 的连接信息。
### 2. 使用 Docker Compose 启动
在项目根目录运行:
```bash
docker-compose up -d netease-sync
```
### 3. 访问 Web 界面
打开浏览器访问:`http://localhost:7483`
### 4. 添加歌单
在输入框中输入网易云音乐歌单ID或分享链接例如
- 歌单ID`123456789`
- 分享链接:`https://music.163.com/#/playlist?id=123456789`
点击"添加歌单"按钮,系统会自动:
1. 获取歌单信息
2. 下载所有歌曲
3. 在 Navidrome 中创建歌单
4. 添加歌曲到歌单
### 5. 管理歌单
- **立即同步**:点击"立即同步"按钮手动触发同步
- **删除歌单**:点击"删除"按钮移除歌单(不会删除 Navidrome 中的歌单)
- **查看状态**:实时查看同步状态和上次同步时间
## API 接口
### 获取所有歌单
```
GET /api/playlists
```
### 添加歌单
```
POST /api/playlists
Content-Type: application/json
{
"url": "歌单ID或分享链接"
}
```
### 删除歌单
```
DELETE /api/playlists/:id
```
### 手动同步歌单
```
POST /api/playlists/:id/sync
```
### 获取歌单状态
```
GET /api/status/:id
```
## 同步逻辑
1. **获取歌单信息**:通过 TuneHub API 获取网易云音乐歌单信息
2. **下载歌曲**:将歌曲列表发送到 sync-server 进行下载
3. **等待下载完成**:等待 5 秒让 sync-server 处理下载
4. **匹配歌曲**:根据文件名格式 `Artist - Name [netease_id].ext` 在 Navidrome 中搜索歌曲
5. **更新歌单**
- 如果是首次同步,在 Navidrome 中创建新歌单
- 如果已存在,只添加新匹配到的歌曲
6. **记录映射**保存网易云音乐歌曲ID到 Navidrome歌曲ID的映射关系
## 数据存储
所有数据存储在 `DATA_DIR` 目录下的 `playlists.json` 文件中,包括:
- 歌单信息
- Navidrome 歌单ID
- 歌曲映射关系
- 同步状态和时间
## 故障排除
### 歌单同步失败
1. 检查 Navidrome 连接配置是否正确
2. 查看 Docker 容器日志:`docker logs netease-sync`
3. 确认 sync-server 正常运行
4. 检查网络连接
### 歌曲未匹配到
1. 确认歌曲已成功下载到 music 目录
2. 检查文件名格式是否正确
3. Navidrome 可能需要时间扫描新文件
4. 尝试手动触发 Navidrome 媒体库扫描
### 定时同步不工作
1. 检查 `SYNC_INTERVAL` 环境变量设置
2. 查看容器日志确认定时任务是否启动
3. 确认服务正常运行