Skip to content

Commit

Permalink
Merge pull request #5620 from aneesh1122/master
Browse files Browse the repository at this point in the history
Added multi songs adding in the youtube playlists
  • Loading branch information
fast4x authored Feb 4, 2025
2 parents b72b9e3 + 2b36a59 commit 8673889
Show file tree
Hide file tree
Showing 13 changed files with 265 additions and 59 deletions.
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package it.fast4x.rimusic.ui.components.themed

import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
Expand All @@ -23,6 +25,7 @@ import it.fast4x.compose.persist.persistList
import it.fast4x.rimusic.Database
import it.fast4x.rimusic.PIPED_PREFIX
import it.fast4x.rimusic.R
import it.fast4x.rimusic.YTEDITABLEPLAYLIST_PREFIX
import it.fast4x.rimusic.YTP_PREFIX
import it.fast4x.rimusic.cleanPrefix
import it.fast4x.rimusic.colorPalette
Expand Down Expand Up @@ -105,6 +108,20 @@ fun Playlist(
contentScale = ContentScale.Fit
)
}
if (playlist.playlist.name.contains(YTP_PREFIX) && playlist.playlist.browseId?.startsWith(YTEDITABLEPLAYLIST_PREFIX) == false){
Image(
painter = painterResource(R.drawable.locked),
colorFilter = ColorFilter.tint(Color.Red),
modifier = Modifier
.padding(all = 5.dp)
.background(colorPalette().text, CircleShape)
.padding(all = 5.dp)
.size(18.dp)
.align(Alignment.BottomStart),
contentDescription = "Background Image",
contentScale = ContentScale.Fit
)
}
},
songCount = playlist.songCount,
name = cleanPrefix(playlist.playlist.name),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ import it.fast4x.rimusic.MONTHLY_PREFIX
import it.fast4x.rimusic.PINNED_PREFIX
import it.fast4x.rimusic.PIPED_PREFIX
import it.fast4x.rimusic.R
import it.fast4x.rimusic.YTP_PREFIX
import it.fast4x.rimusic.enums.MenuStyle
import it.fast4x.rimusic.enums.NavRoutes
import it.fast4x.rimusic.enums.PlaylistSortBy
Expand Down Expand Up @@ -398,7 +399,7 @@ fun PlaylistsItemGridMenu(
if (showLinkUnlink) onLinkUnlink?.let { onLinkUnlink ->
GridMenuItem(
icon = R.drawable.link,
title = R.string.unlink_from_ytm,
title = if (playlist?.playlist?.name?.contains(YTP_PREFIX) == true) R.string.unlink_from_ytm else R.string.unlink_from_yt,
colorIcon = colorPalette.text,
colorText = colorPalette.text,
onClick = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,11 @@ import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.graphics.compositeOver
import androidx.compose.ui.layout.onPlaced
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
Expand All @@ -42,6 +45,8 @@ import it.fast4x.rimusic.MONTHLY_PREFIX
import it.fast4x.rimusic.PINNED_PREFIX
import it.fast4x.rimusic.PIPED_PREFIX
import it.fast4x.rimusic.R
import it.fast4x.rimusic.YTEDITABLEPLAYLIST_PREFIX
import it.fast4x.rimusic.YTP_PREFIX
import it.fast4x.rimusic.cleanPrefix
import it.fast4x.rimusic.enums.MenuStyle
import it.fast4x.rimusic.enums.NavRoutes
Expand All @@ -60,6 +65,7 @@ import it.fast4x.rimusic.utils.semiBold
import kotlinx.coroutines.Dispatchers
import it.fast4x.rimusic.colorPalette
import it.fast4x.rimusic.typography
import it.fast4x.rimusic.utils.isNetworkConnected

@ExperimentalTextApi
@SuppressLint("SuspiciousIndentation")
Expand Down Expand Up @@ -155,6 +161,7 @@ fun PlaylistsItemMenu(
}, label = ""
) { currentIsViewingPlaylists ->
if (currentIsViewingPlaylists) {
val context = LocalContext.current
val sortBy by rememberPreference(playlistSortByKey, PlaylistSortBy.DateAdded)
val sortOrder by rememberPreference(playlistSortOrderKey, SortOrder.Descending)
val playlistPreviews by remember {
Expand All @@ -163,12 +170,20 @@ fun PlaylistsItemMenu(

val pinnedPlaylists = playlistPreviews.filter {
it.playlist.name.startsWith(PINNED_PREFIX, 0, true)
&& if (isNetworkConnected(context)) !(it.playlist.name.contains(
YTP_PREFIX
) && (it.playlist.browseId?.startsWith(YTEDITABLEPLAYLIST_PREFIX) == false)) else !it.playlist.name.contains(
YTP_PREFIX
)
}

val youtubePlaylists = playlistPreviews.filter { it.playlist.browseId?.startsWith(
YTEDITABLEPLAYLIST_PREFIX) == true && !it.playlist.name.startsWith(PINNED_PREFIX)}

val unpinnedPlaylists = playlistPreviews.filter {
!it.playlist.name.startsWith(PINNED_PREFIX, 0, true) &&
!it.playlist.name.startsWith(MONTHLY_PREFIX, 0, true) //&&
//!it.playlist.name.startsWith(PIPED_PREFIX, 0, true)
!it.playlist.name.startsWith(MONTHLY_PREFIX, 0, true) &&
!it.playlist.name.contains(YTP_PREFIX)
}

var isCreatingNewPlaylist by rememberSaveable {
Expand Down Expand Up @@ -261,6 +276,25 @@ fun PlaylistsItemMenu(
)
},
trailingContent = {
if (playlistPreview.playlist.name.startsWith(PIPED_PREFIX, 0, true))
Image(
painter = painterResource(R.drawable.piped_logo),
contentDescription = null,
colorFilter = ColorFilter.tint(colorPalette().red),
modifier = Modifier
.size(18.dp)
)
if (playlistPreview.playlist.name.contains(YTP_PREFIX)) {
Image(
painter = painterResource(R.drawable.ytmusic),
contentDescription = null,
colorFilter = ColorFilter.tint(
Color.Red.copy(0.75f).compositeOver(Color.White)
),
modifier = Modifier
.size(18.dp)
)
}
IconButton(
icon = R.drawable.open,
color = colorPalette().text,
Expand All @@ -280,6 +314,48 @@ fun PlaylistsItemMenu(
}
}

if (youtubePlaylists.isNotEmpty() && isNetworkConnected(context)) {
BasicText(
text = stringResource(R.string.ytm_playlists),
style = typography().m.semiBold,
modifier = Modifier.padding(start = 20.dp, top = 5.dp)
)

onAddToPlaylist?.let { onAddToPlaylist ->
youtubePlaylists.forEach { playlistPreview ->
MenuEntry(
icon = R.drawable.add_in_playlist,
text = cleanPrefix(playlistPreview.playlist.name),
secondaryText = "${playlistPreview.songCount} " + stringResource(R.string.songs),
onClick = {
onDismiss()
onAddToPlaylist(
PlaylistPreview(
playlistPreview.playlist,
playlistPreview.songCount
)
)
},
trailingContent = {
IconButton(
icon = R.drawable.open,
color = colorPalette().text,
onClick = {
if (onGoToPlaylist != null) {
onGoToPlaylist(playlistPreview.playlist.id)
onDismiss()
}
navController.navigate(route = "${NavRoutes.localPlaylist.name}/${playlistPreview.playlist.id}")
},
modifier = Modifier
.size(24.dp)
)
}
)
}
}
}

if (unpinnedPlaylists.isNotEmpty()) {
BasicText(
text = stringResource(R.string.playlists),
Expand Down Expand Up @@ -482,7 +558,7 @@ fun PlaylistsItemMenu(
if (showLinkUnlink) onLinkUnlink?.let { onLinkUnlink ->
MenuEntry(
icon = R.drawable.link,
text = stringResource(R.string.unlink_from_ytm),
text = if (playlist?.playlist?.name?.contains(YTP_PREFIX) == true) stringResource(R.string.unlink_from_ytm) else stringResource(R.string.unlink_from_yt),
onClick = {
onDismiss()
onLinkUnlink()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.requiredSize
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.BasicText
import androidx.compose.runtime.Composable
Expand Down Expand Up @@ -332,13 +333,15 @@ fun PlaylistItem(
)
}

if (browseId?.startsWith(YTEDITABLEPLAYLIST_PREFIX) == true){
if (name?.contains(YTP_PREFIX) == true && browseId?.startsWith(YTEDITABLEPLAYLIST_PREFIX) == false){
Image(
painter = painterResource(R.drawable.cover_edit),
colorFilter = ColorFilter.tint(colorPalette().text),
painter = painterResource(R.drawable.locked),
colorFilter = ColorFilter.tint(Color.Red),
modifier = Modifier
.size(40.dp)
.padding(all = 5.dp)
.background(colorPalette().text, CircleShape)
.padding(all = 5.dp)
.size(18.dp)
.align(Alignment.BottomStart),
contentDescription = "Background Image",
contentScale = ContentScale.Fit
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ import it.fast4x.rimusic.EXPLICIT_PREFIX
import it.fast4x.rimusic.LocalPlayerServiceBinder
import it.fast4x.rimusic.MODIFIED_PREFIX
import it.fast4x.rimusic.R
import it.fast4x.rimusic.YTEDITABLEPLAYLIST_PREFIX
import it.fast4x.rimusic.YTP_PREFIX
import it.fast4x.rimusic.cleanPrefix
import it.fast4x.rimusic.enums.NavRoutes
Expand Down Expand Up @@ -1067,12 +1068,17 @@ fun AlbumDetails(
)
)
}

if(isYouTubeSyncEnabled())
CoroutineScope(Dispatchers.IO).launch {
playlistPreview.playlist.browseId?.let { it -> YtMusic.addToPlaylist(cleanPrefix(it), song.id) }
}
}

if (isYouTubeSyncEnabled() && playlistPreview.playlist.browseId?.startsWith(YTEDITABLEPLAYLIST_PREFIX) == true) {
CoroutineScope(Dispatchers.IO).launch {
YtMusic.addPlaylistToPlaylist(
cleanPrefix(playlistPreview.playlist.browseId),
cleanPrefix(albumPage?.album?.playlistId ?: "")

)
}
}
} else {
listMediaItems.forEachIndexed { index, song ->
//Log.d("mediaItemMaxPos", position.toString())
Expand All @@ -1086,10 +1092,15 @@ fun AlbumDetails(
)
)
}
if(isYouTubeSyncEnabled())
CoroutineScope(Dispatchers.IO).launch {
playlistPreview.playlist.browseId?.let { it -> YtMusic.addToPlaylist(cleanPrefix(it), song.mediaId) }
}
}
if (isYouTubeSyncEnabled() && playlistPreview.playlist.browseId?.startsWith(YTEDITABLEPLAYLIST_PREFIX) == true) {
CoroutineScope(Dispatchers.IO).launch {
YtMusic.addToPlaylist(
cleanPrefix(playlistPreview.playlist.browseId),
listMediaItems.map { it.mediaId }

)
}
}
listMediaItems.clear()
selectItems = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ import it.fast4x.rimusic.Database
import it.fast4x.rimusic.LocalPlayerServiceBinder
import it.fast4x.rimusic.MODIFIED_PREFIX
import it.fast4x.rimusic.R
import it.fast4x.rimusic.YTEDITABLEPLAYLIST_PREFIX
import it.fast4x.rimusic.YTP_PREFIX
import it.fast4x.rimusic.cleanPrefix
import it.fast4x.rimusic.enums.AlbumSortBy
Expand Down Expand Up @@ -445,13 +446,11 @@ fun HomeAlbums(
)
)
}

if(isYouTubeSyncEnabled())
}
if (isYouTubeSyncEnabled() && playlistPreview.playlist.browseId?.startsWith(YTEDITABLEPLAYLIST_PREFIX) == true) {
CoroutineScope(Dispatchers.IO).launch {
playlistPreview.playlist.browseId?.let { it ->
YtMusic.addToPlaylist(cleanPrefix(it), song.id) }
cleanPrefix(playlistPreview.playlist.browseId).let { id -> YtMusic.addToPlaylist(id, songs.map{it.asMediaItem.mediaId})}
}

}

},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ import it.fast4x.rimusic.Database
import it.fast4x.rimusic.EXPLICIT_PREFIX
import it.fast4x.rimusic.LocalPlayerServiceBinder
import it.fast4x.rimusic.R
import it.fast4x.rimusic.YTEDITABLEPLAYLIST_PREFIX
import it.fast4x.rimusic.cleanPrefix
import it.fast4x.rimusic.colorPalette
import it.fast4x.rimusic.enums.BuiltInPlaylist
Expand Down Expand Up @@ -1383,13 +1384,18 @@ fun HomeSongsModern(
Timber.e("Failed addToPlaylist in HomeSongsModern ${it.stackTraceToString()}")
println("Failed addToPlaylist in HomeSongsModern ${it.stackTraceToString()}")
}
if(isYouTubeSyncEnabled() && !song.song.id.startsWith(
LOCAL_KEY_PREFIX))
CoroutineScope(Dispatchers.IO).launch {
playlistPreview.playlist.browseId?.let {
YtMusic.addToPlaylist(cleanPrefix(it), song.song.asMediaItem.mediaId) }
}
if(isYouTubeSyncEnabled()
&& playlistPreview.playlist.browseId?.startsWith(YTEDITABLEPLAYLIST_PREFIX) == true) {
CoroutineScope(Dispatchers.IO).launch {
playlistPreview.playlist.browseId.let { id ->
YtMusic.addToPlaylist(cleanPrefix(id),items
.filterNot {it.song.id.startsWith(LOCAL_KEY_PREFIX)}
.map { it.asMediaItem.mediaId })
}
}
}

CoroutineScope(Dispatchers.Main).launch {
SmartMessage(
context.resources.getString(R.string.done),
Expand Down
Loading

0 comments on commit 8673889

Please sign in to comment.