From b11d5d30d0345aa35275e616483568826304db64 Mon Sep 17 00:00:00 2001 From: vfsfitvnm Date: Mon, 6 Jun 2022 19:29:16 +0200 Subject: [PATCH] Add share button for YouTube albums and playlists --- .../ui/screens/PlaylistOrAlbumScreen.kt | 21 +++++++++++++++++++ .../it/vfsfitvnm/youtubemusic/YouTube.kt | 9 ++++++-- .../youtubemusic/models/BrowseResponse.kt | 13 +++++++++++- 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/PlaylistOrAlbumScreen.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/PlaylistOrAlbumScreen.kt index 649b081..fe52a05 100644 --- a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/PlaylistOrAlbumScreen.kt +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/PlaylistOrAlbumScreen.kt @@ -1,5 +1,6 @@ package it.vfsfitvnm.vimusic.ui.screens +import android.content.Intent import androidx.compose.animation.ExperimentalAnimationApi import androidx.compose.foundation.* import androidx.compose.foundation.layout.* @@ -13,6 +14,7 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.shadow import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.style.TextOverflow @@ -76,6 +78,7 @@ fun PlaylistOrAlbumScreen( } host { + val context = LocalContext.current val density = LocalDensity.current val player = LocalYoutubePlayer.current val colorPalette = LocalColorPalette.current @@ -184,6 +187,24 @@ fun PlaylistOrAlbumScreen( } } ) + + MenuEntry( + icon = R.drawable.share_social, + text = "Share", + onClick = { + menuState.hide() + + playlistOrAlbum.valueOrNull?.url?.let { url -> + val sendIntent = Intent().apply { + action = Intent.ACTION_SEND + type = "text/plain" + putExtra(Intent.EXTRA_TEXT, url) + } + + context.startActivity(Intent.createChooser(sendIntent, null)) + } + } + ) } } } 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 2e51418..cf28889 100644 --- a/youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/YouTube.kt +++ b/youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/YouTube.kt @@ -589,7 +589,8 @@ object YouTube { val authors: List>?, val year: String?, val thumbnail: ThumbnailRenderer.MusicThumbnailRenderer.Thumbnail.Thumbnail?, - val items: List? + val items: List?, + val url: String? ) { open class Item( val info: Info, @@ -686,7 +687,11 @@ object YouTube { ?.firstOrNull() ) } - ?.filter { it.info.endpoint != null } + ?.filter { it.info.endpoint != null }, + url = body + .microformat + ?.microformatDataRenderer + ?.urlCanonical ) } } diff --git a/youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/models/BrowseResponse.kt b/youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/models/BrowseResponse.kt index d94a434..0dfa2bc 100644 --- a/youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/models/BrowseResponse.kt +++ b/youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/models/BrowseResponse.kt @@ -6,7 +6,8 @@ import kotlinx.serialization.Serializable @Serializable data class BrowseResponse( val contents: Contents, - val header: Header? + val header: Header?, + val microformat: Microformat? ) { @Serializable data class Contents( @@ -46,4 +47,14 @@ data class BrowseResponse( ) } } + + @Serializable + data class Microformat( + val microformatDataRenderer: MicroformatDataRenderer? + ) { + @Serializable + data class MicroformatDataRenderer( + val urlCanonical: String? + ) + } }