diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 4e7d61b6..7339f8f2 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -56,4 +56,7 @@ #-keepnames class <1>$$serializer { # -keepnames suffices; class is kept when serializer() is kept. # static <1>$$serializer INSTANCE; #} --keepclassmembers enum * { *; } \ No newline at end of file +-keepclassmembers enum * { *; } +-keepclassmembers class * extends androidx.work.Worker { + public (android.content.Context,androidx.work.WorkerParameters); +} \ No newline at end of file diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/models/ChapterItem.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/models/ChapterItem.kt index aaa81e09..50560666 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/models/ChapterItem.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/models/ChapterItem.kt @@ -1,7 +1,12 @@ package com.deniscerri.ytdlnis.database.models +import com.google.gson.annotations.SerializedName + data class ChapterItem( + @SerializedName(value = "start_time") var start_time: Long, + @SerializedName(value = "end_time") var end_time: Long, + @SerializedName(value = "title") var title: String, ) \ No newline at end of file diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/TerminalActivity.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/TerminalActivity.kt index 64f99c6e..1dcb2a3e 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/TerminalActivity.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/TerminalActivity.kt @@ -1,19 +1,20 @@ package com.deniscerri.ytdlnis.ui.more import android.app.Activity +import android.content.ClipboardManager import android.content.Context import android.content.Intent import android.content.SharedPreferences +import android.os.Build import android.os.Bundle +import android.os.FileObserver import android.util.Log +import android.view.MenuItem import android.view.View import android.view.ViewGroup import android.view.Window import android.view.inputmethod.InputMethodManager -import android.widget.EditText -import android.widget.LinearLayout -import android.widget.ScrollView -import android.widget.TextView +import android.widget.* import androidx.appcompat.app.AppCompatActivity import androidx.constraintlayout.widget.ConstraintLayout import androidx.lifecycle.ViewModelProvider @@ -33,6 +34,7 @@ import com.yausername.youtubedl_android.YoutubeDL import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import java.io.File import kotlin.properties.Delegates @@ -47,6 +49,8 @@ class TerminalActivity : AppCompatActivity() { private lateinit var commandTemplateViewModel: CommandTemplateViewModel private lateinit var sharedPreferences: SharedPreferences private var downloadID by Delegates.notNull() + private lateinit var downloadFile : File + private lateinit var observer: FileObserver var context: Context? = null public override fun onCreate(savedInstanceState: Bundle?) { @@ -54,6 +58,8 @@ class TerminalActivity : AppCompatActivity() { setContentView(R.layout.activity_terminal) downloadID = System.currentTimeMillis().toInt() % 100000 + downloadFile = File(cacheDir.absolutePath + "/$downloadID.txt") + if (! downloadFile.exists()) downloadFile.createNewFile() context = baseContext scrollView = findViewById(R.id.custom_command_scrollview) @@ -84,6 +90,7 @@ class TerminalActivity : AppCompatActivity() { input!!.visibility = View.GONE output!!.text = "${output!!.text}\n~ $ ${input!!.text}\n" showCancelFab() + downloadFile.appendText("~ $ ${input!!.text}\n") startDownload( input!!.text.toString() ) @@ -96,6 +103,36 @@ class TerminalActivity : AppCompatActivity() { notificationUtil = NotificationUtil(this) handleIntent(intent) + if(Build.VERSION.SDK_INT < 29){ + observer = object : FileObserver(downloadFile.absolutePath, MODIFY) { + override fun onEvent(event: Int, p: String?) { + runOnUiThread{ + try { + val newText = downloadFile.readText() + output!!.text = newText + output!!.scrollTo(0, output!!.height) + scrollView!!.fullScroll(View.FOCUS_DOWN) + }catch (ignored: Exception) {} + } + } + } + observer.startWatching() + }else{ + observer = object : FileObserver(downloadFile, MODIFY) { + override fun onEvent(event: Int, p: String?) { + runOnUiThread{ + try { + val newText = downloadFile.readText() + output!!.text = newText + output!!.scrollTo(0, output!!.height) + scrollView!!.fullScroll(View.FOCUS_DOWN) + }catch (ignored: Exception) {} + } + } + } + observer.startWatching() + } + WorkManager.getInstance(this) .getWorkInfosForUniqueWorkLiveData(downloadID.toString()) .observe(this){ list -> @@ -106,16 +143,27 @@ class TerminalActivity : AppCompatActivity() { input!!.requestFocus() hideCancelFab() } - val line = work.progress.getString("output") ?: (work.outputData.getString("output") ?: return@observe) - runOnUiThread { - try { - output!!.text = "${output!!.text}\n$line" - output!!.scrollTo(0, output!!.height) - scrollView!!.fullScroll(View.FOCUS_DOWN) - }catch (ignored: Exception) {} - } } } + initMenu() + } + + private fun initMenu() { + topAppBar?.setOnMenuItemClickListener { m: MenuItem -> + val itemId = m.itemId + if (itemId == R.id.export_clipboard) { + lifecycleScope.launch(Dispatchers.IO){ + val clipboard: ClipboardManager = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager + clipboard.setText(output?.text) + } + } + true + } + } + + override fun onDestroy() { + downloadFile.delete() + super.onDestroy() } override fun onNewIntent(intent: Intent) { diff --git a/app/src/main/java/com/deniscerri/ytdlnis/work/TerminalDownloadWorker.kt b/app/src/main/java/com/deniscerri/ytdlnis/work/TerminalDownloadWorker.kt index fec492e3..92124c77 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/work/TerminalDownloadWorker.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/work/TerminalDownloadWorker.kt @@ -49,6 +49,9 @@ class TerminalDownloadWorker( tempFileDir.delete() tempFileDir.mkdirs() + val outputFile = File(context.cacheDir.absolutePath + "/$itemId.txt") + if (! outputFile.exists()) outputFile.createNewFile() + request.addOption( "--config-locations", File(context.cacheDir.absolutePath + "/downloads/config${System.currentTimeMillis()}.txt").apply { @@ -77,7 +80,7 @@ class TerminalDownloadWorker( } YoutubeDL.getInstance().execute(request, itemId.toString()){ progress, _, line -> - setProgressAsync(workDataOf("progress" to progress.toInt(), "output" to line, "id" to itemId, "log" to logDownloads)) + outputFile.appendText("${line}\n") val title: String = command.take(20) notificationUtil.updateDownloadNotification( itemId, @@ -103,20 +106,15 @@ class TerminalDownloadWorker( }, 1000) } - val chunks = it.out.chunked(5000) - val dataBuilder = Data.Builder(); - dataBuilder.putString("output", chunks[0]) - - - return Result.success( - dataBuilder.build() - ) - + outputFile.appendText("${it.out}\n") + if (logDownloads && logFile.exists()){ + logFile.appendText("${it.out}\n") + } }.onFailure { if (it is YoutubeDL.CanceledException) { return Result.failure() } - + outputFile.appendText("${it.message}\n") if (logDownloads && logFile.exists()){ logFile.appendText("${it.message}\n") } @@ -129,13 +127,7 @@ class TerminalDownloadWorker( NotificationUtil.DOWNLOAD_SERVICE_CHANNEL_ID ) - if (logDownloads && logFile.exists()){ - logFile.appendText("${it.message}\n") - } - - return Result.failure( - Data.Builder().putString("output", it.message.toString()).build() - ) + return Result.failure() } return Result.success() diff --git a/app/src/main/res/layout/activity_terminal.xml b/app/src/main/res/layout/activity_terminal.xml index 0eab9bca..7f5f022d 100644 --- a/app/src/main/res/layout/activity_terminal.xml +++ b/app/src/main/res/layout/activity_terminal.xml @@ -17,6 +17,7 @@ android:id="@+id/custom_command_toolbar" android:elevation="0dp" app:title="@string/terminal" + app:menu="@menu/terminal_top_menu" android:layout_width="match_parent" app:navigationIcon="@drawable/ic_back" android:layout_height="match_parent"/> diff --git a/app/src/main/res/menu/terminal_top_menu.xml b/app/src/main/res/menu/terminal_top_menu.xml new file mode 100644 index 00000000..660cf513 --- /dev/null +++ b/app/src/main/res/menu/terminal_top_menu.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file