From 2b91c76b85e6bb646c918cf265888285675e8bcc Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Wed, 30 Nov 2022 23:45:41 +0100 Subject: [PATCH] fix: replace MVs in albums with tracks from album playlist --- src/client/music_details.rs | 5 +- src/client/music_playlist.rs | 57 ++++++++++++++++--- tests/snapshots/youtube__music_album_ep.snap | 4 +- .../youtube__music_album_single.snap | 4 +- .../youtube__music_album_various_artists.snap | 4 +- 5 files changed, 59 insertions(+), 15 deletions(-) diff --git a/src/client/music_details.rs b/src/client/music_details.rs index 1a48e67..cd4717c 100644 --- a/src/client/music_details.rs +++ b/src/client/music_details.rs @@ -99,7 +99,10 @@ impl RustyPipeQuery { radio_id: S, ) -> Result, Error> { let radio_id = radio_id.as_ref(); - let context = self.get_context(ClientType::DesktopMusic, true, None).await; + let visitor_data = self.get_ytm_visitor_data().await?; + let context = self + .get_context(ClientType::DesktopMusic, true, Some(&visitor_data)) + .await; let request_body = QRadio { context, playlist_id: radio_id, diff --git a/src/client/music_playlist.rs b/src/client/music_playlist.rs index 6db4c7e..6fdd6ef 100644 --- a/src/client/music_playlist.rs +++ b/src/client/music_playlist.rs @@ -45,14 +45,55 @@ impl RustyPipeQuery { browse_id: album_id, }; - self.execute_request::( - ClientType::DesktopMusic, - "music_album", - album_id, - "browse", - &request_body, - ) - .await + let mut album = self + .execute_request::( + ClientType::DesktopMusic, + "music_album", + album_id, + "browse", + &request_body, + ) + .await?; + + // YouTube Music is replacing album tracks with their respective music videos. To get the original + // tracks, we have to fetch the album as a playlist and replace the offending track ids. + if let Some(playlist_id) = &album.playlist_id { + // Get a list of music videos in the album + let to_replace = album + .tracks + .iter() + .enumerate() + .filter_map(|(i, track)| { + if track.is_video { + Some((i, track.title.to_owned())) + } else { + None + } + }) + .collect::>(); + + if !to_replace.is_empty() { + let playlist = self.music_playlist(playlist_id).await?; + + for (i, title) in to_replace { + let found_track = playlist.tracks.items.iter().find_map(|track| { + if track.title == title && !track.is_video { + Some((track.id.to_owned(), track.duration)) + } else { + None + } + }); + if let Some((track_id, duration)) = found_track { + album.tracks[i].id = track_id; + if let Some(duration) = duration { + album.tracks[i].duration = Some(duration); + } + album.tracks[i].is_video = false; + } + } + } + } + Ok(album) } } diff --git a/tests/snapshots/youtube__music_album_ep.snap b/tests/snapshots/youtube__music_album_ep.snap index e68573a..26256f6 100644 --- a/tests/snapshots/youtube__music_album_ep.snap +++ b/tests/snapshots/youtube__music_album_ep.snap @@ -39,7 +39,7 @@ MusicAlbum( track_nr: Some(1), ), TrackItem( - id: "lhPOMUjV4rE", + id: "Jz-26iiDuYs", title: "Waldbrand", duration: Some(208), cover: [], @@ -55,7 +55,7 @@ MusicAlbum( name: "Waldbrand", )), view_count: None, - is_video: true, + is_video: false, track_nr: Some(2), ), TrackItem( diff --git a/tests/snapshots/youtube__music_album_single.snap b/tests/snapshots/youtube__music_album_single.snap index 61f7faa..aeba890 100644 --- a/tests/snapshots/youtube__music_album_single.snap +++ b/tests/snapshots/youtube__music_album_single.snap @@ -23,7 +23,7 @@ MusicAlbum( by_va: false, tracks: [ TrackItem( - id: "XX0epju-YvY", + id: "VU6lEv0PKAo", title: "Der Himmel reißt auf", duration: Some(183), cover: [], @@ -43,7 +43,7 @@ MusicAlbum( name: "Der Himmel reißt auf", )), view_count: None, - is_video: true, + is_video: false, track_nr: Some(1), ), ], diff --git a/tests/snapshots/youtube__music_album_various_artists.snap b/tests/snapshots/youtube__music_album_various_artists.snap index a3eef12..b04f5ea 100644 --- a/tests/snapshots/youtube__music_album_various_artists.snap +++ b/tests/snapshots/youtube__music_album_various_artists.snap @@ -14,7 +14,7 @@ MusicAlbum( by_va: true, tracks: [ TrackItem( - id: "8IqLxg0GqXc", + id: "Tzai7JXo45w", title: "Waka Boom (My Way) (feat. Lee Young Ji)", duration: Some(274), cover: [], @@ -30,7 +30,7 @@ MusicAlbum( name: "<Queendom2> FINAL", )), view_count: None, - is_video: true, + is_video: false, track_nr: Some(1), ), TrackItem(