diff --git a/app/src/main/java/com/github/libretube/api/PlaylistsHelper.kt b/app/src/main/java/com/github/libretube/api/PlaylistsHelper.kt index 15b357617..3d8c46a3b 100644 --- a/app/src/main/java/com/github/libretube/api/PlaylistsHelper.kt +++ b/app/src/main/java/com/github/libretube/api/PlaylistsHelper.kt @@ -1,7 +1,6 @@ package com.github.libretube.api import android.content.Context -import android.net.Uri import android.util.Log import com.github.libretube.R import com.github.libretube.api.obj.Playlist @@ -207,7 +206,7 @@ object PlaylistsHelper { addToPlaylist( playlistId, *playlist.videos.map { - Uri.parse(it).getQueryParameter("v")!! + it.substring(it.length - 11, it.length) }.toTypedArray() ) } 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 fc25c8789..a080dfa30 100644 --- a/app/src/main/java/com/github/libretube/obj/ImportPlaylist.kt +++ b/app/src/main/java/com/github/libretube/obj/ImportPlaylist.kt @@ -1,8 +1,8 @@ package com.github.libretube.obj data class ImportPlaylist( - val name: String? = null, + var name: String? = null, val type: String? = null, val visibility: String? = null, - val videos: List = listOf() + var videos: List = listOf() ) 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 569bba21b..e879907a4 100644 --- a/app/src/main/java/com/github/libretube/util/ImportHelper.kt +++ b/app/src/main/java/com/github/libretube/util/ImportHelper.kt @@ -11,6 +11,7 @@ import com.github.libretube.api.RetrofitInstance import com.github.libretube.api.SubscriptionHelper import com.github.libretube.extensions.TAG import com.github.libretube.extensions.toastFromMainThread +import com.github.libretube.obj.ImportPlaylist import com.github.libretube.obj.ImportPlaylistFile import com.github.libretube.obj.NewPipeSubscription import com.github.libretube.obj.NewPipeSubscriptions @@ -112,13 +113,37 @@ class ImportHelper( fun importPlaylists(uri: Uri?) { if (uri == null) return - val playlistFile = ObjectMapper().readValue(uri.readText(), ImportPlaylistFile::class.java) + val importPlaylists = mutableListOf() + + when (val fileType = activity.contentResolver.getType(uri)) { + "text/csv", "text/comma-separated-values" -> { + val playlist = ImportPlaylist() + activity.contentResolver.openInputStream(uri)?.use { + val lines = it.bufferedReader().readLines() + playlist.name = lines[1].split(",").reversed()[2] + val splitIndex = lines.indexOfFirst { line -> line.startsWith("Video ID") } + lines.subList(splitIndex + 1, lines.size).forEach { line -> + line.split(",").firstOrNull()?.let { videoId -> + if (videoId.isNotBlank()) playlist.videos = playlist.videos + videoId + } + } + importPlaylists.add(playlist) + } + } + "application/json", "application/*", "application/octet-stream" -> { + val playlistFile = ObjectMapper().readValue(uri.readText(), ImportPlaylistFile::class.java) + importPlaylists.addAll(playlistFile.playlists.orEmpty()) + } + else -> { + activity.applicationContext.toastFromMainThread("Unsupported file type $fileType") + return + } + } CoroutineScope(Dispatchers.IO).launch { try { - playlistFile.playlists?.let { - PlaylistsHelper.importPlaylists(activity, it) - } + PlaylistsHelper.importPlaylists(activity, importPlaylists) + activity.applicationContext.toastFromMainThread(R.string.success) } catch (e: Exception) { Log.e(TAG(), e.toString()) e.localizedMessage?.let { @@ -126,8 +151,6 @@ class ImportHelper( } } } - - activity.toastFromMainThread(R.string.success) } /**