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
import kotlinx.serialization.Serializable
@Serializable
data class ImportPlaylist(
var name: String? = null,
val type: String? = null,

View File

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

View File

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

View File

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

View File

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