From f44bc6434a6b34247aff76aa710ee748395e12d3 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Thu, 29 Dec 2022 14:44:48 +0100 Subject: [PATCH] fix: albums without artists --- src/client/music_playlist.rs | 25 +++- src/client/response/music_item.rs | 10 +- .../youtube__music_album_no_artist.snap | 135 +++++++++++++++++ ...outube__music_album_version_no_artist.snap | 139 ++++++++++++++++++ tests/youtube.rs | 8 +- 5 files changed, 310 insertions(+), 7 deletions(-) create mode 100644 tests/snapshots/youtube__music_album_no_artist.snap create mode 100644 tests/snapshots/youtube__music_album_version_no_artist.snap diff --git a/src/client/music_playlist.rs b/src/client/music_playlist.rs index 05a511b..608c2d3 100644 --- a/src/client/music_playlist.rs +++ b/src/client/music_playlist.rs @@ -277,9 +277,30 @@ impl MapResponse for response::MusicPlaylist { )))?; let mut subtitle_split = header.subtitle.split(util::DOT_SEPARATOR); - let year_txt = subtitle_split.try_swap_remove(2).map(|cmp| cmp.to_string()); - let artists_p = subtitle_split.try_swap_remove(1); + let (year_txt, artists_p) = match subtitle_split.len() { + 3.. => { + let year_txt = subtitle_split + .swap_remove(2) + .0 + .get(0) + .map(|c| c.as_str().to_owned()); + (year_txt, subtitle_split.try_swap_remove(1)) + } + 2 => { + // The second part may either be the year or the artist + let p2 = subtitle_split.swap_remove(1); + let is_year = + p2.0.len() == 1 && p2.0[0].as_str().chars().all(|c| c.is_ascii_digit()); + if is_year { + (Some(p2.0[0].as_str().to_owned()), None) + } else { + (None, Some(p2)) + } + } + _ => (None, None), + }; + let (artists, by_va) = map_artists(artists_p); let album_type_txt = subtitle_split .try_swap_remove(0) diff --git a/src/client/response/music_item.rs b/src/client/response/music_item.rs index c677490..e8110af 100644 --- a/src/client/response/music_item.rs +++ b/src/client/response/music_item.rs @@ -796,14 +796,20 @@ impl MusicListMapper { map_album_type(atype_txt.first_str(), self.lang); artists.clone() } + // Album on artist page with unknown year + (None, None, Some(artists), true) => artists.clone(), // "Album", <"Oonagh"> (Album variants, new releases) (Some(atype_txt), Some(p2), _, false) => { album_type = map_album_type(atype_txt.first_str(), self.lang); map_artists(Some(p2)) } - // Album on artist page with unknown year - (None, None, Some(artists), true) => artists.clone(), + // "Album" (Album variants, no artist) + (Some(atype_txt), None, _, false) => { + album_type = + map_album_type(atype_txt.first_str(), self.lang); + (Vec::new(), true) + } _ => { return Err(format!( "could not parse subtitle of album {}", diff --git a/tests/snapshots/youtube__music_album_no_artist.snap b/tests/snapshots/youtube__music_album_no_artist.snap new file mode 100644 index 0000000..c401024 --- /dev/null +++ b/tests/snapshots/youtube__music_album_no_artist.snap @@ -0,0 +1,135 @@ +--- +source: tests/youtube.rs +assertion_line: 1391 +expression: album +--- +MusicAlbum( + id: "MPREb_bqWA6mAZFWS", + playlist_id: Some("OLAK5uy_mUiRbMqeQXFUH6h9KB87RcEmNtm45Qvs0"), + name: "Pedha Rasi Peddamma Katha", + cover: "[cover]", + artists: [], + artist_id: None, + description: None, + album_type: Ep, + year: Some(1968), + by_va: false, + tracks: [ + TrackItem( + id: "EX7-pOQHPyE", + name: "Siva Manoranjani", + duration: Some(267), + cover: [], + artists: [ + ArtistId( + id: Some("UC1C05NyYICFB2mVGn9_ttEw"), + name: "Dr. M. Balamuralikrishna", + ), + ], + artist_id: Some("UC1C05NyYICFB2mVGn9_ttEw"), + album: Some(AlbumId( + id: "MPREb_bqWA6mAZFWS", + name: "Pedha Rasi Peddamma Katha", + )), + view_count: None, + is_video: false, + track_nr: Some(1), + by_va: false, + ), + TrackItem( + id: "0AyWB-Quj4A", + name: "Kuluku Nadakula", + duration: Some(179), + cover: [], + artists: [ + ArtistId( + id: Some("UCDqpyYkgWy2h03HamIfODjw"), + name: "Ghantasala, Chorus", + ), + ], + artist_id: Some("UCDqpyYkgWy2h03HamIfODjw"), + album: Some(AlbumId( + id: "MPREb_bqWA6mAZFWS", + name: "Pedha Rasi Peddamma Katha", + )), + view_count: None, + is_video: false, + track_nr: Some(2), + by_va: false, + ), + TrackItem( + id: "s0Sb-GZLXSM", + name: "Gulabi Buggalunna", + duration: Some(155), + cover: [], + artists: [ + ArtistId( + id: None, + name: "L.r. Eswari", + ), + ], + artist_id: None, + album: Some(AlbumId( + id: "MPREb_bqWA6mAZFWS", + name: "Pedha Rasi Peddamma Katha", + )), + view_count: None, + is_video: false, + track_nr: Some(3), + by_va: false, + ), + TrackItem( + id: "P4XAaXjlCDA", + name: "Oh Javaraala", + duration: Some(229), + cover: [], + artists: [ + ArtistId( + id: Some("UCl4iPtukwe7m0kIxUMskkgA"), + name: "S.p. Balasubrahmanyam, S. Janaki", + ), + ], + artist_id: Some("UCl4iPtukwe7m0kIxUMskkgA"), + album: Some(AlbumId( + id: "MPREb_bqWA6mAZFWS", + name: "Pedha Rasi Peddamma Katha", + )), + view_count: None, + is_video: false, + track_nr: Some(4), + by_va: false, + ), + ], + variants: [ + AlbumItem( + id: "MPREb_h8ltx5oKvyY", + name: "Pedha Rasi Peddamma Katha", + cover: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/iZtBdPWBGNB-GAWvOp9seuYj5QqKrUYGSe-B5J026yxHqFSWv4zsxHy-LxX5LbFlnepOPRWNLrajO-_-=w226-h226-l90-rj", + width: 226, + height: 226, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/iZtBdPWBGNB-GAWvOp9seuYj5QqKrUYGSe-B5J026yxHqFSWv4zsxHy-LxX5LbFlnepOPRWNLrajO-_-=w544-h544-l90-rj", + width: 544, + height: 544, + ), + ], + artists: [ + ArtistId( + id: Some("UCl4iPtukwe7m0kIxUMskkgA"), + name: "S P Balasubramaniam", + ), + ArtistId( + id: Some("UCWgAqlYG7mXTUxrFiLyDSsg"), + name: "S Janaki", + ), + ], + artist_id: Some("UCl4iPtukwe7m0kIxUMskkgA"), + album_type: Ep, + year: None, + by_va: false, + ), + ], +) diff --git a/tests/snapshots/youtube__music_album_version_no_artist.snap b/tests/snapshots/youtube__music_album_version_no_artist.snap new file mode 100644 index 0000000..c5f9504 --- /dev/null +++ b/tests/snapshots/youtube__music_album_version_no_artist.snap @@ -0,0 +1,139 @@ +--- +source: tests/youtube.rs +assertion_line: 1391 +expression: album +--- +MusicAlbum( + id: "MPREb_h8ltx5oKvyY", + playlist_id: Some("OLAK5uy_lIDfTi_k8V1RJ54MeJJGK_BduAeYbm-0s"), + name: "Pedha Rasi Peddamma Katha", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCl4iPtukwe7m0kIxUMskkgA"), + name: "S P Balasubramaniam", + ), + ArtistId( + id: Some("UCWgAqlYG7mXTUxrFiLyDSsg"), + name: "S Janaki", + ), + ], + artist_id: Some("UCl4iPtukwe7m0kIxUMskkgA"), + description: None, + album_type: Ep, + year: Some(1968), + by_va: false, + tracks: [ + TrackItem( + id: "AKJ3IJZKPWc", + name: "Oh Javaraala", + duration: Some(228), + cover: [], + artists: [ + ArtistId( + id: Some("UCl4iPtukwe7m0kIxUMskkgA"), + name: "S P Balasubramaniam", + ), + ArtistId( + id: Some("UCWgAqlYG7mXTUxrFiLyDSsg"), + name: "S Janaki", + ), + ], + artist_id: Some("UCl4iPtukwe7m0kIxUMskkgA"), + album: Some(AlbumId( + id: "MPREb_h8ltx5oKvyY", + name: "Pedha Rasi Peddamma Katha", + )), + view_count: None, + is_video: false, + track_nr: Some(1), + by_va: false, + ), + TrackItem( + id: "WnpZuHNB33E", + name: "Siva Manoranjani", + duration: Some(266), + cover: [], + artists: [ + ArtistId( + id: Some("UC1C05NyYICFB2mVGn9_ttEw"), + name: "M Balamuralikrishna", + ), + ], + artist_id: Some("UC1C05NyYICFB2mVGn9_ttEw"), + album: Some(AlbumId( + id: "MPREb_h8ltx5oKvyY", + name: "Pedha Rasi Peddamma Katha", + )), + view_count: None, + is_video: false, + track_nr: Some(2), + by_va: false, + ), + TrackItem( + id: "pRqoDGXg1-I", + name: "Gulabi Buggalunna", + duration: Some(154), + cover: [], + artists: [ + ArtistId( + id: Some("UC_KQPMiRQl3CFAIKTVfCHwA"), + name: "L R Eswari", + ), + ], + artist_id: Some("UC_KQPMiRQl3CFAIKTVfCHwA"), + album: Some(AlbumId( + id: "MPREb_h8ltx5oKvyY", + name: "Pedha Rasi Peddamma Katha", + )), + view_count: None, + is_video: false, + track_nr: Some(3), + by_va: false, + ), + TrackItem( + id: "20vIKLJxjBY", + name: "Kuluku Nadakula", + duration: Some(178), + cover: [], + artists: [ + ArtistId( + id: None, + name: "Ghantasala & Chorus", + ), + ], + artist_id: Some("UCDqpyYkgWy2h03HamIfODjw"), + album: Some(AlbumId( + id: "MPREb_h8ltx5oKvyY", + name: "Pedha Rasi Peddamma Katha", + )), + view_count: None, + is_video: false, + track_nr: Some(4), + by_va: false, + ), + ], + variants: [ + AlbumItem( + id: "MPREb_bqWA6mAZFWS", + name: "Pedha Rasi Peddamma Katha", + cover: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/cyKTDdyucqYv8xfv0t3Vs9CkhmvssXRKsGzlWN_DU6A9uapXvovV0Ys2fXc9-r7Jv7V4UB1OD48iYH5z=w226-h226-l90-rj", + width: 226, + height: 226, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/cyKTDdyucqYv8xfv0t3Vs9CkhmvssXRKsGzlWN_DU6A9uapXvovV0Ys2fXc9-r7Jv7V4UB1OD48iYH5z=w544-h544-l90-rj", + width: 544, + height: 544, + ), + ], + artists: [], + artist_id: None, + album_type: Ep, + year: None, + by_va: true, + ), + ], +) diff --git a/tests/youtube.rs b/tests/youtube.rs index 48edd1a..e6ca923 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -1379,6 +1379,8 @@ async fn music_playlist_not_found() { #[case::show("show", "MPREb_cwzk8EUwypZ")] #[case::unavailable("unavailable", "MPREb_AzuWg8qAVVl")] #[case::no_year("no_year", "MPREb_F3Af9UZZVxX")] +#[case::version_no_artist("version_no_artist", "MPREb_h8ltx5oKvyY")] +#[case::no_artist("no_artist", "MPREb_bqWA6mAZFWS")] #[tokio::test] async fn music_album(#[case] name: &str, #[case] id: &str) { let rp = RustyPipe::builder().strict().build(); @@ -1913,9 +1915,9 @@ async fn music_related(#[case] id: &str, #[case] full: bool) { assert_gte(n_tracks, 20, "tracks"); assert_gte(n_tracks_ytm, 10, "tracks_ytm"); - assert_gte(track_artists, n_tracks - 3, "track_artists"); - assert_gte(track_artist_ids, n_tracks - 3, "track_artists"); - assert_gte(track_albums, n_tracks_ytm - 3, "track_artists"); + assert_gte(track_artists, n_tracks - 4, "track_artists"); + assert_gte(track_artist_ids, n_tracks - 4, "track_artists"); + assert_gte(track_albums, n_tracks_ytm - 4, "track_artists"); if full { assert_gte(related.albums.len(), 10, "albums");