Compare commits

..

No commits in common. "main" and "musixmatch-cli/v0.3.0" have entirely different histories.

7 changed files with 67 additions and 74 deletions

View file

@ -17,7 +17,7 @@ jobs:
renovate: renovate:
runs-on: docker runs-on: docker
container: container:
image: renovate/renovate:39 image: renovate/renovate:latest
steps: steps:
- name: Load renovate repo cache - name: Load renovate repo cache

View file

@ -3,23 +3,6 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
## [v0.2.1](https://codeberg.org/ThetaDev/musixmatch-inofficial/compare/musixmatch-inofficial/v0.2.0..musixmatch-inofficial/v0.2.1) - 2025-04-04
### 🐛 Bug Fixes
- Parsing unset has_fan_chant field - ([6f90033](https://codeberg.org/ThetaDev/musixmatch-inofficial/commit/6f90033cf4284eff5c12a30aafb21943c1575b92))
### 📚 Documentation
- Fix docs - ([4a46e7b](https://codeberg.org/ThetaDev/musixmatch-inofficial/commit/4a46e7bb1d83c6261660d403c009cdb640b301d7))
### ⚙️ Miscellaneous Tasks
- *(deps)* Update rust crate governor to 0.10.0 - ([87859e6](https://codeberg.org/ThetaDev/musixmatch-inofficial/commit/87859e629f3c236ba450872b29beb7876be7ef0b))
- *(deps)* Update rust crate rstest to 0.25.0 - ([a3f2ffc](https://codeberg.org/ThetaDev/musixmatch-inofficial/commit/a3f2ffc5d99ddddf777b4de306bd215bd3bbf5ce))
- *(deps)* Update rust crate rand to 0.9.0 - ([7c325c4](https://codeberg.org/ThetaDev/musixmatch-inofficial/commit/7c325c4af779e32059680c1cfb874f83896d7649))
## [v0.2.0](https://codeberg.org/ThetaDev/musixmatch-inofficial/compare/musixmatch-inofficial/v0.1.2..musixmatch-inofficial/v0.2.0) - 2025-01-16 ## [v0.2.0](https://codeberg.org/ThetaDev/musixmatch-inofficial/compare/musixmatch-inofficial/v0.1.2..musixmatch-inofficial/v0.2.0) - 2025-01-16
### 🚀 Features ### 🚀 Features

View file

@ -1,6 +1,6 @@
[package] [package]
name = "musixmatch-inofficial" name = "musixmatch-inofficial"
version = "0.2.1" version = "0.2.0"
rust-version = "1.70.0" rust-version = "1.70.0"
edition.workspace = true edition.workspace = true
authors.workspace = true authors.workspace = true
@ -54,14 +54,14 @@ time = { version = "0.3.10", features = [
] } ] }
hmac = "0.12.0" hmac = "0.12.0"
sha1 = "0.10.0" sha1 = "0.10.0"
rand = "0.9.0" rand = "0.8.0"
base64 = "0.22.0" base64 = "0.22.0"
[dev-dependencies] [dev-dependencies]
rstest = { version = "0.25.0", default-features = false } rstest = { version = "0.24.0", default-features = false }
dotenvy = "0.15.5" dotenvy = "0.15.5"
tokio = { version = "1.20.4", features = ["macros"] } tokio = { version = "1.20.4", features = ["macros"] }
futures = "0.3.21" futures = "0.3.21"
path_macro = "1.0.0" path_macro = "1.0.0"
governor = "0.10.0" governor = "0.8.0"
test-log = "0.2.16" test-log = "0.2.16"

View file

@ -1,6 +1,8 @@
{ {
"$schema": "https://docs.renovatebot.com/renovate-schema.json", "$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": ["config:best-practices", ":preserveSemverRanges"], "extends": [
"config:best-practices"
],
"semanticCommits": "enabled", "semanticCommits": "enabled",
"automerge": true, "automerge": true,
"automergeStrategy": "squash", "automergeStrategy": "squash",

View file

@ -449,20 +449,20 @@ impl Musixmatch {
} }
fn random_guid() -> String { fn random_guid() -> String {
let mut rng = rand::rng(); let mut rng = rand::thread_rng();
let n = rng.random::<u64>(); let n = rng.gen::<u64>();
format!("{:016x}", n) format!("{:016x}", n)
} }
fn random_uuid() -> String { fn random_uuid() -> String {
let mut rng = rand::rng(); let mut rng = rand::thread_rng();
format!( format!(
"{:08x}-{:04x}-{:04x}-{:04x}-{:012x}", "{:08x}-{:04x}-{:04x}-{:04x}-{:012x}",
rng.random::<u32>(), rng.gen::<u32>(),
rng.random::<u16>(), rng.gen::<u16>(),
rng.random::<u16>(), rng.gen::<u16>(),
rng.random::<u16>(), rng.gen::<u16>(),
rng.random::<u64>() & 0xffffffffffff, rng.gen::<u64>() & 0xffffffffffff,
) )
} }

View file

@ -160,20 +160,18 @@ pub struct TrackLyricsTranslationStatus {
/// Lyrics parts marked with the performer who is singing them /// Lyrics parts marked with the performer who is singing them
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
#[allow(missing_docs)]
pub struct TrackPerformerTagging { pub struct TrackPerformerTagging {
/// Musixmatch user ID of the user who added the performer tags /// Musixmatch user ID of the user who added the performer tags
/// ///
/// Format: `mxm:<16 byte hex>` /// Format: `mxm:<16 byte hex>`
pub user_id: String, pub user_id: String,
/// True if the lyrics are completely tagged /// True if the lyrics are completely tagged
#[serde(default)]
pub completed: bool, pub completed: bool,
/// True if the lyrics have unknown performers /// True if the lyrics
#[serde(default)]
pub has_unknown: bool, pub has_unknown: bool,
/// True if the lyrics contain parts that are intended to be sung by the /// True if the lyrics contain parts that are intended to be sung by the
/// audience during concerts /// audience during concerts
#[serde(default)]
pub has_fan_chant: bool, pub has_fan_chant: bool,
/// List of tagged lyrics parts /// List of tagged lyrics parts
#[serde(default)] #[serde(default)]
@ -185,14 +183,15 @@ pub struct TrackPerformerTagging {
/// Performer-tagged lyrics part /// Performer-tagged lyrics part
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
#[allow(missing_docs)]
pub struct PerformerTaggingPart { pub struct PerformerTaggingPart {
/// Part of the lyrics text /// Part of the lyrics text
/// ///
/// Includes whitespace (spaces and newline characters). /// Includes whitespace (spaces and newline characters).
pub snippet: String, pub snippet: String,
/// Unknown /// Unbekannt
/// ///
/// Values: 0-3 /// 0-3
pub position: u32, pub position: u32,
/// List of performers singing this part /// List of performers singing this part
pub performers: Vec<Performer>, pub performers: Vec<Performer>,
@ -200,6 +199,7 @@ pub struct PerformerTaggingPart {
/// Lyrics performer /// Lyrics performer
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
#[allow(missing_docs)]
pub struct Performer { pub struct Performer {
/// artist / unknown /// artist / unknown
#[serde(rename = "type")] #[serde(rename = "type")]
@ -219,6 +219,7 @@ pub struct Performer {
/// Artists (and possibly other objects) that are referenced by the tagged parts /// Artists (and possibly other objects) that are referenced by the tagged parts
#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] #[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)]
#[serde(default)] #[serde(default)]
#[allow(missing_docs)]
pub struct PerformerTaggingResources { pub struct PerformerTaggingResources {
/// List of artists tagged as performers /// List of artists tagged as performers
pub artists: Vec<Artist>, pub artists: Vec<Artist>,

View file

@ -324,9 +324,9 @@ mod track {
let track = mxm let track = mxm
.await .await
.matcher_track( .matcher_track(
"Unter der Oberfläche", "Poker Face",
"Silbermond", "Lady Gaga",
"Himmel auf", "The Fame",
translation_status, translation_status,
lang_3c, lang_3c,
false, false,
@ -336,58 +336,55 @@ mod track {
// dbg!(&track); // dbg!(&track);
assert_eq!(track.track_id, 17633247); assert_eq!(track.track_id, 85213841);
assert_eq!( // assert_eq!(
track.track_mbid.unwrap(), // track.track_mbid.unwrap(),
"1b97675a-537e-4599-82de-b4ef801e4a69" // "080975b0-39b1-493c-ae64-5cb3292409bb"
); // );
assert_eq!(track.track_isrc.unwrap(), "DEE861200084"); // assert_eq!(track.track_isrc.unwrap(), "USUM70824409");
assert!( assert!(
track.commontrack_isrcs[0] track.commontrack_isrcs[0]
.iter() .iter()
.any(|isrc| isrc == "DEE861200084"), .any(|isrc| isrc == "USUM70824409"),
"commontrack_isrcs: {:?}", "commontrack_isrcs: {:?}",
&track.commontrack_isrcs[0], &track.commontrack_isrcs[0],
); );
assert_eq!(track.track_spotify_id.unwrap(), "4kebfr96W2JTvb7xjf4lDV"); assert_eq!(track.track_spotify_id.unwrap(), "1QV6tiMFM6fSOKOGLMHYYg");
assert!( assert!(
track track
.commontrack_spotify_ids .commontrack_spotify_ids
.iter() .iter()
.any(|spid| spid == "4kebfr96W2JTvb7xjf4lDV"), .any(|spid| spid == "1QV6tiMFM6fSOKOGLMHYYg"),
"commontrack_spotify_ids: {:?}", "commontrack_spotify_ids: {:?}",
track.commontrack_spotify_ids, track.commontrack_spotify_ids,
); );
assert_eq!(track.track_name, "Unter der Oberfläche"); assert_eq!(track.track_name, "Poker Face");
assert!(track.track_rating > 30); assert!(track.track_rating > 50);
assert_eq!(track.commontrack_id, 10514077); assert_eq!(track.commontrack_id, 47672612);
assert!(!track.instrumental); assert!(!track.instrumental);
assert!(!track.explicit); assert!(track.explicit);
assert!(track.has_subtitles); assert!(track.has_subtitles);
assert!(track.has_richsync); assert!(track.has_richsync);
assert!(!track.has_track_structure); assert!(track.has_track_structure);
assert!(track.num_favourite > 10); assert!(track.num_favourite > 50);
assert_eq!(track.lyrics_id.unwrap(), 7401716); assert!(track.lyrics_id.is_some());
assert_eq!(track.subtitle_id.unwrap(), 35487435); assert_eq!(track.subtitle_id.unwrap(), 36450705);
assert_eq!(track.album_id, 14122870); assert_eq!(track.album_id, 20960801);
assert_eq!(track.album_name, "Himmel auf"); assert_eq!(track.album_name, "The Fame");
assert_eq!(track.artist_id, 84849); assert_eq!(track.artist_id, 378462);
assert_eq!( assert_eq!(
track.artist_mbid.unwrap(), track.artist_mbid.unwrap(),
"34d42823-6b56-4861-a675-1565bf40d557" "650e7db6-b795-4eb5-a702-5ea2fc46c848"
);
assert_eq!(track.artist_name, "Silbermond");
assert_imgurl(&track.album_coverart_100x100, "/30913494.jpg");
assert_imgurl(&track.album_coverart_350x350, "/30913494_350_350.jpg");
assert_imgurl(&track.album_coverart_500x500, "/30913494_500_500.jpg");
assert_imgurl(&track.album_coverart_800x800, "/30913494_800_800.jpg");
assert_eq!(
track.commontrack_vanity_id,
"Silbermond/Unter-der-Oberfläche"
); );
assert_eq!(track.artist_name, "Lady Gaga");
assert_imgurl(&track.album_coverart_100x100, "/32133892.jpg");
assert_imgurl(&track.album_coverart_350x350, "/32133892_350_350.jpg");
assert_imgurl(&track.album_coverart_500x500, "/32133892_500_500.jpg");
assert_imgurl(&track.album_coverart_800x800, "/32133892_800_800.jpg");
assert_eq!(track.commontrack_vanity_id, "Lady-Gaga/poker-face-1");
let first_release = track.first_release_date.unwrap(); let first_release = track.first_release_date.unwrap();
assert_eq!(first_release.date(), date!(2012 - 3 - 23)); assert_eq!(first_release.date(), date!(2008 - 1 - 1));
assert!(track.updated_time > datetime!(2013-4-26 13:11:50 UTC)); assert!(track.updated_time > datetime!(2023-1-17 0:00 UTC));
let first_pri_genre = &track.primary_genres.music_genre_list[0].music_genre; let first_pri_genre = &track.primary_genres.music_genre_list[0].music_genre;
assert_eq!(first_pri_genre.music_genre_id, 14); assert_eq!(first_pri_genre.music_genre_id, 14);
@ -396,13 +393,23 @@ mod track {
assert_eq!(first_pri_genre.music_genre_name_extended, "Pop"); assert_eq!(first_pri_genre.music_genre_name_extended, "Pop");
assert_eq!(first_pri_genre.music_genre_vanity.as_ref().unwrap(), "Pop"); assert_eq!(first_pri_genre.music_genre_vanity.as_ref().unwrap(), "Pop");
let first_sec_genre = &track.secondary_genres.music_genre_list[0].music_genre;
assert_eq!(first_sec_genre.music_genre_id, 17);
assert_eq!(first_sec_genre.music_genre_parent_id, 34);
assert_eq!(first_sec_genre.music_genre_name, "Dance");
assert_eq!(first_sec_genre.music_genre_name_extended, "Dance");
assert_eq!(
first_sec_genre.music_genre_vanity.as_ref().unwrap(),
"Dance"
);
if translation_status { if translation_status {
assert!( assert!(
track.track_lyrics_translation_status.iter().all(|tl| { track.track_lyrics_translation_status.iter().all(|tl| {
(if lang_3c { (if lang_3c {
tl.from.as_deref() == Some("deu") tl.from.as_deref() == Some("eng")
} else { } else {
tl.from.as_deref() == Some("de") tl.from.as_deref() == Some("en")
}) && tl.perc >= 0.0 }) && tl.perc >= 0.0
&& tl.perc <= 1.0 && tl.perc <= 1.0
}), }),