mirror of
https://github.com/metowolf/Meting.git
synced 2026-09-03 07:27:07 +08:00
* feat: migrate from PHP to Node.js implementation - Replace PHP implementation with Node.js version - Add Node.js package configuration (package.json, package-lock.json) - Add Rollup build configuration for browser compatibility - Update README with Node.js usage examples and API documentation - Add comprehensive test suite for all supported platforms - Add Claude Code development instructions (CLAUDE.md) - Remove PHP-specific files (composer.json, src/Meting.php) - Update GitHub workflows for Node.js environment This migration maintains API compatibility while providing: - Promise-based async/await support - ES6 class design with method chaining - Zero external dependencies (Node.js built-in modules only) - Support for all existing music platforms (netease, tencent, xiami, kugou, baidu, kuwo) 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * refactor: 重构为 Provider 模式架构 - 引入统一的 Provider 接口,实现平台解耦 - 将原有单体文件拆分为模块化 Provider 系统 - 实现真正的内部闭环设计,每个 Provider 独立处理编码/解码 - 优化构建系统,支持版本号注入和 TypeScript 定义生成 - 完善测试覆盖,支持独立平台测试 - 新增架构文档,详细说明设计模式和开发流程 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * fix: 修复 ES Module 导入问题,添加 package.json exports 配置 - 添加 module 字段指向 ESM 版本构建文件 - 添加 exports 字段支持双包发布模式 - 修正 main 字段路径格式 - 解决 import Meting from '@meting/core'; 导入失败问题 Generated with [Claude Code](https://claude.ai/code) via [Happy](https://happy.engineering) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happy <yesreply@happy.engineering> * refactor: 简化网易云音乐架构并恢复 search option 参数支持 - 移除 WebAPI 支持,统一使用 EAPI 架构,简化代码结构 - 删除复杂的选项管理系统和全局配置 - 恢复 search 接口的 option 参数支持(type, page, limit) - 优化构建配置和代码压缩设置 - 更新文档和测试以反映新的 API 结构 Breaking Changes: - 移除 setOption() 方法 - 删除 WebAPI (weapi) 相关代码 - 简化 netease provider 为纯 EAPI 实现 🤖 Generated with [Claude Code](https://claude.ai/code) via [Happy](https://happy.engineering) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happy <yesreply@happy.engineering> --------- Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Happy <yesreply@happy.engineering>
4.5 KiB
4.5 KiB
Meting 架构重构说明
重构概述
本次重构将原本单一文件中的不同音乐厂商逻辑抽离到独立的 Provider 文件中,采用了标准的 Provider 模式,提高了代码的可维护性和扩展性。
新架构结构
src/
├── meting.js # 主入口文件(重构后)
├── meting-original.js # 原始文件备份
└── providers/ # 音乐平台提供者目录
├── index.js # Provider 工厂类
├── base.js # 基础 Provider 接口
├── netease.js # 网易云音乐 Provider
├── tencent.js # 腾讯音乐 Provider
├── xiami.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): 创建指定平台的 ProvidergetSupportedPlatforms(): 获取支持的平台列表isSupported(platform): 检查平台是否支持
主 Meting 类
协调各个 Provider,提供统一的 API 接口:
- 保持原有的公共 API 不变
- 简化为纯粹的协调者角色
- 将具体执行逻辑完全委托给 Provider
- 版本号在构建时注入,无运行时开销
使用方式
重构后的使用方式与原版完全兼容:
import Meting from './src/meting.js';
// 创建实例
const meting = new Meting('netease');
// 或者动态切换平台
meting.site('tencent');
// 使用 API(与原版完全相同)
const result = await meting.search('稻香');
扩展新平台
添加新平台只需要:
- 在
src/providers/下创建新的 Provider 文件 - 继承
BaseProvider并实现所需方法 - 在
src/providers/index.js中注册新 Provider
示例:
// 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 中的实际版本
- 避免运行时文件系统读取,提升性能
构建流程
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 测试
重构成功保持了所有原有功能,同时大大提升了代码的可维护性和扩展性,并优化了运行时性能。