From abf2be6c9a7b6c9650df3952b7206ce2724a7fca Mon Sep 17 00:00:00 2001 From: vfsfitvnm Date: Thu, 16 Jun 2022 12:57:38 +0200 Subject: [PATCH] Fix #44 --- .../vimusic/ui/screens/SearchResultScreen.kt | 12 +- .../it/vfsfitvnm/vimusic/ui/views/SongItem.kt | 2 +- .../it/vfsfitvnm/vimusic/utils/utils.kt | 4 +- .../it/vfsfitvnm/youtubemusic/YouTube.kt | 199 ++++++++++++------ .../youtubemusic/models/MusicShelfRenderer.kt | 26 ++- 5 files changed, 162 insertions(+), 81 deletions(-) diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/SearchResultScreen.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/SearchResultScreen.kt index 223408b..deda0fa 100644 --- a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/SearchResultScreen.kt +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/SearchResultScreen.kt @@ -415,7 +415,7 @@ fun SmallSongItem( modifier: Modifier = Modifier ) { SongItem( - thumbnailModel = song.thumbnail.size(thumbnailSizePx), + thumbnailModel = song.thumbnail?.size(thumbnailSizePx), title = song.info.name, authors = song.authors.joinToString("") { it.name }, durationText = song.durationText, @@ -436,7 +436,7 @@ fun SmallVideoItem( modifier: Modifier = Modifier ) { SongItem( - thumbnailModel = video.thumbnail.size(thumbnailSizePx), + thumbnailModel = video.thumbnail?.size(thumbnailSizePx), title = video.info.name, authors = video.views.joinToString("") { it.name }, durationText = video.durationText, @@ -464,7 +464,7 @@ fun SmallPlaylistItem( modifier = modifier ) { AsyncImage( - model = playlist.thumbnail.size(thumbnailSizePx), + model = playlist.thumbnail?.size(thumbnailSizePx), contentDescription = null, contentScale = ContentScale.Crop, modifier = Modifier @@ -513,7 +513,7 @@ fun SmallAlbumItem( modifier = modifier ) { AsyncImage( - model = album.thumbnail.size(thumbnailSizePx), + model = album.thumbnail?.size(thumbnailSizePx), contentDescription = null, contentScale = ContentScale.Crop, modifier = Modifier @@ -532,7 +532,7 @@ fun SmallAlbumItem( overflow = TextOverflow.Ellipsis, ) BasicText( - text = "${album.authors.joinToString("") { it.name }} • ${album.year}", + text = "${album.authors?.joinToString("") { it.name }} • ${album.year}", style = typography.xs, maxLines = 1, overflow = TextOverflow.Ellipsis, @@ -556,7 +556,7 @@ fun SmallArtistItem( modifier = modifier ) { AsyncImage( - model = artist.thumbnail.size(thumbnailSizePx), + model = artist.thumbnail?.size(thumbnailSizePx), contentDescription = null, modifier = Modifier .clip(CircleShape) diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/SongItem.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/SongItem.kt index 8578e83..76305d1 100644 --- a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/SongItem.kt +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/SongItem.kt @@ -95,7 +95,7 @@ fun SongItem( thumbnailModel: Any?, title: String, authors: String, - durationText: String, + durationText: String?, onClick: () -> Unit, menuContent: @Composable () -> Unit, modifier: Modifier = Modifier, diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/utils.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/utils.kt index 45daa24..c3f0ec7 100644 --- a/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/utils.kt +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/utils.kt @@ -86,7 +86,7 @@ val YouTube.Item.Song.asMediaItem: MediaItem .setTitle(info.name) .setArtist(authors.joinToString("") { it.name }) .setAlbumTitle(album?.name) - .setArtworkUri(thumbnail.url.toUri()) + .setArtworkUri(thumbnail?.url?.toUri()) .setExtras( bundleOf( "videoId" to info.endpoint!!.videoId, @@ -109,7 +109,7 @@ val YouTube.Item.Video.asMediaItem: MediaItem MediaMetadata.Builder() .setTitle(info.name) .setArtist(authors.joinToString("") { it.name }) - .setArtworkUri(thumbnail.url.toUri()) + .setArtworkUri(thumbnail?.url?.toUri()) .setExtras( bundleOf( "videoId" to info.endpoint!!.videoId, 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 3660974..449a4c3 100644 --- a/youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/YouTube.kt +++ b/youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/YouTube.kt @@ -144,14 +144,14 @@ object YouTube { } sealed class Item { - abstract val thumbnail: ThumbnailRenderer.MusicThumbnailRenderer.Thumbnail.Thumbnail + abstract val thumbnail: ThumbnailRenderer.MusicThumbnailRenderer.Thumbnail.Thumbnail? data class Song( val info: Info, val authors: List>, val album: Info?, - val durationText: String, - override val thumbnail: ThumbnailRenderer.MusicThumbnailRenderer.Thumbnail.Thumbnail + val durationText: String?, + override val thumbnail: ThumbnailRenderer.MusicThumbnailRenderer.Thumbnail.Thumbnail? ) : Item() { companion object : FromMusicShelfRendererContent { val Filter = Filter("EgWKAQIIAWoKEAkQBRAKEAMQBA%3D%3D") @@ -161,14 +161,19 @@ object YouTube { return Song( info = Info.from(mainRuns.first()), - authors = otherRuns.getOrNull(otherRuns.lastIndex - 2) - ?.map(Info.Companion::from) ?: emptyList(), - album = otherRuns.getOrNull(otherRuns.lastIndex - 1)?.firstOrNull()?.let( - Info.Companion::from - ), - durationText = otherRuns.getOrNull(otherRuns.lastIndex)?.first()?.text - ?: "?", - thumbnail = content.thumbnail + authors = otherRuns + .getOrNull(otherRuns.lastIndex - 2) + ?.map(Info.Companion::from) + ?: emptyList(), + album = otherRuns + .getOrNull(otherRuns.lastIndex - 1) + ?.firstOrNull() + ?.let(Info.Companion::from), + durationText = otherRuns + .getOrNull(otherRuns.lastIndex) + ?.firstOrNull()?.text, + thumbnail = content + .thumbnail ) } } @@ -178,14 +183,22 @@ object YouTube { val info: Info, val authors: List>, val views: List>, - val durationText: String, - override val thumbnail: ThumbnailRenderer.MusicThumbnailRenderer.Thumbnail.Thumbnail + val durationText: String?, + override val thumbnail: ThumbnailRenderer.MusicThumbnailRenderer.Thumbnail.Thumbnail? ) : Item() { val isOfficialMusicVideo: Boolean - get() = info.endpoint?.watchEndpointMusicSupportedConfigs?.watchEndpointMusicConfig?.musicVideoType == "MUSIC_VIDEO_TYPE_OMV" + get() = info + .endpoint + ?.watchEndpointMusicSupportedConfigs + ?.watchEndpointMusicConfig + ?.musicVideoType == "MUSIC_VIDEO_TYPE_OMV" val isUserGeneratedContent: Boolean - get() = info.endpoint?.watchEndpointMusicSupportedConfigs?.watchEndpointMusicConfig?.musicVideoType == "MUSIC_VIDEO_TYPE_UGC" + get() = info + .endpoint + ?.watchEndpointMusicSupportedConfigs + ?.watchEndpointMusicConfig + ?.musicVideoType == "MUSIC_VIDEO_TYPE_UGC" companion object : FromMusicShelfRendererContent