Giter Site home page Giter Site logo

unblockneteasemusic / server-rust Goto Github PK

View Code? Open in Web Editor NEW
229.0 3.0 28.0 1.85 MB

Rust 版本的 UnblockNeteaseMusic/server ,以效能、穩定性及可維護性為目標。

License: GNU Lesser General Public License v3.0

Rust 94.65% JavaScript 5.06% Shell 0.29%
rust unblock netease

server-rust's Introduction

UnblockNeteaseMusic/server-rust

FOSSA Status

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 的各種基礎類型(如 SongArtist⋯⋯)
  • 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

使用

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

請參考 UNM REST API 的 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,見引擎文件。
  • migu 的 API 壞掉了。等到有更好的 API 會再更新。

引擎文件

設定全域通用設定(Context

全域通用設定(Context)包含以下這些設定:

  • proxy_uri:要在引擎使用的 Proxy 伺服器。選填。
  • enable_flac:是否抓取 FLAC 音訊?預設值是 false
  • search_mode:搜尋模式
  • 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-demonapi 註冊自己的音源。 註冊音源有 macro 協助,語法目前是這樣的:

push_engine!([引擎名稱]: [引擎實體]);

範例如下:

push_engine!(bilibili: BilibiliEngine);

授權條款

This project is licensed under LGPL-3.0-only.

FOSSA Status

server-rust's People

Contributors

dependabot[bot] avatar memorydream avatar pan93412 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

server-rust's Issues

X-Real-IP 支持?

之前的UNM有通过X-Real-IP来支持海外解锁(参见此处),想请问rust版现在有支持或者有计划支持吗?readme里没有提及,搜索了下代码也没有找到相关的部分,不知道是否是我遗漏了。多谢。

修掉 CI 編譯失敗的問題

aarch64-unknown-linux-gnu

2022-08-10T04:31:00.0571160Z    Compiling tinyvec v1.6.0
2022-08-10T04:31:01.0641082Z    Compiling alloc-stdlib v0.2.1
2022-08-10T04:31:01.1633483Z    Compiling miniz_oxide v0.5.1
2022-08-10T04:31:01.5228108Z    Compiling form_urlencoded v1.0.1
2022-08-10T04:31:01.9934096Z    Compiling random-string v1.0.0
2022-08-10T04:31:02.0776633Z    Compiling unm_napi v0.0.0 (/build/napi)
2022-08-10T04:31:04.0664728Z    Compiling openssl-sys v0.9.75
2022-08-10T04:31:04.4282158Z error: failed to run custom build command for `libmimalloc-sys v0.1.25`
2022-08-10T04:31:04.4283583Z 
2022-08-10T04:31:04.4283660Z Caused by:
2022-08-10T04:31:04.4292632Z   process didn't exit successfully: `/build/target/release/build/libmimalloc-sys-3c79500f70151f70/build-script-build` (exit status: 1)
2022-08-10T04:31:04.4293207Z   --- stdout
2022-08-10T04:31:04.4293409Z   OPT_LEVEL = Some("3")
2022-08-10T04:31:04.4293859Z   TARGET = Some("aarch64-unknown-linux-gnu")
2022-08-10T04:31:04.4294188Z   HOST = Some("x86_64-unknown-linux-gnu")
2022-08-10T04:31:04.4294504Z   CC_aarch64-unknown-linux-gnu = None
2022-08-10T04:31:04.4294992Z   CC_aarch64_unknown_linux_gnu = Some("aarch64-linux-gnu-gcc")
2022-08-10T04:31:04.4295349Z   CFLAGS_aarch64-unknown-linux-gnu = None
2022-08-10T04:31:04.4295746Z   CFLAGS_aarch64_unknown_linux_gnu = None
2022-08-10T04:31:04.4295960Z   TARGET_CFLAGS = None
2022-08-10T04:31:04.4296155Z   CFLAGS = None
2022-08-10T04:31:04.4296363Z   CRATE_CC_NO_DEFAULTS = None
2022-08-10T04:31:04.4296565Z   DEBUG = Some("false")
2022-08-10T04:31:04.4296933Z   CARGO_CFG_TARGET_FEATURE = Some("neon,pmuv3")
2022-08-10T04:31:04.4297270Z   CC_aarch64-unknown-linux-gnu = None
2022-08-10T04:31:04.4297754Z   CC_aarch64_unknown_linux_gnu = Some("aarch64-linux-gnu-gcc")
2022-08-10T04:31:04.4298105Z   CFLAGS_aarch64-unknown-linux-gnu = None
2022-08-10T04:31:04.4298470Z   CFLAGS_aarch64_unknown_linux_gnu = None
2022-08-10T04:31:04.4298704Z   TARGET_CFLAGS = None
2022-08-10T04:31:04.4298887Z   CFLAGS = None
2022-08-10T04:31:04.4299084Z   CRATE_CC_NO_DEFAULTS = None
2022-08-10T04:31:04.4299453Z   CARGO_CFG_TARGET_FEATURE = Some("neon,pmuv3")
2022-08-10T04:31:04.4299762Z   CC_aarch64-unknown-linux-gnu = None
2022-08-10T04:31:04.4300236Z   CC_aarch64_unknown_linux_gnu = Some("aarch64-linux-gnu-gcc")
2022-08-10T04:31:04.4300598Z   CFLAGS_aarch64-unknown-linux-gnu = None
2022-08-10T04:31:04.4300948Z   CFLAGS_aarch64_unknown_linux_gnu = None
2022-08-10T04:31:04.4301171Z   TARGET_CFLAGS = None
2022-08-10T04:31:04.4301369Z   CFLAGS = None
2022-08-10T04:31:04.4301556Z   CRATE_CC_NO_DEFAULTS = None
2022-08-10T04:31:04.4301797Z   CARGO_CFG_TARGET_FEATURE = Some("neon,pmuv3")
2022-08-10T04:31:04.4302717Z   running: "aarch64-linux-gnu-gcc" "-O3" "-ffunction-sections" "-fdata-sections" "-fPIC" "-I" "c_src/mimalloc/include" "-I" "c_src/mimalloc/src" "-Wall" "-Wextra" "-DMI_SECURE=4" "-DMI_DEBUG=0" "-o" "/build/target/aarch64-unknown-linux-gnu/release/build/libmimalloc-sys-05bea6790a1b0a59/out/c_src/mimalloc/src/static.o" "-c" "c_src/mimalloc/src/static.c"
2022-08-10T04:31:04.4303252Z 
2022-08-10T04:31:04.4303360Z   --- stderr
2022-08-10T04:31:04.4303473Z 
2022-08-10T04:31:04.4303480Z 
2022-08-10T04:31:04.4303950Z   error occurred: Failed to find tool. Is `aarch64-linux-gnu-gcc` installed?
2022-08-10T04:31:04.4304159Z 
2022-08-10T04:31:04.4304241Z 
2022-08-10T04:31:04.4304509Z warning: build failed, waiting for other jobs to finish...
2022-08-10T04:31:04.6218703Z Internal Error: Command failed: cargo build --release --target aarch64-unknown-linux-gnu
2022-08-10T04:31:04.6219124Z     at checkExecSyncError (node:child_process:828:11)
2022-08-10T04:31:04.6219424Z     at Object.execSync (node:child_process:899:15)
2022-08-10T04:31:04.6219866Z     at BuildCommand.<anonymous> (/build/napi/node_modules/@napi-rs/cli/scripts/index.js:31942:26)
2022-08-10T04:31:04.6220182Z     at Generator.next (<anonymous>)
2022-08-10T04:31:04.6220575Z     at fulfilled (/build/napi/node_modules/@napi-rs/cli/scripts/index.js:3464:58)
2022-08-10T04:31:04.6421863Z error Command failed with exit code 1.
2022-08-10T04:31:04.6422272Z info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
2022-08-10T04:31:05.1262506Z Post job cleanup.

歌曲匹配错误

用ypm时,好多歌曲匹配的都不对,不知道怎么办,指定特定的源是不是会起作用?不知道这个匹配机制是什么,但是网易云音乐上有的歌曲时长和别的曲库是有几秒的差别的,感觉不能只看时长。在别的曲库搜的第一个结果往往就是正确的,但是匹配出来的就是错的。关于匹配时间过长的问题,是不是可以预读播放列表,预先查询匹配?@pan93412

Add license

根据 fossa 扫描结果,个人推荐设定为 GPL-3.0-only。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.