clone playlists without account

This commit is contained in:
Bnyro 2022-12-08 18:15:39 +01:00
parent 81b14cfcd2
commit 834d0823f1
3 changed files with 69 additions and 46 deletions

View File

@ -142,7 +142,7 @@ interface PipedApi {
): Message ): Message
@POST("import/playlist") @POST("import/playlist")
suspend fun importPlaylist( suspend fun clonePlaylist(
@Header("Authorization") token: String, @Header("Authorization") token: String,
@Body playlistId: PlaylistId @Body playlistId: PlaylistId
): PlaylistId ): PlaylistId

View File

@ -20,7 +20,10 @@ import com.github.libretube.extensions.toastFromMainThread
import com.github.libretube.obj.ImportPlaylist import com.github.libretube.obj.ImportPlaylist
import com.github.libretube.util.PreferenceHelper import com.github.libretube.util.PreferenceHelper
import com.github.libretube.util.ProxyHelper import com.github.libretube.util.ProxyHelper
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async import kotlinx.coroutines.async
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import retrofit2.HttpException import retrofit2.HttpException
import java.io.IOException import java.io.IOException
@ -28,12 +31,12 @@ import java.io.IOException
object PlaylistsHelper { object PlaylistsHelper {
private val pipedPlaylistRegex = "[\\da-fA-F]{8}-[\\da-fA-F]{4}-[\\da-fA-F]{4}-[\\da-fA-F]{4}-[\\da-fA-F]{12}".toRegex() private val pipedPlaylistRegex = "[\\da-fA-F]{8}-[\\da-fA-F]{4}-[\\da-fA-F]{4}-[\\da-fA-F]{4}-[\\da-fA-F]{12}".toRegex()
val token get() = PreferenceHelper.getToken() private val token get() = PreferenceHelper.getToken()
private fun loggedIn() = token != "" val loggedIn: Boolean get() = token != ""
suspend fun getPlaylists(): List<Playlists> { suspend fun getPlaylists(): List<Playlists> {
if (loggedIn()) return RetrofitInstance.authApi.getUserPlaylists(token) if (loggedIn) return RetrofitInstance.authApi.getUserPlaylists(token)
val localPlaylists = awaitQuery { val localPlaylists = awaitQuery {
DatabaseHolder.Database.localPlaylistsDao().getAll() DatabaseHolder.Database.localPlaylistsDao().getAll()
@ -75,7 +78,7 @@ object PlaylistsHelper {
playlistName: String, playlistName: String,
appContext: Context appContext: Context
): String? { ): String? {
if (!loggedIn()) { if (!loggedIn) {
awaitQuery { awaitQuery {
DatabaseHolder.Database.localPlaylistsDao().createPlaylist( DatabaseHolder.Database.localPlaylistsDao().createPlaylist(
LocalPlaylist( LocalPlaylist(
@ -109,7 +112,7 @@ object PlaylistsHelper {
} }
suspend fun addToPlaylist(playlistId: String, vararg videoIds: String): Boolean { suspend fun addToPlaylist(playlistId: String, vararg videoIds: String): Boolean {
if (!loggedIn()) { if (!loggedIn) {
val localPlaylist = DatabaseHolder.Database.localPlaylistsDao().getAll() val localPlaylist = DatabaseHolder.Database.localPlaylistsDao().getAll()
.first { it.playlist.id.toString() == playlistId } .first { it.playlist.id.toString() == playlistId }
@ -144,7 +147,7 @@ object PlaylistsHelper {
} }
suspend fun renamePlaylist(playlistId: String, newName: String): Boolean { suspend fun renamePlaylist(playlistId: String, newName: String): Boolean {
if (!loggedIn()) { if (!loggedIn) {
val playlist = awaitQuery { val playlist = awaitQuery {
DatabaseHolder.Database.localPlaylistsDao().getAll() DatabaseHolder.Database.localPlaylistsDao().getAll()
}.first { it.playlist.id.toString() == playlistId }.playlist }.first { it.playlist.id.toString() == playlistId }.playlist
@ -165,7 +168,7 @@ object PlaylistsHelper {
} }
suspend fun removeFromPlaylist(playlistId: String, index: Int) { suspend fun removeFromPlaylist(playlistId: String, index: Int) {
if (!loggedIn()) { if (!loggedIn) {
val transaction = awaitQuery { val transaction = awaitQuery {
DatabaseHolder.Database.localPlaylistsDao().getAll() DatabaseHolder.Database.localPlaylistsDao().getAll()
}.first { it.playlist.id.toString() == playlistId } }.first { it.playlist.id.toString() == playlistId }
@ -228,8 +231,63 @@ object PlaylistsHelper {
return importLists return importLists
} }
fun clonePlaylist(context: Context, playlistId: String) {
val appContext = context.applicationContext
if (!loggedIn) {
CoroutineScope(Dispatchers.IO).launch {
val playlist = try {
RetrofitInstance.api.getPlaylist(playlistId)
} catch (e: Exception) {
appContext.toastFromMainThread(R.string.server_error)
return@launch
}
val newPlaylist = createPlaylist(playlist.name ?: "Unknown name", appContext)
newPlaylist ?: return@launch
addToPlaylist(
newPlaylist,
*playlist.relatedStreams.orEmpty()
.map { it.url!!.toID() }
.toTypedArray()
)
var nextPage = playlist.nextpage
while (nextPage != null) {
nextPage = try {
RetrofitInstance.api.getPlaylistNextPage(playlistId, nextPage).apply {
addToPlaylist(
newPlaylist,
*relatedStreams.orEmpty()
.map { it.url!!.toID() }
.toTypedArray()
)
}.nextpage
} catch (e: Exception) {
return@launch
}
}
}
return
}
CoroutineScope(Dispatchers.IO).launch {
val response = try {
RetrofitInstance.authApi.clonePlaylist(
token,
PlaylistId(playlistId)
)
} catch (e: Exception) {
Log.e(TAG(), e.toString())
return@launch
}
appContext?.toastFromMainThread(
if (response.playlistId != null) R.string.playlistCloned else R.string.server_error
)
}
}
fun getPrivatePlaylistType(): PlaylistType { fun getPrivatePlaylistType(): PlaylistType {
return if (loggedIn()) PlaylistType.PRIVATE else PlaylistType.LOCAL return if (loggedIn) PlaylistType.PRIVATE else PlaylistType.LOCAL
} }
private fun getPrivatePlaylistType(playlistId: String): PlaylistType { private fun getPrivatePlaylistType(playlistId: String): PlaylistType {

View File

@ -1,26 +1,18 @@
package com.github.libretube.ui.sheets package com.github.libretube.ui.sheets
import android.os.Bundle import android.os.Bundle
import android.widget.Toast
import com.github.libretube.R import com.github.libretube.R
import com.github.libretube.api.PlaylistsHelper
import com.github.libretube.api.RetrofitInstance import com.github.libretube.api.RetrofitInstance
import com.github.libretube.api.obj.PlaylistId
import com.github.libretube.enums.PlaylistType import com.github.libretube.enums.PlaylistType
import com.github.libretube.enums.ShareObjectType import com.github.libretube.enums.ShareObjectType
import com.github.libretube.extensions.toID import com.github.libretube.extensions.toID
import com.github.libretube.extensions.toastFromMainThread
import com.github.libretube.obj.ShareData import com.github.libretube.obj.ShareData
import com.github.libretube.ui.dialogs.DeletePlaylistDialog import com.github.libretube.ui.dialogs.DeletePlaylistDialog
import com.github.libretube.ui.dialogs.RenamePlaylistDialog import com.github.libretube.ui.dialogs.RenamePlaylistDialog
import com.github.libretube.ui.dialogs.ShareDialog import com.github.libretube.ui.dialogs.ShareDialog
import com.github.libretube.util.BackgroundHelper import com.github.libretube.util.BackgroundHelper
import com.github.libretube.util.PreferenceHelper
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import retrofit2.HttpException
import java.io.IOException
class PlaylistOptionsBottomSheet( class PlaylistOptionsBottomSheet(
private val playlistId: String, private val playlistId: String,
@ -62,16 +54,7 @@ class PlaylistOptionsBottomSheet(
} }
// Clone the playlist to the users Piped account // Clone the playlist to the users Piped account
context?.getString(R.string.clonePlaylist) -> { context?.getString(R.string.clonePlaylist) -> {
val token = PreferenceHelper.getToken() PlaylistsHelper.clonePlaylist(requireContext(), playlistId)
if (token != "") {
importPlaylist(token, playlistId)
} else {
Toast.makeText(
context,
R.string.login_first,
Toast.LENGTH_SHORT
).show()
}
} }
// share the playlist // share the playlist
context?.getString(R.string.share) -> { context?.getString(R.string.share) -> {
@ -91,22 +74,4 @@ class PlaylistOptionsBottomSheet(
} }
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
} }
private fun importPlaylist(token: String, playlistId: String) {
val appContext = context?.applicationContext
CoroutineScope(Dispatchers.IO).launch {
val response = try {
RetrofitInstance.authApi.importPlaylist(
token,
PlaylistId(playlistId)
)
} catch (e: IOException) {
println(e)
return@launch
} catch (e: HttpException) {
return@launch
}
appContext?.toastFromMainThread(if (response.playlistId != null) R.string.playlistCloned else R.string.server_error)
}
}
} }