From e00b0c82631c008f0fd146071b76a4333960a039 Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Sat, 21 Jan 2023 08:39:59 +0530 Subject: [PATCH] Use Kotlinx Serialization with the subscription import/export functionality. --- .../github/libretube/obj/ImportPlaylist.kt | 3 ++ .../libretube/obj/ImportPlaylistFile.kt | 7 +++- .../libretube/obj/NewPipeSubscription.kt | 7 ++-- .../libretube/obj/NewPipeSubscriptions.kt | 5 ++- .../com/github/libretube/util/ImportHelper.kt | 40 +++++-------------- 5 files changed, 26 insertions(+), 36 deletions(-) diff --git a/app/src/main/java/com/github/libretube/obj/ImportPlaylist.kt b/app/src/main/java/com/github/libretube/obj/ImportPlaylist.kt index a080dfa30..e31622d32 100644 --- a/app/src/main/java/com/github/libretube/obj/ImportPlaylist.kt +++ b/app/src/main/java/com/github/libretube/obj/ImportPlaylist.kt @@ -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, diff --git a/app/src/main/java/com/github/libretube/obj/ImportPlaylistFile.kt b/app/src/main/java/com/github/libretube/obj/ImportPlaylistFile.kt index 7b531a584..0693e2df6 100644 --- a/app/src/main/java/com/github/libretube/obj/ImportPlaylistFile.kt +++ b/app/src/main/java/com/github/libretube/obj/ImportPlaylistFile.kt @@ -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 = emptyList() ) diff --git a/app/src/main/java/com/github/libretube/obj/NewPipeSubscription.kt b/app/src/main/java/com/github/libretube/obj/NewPipeSubscription.kt index 041703fdc..c75befd6a 100644 --- a/app/src/main/java/com/github/libretube/obj/NewPipeSubscription.kt +++ b/app/src/main/java/com/github/libretube/obj/NewPipeSubscription.kt @@ -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 ) diff --git a/app/src/main/java/com/github/libretube/obj/NewPipeSubscriptions.kt b/app/src/main/java/com/github/libretube/obj/NewPipeSubscriptions.kt index edea052fd..8309b5f27 100644 --- a/app/src/main/java/com/github/libretube/obj/NewPipeSubscriptions.kt +++ b/app/src/main/java/com/github/libretube/obj/NewPipeSubscriptions.kt @@ -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 = emptyList() ) diff --git a/app/src/main/java/com/github/libretube/util/ImportHelper.kt b/app/src/main/java/com/github/libretube/util/ImportHelper.kt index ffca363d0..9560b7fca 100644 --- a/app/src/main/java/com/github/libretube/util/ImportHelper.kt +++ b/app/src/main/java/com/github/libretube/util/ImportHelper.kt @@ -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(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() - 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(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(uri.readText()) - importPlaylists.addAll(playlistFile.playlists) + val playlistFile = activity.contentResolver.openInputStream(uri)?.use { + JsonHelper.json.decodeFromStream(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(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() - } }