From 2a6ba6d5412119cb68815db5ec0ca5b8754c5621 Mon Sep 17 00:00:00 2001 From: Koen Date: Fri, 14 Jun 2024 14:54:37 +0200 Subject: [PATCH] Fixed remote playlist ToPlaylist. --- .../playlists/IPlatformPlaylistDetails.kt | 2 +- .../platforms/js/models/JSPlaylistDetails.kt | 18 +++--- .../main/RemotePlaylistFragment.kt | 59 ++++++++++--------- 3 files changed, 44 insertions(+), 35 deletions(-) diff --git a/app/src/main/java/com/futo/platformplayer/api/media/models/playlists/IPlatformPlaylistDetails.kt b/app/src/main/java/com/futo/platformplayer/api/media/models/playlists/IPlatformPlaylistDetails.kt index b7783668..28947655 100644 --- a/app/src/main/java/com/futo/platformplayer/api/media/models/playlists/IPlatformPlaylistDetails.kt +++ b/app/src/main/java/com/futo/platformplayer/api/media/models/playlists/IPlatformPlaylistDetails.kt @@ -8,5 +8,5 @@ interface IPlatformPlaylistDetails: IPlatformPlaylist { //TODO: Determine if this should be IPlatformContent (probably not?) val contents: IPager; - fun toPlaylist(): Playlist; + fun toPlaylist(onProgress: ((progress: Int) -> Unit)? = null): Playlist; } \ No newline at end of file diff --git a/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/JSPlaylistDetails.kt b/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/JSPlaylistDetails.kt index cbd4e013..f2c3935c 100644 --- a/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/JSPlaylistDetails.kt +++ b/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/JSPlaylistDetails.kt @@ -7,7 +7,7 @@ import com.futo.platformplayer.api.media.models.video.SerializedPlatformVideo import com.futo.platformplayer.api.media.platforms.js.JSClient import com.futo.platformplayer.api.media.platforms.js.SourcePluginConfig import com.futo.platformplayer.api.media.structures.IPager -import com.futo.platformplayer.engine.V8Plugin +import com.futo.platformplayer.api.media.structures.ReusablePager import com.futo.platformplayer.getOrThrow import com.futo.platformplayer.models.Playlist @@ -15,22 +15,26 @@ class JSPlaylistDetails: JSPlaylist, IPlatformPlaylistDetails { override val contents: IPager; constructor(plugin: JSClient, config: SourcePluginConfig, obj: V8ValueObject): super(config, obj) { - contents = JSVideoPager(config, plugin, obj.getOrThrow(config, "contents", "PlaylistDetails")); + contents = ReusablePager(JSVideoPager(config, plugin, obj.getOrThrow(config, "contents", "PlaylistDetails"))); } - override fun toPlaylist(): Playlist { - val videos = contents.getResults().toMutableList(); + override fun toPlaylist(onProgress: ((progress: Int) -> Unit)?): Playlist { + val playlist = if (contents is ReusablePager) contents.getWindow() else contents; + val videos = playlist.getResults().toMutableList(); + onProgress?.invoke(videos.size); //Download all pages var allowedEmptyCount = 2; - while(contents.hasMorePages()) { - contents.nextPage(); - if(!videos.addAll(contents.getResults())) { + while(playlist.hasMorePages()) { + playlist.nextPage(); + if(!videos.addAll(playlist.getResults())) { allowedEmptyCount--; if(allowedEmptyCount <= 0) break; } else allowedEmptyCount = 2; + + onProgress?.invoke(videos.size); } return Playlist(id.toString(), name, videos.map { SerializedPlatformVideo.fromVideo(it)}); diff --git a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/RemotePlaylistFragment.kt b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/RemotePlaylistFragment.kt index 84e06047..188aa5dd 100644 --- a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/RemotePlaylistFragment.kt +++ b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/RemotePlaylistFragment.kt @@ -24,11 +24,11 @@ import com.futo.platformplayer.api.media.platforms.js.models.JSPager import com.futo.platformplayer.api.media.structures.IAsyncPager import com.futo.platformplayer.api.media.structures.IPager import com.futo.platformplayer.api.media.structures.MultiPager +import com.futo.platformplayer.api.media.structures.ReusablePager import com.futo.platformplayer.constructs.TaskHandler import com.futo.platformplayer.fragment.mainactivity.topbar.NavigationTopBarFragment import com.futo.platformplayer.images.GlideHelper.Companion.crossfade import com.futo.platformplayer.logging.Logger -import com.futo.platformplayer.models.Playlist import com.futo.platformplayer.states.StateApp import com.futo.platformplayer.states.StatePlatform import com.futo.platformplayer.states.StatePlaylists @@ -66,6 +66,7 @@ class RemotePlaylistFragment : MainFragment() { private val _fragment: RemotePlaylistFragment; private var _remotePlaylist: IPlatformPlaylistDetails? = null; + private var _remotePlaylistPagerWindow: IPager? = null; private var _url: String? = null; private val _videos: ArrayList = arrayListOf(); @@ -103,9 +104,7 @@ class RemotePlaylistFragment : MainFragment() { val view = LayoutInflater.from(viewGroup.context).inflate(R.layout.list_playlist, viewGroup, false); val holder = VideoListEditorViewHolder(view, null); holder.onClick.subscribe { - showConvertConfirmationModal() { - _fragment.navigate(it); - } + showConvertConfirmationModal(); }; return@InsertedViewAdapterWithLoader holder; } @@ -129,14 +128,10 @@ class RemotePlaylistFragment : MainFragment() { }; buttonPlayAll.setOnClickListener { - showConvertConfirmationModal() { - _fragment.navigate(it); - } + showConvertConfirmationModal(); }; buttonShuffle.setOnClickListener { - showConvertConfirmationModal() { - _fragment.navigate(it); - } + showConvertConfirmationModal(); }; _taskLoadPlaylist = TaskHandler( @@ -146,8 +141,10 @@ class RemotePlaylistFragment : MainFragment() { }) .success { _remotePlaylist = it; + val c = it.contents; + _remotePlaylistPagerWindow = if (c is ReusablePager) c.getWindow() else c; setName(it.name); - setVideos(it.contents.getResults()); + setVideos(_remotePlaylistPagerWindow!!.getResults()); setVideoCount(it.videoCount); setLoading(false); } @@ -193,7 +190,7 @@ class RemotePlaylistFragment : MainFragment() { } private fun loadNextPage() { - val pager: IPager = _remotePlaylist?.contents ?: return; + val pager: IPager = _remotePlaylistPagerWindow ?: return; val hasMorePages = pager.hasMorePages(); Logger.i(TAG, "loadNextPage() hasMorePages=$hasMorePages, page size=${pager.getResults().size}"); @@ -256,7 +253,7 @@ class RemotePlaylistFragment : MainFragment() { } } - private fun showConvertConfirmationModal(onSuccess: ((playlist: Playlist) -> Unit)? = null) { + private fun showConvertConfirmationModal() { val remotePlaylist = _remotePlaylist; if (remotePlaylist == null) { UIDialogs.toast(context.getString(R.string.please_wait_for_playlist_to_finish_loading)); @@ -266,22 +263,30 @@ class RemotePlaylistFragment : MainFragment() { val c = context ?: return; UIDialogs.showConfirmationDialog(c, "Conversion to local playlist is required for this action", { setLoading(true); - StateApp.instance.scopeOrNull?.launch(Dispatchers.IO) { - try { - val playlist = remotePlaylist.toPlaylist(); - StatePlaylists.instance.playlistStore.save(playlist); - withContext(Dispatchers.Main) { - setLoading(false); - UIDialogs.toast(context.getString(R.string.playlist_copied_as_local_playlist)); - onSuccess?.invoke(playlist); - } - } catch (e: Throwable) { - withContext(Dispatchers.Main) { - setLoading(false); - } + UIDialogs.showDialogProgress(context) { + it.setText("Converting playlist.."); + it.setProgress(0f); - throw e; + _fragment.lifecycleScope.launch(Dispatchers.IO) { + try { + val playlist = remotePlaylist.toPlaylist() { progress -> + _fragment.lifecycleScope.launch(Dispatchers.Main) { + it.setProgress(progress.toDouble() / remotePlaylist.videoCount); + } + }; + + StatePlaylists.instance.playlistStore.save(playlist); + + withContext(Dispatchers.Main) { + UIDialogs.toast("Playlist converted"); + it.dismiss(); + _fragment.navigate(playlist); + } + } + catch(ex: Throwable) { + UIDialogs.appToast("Failed to convert playlist.\n" + ex.message); + } } } });