mirror of
https://github.com/metowolf/Meting.git
synced 2026-09-03 07:27:07 +08:00
BREAKING CHANGE: Xiami Music platform support has been removed as the service has been discontinued. Changes: - Remove Xiami Music provider implementation (src/providers/xiami.js) - Update supported platforms list from 6 to 5 (NetEase, Tencent, KuGou, Baidu, Kuwo) - Update all documentation (README.md, CLAUDE.md, ARCHITECTURE.md) - Update package.json version to 1.6.0 and remove Xiami references - Add CHANGELOG.md with detailed migration guide Migration: Users should switch to alternative platforms. The library will automatically fallback to 'netease' if 'xiami' is specified. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
156 lines
4.4 KiB
Markdown
156 lines
4.4 KiB
Markdown
# Meting 架构重构说明
|
||
|
||
## 重构概述
|
||
|
||
本次重构将原本单一文件中的不同音乐厂商逻辑抽离到独立的 Provider 文件中,采用了标准的 Provider 模式,提高了代码的可维护性和扩展性。
|
||
|
||
## 新架构结构
|
||
|
||
```
|
||
src/
|
||
├── meting.js # 主入口文件(重构后)
|
||
├── meting-original.js # 原始文件备份
|
||
└── providers/ # 音乐平台提供者目录
|
||
├── index.js # Provider 工厂类
|
||
├── base.js # 基础 Provider 接口
|
||
├── netease.js # 网易云音乐 Provider
|
||
├── tencent.js # 腾讯音乐 Provider
|
||
├── kugou.js # 酷狗音乐 Provider
|
||
├── baidu.js # 百度音乐 Provider
|
||
└── kuwo.js # 酷我音乐 Provider
|
||
```
|
||
|
||
## 架构优势
|
||
|
||
### 1. 单一职责原则
|
||
- 每个 Provider 只负责一个音乐平台的逻辑
|
||
- 主 Meting 类只负责协调和通用功能
|
||
|
||
### 2. 开放封闭原则
|
||
- 添加新平台只需创建新的 Provider,无需修改现有代码
|
||
- 修改某个平台的逻辑不会影响其他平台
|
||
|
||
### 3. 内部闭环设计
|
||
- 每个 Provider 内部处理自己的编码/解码逻辑
|
||
- 避免了主类中的方法映射和统一处理
|
||
- 真正实现了平台逻辑的完全隔离
|
||
|
||
### 4. 代码组织清晰
|
||
- 每个文件职责明确,便于维护
|
||
- 相关功能聚合在一起
|
||
- 版本号在构建时从 package.json 注入,避免运行时文件读取
|
||
|
||
## 核心组件
|
||
|
||
### BaseProvider 基础类
|
||
所有平台 Provider 的基础接口,定义了标准的方法:
|
||
- `getHeaders()`: 获取请求头配置
|
||
- `search()`: 搜索功能
|
||
- `song()`: 获取歌曲详情
|
||
- `album()`: 获取专辑信息
|
||
- `artist()`: 获取艺术家作品
|
||
- `playlist()`: 获取播放列表
|
||
- `url()`: 获取播放链接
|
||
- `lyric()`: 获取歌词
|
||
- `pic()`: 获取封面图片
|
||
- `format()`: 数据格式化
|
||
- `encode()`: 请求编码(如需要)
|
||
- `urlDecode()`: URL解码(如需要)
|
||
- `lyricDecode()`: 歌词解码(如需要)
|
||
|
||
### ProviderFactory 工厂类
|
||
负责创建和管理 Provider 实例:
|
||
- `create(platform, meting)`: 创建指定平台的 Provider
|
||
- `getSupportedPlatforms()`: 获取支持的平台列表
|
||
- `isSupported(platform)`: 检查平台是否支持
|
||
|
||
### 主 Meting 类
|
||
协调各个 Provider,提供统一的 API 接口:
|
||
- 保持原有的公共 API 不变
|
||
- 简化为纯粹的协调者角色
|
||
- 将具体执行逻辑完全委托给 Provider
|
||
- 版本号在构建时注入,无运行时开销
|
||
|
||
## 使用方式
|
||
|
||
重构后的使用方式与原版完全兼容:
|
||
|
||
```javascript
|
||
import Meting from './src/meting.js';
|
||
|
||
// 创建实例
|
||
const meting = new Meting('netease');
|
||
|
||
// 或者动态切换平台
|
||
meting.site('tencent');
|
||
|
||
// 使用 API(与原版完全相同)
|
||
const result = await meting.search('稻香');
|
||
```
|
||
|
||
## 扩展新平台
|
||
|
||
添加新平台只需要:
|
||
|
||
1. 在 `src/providers/` 下创建新的 Provider 文件
|
||
2. 继承 `BaseProvider` 并实现所需方法
|
||
3. 在 `src/providers/index.js` 中注册新 Provider
|
||
|
||
示例:
|
||
```javascript
|
||
// src/providers/newplatform.js
|
||
import BaseProvider from './base.js';
|
||
|
||
export default class NewPlatformProvider extends BaseProvider {
|
||
constructor(meting) {
|
||
super(meting);
|
||
this.name = 'newplatform';
|
||
}
|
||
|
||
getHeaders() {
|
||
// 实现平台特定的请求头
|
||
}
|
||
|
||
search(keyword, option = {}) {
|
||
// 实现搜索逻辑
|
||
}
|
||
|
||
// ... 实现其他必需方法
|
||
}
|
||
```
|
||
|
||
## 构建系统
|
||
|
||
### Rollup 构建配置
|
||
- 使用自定义插件在构建时注入版本号
|
||
- 源码中使用 `__VERSION__` 占位符
|
||
- 构建时自动替换为 package.json 中的实际版本
|
||
- 避免运行时文件系统读取,提升性能
|
||
|
||
### 构建流程
|
||
```bash
|
||
npm run build # 构建 ESM 和 CJS 两种格式
|
||
```
|
||
|
||
构建后:
|
||
- `lib/meting.esm.js` - ES Module 格式
|
||
- `lib/meting.js` - CommonJS 格式
|
||
|
||
## 兼容性
|
||
|
||
- ✅ 保持原有 API 接口不变
|
||
- ✅ 保持原有使用方式不变
|
||
- ✅ 保持原有功能特性不变
|
||
- ✅ 支持原有的链式调用
|
||
- ✅ 支持原有的配置方法
|
||
- ✅ 构建时版本号注入,无运行时开销
|
||
|
||
## 测试验证
|
||
|
||
已通过以下测试:
|
||
- 基础功能测试(`test/test.js`)
|
||
- 架构验证测试(`test/simple-test.js`)
|
||
- 版本号注入测试(`test/build-version-test.js`)
|
||
- 各平台 Provider 测试
|
||
|
||
重构成功保持了所有原有功能,同时大大提升了代码的可维护性和扩展性,并优化了运行时性能。 |