mirror of
https://gitlab.futo.org/videostreaming/grayjay.git
synced 2026-05-16 04:52:39 +02:00
Improved dl
This commit is contained in:
@@ -9,7 +9,9 @@ import com.arthenica.ffmpegkit.FFmpegKit
|
||||
import com.arthenica.ffmpegkit.ReturnCode
|
||||
import com.arthenica.ffmpegkit.StatisticsCallback
|
||||
import com.futo.platformplayer.Settings
|
||||
import com.futo.platformplayer.UIDialogs
|
||||
import com.futo.platformplayer.api.http.ManagedHttpClient
|
||||
import com.futo.platformplayer.api.media.IPlatformClient
|
||||
import com.futo.platformplayer.api.media.PlatformID
|
||||
import com.futo.platformplayer.api.media.models.modifier.IRequestModifier
|
||||
import com.futo.platformplayer.api.media.models.streams.VideoUnMuxedSourceDescriptor
|
||||
@@ -40,6 +42,8 @@ import com.futo.platformplayer.api.media.platforms.js.models.sources.JSDashManif
|
||||
import com.futo.platformplayer.api.media.platforms.js.models.sources.JSDashManifestRawSource
|
||||
import com.futo.platformplayer.api.media.platforms.js.models.sources.JSSource
|
||||
import com.futo.platformplayer.constructs.Event1
|
||||
import com.futo.platformplayer.engine.exceptions.ScriptException
|
||||
import com.futo.platformplayer.engine.exceptions.ScriptReloadRequiredException
|
||||
import com.futo.platformplayer.exceptions.DownloadException
|
||||
import com.futo.platformplayer.helpers.FileHelper.Companion.sanitizeFileName
|
||||
import com.futo.platformplayer.helpers.VideoHelper
|
||||
@@ -87,6 +91,9 @@ import kotlin.time.times
|
||||
class VideoDownload {
|
||||
var state: State = State.QUEUED;
|
||||
|
||||
@Contextual
|
||||
@Transient
|
||||
var plugin: IPlatformClient? = null;
|
||||
var video: SerializedPlatformVideo? = null;
|
||||
var videoDetails: SerializedPlatformVideoDetails? = null;
|
||||
|
||||
@@ -272,7 +279,7 @@ class VideoDownload {
|
||||
|
||||
//Fetch full video object and determine source
|
||||
if(video != null && videoDetails == null) {
|
||||
val original = StatePlatform.instance.getContentDetails(video!!.url).await();
|
||||
val original = if (plugin != null) plugin!!.getContentDetails(video!!.url) else StatePlatform.instance.getContentDetails(video!!.url)?.await();
|
||||
if(original !is IPlatformVideoDetails)
|
||||
throw IllegalStateException("Original content is not media?");
|
||||
|
||||
@@ -1007,6 +1014,15 @@ class VideoDownload {
|
||||
|
||||
Logger.i(TAG, "$name downloadSource Finished");
|
||||
}
|
||||
catch(scriptEx: ScriptReloadRequiredException) {
|
||||
if(targetFile.exists() ?: false)
|
||||
targetFile.delete();
|
||||
if(targetFileAudio?.exists() ?: false)
|
||||
targetFileAudio.delete();
|
||||
|
||||
createNewPluginClient();
|
||||
throw scriptEx;
|
||||
}
|
||||
catch(ioex: IOException) {
|
||||
if(targetFile.exists() ?: false)
|
||||
targetFile.delete();
|
||||
@@ -1033,6 +1049,24 @@ class VideoDownload {
|
||||
audioFileSize = sourceLengthAudio
|
||||
return sourceLength!!;
|
||||
}
|
||||
|
||||
fun createNewPluginClient() {
|
||||
UIDialogs.appToast("Download creating new client at request of plugin");
|
||||
cleanupPluginClient();
|
||||
plugin = (video?.url ?: videoDetails?.url)?.let { StatePlatform.instance.getContentClient(it) }?.let { if(it is JSClient) it else null }?.getCopy(false, true);
|
||||
plugin?.initialize();
|
||||
}
|
||||
fun cleanupPluginClient() {
|
||||
val oldPlugin = plugin;
|
||||
plugin = null;
|
||||
try {
|
||||
oldPlugin?.disable();
|
||||
}
|
||||
catch(ex: Throwable) {
|
||||
Logger.e(TAG, "Failed to dispose download client: ${ex.message}" , ex);
|
||||
}
|
||||
}
|
||||
|
||||
private fun downloadFileSource(name: String, client: ManagedHttpClient, source: JSSource?, videoUrl: String, targetFile: File, onProgress: (Long, Long, Long) -> Unit): Long {
|
||||
if(targetFile.exists())
|
||||
targetFile.delete();
|
||||
@@ -1457,6 +1491,10 @@ class VideoDownload {
|
||||
}
|
||||
}
|
||||
|
||||
fun cleanup(){
|
||||
cleanupPluginClient()
|
||||
}
|
||||
|
||||
enum class State {
|
||||
QUEUED,
|
||||
PREPARING,
|
||||
|
||||
@@ -15,6 +15,7 @@ import com.futo.platformplayer.Settings
|
||||
import com.futo.platformplayer.activities.MainActivity
|
||||
import com.futo.platformplayer.api.http.ManagedHttpClient
|
||||
import com.futo.platformplayer.downloads.VideoDownload
|
||||
import com.futo.platformplayer.engine.exceptions.ScriptReloadRequiredException
|
||||
import com.futo.platformplayer.exceptions.DownloadException
|
||||
import com.futo.platformplayer.getNowDiffMinutes
|
||||
import com.futo.platformplayer.logging.Logger
|
||||
@@ -169,6 +170,7 @@ class DownloadService : Service() {
|
||||
Thread.sleep(500);
|
||||
}
|
||||
catch(ex: Throwable) {
|
||||
if(ex is ScriptReloadRequiredException)
|
||||
Logger.e(TAG, "Download failed", ex);
|
||||
if(currentVideo.video == null && currentVideo.videoDetails == null) {
|
||||
//Corrupt?
|
||||
|
||||
@@ -179,6 +179,7 @@ class StateDownloads {
|
||||
|
||||
fun removeDownload(download: VideoDownload) {
|
||||
download.isCancelled = true;
|
||||
download.cleanup();
|
||||
_downloading.delete(download);
|
||||
onDownloadsChanged.emit();
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@ import com.futo.platformplayer.*
|
||||
import com.futo.platformplayer.downloads.VideoDownload
|
||||
import com.futo.platformplayer.images.GlideHelper.Companion.crossfade
|
||||
import com.futo.platformplayer.logging.Logger
|
||||
import com.futo.platformplayer.services.DownloadService
|
||||
import com.futo.platformplayer.states.StateDownloads
|
||||
import com.futo.platformplayer.views.others.ProgressBar
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
@@ -32,6 +33,7 @@ class ActiveDownloadItem: LinearLayout {
|
||||
private val _videoState: TextView;
|
||||
|
||||
private val _videoCancel: TextView;
|
||||
private val _videoRetry: TextView;
|
||||
|
||||
private val _scope: CoroutineScope;
|
||||
|
||||
@@ -51,13 +53,14 @@ class ActiveDownloadItem: LinearLayout {
|
||||
_videoSpeed = findViewById(R.id.download_video_speed);
|
||||
|
||||
_videoCancel = findViewById(R.id.download_cancel);
|
||||
_videoRetry = findViewById(R.id.download_retry);
|
||||
|
||||
_videoName.text = download.name;
|
||||
_videoDuration.text = download.videoEither.duration.toHumanTime(false);
|
||||
_videoAuthor.text = download.videoEither.author.name;
|
||||
|
||||
_videoState.setOnClickListener {
|
||||
UIDialogs.toast(context, _videoState.text.toString(), false);
|
||||
UIDialogs.appToast(_videoState.text.toString(), false);
|
||||
}
|
||||
|
||||
Glide.with(_videoImage)
|
||||
@@ -72,6 +75,12 @@ class ActiveDownloadItem: LinearLayout {
|
||||
StateDownloads.instance.removeDownload(_download);
|
||||
StateDownloads.instance.preventPlaylistDownload(_download);
|
||||
};
|
||||
_videoRetry.setOnClickListener {
|
||||
download.changeState(VideoDownload.State.QUEUED);
|
||||
DownloadService.getOrCreateService(context) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
_download.onProgressChanged.subscribe(this) {
|
||||
_scope.launch(Dispatchers.Main) {
|
||||
@@ -122,16 +131,19 @@ class ActiveDownloadItem: LinearLayout {
|
||||
VideoDownload.State.DOWNLOADING -> {
|
||||
_videoBar.visibility = VISIBLE;
|
||||
_videoSpeed.visibility = VISIBLE;
|
||||
_videoRetry.visibility = GONE;
|
||||
};
|
||||
VideoDownload.State.ERROR -> {
|
||||
_videoState.setTextColor(Color.RED);
|
||||
_videoState.text = _download.error ?: context.getString(R.string.error);
|
||||
_videoBar.visibility = GONE;
|
||||
_videoSpeed.visibility = GONE;
|
||||
_videoRetry.visibility = VISIBLE;
|
||||
}
|
||||
else -> {
|
||||
_videoBar.visibility = GONE;
|
||||
_videoSpeed.visibility = GONE;
|
||||
_videoRetry.visibility = GONE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -118,6 +118,21 @@
|
||||
android:ellipsize="end"
|
||||
android:layout_marginEnd="10dp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/downloaded_author"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="wrap_content"
|
||||
android:gravity="center_vertical"
|
||||
android:textSize="9dp"
|
||||
android:textColor="@color/gray_e0"
|
||||
android:fontFamily="@font/inter_extra_light"
|
||||
app:layout_constraintTop_toBottomOf="@id/downloaded_video_name"
|
||||
app:layout_constraintLeft_toLeftOf="parent"
|
||||
tools:text="ShortCircuit"
|
||||
android:maxLines="1"
|
||||
android:ellipsize="end"
|
||||
android:layout_marginStart="10dp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/download_cancel"
|
||||
android:layout_width="60dp"
|
||||
@@ -130,20 +145,20 @@
|
||||
android:background="@drawable/background_small_button"
|
||||
android:textAlignment="center"
|
||||
android:text="@string/cancel" />
|
||||
<TextView
|
||||
android:id="@+id/download_retry"
|
||||
android:layout_width="60dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="2dp"
|
||||
android:padding="2dp"
|
||||
android:visibility="gone"
|
||||
app:layout_constraintRight_toRightOf="@id/download_cancel"
|
||||
app:layout_constraintTop_toBottomOf="@id/download_cancel"
|
||||
android:textSize="10dp"
|
||||
android:background="@drawable/background_small_button"
|
||||
android:textAlignment="center"
|
||||
android:text="@string/retry" />
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/downloaded_author"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="wrap_content"
|
||||
android:gravity="center_vertical"
|
||||
android:textSize="9dp"
|
||||
android:textColor="@color/gray_e0"
|
||||
android:fontFamily="@font/inter_extra_light"
|
||||
tools:text="ShortCircuit"
|
||||
android:maxLines="1"
|
||||
android:ellipsize="end"
|
||||
android:layout_marginStart="10dp" />
|
||||
</LinearLayout>
|
||||
<LinearLayout
|
||||
android:layout_height="wrap_content"
|
||||
|
||||
Reference in New Issue
Block a user