Use Kotlinx Serialization with the subscription import/export functionality.

This commit is contained in:
Isira Seneviratne 2023-01-21 08:39:59 +05:30
parent 187c7ac0e9
commit e00b0c8263
5 changed files with 26 additions and 36 deletions

View File

@ -1,5 +1,8 @@
package com.github.libretube.obj package com.github.libretube.obj
import kotlinx.serialization.Serializable
@Serializable
data class ImportPlaylist( data class ImportPlaylist(
var name: String? = null, var name: String? = null,
val type: String? = null, val type: String? = null,

View File

@ -1,7 +1,10 @@
package com.github.libretube.obj package com.github.libretube.obj
import kotlinx.serialization.Serializable
@Serializable
data class ImportPlaylistFile( data class ImportPlaylistFile(
val format: String? = null, val format: String,
val version: Int? = null, val version: Int,
val playlists: List<ImportPlaylist> = emptyList() val playlists: List<ImportPlaylist> = emptyList()
) )

View File

@ -1,10 +1,11 @@
package com.github.libretube.obj package com.github.libretube.obj
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@Serializable @Serializable
data class NewPipeSubscription( data class NewPipeSubscription(
val name: String? = null, val name: String,
val service_id: Int? = null, @SerialName("service_id") val serviceId: Int,
val url: String? = null val url: String
) )

View File

@ -1,10 +1,11 @@
package com.github.libretube.obj package com.github.libretube.obj
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@Serializable @Serializable
data class NewPipeSubscriptions( data class NewPipeSubscriptions(
val app_version: String = "", @SerialName("app_version") val appVersion: String = "",
val app_version_int: Int = 0, @SerialName("app_version_int") val appVersionInt: Int = 0,
val subscriptions: List<NewPipeSubscription> = emptyList() val subscriptions: List<NewPipeSubscription> = emptyList()
) )

View File

@ -19,7 +19,6 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.decodeFromStream import kotlinx.serialization.json.decodeFromStream
import kotlinx.serialization.json.encodeToStream import kotlinx.serialization.json.encodeToStream
import okio.use import okio.use
@ -63,7 +62,7 @@ class ImportHelper(
JsonHelper.json.decodeFromStream<NewPipeSubscriptions>(it) JsonHelper.json.decodeFromStream<NewPipeSubscriptions>(it)
} }
subscriptions?.subscriptions.orEmpty().map { subscriptions?.subscriptions.orEmpty().map {
it.url!!.replace("https://www.youtube.com/channel/", "") it.url.replace("https://www.youtube.com/channel/", "")
} }
} }
"text/csv", "text/comma-separated-values" -> { "text/csv", "text/comma-separated-values" -> {
@ -93,21 +92,13 @@ class ImportHelper(
SubscriptionHelper.getFormattedLocalSubscriptions() SubscriptionHelper.getFormattedLocalSubscriptions()
) )
} }
val newPipeChannels = mutableListOf<NewPipeSubscription>() val newPipeChannels = subs.map {
subs.forEach { NewPipeSubscription(it.name, 0, "https://www.youtube.com${it.url}")
newPipeChannels += NewPipeSubscription(
name = it.name,
service_id = 0,
url = "https://www.youtube.com" + it.url
)
} }
val newPipeSubscriptions = NewPipeSubscriptions(subscriptions = newPipeChannels)
val newPipeSubscriptions = NewPipeSubscriptions(
subscriptions = newPipeChannels
)
activity.contentResolver.openOutputStream(uri)?.use { activity.contentResolver.openOutputStream(uri)?.use {
JsonHelper.json.encodeToStream<Any>(newPipeSubscriptions, it) JsonHelper.json.encodeToStream(newPipeSubscriptions, it)
} }
activity.toastFromMainThread(R.string.exportsuccess) activity.toastFromMainThread(R.string.exportsuccess)
@ -138,9 +129,10 @@ class ImportHelper(
} }
} }
"application/json", "application/*", "application/octet-stream" -> { "application/json", "application/*", "application/octet-stream" -> {
val playlistFile = JsonHelper.json val playlistFile = activity.contentResolver.openInputStream(uri)?.use {
.decodeFromString<ImportPlaylistFile>(uri.readText()) JsonHelper.json.decodeFromStream<ImportPlaylistFile>(it)
importPlaylists.addAll(playlistFile.playlists) }
importPlaylists.addAll(playlistFile?.playlists.orEmpty())
} }
else -> { else -> {
activity.applicationContext.toastFromMainThread("Unsupported file type $fileType") activity.applicationContext.toastFromMainThread("Unsupported file type $fileType")
@ -169,23 +161,13 @@ class ImportHelper(
runBlocking { runBlocking {
val playlists = PlaylistsHelper.exportPlaylists() val playlists = PlaylistsHelper.exportPlaylists()
val playlistFile = ImportPlaylistFile( val playlistFile = ImportPlaylistFile("Piped", 1, playlists)
format = "Piped",
version = 1,
playlists = playlists
)
activity.contentResolver.openOutputStream(uri)?.use { activity.contentResolver.openOutputStream(uri)?.use {
JsonHelper.json.encodeToStream<Any>(playlistFile, it) JsonHelper.json.encodeToStream(playlistFile, it)
} }
activity.toastFromMainThread(R.string.exportsuccess) activity.toastFromMainThread(R.string.exportsuccess)
} }
} }
private fun Uri.readText(): String {
return activity.contentResolver.openInputStream(this)?.use {
it.bufferedReader().use { reader -> reader.readText() }
}.orEmpty()
}
} }