diff --git a/odesli/src/main/java/com/prochy/odesliandroid/activity/Main.kt b/odesli/src/main/java/com/prochy/odesliandroid/activity/Main.kt index 572b22a..ab7502c 100644 --- a/odesli/src/main/java/com/prochy/odesliandroid/activity/Main.kt +++ b/odesli/src/main/java/com/prochy/odesliandroid/activity/Main.kt @@ -339,21 +339,7 @@ fun OdesliLayout() { strokeCap = StrokeCap.Round ) if (receivedLinks) { - val thumbnail = songData.entitiesByUniqueId[outputService]?.thumbnailUrl - val title = songData.entitiesByUniqueId[outputService]?.title - val artist = songData.entitiesByUniqueId[outputService]?.artistName - val service = getLabelFromService(outputService) - val link = songData.linksByPlatform[outputService]?.url - val type = songData.entitiesByUniqueId[songData.entitiesByUniqueId.keys.first()]?.type ?: "" - - Utils.SongInfo( - thumbnail = thumbnail.toString(), - title = title.toString(), - artist = artist.toString(), - service = service.toString(), - link = link.toString(), - odesliType = type - ) + Utils.SongInfoFromData(songData, outputService) } } diff --git a/odesli/src/main/java/com/prochy/odesliandroid/activity/Share.kt b/odesli/src/main/java/com/prochy/odesliandroid/activity/Share.kt index 2b19dec..7151be2 100644 --- a/odesli/src/main/java/com/prochy/odesliandroid/activity/Share.kt +++ b/odesli/src/main/java/com/prochy/odesliandroid/activity/Share.kt @@ -125,10 +125,11 @@ class Share : ComponentActivity() { ).show() finish() } - val platformLink = data.linksByPlatform[service]?.url - if (!platformLink.isNullOrBlank()) { + + val serviceLink = Utils.getLinkForService(data, service) + if (!serviceLink.isNullOrBlank()) { val clipboard = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager - val clip = ClipData.newPlainText("Link", platformLink) + val clip = ClipData.newPlainText("Link", serviceLink) clipboard.setPrimaryClip(clip) finish() } else { @@ -326,19 +327,10 @@ fun ShareActivityLayout(receivedLink: String) { } val musicServices = MusicProviders.entries.map { it.service } - val thumbnail = receivedData.value.entitiesByUniqueId[outputService]?.thumbnailUrl - val title = receivedData.value.entitiesByUniqueId[outputService]?.title - val artist = receivedData.value.entitiesByUniqueId[outputService]?.artistName - val service = getLabelFromService(outputService) - val link = receivedData.value.linksByPlatform[outputService]?.url - val type = receivedData.value.entitiesByUniqueId[receivedData.value.entitiesByUniqueId.keys.first()]?.type ?: "" - Utils.SongInfo( - thumbnail = thumbnail.toString(), - title = title.toString(), - artist = artist.toString(), - service = service.toString(), - link = link.toString(), - odesliType = type, + + Utils.SongInfoFromData( + receivedData.value, + outputService, element = { DynamicSelectTextFieldPopUp( modifier = Modifier.width(350.dp), @@ -351,6 +343,7 @@ fun ShareActivityLayout(receivedLink: String) { ) } ) + } } } diff --git a/odesli/src/main/java/com/prochy/odesliandroid/utils/MusicProviders.kt b/odesli/src/main/java/com/prochy/odesliandroid/utils/MusicProviders.kt index 7d7dba7..60197ee 100644 --- a/odesli/src/main/java/com/prochy/odesliandroid/utils/MusicProviders.kt +++ b/odesli/src/main/java/com/prochy/odesliandroid/utils/MusicProviders.kt @@ -5,6 +5,7 @@ import androidx.annotation.Keep // Enum class representing different music services @Keep enum class MusicProviders(val label: String, val service: String) { + SongLink("SongLink", "SONG_LINK"), AmazonMusic("Amazon Music", "amazonMusic"), AmazonStore("Amazon Appstore", "amazonStore"), Anghami("Anghami", "anghami"), diff --git a/odesli/src/main/java/com/prochy/odesliandroid/utils/Utils.kt b/odesli/src/main/java/com/prochy/odesliandroid/utils/Utils.kt index 529b189..d5d315a 100644 --- a/odesli/src/main/java/com/prochy/odesliandroid/utils/Utils.kt +++ b/odesli/src/main/java/com/prochy/odesliandroid/utils/Utils.kt @@ -49,9 +49,45 @@ import coil.compose.rememberAsyncImagePainter import coil.request.ImageRequest import coil.size.Size import com.prochy.odesliandroid.R +import com.prochy.odesliandroid.utils.MusicProviders.Companion.getLabelFromService class Utils { companion object { + + /// prioritized list of music providers that get used if the selected music provider doesn't have any metadata + private val fallbackMusicProviders = listOf( + MusicProviders.Spotify, + MusicProviders.AppleMusic, + MusicProviders.YoutubeMusic, + MusicProviders.Deezer, + ) + + /// adds song metadata extracted from the given [songData] for the given [service] + @Composable + fun SongInfoFromData( + songData: OdesliData, + service: String, + element: @Composable () -> Unit = {}, + ) { + val entriesData = getEntriesDataFor(songData, service) + val thumbnail = entriesData?.thumbnailUrl + val title = entriesData?.title + val artist = entriesData?.artistName + val serviceLabel = getLabelFromService(service) + val link = getLinkForService(songData, service) + val type = songData.entitiesByUniqueId[songData.entitiesByUniqueId.keys.first()]?.type ?: "" + + SongInfo( + thumbnail = thumbnail.toString(), + title = title.toString(), + artist = artist.toString(), + service = serviceLabel.toString(), + link = link.toString(), + odesliType = type, + element = element, + ) + } + @Composable fun SongInfo( thumbnail: String, @@ -261,6 +297,34 @@ class Utils { startActivity(context, browserIntent, null) } + private fun getEntriesDataFor(songData: OdesliData, service: String) : EntitiesData? { + val matchingData = songData.entitiesByUniqueId[service] + if(matchingData != null) { + return matchingData + } + // if [service] doesn't have metadata then go through the fallbackMusicProviders + // and use the first one that has metadata + for (fallbackMusicProvider in fallbackMusicProviders) { + val potentialFallbackData = songData.entitiesByUniqueId[fallbackMusicProvider.service] + if(potentialFallbackData != null) { + return potentialFallbackData + } + } + if(songData.entitiesByUniqueId.isNotEmpty()) { + return songData.entitiesByUniqueId[songData.entitiesByUniqueId.keys.first()] + } + return null + } + + fun getLinkForService(data: OdesliData, service: String): String? { + // if the selected service is "SongLink" then we return the SongLink URL + if(service == MusicProviders.SongLink.service) { + return data.pageUrl + } + val serviceSpecificLink = data.linksByPlatform[service] ?: return null + return serviceSpecificLink.url + } + fun getMusicData(link: String, context: Context, callback: (OdesliData) -> Unit) { fun retroFitRequest(countryCode: String) {