#music-brainz #search-query #async-client #blocking-client #user-agent #utility #rate-limiting

musicbrainz_rs_nova

MusicBrainz Rust是一个用于MusicBrainz API的实用程序包

2个不稳定版本

0.6.0 2024年6月25日
0.5.1 2024年5月30日

#181 in 异步

Download history 382/week @ 2024-05-27 78/week @ 2024-06-03 175/week @ 2024-06-10 96/week @ 2024-06-17 198/week @ 2024-06-24 56/week @ 2024-07-01 75/week @ 2024-07-08 25/week @ 2024-07-22 14/week @ 2024-07-29

114 每月下载量
用于 listenbrainz-cli-tools

MIT 许可证

190KB
3K SLoC

MusicBrainz Rust  

Latest Version Build Status codecov GitHub tag (latest by date) Conventional Commits License

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中的ReleaseReleaseGroup实体也允许您在它们上进行封面艺术查询

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 功能

以下是支持的特性值列表。默认功能是:asyncrate_limitreqwest/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