Skip to content
Snippets Groups Projects
Commit 486ebd6b authored by Kelvin's avatar Kelvin
Browse files

Merge branch 'master' of gitlab.futo.org:videostreaming/grayjay

parents 74b99266 2a6ba6d5
No related branches found
No related tags found
No related merge requests found
......@@ -8,5 +8,5 @@ interface IPlatformPlaylistDetails: IPlatformPlaylist {
//TODO: Determine if this should be IPlatformContent (probably not?)
val contents: IPager<IPlatformVideo>;
fun toPlaylist(): Playlist;
fun toPlaylist(onProgress: ((progress: Int) -> Unit)? = null): Playlist;
}
\ No newline at end of file
......@@ -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<IPlatformVideo>;
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)});
......
......@@ -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<IPlatformVideo>? = null;
private var _url: String? = null;
private val _videos: ArrayList<IPlatformVideo> = 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<PlaylistFragment>(it);
}
showConvertConfirmationModal();
};
return@InsertedViewAdapterWithLoader holder;
}
......@@ -129,14 +128,10 @@ class RemotePlaylistFragment : MainFragment() {
};
buttonPlayAll.setOnClickListener {
showConvertConfirmationModal() {
_fragment.navigate<PlaylistFragment>(it);
}
showConvertConfirmationModal();
};
buttonShuffle.setOnClickListener {
showConvertConfirmationModal() {
_fragment.navigate<PlaylistFragment>(it);
}
showConvertConfirmationModal();
};
_taskLoadPlaylist = TaskHandler<String, IPlatformPlaylistDetails>(
......@@ -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<IPlatformVideo> = _remotePlaylist?.contents ?: return;
val pager: IPager<IPlatformVideo> = _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);
UIDialogs.showDialogProgress(context) {
it.setText("Converting playlist..");
it.setProgress(0f);
_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<PlaylistFragment>(playlist);
}
}
} catch (e: Throwable) {
withContext(Dispatchers.Main) {
setLoading(false);
catch(ex: Throwable) {
UIDialogs.appToast("Failed to convert playlist.\n" + ex.message);
}
throw e;
}
}
});
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment