2个不稳定版本
0.6.0 | 2024年6月25日 |
---|---|
0.5.1 | 2024年5月30日 |
#181 in 异步
114 每月下载量
用于 listenbrainz-cli-tools
190KB
3K SLoC
Rust
MusicBrainz rust是MusicBrainz API的实用程序包。
这是一个musicbrainz_rs crate的分支,因为它目前似乎没有得到维护。虽然这个crate主要是作为一个临时修复用于另一个项目,但这个crate可以用作原版的替代。
这是一个要替换的,但在某些情况下可能需要一些调整。不要忘记进行测试。
你可能正在寻找
使用
你可以选择使用默认的异步客户端或阻塞客户端。
异步客户端
musicbrainz_rs_nova = "0.6.0"
阻塞客户端
musicbrainz_rs_nova = { version = "0.6.0", default-features = false, features = ["blocking"] }
如果是从musicbrainz_rs迁移而来
musicbrainz_rs = {version = "0.6.0", package = "musicbrainz_rs_nova"}
功能
注意:以下所有示例均使用blocking
功能,以便简洁。
获取查询
要执行通过fetch查询的查找,您需要导入Fetch
特征。这可以通过使用musicbrainz_rs::prelude
use musicbrainz_rs_nova::entity::artist;
use musicbrainz_rs_nova::entity::artist::*;
use musicbrainz_rs_nova::prelude::*;
fn main() {
let nirvana = Artist::fetch()
.id("5b11f4ce-a62d-471e-81fc-a69a8278c7da")
.execute();
assert_eq!(nirvana.unwrap().name, "Nirvana".to_string());
}
包含参数
您还可以使用包含来获取有关资源的更多详细信息
每个Musicbrainz资源都有允许的包含参数。
use musicbrainz_rs_nova::entity::label::*;
use musicbrainz_rs_nova::prelude::*;
fn main() {
let ninja_tune = Label::fetch()
.id("dc940013-b8a8-4362-a465-291026c04b42")
.with_tags()
.with_ratings()
.execute()
.unwrap();
assert!(ninja_tune
.tags
.unwrap()
.iter()
.any(|tag| tag.name == "independent"));
assert!(ninja_tune.rating.is_some());
}
封面艺术查询
MusicBrainz中的Release
和ReleaseGroup
实体也允许您在它们上进行封面艺术查询
use musicbrainz_rs_nova::entity::release::*;
use musicbrainz_rs_nova::entity::CoverartResponse;
use musicbrainz_rs_nova::prelude::*;
use musicbrainz_rs_nova::FetchCoverart;
fn main() {
// CoverArt Query for a Release.
let in_utero_coverart = Release::fetch_coverart()
.id("76df3287-6cda-33eb-8e9a-044b5e15ffdd")
.execute()
.expect("Unable to get cover art");
if let CoverartResponse::Json(coverart) = in_utero_coverart {
assert!(!coverart.images[0].back);
assert_eq!(
coverart.images[0].image,
"http://coverartarchive.org/release/76df3287-6cda-33eb-8e9a-044b5e15ffdd/829521842.jpg"
);
} else {
assert!(false);
}
let in_utero = Release::fetch()
.id("76df3287-6cda-33eb-8e9a-044b5e15ffdd")
.execute()
.expect("Unable to get release");
// Calling `get_coverart()` method on an already fetched Release entity.
let in_utero_coverart = in_utero
.get_coverart()
.execute()
.expect("Unable to get coverart");
if let CoverartResponse::Json(coverart) = in_utero_coverart {
assert!(!coverart.images[0].back);
assert_eq!(
coverart.images[0].image,
"http://coverartarchive.org/release/76df3287-6cda-33eb-8e9a-044b5e15ffdd/829521842.jpg"
);
} else {
assert!(false);
}
// CoverArt Query Builder to fetch a specific resource.
let in_utero_500px_front_coverart = Release::fetch_coverart()
.id("76df3287-6cda-33eb-8e9a-044b5e15ffdd")
.res_500()
.back()
.execute()
.expect("Unable to get cover art");
if let CoverartResponse::Url(coverart_url) = in_utero_500px_front_coverart {
println!("{}", coverart_url);
} else {
assert!(false);
}
}
浏览查询
使用 musicbrainz_rs::Browse
或使用 musicbrainz_rs::prelude
将其引入作用域以执行一个 浏览查询。就像 Include
一样,每个 MusicBrainz 资源都允许进行此类查询的链接实体。
use musicbrainz_rs_nova::entity::artist;
use musicbrainz_rs_nova::entity::artist::Artist;
use musicbrainz_rs_nova::prelude::*;
fn main() {
let artists_on_in_utero_release = Artist::browse()
.by_release("18d4e9b4-9247-4b44-914a-8ddec3502103")
.execute();
let artists_on_in_utero_release = artists_on_in_utero_release.unwrap();
artists_on_in_utero_release
.entities
.iter()
.for_each(|artist| println!("{:?}", artist.name));
}
搜索查询
使用 musicbrainz_rs::Search
执行一个 搜索查询。
use musicbrainz_rs_nova::entity::artist::Artist;
use musicbrainz_rs_nova::prelude::*;
fn main() {
musicbrainz_rs::config::set_user_agent("my_awesome_app/1.0");
let query = Artist::query_builder()
.artist("Miles Davis")
.and()
.country("US")
.build();
let query_result = Artist::search(query).execute().unwrap();
let query_result: Vec<String> = query_result.entities
.iter()
.map(|artist| artist.name.clone()).collect();
assert!(query_result.contains(&"Miles Davis".to_string()));
assert!(query_result.contains(&"Miles Davis Quintet".to_string()));
}
自定义用户代理
您可以根据音乐脑图文档中的建议设置您的应用程序用户代理
use musicbrainz_rs_nova::entity::artist::Artist;
use musicbrainz_rs_nova::prelude::*;
fn main() {
musicbrainz_rs::config::set_user_agent("my_awesome_app/1.0");
let nirvana = Artist::fetch()
.id("5b11f4ce-a62d-471e-81fc-a69a8278c7da")
.execute();
assert_eq!(nirvana.unwrap().name, "Nirvana".to_string());
}
速率限制
默认情况下,根据 MB 的策略,实现了 1req/sec 的速率限制器。这允许您毫无顾虑地发送大量请求,无需担心对音乐脑图进行 DDoS 攻击。此功能仅与 async
功能捆绑提供,因为它需要一个异步运行时。但对于 blocking
用户来说,这不是问题,因为 API 有点宽容,并且循环调用请求很少达到 1req/sec
示例
要查看在 crate 中当前实现了什么,您可以查看 tests
目录。
您可以使用 cargo run --example example_name
Cargo 功能
以下是支持的特性值列表。默认功能是:async
、rate_limit
和 reqwest/default-tls
blocking
:使用阻塞客户端async
:使用异步客户端rate_limit
:为请求添加速率限制器。需要async
rustls
:使用 rustls 而不是平台的 tls
MSRV
对于 cacache,最低支持的 Rust 版本为 1.64.0
。任何对 MSRV 的更改都将被视为破坏性更改。
目前尚未检查 MSRV 是否是实际的最小版本,因此它可能降低。如果您有问题,请在此处回复 这里,我将尽快处理。同样,如果需要 traits 中的异步,它可能增加到 1.75
贡献
欢迎所有贡献,如果您发现错误或有特性请求,请毫不犹豫地打开一个问题!
致谢
本 crate 的大部分文档摘自官方的 音乐脑图文档,感谢 MetaBrainz 基金会及其赞助商和支持者。封面艺术由 封面艺术存档 提供。
依赖项
~5–18MB
~271K SLoC