diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/AlbumScreen.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/AlbumScreen.kt index 5b61983..6237921 100644 --- a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/AlbumScreen.kt +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/AlbumScreen.kt @@ -71,7 +71,7 @@ fun AlbumScreen( authorsText = youtubeAlbum.authors?.joinToString("") { it.name }, shareUrl = youtubeAlbum.url ).also(Database::upsert).also { - youtubeAlbum.items?.forEachIndexed { position, albumItem -> + youtubeAlbum.withAudioSources().items?.forEachIndexed { position, albumItem -> albumItem.toMediaItem(browseId, youtubeAlbum)?.let { mediaItem -> Database.insert(mediaItem) Database.upsert( 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 05f8f6b..313e43f 100644 --- a/youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/YouTube.kt +++ b/youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/YouTube.kt @@ -691,7 +691,7 @@ object YouTube { }.recoverIfCancelled() } - open class PlaylistOrAlbum( + data class PlaylistOrAlbum( val title: String?, val authors: List>?, val year: String?, @@ -700,13 +700,50 @@ object YouTube { val url: String?, val continuation: String?, ) { - open class Item( + data class Item( val info: Info, val authors: List>?, val durationText: String?, val album: Info?, val thumbnail: ThumbnailRenderer.MusicThumbnailRenderer.Thumbnail.Thumbnail?, ) + + suspend fun withAudioSources(): PlaylistOrAlbum { + @Serializable + data class RelatedStream( + val url: String, + val title: String + ) + + @Serializable + data class Response( + val relatedStreams: List + ) + + return url?.replace("https://music.youtube.com/playlist?list=", "https://pipedapi.kavin.rocks/playlists/")?.let { url -> + val sources = client.get(url).body().relatedStreams + + copy( + items = items?.mapIndexed { index, item -> + if (item.info.endpoint?.type != "MUSIC_VIDEO_TYPE_ATV") { + sources.getOrNull(index)?.takeIf { source -> + source.title == item.info.name + }?.let { source -> + item.copy( + info = item.info.copy( + endpoint = item.info.endpoint?.copy( + videoId = source.url.removePrefix("/watch?v=") + ) + ) + ) + } ?: item + } else { + item + } + } + ) + } ?: this + } } suspend fun playlistOrAlbum(browseId: String): Result? { @@ -795,7 +832,8 @@ object YouTube { ?.firstOrNull() ) } - ?.filter { it.info.endpoint != null }, +// ?.filter { it.info.endpoint != null } + , url = body .microformat ?.microformatDataRenderer