5 个不稳定版本
0.4.0 | 2023年1月22日 |
---|---|
0.3.0 | 2022年5月24日 |
0.3.0-pre.1 | 2022年4月24日 |
0.2.0-pre.2 | 2022年4月14日 |
#1338 in 网页编程
在 2 个库中使用(通过 unm_api_utils)
105KB
1.5K SLoC
UnblockNeteaseMusic/服务器-rust
Rust 版本的 UnblockNeteaseMusic/server,以性能、稳定性及可维护性为目标。
目前用户文档及开发文档 仍在撰写,在此之前有任何问题,欢迎开 Discussion 咨询。
⚠️ 免责声明 Disclaimer
- 本函数库仅供 个人学习和研究 Rust 网络服务使用,并 未用于商业用途。
- 除授权条款列载的事项外,您亦已知将此函数库用于商业或其他竞争行为上,可能会引起法律风险。
- 若您认为本函数库侵犯您的知识产权,请发起 PR、Issue 或 DMCA 请求,表达您想移除相关引擎或代码的意愿。
架构
注:目前 UnblockNeteaseMusic/server 只实现 engine/resolver 的部分。
crypto
:与加密相关的函数库,如 md5、aes128 等。engine-base
:Engine 的抽象部分,包含一个 Engine 应有的接口、整合所有 Engines 的 Executor 等。engines
- 此目录下的是官方提供的引擎,所有引擎都是可选依赖、可使用的。
- 您可以自行实现其他平台,并发布到 crates.io(当然也欢迎提交 PR 让引擎纳入本 codebase 一同管理)。
- 每个 Engine 都有
examples
方便测试单一引擎模块。如您是开发者,可模仿其他引擎,编写自己的 example。
api-utils
:用于开发 UNM 的实用工具。request
:UNM 的 reqwest 封装,自动带上User-Agent
等 headers。selector
:包含选择最合适音乐项目的算法。types
:UNM 的各种基础类型(如Song
、Artist⋯⋯)
test-utils
:方便编写测试方法和 demo 的工具集。napi
:Node.js 的 UNM (Rust) 绑定。- 这个绑定因 napi 限制,目前不像 Rust 版一样有方便的扩展系统。
- 原则上启用
engines/
底下的所有引擎。
rest-api
:UNM 的 RESTful API- 因安全性考虑,目前不考虑为 RESTful API 提供不修改代码的扩展方案。
- 原则上启用
engines/
底下的所有引擎。
demo
:用于测试及展示 UNM (Rust) 的 demo 程序。- 启动 Demo:
cargo run --release --bin unm_engine_demo
- 启动 Demo:
使用
Rust 函数库
可以参考
engine-demo
的用法~
首先,您需要从 https://crates.io 引用至少三个组件:
unm_engine
:包含并行查询音源结果的 Executor。unm_engine_[想要的引擎]
:用于从音源搜索的引擎。unm_types
:UNM 的基础类型。编写函数时非常需要。
然后,我们可以注册音源:
use unm_engine::executor::Executor;
use unm_engine_bilibili::{BilibiliEngine, ENGINE_ID as BILIBILI_ENGINE_ID};
let mut executor = Executor::new();
executor.register(BILIBILI_ENGINE_ID, BilibiliEngine::new());
// 您也可以直接使用官方預設的引擎集,免去手動註冊的麻煩。
// 首先得引入 `unm_api_utils`,然後就可以:
use unm_api_utils::executor::build_full_executor;
let executor = build_full_executor();
接着就可以直接使用 executor 提供的方法搜索及取回结果了:
use unm_types::{Song, Artist, Context};
let context = Context::default();
let search_result = executor.search(&[BILIBILI_ENGINE_ID], Song {
id: "".to_string(),
name: "TT",
artists: vec![
Artist {
id: "".to_string(),
name: "Twice",
},
],
}, &context).await?;
let result = executor.retrieve(&search_result, &context).await?;
TypeScript (JS) 库
请参考 napi 的 README.md。
RESTful API
设置
支持的所有引擎
N-API 和 RESTful API 支持的引擎(以下简称「默认引擎集」)与我们上架到 https://crates.io 的引擎略有不同。
名称 | 引擎 ID | 注意事项 | 默认引擎集 |
---|---|---|---|
Bilibili Music | bilibili |
✅ | |
酷狗音乐 | kugou |
✅ | |
酷我音乐 | kuwo |
目前仅支持 320kbps MP3 | ✅ |
咪咕音乐 | migu |
||
JOOX | joox |
需要设置 joox:cookie ,见引擎文件。 |
✅ |
YtDl | ytdl |
默认使用的 youtube-dl 后端是 yt-dlp ,可设置 ytdl:exe 调整 |
✅ |
第三方网易云 API | pyncm |
✅ | |
QQ音乐 | qq |
需要设置 qq:cookie ,见引擎文件。 |
✅ |
migu
的 API 坏掉了。等到有更好的 API 会再更新。
引擎文件
- JOOX 引擎:https://docs.rs/unm_engine_joox
- YtDl 引擎:https://docs.rs/unm_engine_ytdl
- QQ 引擎:https://docs.rs/unm_engine_qq
设置全局通用设置(Context
)
全局通用设置(Context
)包含以下这些设置:
proxy_uri
:要在引擎使用的代理服务器。选填。enable_flac
:是否抓取 FLAC 音频?默认值是false
。search_mode
:搜索模式- 可以设置是以「速度为主」(FastFirst)或者是以「顺序为主」(OrderFirst)进行搜索
- 示例请见 https://docs.rs/unm_types/0.2.0-pre.4/unm_types/enum.SearchMode.html
config
:各引擎设置,见下〈设置引擎特定设置(Config
)〉
如果您使用 Rust 版,您可以使用 ContextBuilder
构建 Context:
use unm_types::{ContextBuilder, SearchMode};
let context = ContextBuilder::default()
.proxy_uri("https://www.google.com")
.search_mode(SearchMode::OrderFirst)
.build();
如果是使用 JavaScript 版,您可以根据 UNM 的类型定义(VS Code 会提供补全建议) 构建 Object
即可:
const UNM = require("@unblockneteasemusic/rust-napi");
// TS 的語法是 `const context: UNM.Context = {}`
/** @type {UNM.Context} */
const context = {
proxyUri: "https://www.google.com",
searchMode: UNM.SearchMode.OrderFirst,
};
设置引擎特定设置(Config
)
「引擎特定设置」是每个引擎针对自己的需要,从 Config
取得需要的设置。设置方法请见 engines/README.md
贡献
检查程序的相关命令
cargo check # 檢查程式碼是否合法 (valid)
cargo test # 執行本 codebase 的所有 Tests
cargo clippy # Rust linter
UNM (Rust) 的 CI 也会在程序 push 后自动执行上述命令,进行程序测试与检查。
贡献引擎后的建议事项
引擎的 crate 名称格式是:unm_engine_[引擎名称]
,放置在 /engines/[引擎名称]
目录。
建议仿照其他引擎,在 engine-demo
和 napi
注册自己的音源。注册音源有 macro 协助,语法目前是这样的:
push_engine!([引擎名稱]: [引擎實體]);
例如:
push_engine!(bilibili: BilibiliEngine);
授权条款
This project is licensed under LGPL-3.0-only.
依赖
~5–21MB
~359K SLoC