UnblockNeteaseMusic/server-rust
Rust 版本的 UnblockNeteaseMusic/server,以效能、穩定性及可維護性為目標。
目前使用者文件及開發文件 仍在撰寫,在此之前有任何問題,歡迎開 Discussion 詢問。
註:目前 UnblockNeteaseMusic/server 只實作 engine/resolver 的部分。
crypto
:與加密相關的函式庫,如 md5、aes128 等。engine-base
:Engine 的抽象部分,包含一個 Engine 應有的介面、整合所有 Engines 的 Executor 等。engines
examples
方便測試單一引擎模組。如您是開發者,可仿造其它引擎,撰寫自己的 example。api-utils
:用來開發 UNM 的實用工具。request
:UNM 的 reqwest 封裝,自動帶上 User-Agent
等 headers。selector
:包含選擇最適音樂項目的演算法。types
:UNM 的各種基礎類型(如 Song
、Artist
⋯⋯)test-utils
:方便撰寫測試方法及 demo 的工具集。napi
:Node.js 的 UNM (Rust) 綁定。
engines/
底下的所有引擎。rest-api
:UNM 的 RESTful API
engines/
底下的所有引擎。demo
:用來測試及展示 UNM (Rust) 的 demo 程式。
cargo run --release --bin unm_engine_demo
可以參考
engine-demo
的用法~
首先,您需要從 https://crates.io 引用至少三個元件:
unm_engine
:包含並行查詢音源結果的 Executor。unm_engine_[想要的引擎]
:用來從音源搜尋的引擎。unm_types
:UNM 的基礎類型。撰寫函數時十分需要。然後,我們可以註冊音源:
```rust use unmengine::executor::Executor; use unmenginebilibili::{BilibiliEngine, ENGINEID as BILIBILIENGINEID};
let mut executor = Executor::new(); executor.register(BILIBILIENGINEID, BilibiliEngine::new());
// 您也可以直接使用官方預設的引擎集,免去手動註冊的麻煩。
// 首先得引入 unm_api_utils
,然後就可以:
use unmapiutils::executor::buildfullexecutor; let executor = buildfullexecutor(); ```
接著就可以直接使用 executor 提供的方法搜尋及取回結果了:
```rust use unm_types::{Song, Artist, Context};
let context = Context::default();
let searchresult = executor.search(&[BILIBILIENGINEID], Song { id: "".tostring(), name: "TT", artists: vec![ Artist { id: "".to_string(), name: "Twice", }, ], }, &context).await?;
let result = executor.retrieve(&search_result, &context).await?; ```
請參考 napi 的 README.md。
N-API 和 RESTful API 支援的引擎(以下簡稱「預設引擎集」)與我們上架到 https://crates.io 的引擎略有差異。
| 名稱 | 引擎 ID | 注意事項 | 預設引擎集 |
| ---------------- | ---------- | --------------------------------------------------------------- | ---------- |
| Bilbili 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
,見引擎文件。 | ✅ |
Context
)全域通用設定(Context
)包含以下這些設定:
proxy_uri
:要在引擎使用的 Proxy 伺服器。選填。enable_flac
:是否抓取 FLAC 音訊?預設值是 false
。search_mode
:搜尋模式
config
:各引擎設定,見下〈設定引擎特定設定(Config
)〉假如您使用 Rust 版,您可以使用 ContextBuilder
建構 Context:
```rs use unm_types::{ContextBuilder, SearchMode};
let context = ContextBuilder::default() .proxyuri("https://www.google.com") .searchmode(SearchMode::OrderFirst) .build(); ```
如果是使用 JavaScript 版,您可以根據 UNM 的類型定義(VS Code 會提供補全建議) 建構 Object
即可:
```js 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
bash
cargo check # 檢查程式碼是否合法 (valid)
cargo test # 執行本 codebase 的所有 Tests
cargo clippy # Rust linter
UNM (Rust) 的 CI 也會在程式碼 push 後自動執行上述命令, 進行程式碼測試與檢查。
引擎的 crate 名稱格式是:unm_engine_[引擎名稱]
,放置在 /engines/[引擎名稱]
目錄。
建議仿照其它引擎,在 engine-demo
和 napi
註冊自己的音源。
註冊音源有 macro 協助,語法目前是這樣的:
rust
push_engine!([引擎名稱]: [引擎實體]);
範例如下:
rust
push_engine!(bilibili: BilibiliEngine);
This project is licensed under LGPL-3.0-only.