From a26eebd806c374be4e43ea14f65f083750e1e64d Mon Sep 17 00:00:00 2001 From: vfsfitvnm Date: Tue, 9 Aug 2022 16:00:25 +0200 Subject: [PATCH] Fix #186 --- .../vfsfitvnm/vimusic/utils/YoutubeRadio.kt | 10 +++++--- .../it/vfsfitvnm/youtubemusic/YouTube.kt | 24 ++++++++++++++++++- .../youtubemusic/models/NextResponse.kt | 17 ++++++++++++- 3 files changed, 46 insertions(+), 5 deletions(-) diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/YoutubeRadio.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/YoutubeRadio.kt index bd8f8e0..8a0ce11 100644 --- a/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/YoutubeRadio.kt +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/YoutubeRadio.kt @@ -7,9 +7,9 @@ import kotlinx.coroutines.withContext data class YouTubeRadio( private val videoId: String? = null, - private val playlistId: String? = null, - private val playlistSetVideoId: String? = null, - private val parameters: String? = null + private var playlistId: String? = null, + private var playlistSetVideoId: String? = null, + private var parameters: String? = null ) { private var nextContinuation: String? = null @@ -24,6 +24,10 @@ data class YouTubeRadio( playlistSetVideoId = playlistSetVideoId, continuation = nextContinuation )?.getOrNull()?.let { nextResult -> + playlistId = nextResult.playlistId + parameters = nextResult.params + playlistSetVideoId = nextResult.playlistSetVideoId + mediaItems = nextResult.items?.map(YouTube.Item.Song::asMediaItem) nextResult.continuation?.takeUnless { nextContinuation == nextResult.continuation } } diff --git a/youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/YouTube.kt b/youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/YouTube.kt index 3d3e0aa..c44f7cc 100644 --- a/youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/YouTube.kt +++ b/youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/YouTube.kt @@ -631,6 +631,9 @@ object YouTube { .tabs NextResult( + playlistId = playlistId, + playlistSetVideoId = playlistSetVideoId, + params = params, continuation = (tabs .getOrNull(0) ?.tabRenderer @@ -652,6 +655,23 @@ object YouTube { ?: body.continuationContents) ?.playlistPanelRenderer ?.contents + ?.also { + // TODO: we should parse the MusicResponsiveListItemRenderer menu so we can + // avoid an extra network request + it.lastOrNull() + ?.automixPreviewVideoRenderer + ?.content + ?.automixPlaylistVideoRenderer + ?.navigationEndpoint + ?.watchPlaylistEndpoint + ?.let { endpoint -> + return next( + videoId = videoId, + playlistId = endpoint.playlistId, + params = endpoint.params + ) + } + } ?.mapNotNull { it.playlistPanelVideoRenderer } ?.mapNotNull { renderer -> Item.Song( @@ -706,6 +726,9 @@ object YouTube { data class NextResult( val continuation: String?, + val playlistId: String?, + val params: String? = null, + val playlistSetVideoId: String? = null, val items: List?, val lyrics: Lyrics?, val related: Related?, @@ -997,4 +1020,3 @@ object YouTube { } } } - diff --git a/youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/models/NextResponse.kt b/youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/models/NextResponse.kt index d31410c..d457238 100644 --- a/youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/models/NextResponse.kt +++ b/youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/models/NextResponse.kt @@ -26,7 +26,8 @@ data class NextResponse( ) { @Serializable data class Content( - val playlistPanelVideoRenderer: PlaylistPanelVideoRenderer? + val playlistPanelVideoRenderer: PlaylistPanelVideoRenderer?, + val automixPreviewVideoRenderer: AutomixPreviewVideoRenderer?, ) { @Serializable data class PlaylistPanelVideoRenderer( @@ -39,6 +40,20 @@ data class NextResponse( val videoId: String, val playlistSetVideoId: String?, ) + @Serializable + data class AutomixPreviewVideoRenderer( + val content: Content? + ) { + @Serializable + data class Content( + val automixPlaylistVideoRenderer: AutomixPlaylistVideoRenderer? + ) { + @Serializable + data class AutomixPlaylistVideoRenderer( + val navigationEndpoint: NavigationEndpoint + ) + } + } } } }