diff --git a/Cargo.toml b/Cargo.toml index 58c86ed..d306e05 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "bandcamp" -version = "0.2.0" +version = "0.3.1" edition = "2021" authors = ["ThetaDev "] license = "MIT" diff --git a/src/models.rs b/src/models.rs index 5bdb84c..ace454f 100644 --- a/src/models.rs +++ b/src/models.rs @@ -3,7 +3,7 @@ use std::collections::BTreeMap; use serde::{Deserialize, Serialize}; -use serde_with::{serde_as, NoneAsEmptyString, VecSkipError}; +use serde_with::{serde_as, DefaultOnNull, NoneAsEmptyString, VecSkipError}; use time::OffsetDateTime; use crate::util; @@ -78,6 +78,7 @@ pub struct Album { pub release_date: OffsetDateTime, /// List of album tags (genres and locations) #[serde(default)] + #[serde_as(deserialize_as = "DefaultOnNull")] pub tags: Vec, /// List of album tracks pub tracks: Vec, @@ -92,14 +93,11 @@ pub struct Track { pub track_id: u64, /// Track title pub title: String, - /// Numeric album id - pub album_id: u64, - /// Album title - #[serde_as(deserialize_as = "NoneAsEmptyString")] - pub album_title: Option, - /// Numeric band id - pub band_id: u64, - /// Band name + /// Track album ID + /// + /// Is None for single tracks + pub album_id: Option, + /// Track artist name (may differ from band name) #[serde_as(deserialize_as = "NoneAsEmptyString")] pub band_name: Option, /// Duration in seconds @@ -112,9 +110,10 @@ pub struct Track { /// /// `mp3-128` => `https://bandcamp.com/stream_redirect?enc=mp3-128&track_id=4173325157&ts=1686871135&t=a1f7904205e6caca970009ca6744ef0b512f353a` #[serde(default)] + #[serde_as(deserialize_as = "DefaultOnNull")] pub streaming_url: BTreeMap, /// Album track number - pub track_num: u16, + pub track_num: Option, } /// Discograph (album or track) @@ -245,6 +244,7 @@ pub struct SearchBand { pub location: Option, /// List of tag names associated with the #[serde(default)] + #[serde_as(deserialize_as = "DefaultOnNull")] pub tag_names: Vec, /// Bandcamp URL /// @@ -314,6 +314,7 @@ pub struct FeedStories { } /// Bandcamp feed item +#[serde_as] #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[non_exhaustive] pub struct FeedItem { @@ -357,6 +358,7 @@ pub struct FeedItem { pub num_streamable_tracks: u16, /// List of tags #[serde(default)] + #[serde_as(deserialize_as = "DefaultOnNull")] pub tags: Vec, } diff --git a/tests/snapshots/tests__album1.snap b/tests/snapshots/tests__album1.snap index a7b6727..74717b7 100644 --- a/tests/snapshots/tests__album1.snap +++ b/tests/snapshots/tests__album1.snap @@ -71,101 +71,83 @@ Album( Track( track_id: 2221991469, title: "SommarfÄgel", - album_id: 2572654767, - album_title: None, - band_id: 2464198920, + album_id: Some(2572654767), band_name: Some("Wintergatan"), duration: 232.642, streaming_url: "[streaming_url]", - track_num: 1, + track_num: Some(1), ), Track( track_id: 1593213040, title: "The Rocket", - album_id: 2572654767, - album_title: None, - band_id: 2464198920, + album_id: Some(2572654767), band_name: Some("Wintergatan"), duration: 211.491, streaming_url: "[streaming_url]", - track_num: 2, + track_num: Some(2), ), Track( track_id: 2806652396, title: "Valentine", - album_id: 2572654767, - album_title: None, - band_id: 2464198920, + album_id: Some(2572654767), band_name: Some("Wintergatan"), duration: 238.538, streaming_url: "[streaming_url]", - track_num: 3, + track_num: Some(3), ), Track( track_id: 4173325157, title: "Slottskogen Disc Golf Club", - album_id: 2572654767, - album_title: None, - band_id: 2464198920, + album_id: Some(2572654767), band_name: Some("Wintergatan"), duration: 212.65, streaming_url: "[streaming_url]", - track_num: 4, + track_num: Some(4), ), Track( track_id: 3038199534, title: "Biking Is Better", - album_id: 2572654767, - album_title: None, - band_id: 2464198920, + album_id: Some(2572654767), band_name: Some("Wintergatan"), duration: 208.27, streaming_url: "[streaming_url]", - track_num: 5, + track_num: Some(5), ), Track( track_id: 3487050701, title: "VÀstanberg", - album_id: 2572654767, - album_title: None, - band_id: 2464198920, + album_id: Some(2572654767), band_name: Some("Wintergatan"), duration: 265.692, streaming_url: "[streaming_url]", - track_num: 6, + track_num: Some(6), ), Track( track_id: 1604303190, title: "Starmachine2000", - album_id: 2572654767, - album_title: None, - band_id: 2464198920, + album_id: Some(2572654767), band_name: Some("Wintergatan"), duration: 243.139, streaming_url: "[streaming_url]", - track_num: 7, + track_num: Some(7), ), Track( track_id: 716010980, title: "All Was Well", - album_id: 2572654767, - album_title: None, - band_id: 2464198920, + album_id: Some(2572654767), band_name: Some("Wintergatan"), duration: 183.224, streaming_url: "[streaming_url]", - track_num: 8, + track_num: Some(8), ), Track( track_id: 2322125757, title: "Paradis", - album_id: 2572654767, - album_title: None, - band_id: 2464198920, + album_id: Some(2572654767), band_name: Some("Wintergatan"), duration: 850.6, streaming_url: "[streaming_url]", - track_num: 9, + track_num: Some(9), ), ], ) diff --git a/tests/snapshots/tests__album2.snap b/tests/snapshots/tests__album2.snap index dffbbf5..da49a30 100644 --- a/tests/snapshots/tests__album2.snap +++ b/tests/snapshots/tests__album2.snap @@ -76,310 +76,254 @@ Album( Track( track_id: 3886649117, title: "Skyjacks", - album_id: 1493086082, - album_title: None, - band_id: 3760769193, + album_id: Some(1493086082), band_name: Some("Arne Parrott"), duration: 263.262, streaming_url: "[streaming_url]", - track_num: 1, + track_num: Some(1), ), Track( track_id: 3353751902, title: "Bound for the Cutting Stone", - album_id: 1493086082, - album_title: None, - band_id: 3760769193, + album_id: Some(1493086082), band_name: Some("Arne Parrott"), duration: 126.905, streaming_url: "[streaming_url]", - track_num: 2, + track_num: Some(2), ), Track( track_id: 814453490, title: "Harmony", - album_id: 1493086082, - album_title: None, - band_id: 3760769193, + album_id: Some(1493086082), band_name: Some("Arne Parrott"), duration: 109.548, streaming_url: "[streaming_url]", - track_num: 3, + track_num: Some(3), ), Track( track_id: 3751525198, title: "Lighthouse", - album_id: 1493086082, - album_title: None, - band_id: 3760769193, + album_id: Some(1493086082), band_name: Some("Arne Parrott"), duration: 187.492, streaming_url: "[streaming_url]", - track_num: 4, + track_num: Some(4), ), Track( track_id: 461427875, title: "Dark Magic", - album_id: 1493086082, - album_title: None, - band_id: 3760769193, + album_id: Some(1493086082), band_name: Some("Arne Parrott"), duration: 67.5178, streaming_url: "[streaming_url]", - track_num: 5, + track_num: Some(5), ), Track( track_id: 694400627, title: "Way Hay Ho", - album_id: 1493086082, - album_title: None, - band_id: 3760769193, + album_id: Some(1493086082), band_name: Some("Arne Parrott"), duration: 179.318, streaming_url: "[streaming_url]", - track_num: 6, + track_num: Some(6), ), Track( track_id: 1856437095, title: "Toast the Axel", - album_id: 1493086082, - album_title: None, - band_id: 3760769193, + album_id: Some(1493086082), band_name: Some("Arne Parrott"), duration: 101.507, streaming_url: "[streaming_url]", - track_num: 7, + track_num: Some(7), ), Track( track_id: 1961563423, title: "Ring the Bell", - album_id: 1493086082, - album_title: None, - band_id: 3760769193, + album_id: Some(1493086082), band_name: Some("Arne Parrott"), duration: 113.478, streaming_url: "[streaming_url]", - track_num: 8, + track_num: Some(8), ), Track( track_id: 405906043, title: "Call of the Sky", - album_id: 1493086082, - album_title: None, - band_id: 3760769193, + album_id: Some(1493086082), band_name: Some("Arne Parrott"), duration: 201.026, streaming_url: "[streaming_url]", - track_num: 9, + track_num: Some(9), ), Track( track_id: 3751492440, title: "Johnny Forgot His Square Knot", - album_id: 1493086082, - album_title: None, - band_id: 3760769193, + album_id: Some(1493086082), band_name: Some("Arne Parrott"), duration: 58.7233, streaming_url: "[streaming_url]", - track_num: 10, + track_num: Some(10), ), Track( track_id: 3046284392, title: "Dance", - album_id: 1493086082, - album_title: None, - band_id: 3760769193, + album_id: Some(1493086082), band_name: Some("Arne Parrott"), duration: 48.9229, streaming_url: "[streaming_url]", - track_num: 11, + track_num: Some(11), ), Track( track_id: 1075587078, title: "Skyjacks (Instrumental)", - album_id: 1493086082, - album_title: None, - band_id: 3760769193, + album_id: Some(1493086082), band_name: Some("Arne Parrott"), duration: 263.348, streaming_url: "[streaming_url]", - track_num: 12, + track_num: Some(12), ), Track( track_id: 3865632006, title: "Bound for the Cutting Stone (Instrumental)", - album_id: 1493086082, - album_title: None, - band_id: 3760769193, + album_id: Some(1493086082), band_name: Some("Arne Parrott"), duration: 125.76, streaming_url: "[streaming_url]", - track_num: 13, + track_num: Some(13), ), Track( track_id: 951718157, title: "Lighthouse (Instrumental)", - album_id: 1493086082, - album_title: None, - band_id: 3760769193, + album_id: Some(1493086082), band_name: Some("Arne Parrott"), duration: 187.492, streaming_url: "[streaming_url]", - track_num: 14, + track_num: Some(14), ), Track( track_id: 1384316860, title: "Way Hay Ho (Instrumental)", - album_id: 1493086082, - album_title: None, - band_id: 3760769193, + album_id: Some(1493086082), band_name: Some("Arne Parrott"), duration: 179.318, streaming_url: "[streaming_url]", - track_num: 15, + track_num: Some(15), ), Track( track_id: 1215251403, title: "Toast the Axel (Instrumental)", - album_id: 1493086082, - album_title: None, - band_id: 3760769193, + album_id: Some(1493086082), band_name: Some("Arne Parrott"), duration: 101.507, streaming_url: "[streaming_url]", - track_num: 16, + track_num: Some(16), ), Track( track_id: 1871038324, title: "Ring the Bell (Instrumental)", - album_id: 1493086082, - album_title: None, - band_id: 3760769193, + album_id: Some(1493086082), band_name: Some("Arne Parrott"), duration: 111.769, streaming_url: "[streaming_url]", - track_num: 17, + track_num: Some(17), ), Track( track_id: 2289302029, title: "Call of the Sky (Instrumental)", - album_id: 1493086082, - album_title: None, - band_id: 3760769193, + album_id: Some(1493086082), band_name: Some("Arne Parrott"), duration: 201.026, streaming_url: "[streaming_url]", - track_num: 18, + track_num: Some(18), ), Track( track_id: 1290369552, title: "Way Hay Ho (Show Cut)", - album_id: 1493086082, - album_title: None, - band_id: 3760769193, + album_id: Some(1493086082), band_name: Some("Arne Parrott"), duration: 129.01, streaming_url: "[streaming_url]", - track_num: 19, + track_num: Some(19), ), Track( track_id: 1453689011, title: "Call of the Sky (Acoustic)", - album_id: 1493086082, - album_title: None, - band_id: 3760769193, + album_id: Some(1493086082), band_name: Some("Arne Parrott"), duration: 196.0, streaming_url: "[streaming_url]", - track_num: 20, + track_num: Some(20), ), Track( track_id: 3921099822, title: "Lighthouse (Cabin Cut)", - album_id: 1493086082, - album_title: None, - band_id: 3760769193, + album_id: Some(1493086082), band_name: Some("Arne Parrott"), duration: 113.751, streaming_url: "[streaming_url]", - track_num: 21, + track_num: Some(21), ), Track( track_id: 2006464954, title: "Otto Van Von Veen", - album_id: 1493086082, - album_title: None, - band_id: 3760769193, + album_id: Some(1493086082), band_name: Some("Arne Parrott"), duration: 128.545, streaming_url: "[streaming_url]", - track_num: 22, + track_num: Some(22), ), Track( track_id: 3157042890, title: "Lighthouse (Duet)", - album_id: 1493086082, - album_title: None, - band_id: 3760769193, + album_id: Some(1493086082), band_name: Some("Arne Parrott"), duration: 166.898, streaming_url: "[streaming_url]", - track_num: 23, + track_num: Some(23), ), Track( track_id: 3031409543, title: "Call of the Sky (Fan Edition)", - album_id: 1493086082, - album_title: None, - band_id: 3760769193, + album_id: Some(1493086082), band_name: Some("Arne Parrott"), duration: 201.143, streaming_url: "[streaming_url]", - track_num: 24, + track_num: Some(24), ), Track( track_id: 3451672807, title: "Call of the Sky 2: The Sequel to Call of the Sky (Instrumental)", - album_id: 1493086082, - album_title: None, - band_id: 3760769193, + album_id: Some(1493086082), band_name: Some("Arne Parrott"), duration: 78.7156, streaming_url: "[streaming_url]", - track_num: 25, + track_num: Some(25), ), Track( track_id: 2232966671, title: "Skyjacks: Call of the Sky Behind the Music Part 1", - album_id: 1493086082, - album_title: None, - band_id: 3760769193, + album_id: Some(1493086082), band_name: Some("Arne Parrott"), duration: 1957.24, streaming_url: "[streaming_url]", - track_num: 26, + track_num: Some(26), ), Track( track_id: 3477530801, title: "Skyjacks: Call of the Sky Behind the Music Part 2", - album_id: 1493086082, - album_title: None, - band_id: 3760769193, + album_id: Some(1493086082), band_name: Some("Arne Parrott"), duration: 3668.83, streaming_url: "[streaming_url]", - track_num: 27, + track_num: Some(27), ), Track( track_id: 3005668857, title: "Skyjacks: Call of the Sky Behind the Music Part 3", - album_id: 1493086082, - album_title: None, - band_id: 3760769193, + album_id: Some(1493086082), band_name: Some("Arne Parrott"), duration: 3876.74, streaming_url: "[streaming_url]", - track_num: 28, + track_num: Some(28), ), ], ) diff --git a/tests/snapshots/tests__album_track.snap b/tests/snapshots/tests__album_track.snap index 1e87b99..276bd72 100644 --- a/tests/snapshots/tests__album_track.snap +++ b/tests/snapshots/tests__album_track.snap @@ -31,13 +31,11 @@ Album( Track( track_id: 716010980, title: "All Was Well", - album_id: 2572654767, - album_title: None, - band_id: 2464198920, + album_id: Some(2572654767), band_name: Some("Wintergatan"), duration: 183.224, streaming_url: "[streaming_url]", - track_num: 8, + track_num: Some(8), ), ], ) diff --git a/tests/snapshots/tests__album_track2.snap b/tests/snapshots/tests__album_track2.snap new file mode 100644 index 0000000..550b656 --- /dev/null +++ b/tests/snapshots/tests__album_track2.snap @@ -0,0 +1,56 @@ +--- +source: tests/tests.rs +expression: "&album" +--- +Album( + id: 3835153004, + title: "Test Me", + art_id: Some(269941427), + type: t, + tralbum_artist: "Cydnee with a C", + band: BandInfo( + band_id: 3453236550, + name: "Cydnee with a C", + bio: None, + image_id: Some(30619318), + location: Some("Los Angeles, California"), + ), + bandcamp_url: "https://cydneewithac.bandcamp.com/track/test-me", + credits: Some("Cydnee Jazmere Butler \nJackson Renauld"), + about: None, + featured_track_id: 3835153004, + release_date: 1654905600, + tags: [ + Tag( + name: "R&B/Soul", + norm_name: "r-b-soul", + isloc: false, + ), + Tag( + name: "drum and bass", + norm_name: "drum-and-bass", + isloc: false, + ), + Tag( + name: "k-pop", + norm_name: "k-pop", + isloc: false, + ), + Tag( + name: "Los Angeles", + norm_name: "los-angeles", + isloc: true, + ), + ], + tracks: [ + Track( + track_id: 3835153004, + title: "Test Me", + album_id: None, + band_name: Some("Cydnee with a C"), + duration: 106.667, + streaming_url: "[streaming_url]", + track_num: None, + ), + ], +) diff --git a/tests/tests.rs b/tests/tests.rs index 4f63dfc..80756e7 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -81,6 +81,18 @@ async fn album_track() { check_image(&album.img_url().unwrap()).await; } +#[tokio::test] +async fn album_track2() { + let bc = Bandcamp::new(); + let album = bc.album_uid("3453236550t3835153004").await.unwrap(); + + insta::assert_ron_snapshot!(&album, { + ".tracks[].streaming_url" => "[streaming_url]" + }); + check_stream_urls(&album.tracks); + check_image(&album.img_url().unwrap()).await; +} + #[tokio::test] async fn search() { let bc = Bandcamp::new();