diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 251cf9bd6..ad38281f1 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -94,6 +94,9 @@
+
+ val directory = DocumentFile.fromTreeUri(context, uri) ?: run {
+ throw Exception("Failed to get directory from URI")
+ }
+
+ val file = directory.createFile("application/json", "playlists") ?: run {
+ throw Exception("Failed to create file")
+ }
+
+ viewModel.viewModelScope.launch {
+ try {
+ context.contentResolver.openOutputStream(file.uri)?.use { outputStream ->
+ outputStream.write(client.serializePlaylists().toByteArray())
+ }
+ } catch (e: Exception) {
+ file.delete()
+ throw e
+ }
+ }
+ }
+ }
+ }
+
+ private fun importPlaylists(client: ExtensionClient) {
+ val context = preferenceManager.context
+ if (client is PlaylistEditClient) {
+ PickerActivity.openFile(context) { uri ->
+ context.contentResolver.openInputStream(uri)?.use { inputStream ->
+ inputStream.bufferedReader().use { reader ->
+ val text = reader.readText()
+ viewModel.viewModelScope.launch {
+ client.deserializePlaylists(text)
+ }
+ }
+ } ?: throw Exception("Cannot open input stream for $uri")
+ }
+ }
+ }
+
private fun Setting.addPreferenceTo(preferenceGroup: PreferenceGroup) {
val context = preferenceGroup.context
when (this) {
diff --git a/app/src/main/java/dev/brahmkshatriya/echo/ui/extensions/export/ExportPlaylist.kt b/app/src/main/java/dev/brahmkshatriya/echo/ui/extensions/export/ExportPlaylist.kt
new file mode 100644
index 000000000..2626eb60d
--- /dev/null
+++ b/app/src/main/java/dev/brahmkshatriya/echo/ui/extensions/export/ExportPlaylist.kt
@@ -0,0 +1,37 @@
+package dev.brahmkshatriya.echo.ui.extensions.export
+
+import dev.brahmkshatriya.echo.common.clients.PlaylistEditClient
+import dev.brahmkshatriya.echo.common.models.Track
+import dev.brahmkshatriya.echo.common.models.Feed.Companion.loadAll
+import dev.brahmkshatriya.echo.utils.Serializer.toData
+import dev.brahmkshatriya.echo.utils.Serializer.toJson
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class ExportPlaylist(
+ val title: String,
+ val description: String? = null,
+ val tracks: List