diff --git a/app/src/main/java/com/github/libretube/helpers/ImportHelper.kt b/app/src/main/java/com/github/libretube/helpers/ImportHelper.kt index 834e2c7d45..f0453f75d2 100644 --- a/app/src/main/java/com/github/libretube/helpers/ImportHelper.kt +++ b/app/src/main/java/com/github/libretube/helpers/ImportHelper.kt @@ -161,10 +161,16 @@ object ImportHelper { } ImportFormat.FREETUBE -> { - val playlistFile = activity.contentResolver.openInputStream(uri)?.use { - JsonHelper.json.decodeFromStream>(it) + val playlistFile = activity.contentResolver.openInputStream(uri)?.use { inputStream -> + val text = inputStream.bufferedReader().readText() + runCatching { + JsonHelper.json.decodeFromString>(text) + }.getOrNull() ?: runCatching { + listOf(JsonHelper.json.decodeFromString(text)) + }.getOrNull() } - val playlists = playlistFile?.map { playlist -> + + val playlists = playlistFile.orEmpty().map { playlist -> // convert FreeTube videos to list of string // convert FreeTube playlists to piped playlists PipedImportPlaylist( @@ -174,7 +180,7 @@ object ImportHelper { playlist.videos.map { it.videoId } ) } - importPlaylists.addAll(playlists.orEmpty()) + importPlaylists.addAll(playlists) } ImportFormat.YOUTUBECSV -> { @@ -221,6 +227,12 @@ object ImportHelper { else -> throw IllegalArgumentException() } + + if (importPlaylists.isEmpty()) { + activity.toastFromMainDispatcher(R.string.emptyList) + return + } + try { PlaylistsHelper.importPlaylists(importPlaylists) activity.toastFromMainDispatcher(R.string.success) diff --git a/app/src/main/java/com/github/libretube/ui/preferences/BackupRestoreSettings.kt b/app/src/main/java/com/github/libretube/ui/preferences/BackupRestoreSettings.kt index 50b9dc79bd..611d34ea77 100644 --- a/app/src/main/java/com/github/libretube/ui/preferences/BackupRestoreSettings.kt +++ b/app/src/main/java/com/github/libretube/ui/preferences/BackupRestoreSettings.kt @@ -94,27 +94,27 @@ class BackupRestoreSettings : BasePreferenceFragment() { // result listeners for importing and exporting playlists private val getPlaylistsFile = - registerForActivityResult(ActivityResultContracts.OpenMultipleDocuments()) { - it?.forEach { + registerForActivityResult(ActivityResultContracts.OpenMultipleDocuments()) { files -> + for (file in files) { CoroutineScope(Dispatchers.IO).launch { - ImportHelper.importPlaylists(requireActivity(), it, importFormat) + ImportHelper.importPlaylists(requireActivity(), file, importFormat) } } } private val getWatchHistoryFile = - registerForActivityResult(ActivityResultContracts.OpenMultipleDocuments()) { - it?.forEach { + registerForActivityResult(ActivityResultContracts.OpenMultipleDocuments()) { files -> + for (file in files) { CoroutineScope(Dispatchers.IO).launch { - ImportHelper.importWatchHistory(requireActivity(), it, importFormat) + ImportHelper.importWatchHistory(requireActivity(), file, importFormat) } } } - private val createPlaylistsFile = registerForActivityResult(CreateDocument(JSON)) { - it?.let { + private val createPlaylistsFile = registerForActivityResult(CreateDocument(JSON)) { uri -> + uri?.let { lifecycleScope.launch(Dispatchers.IO) { - ImportHelper.exportPlaylists(requireActivity(), it, importFormat) + ImportHelper.exportPlaylists(requireActivity(), uri, importFormat) } } }