From 888dabc3522ea0a51d97646e0821a61329c322b0 Mon Sep 17 00:00:00 2001
From: deniscerri <64997243+deniscerri@users.noreply.github.com>
Date: Mon, 1 May 2023 12:51:22 +0200
Subject: [PATCH] crumbs
---
.idea/compiler.xml | 2 +-
.idea/misc.xml | 2 +-
app/build.gradle | 6 +--
app/proguard-rules.pro | 6 ++-
.../ytdlnis/database/dao/ResultDao.kt | 3 ++
.../downloadcard/CutVideoBottomSheetDialog.kt | 39 +++++++--------
.../downloadcard/DownloadBottomSheetDialog.kt | 2 +-
.../DownloadMultipleBottomSheetDialog.kt | 8 +---
.../ui/downloadcard/DownloadVideoFragment.kt | 6 ++-
.../SelectPlaylistItemsBottomSheetDialog.kt | 8 +---
.../ytdlnis/ui/downloads/HistoryFragment.kt | 1 +
.../ui/downloads/QueuedDownloadsFragment.kt | 13 ++---
.../com/deniscerri/ytdlnis/util/InfoUtil.kt | 48 ++++++++++++-------
.../com/deniscerri/ytdlnis/util/UiUtil.kt | 4 ++
.../deniscerri/ytdlnis/work/DownloadWorker.kt | 25 ++++++++--
.../ytdlnis/work/TerminalDownloadWorker.kt | 2 +-
app/src/main/res/layout/cut_video_sheet.xml | 2 +-
app/src/main/res/menu/terminal_menu.xml | 2 +-
app/src/main/res/values/arrays.xml | 5 +-
app/src/main/res/values/themes.xml | 3 --
app/src/main/res/xml/locales_config.xml | 1 +
gradle.properties | 3 ++
22 files changed, 115 insertions(+), 76 deletions(-)
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index fb7f4a8a..b589d56e 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -1,6 +1,6 @@
-
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index f3d02381..f5db0c53 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,5 +1,5 @@
-
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 16ff8aad..45169e9c 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -97,12 +97,12 @@ android {
}
compileOptions {
- sourceCompatibility JavaVersion.VERSION_11
- targetCompatibility JavaVersion.VERSION_11
+ sourceCompatibility JavaVersion.VERSION_17
+ targetCompatibility JavaVersion.VERSION_17
}
kotlinOptions {
- jvmTarget = '11'
+ jvmTarget = '17'
}
splits {
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
index b16d7626..79905da3 100644
--- a/app/proguard-rules.pro
+++ b/app/proguard-rules.pro
@@ -61,4 +61,8 @@
public (android.content.Context,androidx.work.WorkerParameters);
}
--dontobfuscate
\ No newline at end of file
+-dontobfuscate
+-dontwarn com.google.android.exoplayer2.**
+# Retain generic signatures of TypeToken and its subclasses with R8 version 3.0 and higher.
+-keep,allowobfuscation,allowshrinking class com.google.gson.reflect.TypeToken
+-keep,allowobfuscation,allowshrinking class * extends com.google.gson.reflect.TypeToken
\ No newline at end of file
diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/dao/ResultDao.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/dao/ResultDao.kt
index 22df2c74..66b4a861 100644
--- a/app/src/main/java/com/deniscerri/ytdlnis/database/dao/ResultDao.kt
+++ b/app/src/main/java/com/deniscerri/ytdlnis/database/dao/ResultDao.kt
@@ -12,6 +12,9 @@ interface ResultDao {
@Query("SELECT COUNT(id) FROM results")
fun getCount() : LiveData
+ @Query("SELECT COUNT(id) FROM results")
+ fun getCountInt() :Int
+
@Query("SELECT * FROM results LIMIT 1")
fun getFirstResult() : ResultItem
diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/CutVideoBottomSheetDialog.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/CutVideoBottomSheetDialog.kt
index 98a716be..8d77d8c4 100644
--- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/CutVideoBottomSheetDialog.kt
+++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/CutVideoBottomSheetDialog.kt
@@ -33,7 +33,7 @@ import com.google.android.exoplayer2.source.DefaultMediaSourceFactory
import com.google.android.exoplayer2.source.MediaSource
import com.google.android.exoplayer2.source.MergingMediaSource
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector
-import com.google.android.exoplayer2.ui.PlayerView
+import com.google.android.exoplayer2.ui.StyledPlayerView
import com.google.android.exoplayer2.util.MimeTypes
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
@@ -96,7 +96,7 @@ class CutVideoBottomSheetDialog(private val item: DownloadItem, private val list
}
- @SuppressLint("RestrictedApi")
+ @SuppressLint("RestrictedApi", "SetTextI18n")
override fun setupDialog(dialog: Dialog, style: Int) {
super.setupDialog(dialog, style)
val view = LayoutInflater.from(context).inflate(R.layout.cut_video_sheet, null)
@@ -106,14 +106,14 @@ class CutVideoBottomSheetDialog(private val item: DownloadItem, private val list
behavior = BottomSheetBehavior.from(view.parent as View)
val displayMetrics = DisplayMetrics()
requireActivity().windowManager.defaultDisplay.getMetrics(displayMetrics)
- behavior.peekHeight = displayMetrics.heightPixels / 2
+ behavior.peekHeight = displayMetrics.heightPixels
}
val renderersFactory = DefaultRenderersFactory(requireContext().applicationContext)
.setEnableDecoderFallback(true)
.setExtensionRendererMode(EXTENSION_RENDERER_MODE_PREFER)
.setMediaCodecSelector { mimeType, requiresSecureDecoder, requiresTunnelingDecoder ->
- var decoderInfos: MutableList =
+ var decoderInfo: MutableList =
MediaCodecSelector.DEFAULT
.getDecoderInfos(
mimeType,
@@ -122,13 +122,13 @@ class CutVideoBottomSheetDialog(private val item: DownloadItem, private val list
)
if (MimeTypes.VIDEO_H264 == mimeType) {
// copy the list because MediaCodecSelector.DEFAULT returns an unmodifiable list
- decoderInfos = ArrayList(decoderInfos)
- decoderInfos.reverse()
+ decoderInfo = ArrayList(decoderInfo)
+ decoderInfo.reverse()
}
- decoderInfos
+ decoderInfo
}
- val trackSelector = DefaultTrackSelector()
+ val trackSelector = DefaultTrackSelector(requireContext())
val loadControl = DefaultLoadControl()
player = ExoPlayer.Builder(requireContext(), renderersFactory)
@@ -136,7 +136,7 @@ class CutVideoBottomSheetDialog(private val item: DownloadItem, private val list
.setLoadControl(loadControl)
.build()
val frame = view.findViewById(R.id.frame_layout)
- val videoView = view.findViewById(R.id.video_view)
+ val videoView = view.findViewById(R.id.video_view)
videoView.player = player
timeSeconds = convertStringToTimestamp(item.duration)
chapters = emptyList()
@@ -207,9 +207,9 @@ class CutVideoBottomSheetDialog(private val item: DownloadItem, private val list
progress.visibility = View.GONE
populateSuggestedChapters()
- player.prepare()
- player.seekTo((((rangeSlider.valueFrom.toInt() * timeSeconds) / 100) * 1000).toLong())
- player.play()
+ player.prepare().apply {
+ player.play()
+ }
}catch (e: Exception){
progress.visibility = View.GONE
frame.visibility = View.GONE
@@ -253,11 +253,12 @@ class CutVideoBottomSheetDialog(private val item: DownloadItem, private val list
}
+ @SuppressLint("SetTextI18n")
private fun initCutSection(){
fromTextInput.editText!!.setText("0:00")
toTextInput.editText!!.setText(item.duration)
- rangeSlider.addOnChangeListener { rangeSlider, value, fromUser ->
+ rangeSlider.addOnChangeListener { rangeSlider, _, _ ->
val values = rangeSlider.values
val startTimestamp = (values[0].toInt() * timeSeconds) / 100
val endTimestamp = (values[1].toInt() * timeSeconds) / 100
@@ -304,9 +305,9 @@ class CutVideoBottomSheetDialog(private val item: DownloadItem, private val list
val startValueTimeStampSeconds = (startValue.toInt() * timeSeconds) / 100
fromTextInput.editText!!.setText(infoUtil.formatIntegerDuration(startValueTimeStampSeconds, Locale.US))
- return true;
+ return true
}
- return false;
+ return false
}
})
@@ -336,9 +337,9 @@ class CutVideoBottomSheetDialog(private val item: DownloadItem, private val list
val endValueTimeStampSeconds = (endValue.toInt() * timeSeconds) / 100
toTextInput.editText!!.setText(infoUtil.formatIntegerDuration(endValueTimeStampSeconds, Locale.US))
- return true;
+ return true
}
- return false;
+ return false
}
})
@@ -409,7 +410,7 @@ class CutVideoBottomSheetDialog(private val item: DownloadItem, private val list
if (item.downloadSections.isNotBlank()){
chipGroup.removeAllViews()
- item.downloadSections.split(";").forEachIndexed { index, it ->
+ item.downloadSections.split(";").forEachIndexed { _, it ->
if (it.isBlank()) return
if (it.contains(":")) createChip(it.replace(";", ""))
else createChapterChip(ChapterItem(0, 0, it), null)
@@ -436,7 +437,7 @@ class CutVideoBottomSheetDialog(private val item: DownloadItem, private val list
if (chip.isChecked) {
rangeSlider.setValues(startingValue.toFloat(), endingValue.toFloat())
player.prepare()
- player.seekTo((((startingValue * timeSeconds) / 100) * 1000).toLong())
+ player.seekTo((startTimestamp * 1000).toLong())
player.play()
}else {
player.seekTo(0)
diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadBottomSheetDialog.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadBottomSheetDialog.kt
index 0068b7db..553214d3 100644
--- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadBottomSheetDialog.kt
+++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadBottomSheetDialog.kt
@@ -71,7 +71,7 @@ class DownloadBottomSheetDialog(private val resultItem: ResultItem, private val
behavior = BottomSheetBehavior.from(view.parent as View)
val displayMetrics = DisplayMetrics()
requireActivity().windowManager.defaultDisplay.getMetrics(displayMetrics)
- behavior.peekHeight = displayMetrics.heightPixels
+ behavior.state = BottomSheetBehavior.STATE_EXPANDED
}
diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadMultipleBottomSheetDialog.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadMultipleBottomSheetDialog.kt
index e8589c93..85f4162a 100644
--- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadMultipleBottomSheetDialog.kt
+++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadMultipleBottomSheetDialog.kt
@@ -69,12 +69,6 @@ class DownloadMultipleBottomSheetDialog(private var results: List,
uiUtil = UiUtil(fileUtil)
}
- override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
- super.onViewCreated(view, savedInstanceState)
- val behavior = BottomSheetBehavior.from(view.parent as View)
- behavior.state = BottomSheetBehavior.STATE_EXPANDED
- }
-
@SuppressLint("RestrictedApi", "NotifyDataSetChanged")
override fun setupDialog(dialog: Dialog, style: Int) {
super.setupDialog(dialog, style)
@@ -85,7 +79,7 @@ class DownloadMultipleBottomSheetDialog(private var results: List,
behavior = BottomSheetBehavior.from(view.parent as View)
val displayMetrics = DisplayMetrics()
requireActivity().windowManager.defaultDisplay.getMetrics(displayMetrics)
- behavior.peekHeight = displayMetrics.heightPixels / 2
+ behavior.state = BottomSheetBehavior.STATE_EXPANDED
}
listAdapter =
diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadVideoFragment.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadVideoFragment.kt
index ec5fbfd7..7f244cf3 100644
--- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadVideoFragment.kt
+++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadVideoFragment.kt
@@ -178,8 +178,10 @@ class DownloadVideoFragment(private val resultItem: ResultItem, private var curr
containers
)
)
- downloadItem.format.container = containerPreference!!
- containerAutoCompleteTextView!!.setText(downloadItem.format.container, false)
+ downloadItem.format.container = if (containerPreference == getString(R.string.defaultValue)) "" else containerPreference!!
+ containerAutoCompleteTextView!!.setText(
+ downloadItem.format.container.ifEmpty { getString(R.string.defaultValue) },
+ false)
(container!!.editText as AutoCompleteTextView?)!!.onItemClickListener =
AdapterView.OnItemClickListener { _: AdapterView<*>?, _: View?, index: Int, _: Long ->
diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/SelectPlaylistItemsBottomSheetDialog.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/SelectPlaylistItemsBottomSheetDialog.kt
index d56495b2..c06d0934 100644
--- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/SelectPlaylistItemsBottomSheetDialog.kt
+++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/SelectPlaylistItemsBottomSheetDialog.kt
@@ -45,12 +45,6 @@ class SelectPlaylistItemsBottomSheetDialog(private val items: List,
resultViewModel = ViewModelProvider(this)[ResultViewModel::class.java]
}
- override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
- super.onViewCreated(view, savedInstanceState)
- val behavior = BottomSheetBehavior.from(view.parent as View)
- behavior.state = BottomSheetBehavior.STATE_EXPANDED
- }
-
@SuppressLint("RestrictedApi")
override fun setupDialog(dialog: Dialog, style: Int) {
super.setupDialog(dialog, style)
@@ -61,7 +55,7 @@ class SelectPlaylistItemsBottomSheetDialog(private val items: List,
behavior = BottomSheetBehavior.from(view.parent as View)
val displayMetrics = DisplayMetrics()
requireActivity().windowManager.defaultDisplay.getMetrics(displayMetrics)
- behavior.peekHeight = displayMetrics.heightPixels / 2
+ behavior.state = BottomSheetBehavior.STATE_EXPANDED
}
listAdapter =
diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/HistoryFragment.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/HistoryFragment.kt
index 64b2dbc3..04d69a9a 100644
--- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/HistoryFragment.kt
+++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/HistoryFragment.kt
@@ -358,6 +358,7 @@ class HistoryFragment : Fragment(), HistoryAdapter.OnItemClickListener{
//val websites = historyRecyclerViewAdapter!!.websites
for (i in websites.indices) {
val w = websites[i]
+ if (w == "null" || w.isEmpty()) continue
val tmp = layoutinflater!!.inflate(R.layout.filter_chip, websiteGroup, false) as Chip
tmp.text = w
tmp.id = i
diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/QueuedDownloadsFragment.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/QueuedDownloadsFragment.kt
index ca97bd6b..a55de492 100644
--- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/QueuedDownloadsFragment.kt
+++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/QueuedDownloadsFragment.kt
@@ -256,6 +256,13 @@ class QueuedDownloadsFragment : Fragment(), GenericDownloadAdapter.OnItemClickLi
WorkManager.getInstance(requireContext()).cancelUniqueWork(id.toString())
notificationUtil.cancelDownloadNotification(id)
downloadViewModel.deleteDownload(item!!)
+
+ Snackbar.make(queuedRecyclerView, getString(R.string.cancelled) + ": " + item.title, Snackbar.LENGTH_LONG)
+ .setAction(getString(R.string.undo)) {
+ lifecycleScope.launch(Dispatchers.IO) {
+ downloadViewModel.queueDownloads(listOf(item))
+ }
+ }.show()
}
deleteDialog.show()
}
@@ -273,12 +280,6 @@ class QueuedDownloadsFragment : Fragment(), GenericDownloadAdapter.OnItemClickLi
ItemTouchHelper.LEFT -> {
val deletedItem = items[position]
removeItem(deletedItem.id)
- Snackbar.make(queuedRecyclerView, getString(R.string.cancelled) + ": " + deletedItem.title, Snackbar.LENGTH_LONG)
- .setAction(getString(R.string.undo)) {
- lifecycleScope.launch(Dispatchers.IO) {
- downloadViewModel.queueDownloads(listOf(deletedItem))
- }
- }.show()
}
}
diff --git a/app/src/main/java/com/deniscerri/ytdlnis/util/InfoUtil.kt b/app/src/main/java/com/deniscerri/ytdlnis/util/InfoUtil.kt
index 97792aaf..31dc190c 100644
--- a/app/src/main/java/com/deniscerri/ytdlnis/util/InfoUtil.kt
+++ b/app/src/main/java/com/deniscerri/ytdlnis/util/InfoUtil.kt
@@ -7,16 +7,11 @@ import android.os.Looper
import android.util.Log
import android.widget.Toast
import com.deniscerri.ytdlnis.R
-import com.deniscerri.ytdlnis.database.models.DownloadItem
import com.deniscerri.ytdlnis.database.models.Format
import com.deniscerri.ytdlnis.database.models.ResultItem
import com.google.gson.Gson
-import com.google.gson.JsonArray
-import com.google.gson.JsonObject
-import com.google.gson.reflect.TypeToken
import com.yausername.youtubedl_android.YoutubeDL
import com.yausername.youtubedl_android.YoutubeDLRequest
-import kotlinx.serialization.json.Json
import org.json.JSONArray
import org.json.JSONException
import org.json.JSONObject
@@ -137,7 +132,7 @@ class InfoUtil(private val context: Context) {
"thumb",
element.getJSONArray("videoThumbnails").getJSONObject(0).getString("url")
)
- val v = createVideofromInvidiousJSON(element)
+ val v = createVideoFromInvidiousJSON(element)
if (v == null || v.thumb.isEmpty()) {
continue
}
@@ -225,7 +220,7 @@ class InfoUtil(private val context: Context) {
val vids = res.getJSONArray("videos")
for (i in 0 until vids.length()) {
val element = vids.getJSONObject(i)
- val v = createVideofromInvidiousJSON(element)
+ val v = createVideoFromInvidiousJSON(element)
if (v == null || v.thumb.isEmpty()) continue
v.playlistTitle = res.getString("title")
items.add(v)
@@ -243,7 +238,7 @@ class InfoUtil(private val context: Context) {
if (key!!.isEmpty()) {
return if (useInvidous) {
val res = genericRequest(invidousURL + "videos/" + id)
- if (res.length() == 0) getFromYTDL("https://www.youtube.com/watch?v=$id")[0] else createVideofromInvidiousJSON(
+ if (res.length() == 0) getFromYTDL("https://www.youtube.com/watch?v=$id")[0] else createVideoFromInvidiousJSON(
res
)
} else {
@@ -293,7 +288,7 @@ class InfoUtil(private val context: Context) {
return video
}
- private fun createVideofromInvidiousJSON(obj: JSONObject): ResultItem? {
+ private fun createVideoFromInvidiousJSON(obj: JSONObject): ResultItem? {
var video: ResultItem? = null
try {
val id = obj.getString("videoId")
@@ -476,7 +471,7 @@ class InfoUtil(private val context: Context) {
for (i in 0 until res.length()) {
val element = res.getJSONObject(i)
if (element.getString("type") != "video") continue
- val v = createVideofromInvidiousJSON(element)
+ val v = createVideoFromInvidiousJSON(element)
if (v == null || v.thumb.isEmpty()) continue
v.playlistTitle = context.getString(R.string.trendingPlaylist)
items.add(v)
@@ -513,7 +508,7 @@ class InfoUtil(private val context: Context) {
val id = getIDFromYoutubeURL(url)
val res = genericRequest(invidousURL + "videos/" + id)
if (res.length() == 0) getFromYTDL(url)[0]!!
- else createVideofromInvidiousJSON(
+ else createVideoFromInvidiousJSON(
res
)!!
}else{
@@ -691,8 +686,29 @@ class InfoUtil(private val context: Context) {
val youtubeDLResponse = YoutubeDL.getInstance().execute(request)
val jsonObject = JSONObject(youtubeDLResponse.out)
- val thumbs = jsonObject.getJSONArray("thumbnails")
- val thumb = thumbs.getJSONObject(thumbs.length() - 1).getString("url")
+
+ var author: String? = ""
+ if (jsonObject.has("uploader")) {
+ author = jsonObject.getString("uploader")
+ }
+
+ var duration = ""
+ runCatching {
+ if (jsonObject.has("duration")) {
+ duration = formatIntegerDuration(jsonObject.getInt("duration"), Locale.getDefault())
+ }
+ }
+
+ var thumb: String? = ""
+ if (jsonObject.has("thumbnail")) {
+ thumb = jsonObject.getString("thumbnail")
+ } else if (jsonObject.has("thumbnails")) {
+ val thumbs = jsonObject.getJSONArray("thumbnails")
+ if (thumbs.length() > 0){
+ thumb = thumbs.getJSONObject(thumbs.length() - 1).getString("url")
+ }
+ }
+
val isPlaylist = jsonObject.has("playlist_count")
return ResultItem(
0,
@@ -702,9 +718,9 @@ class InfoUtil(private val context: Context) {
}else{
jsonObject.getString("title")
},
- jsonObject.getString("uploader"),
- if (jsonObject.has("duration")) formatIntegerDuration(jsonObject.getInt("duration"), Locale.US) else "",
- thumb,
+ author!!,
+ duration,
+ thumb!!,
jsonObject.getString("extractor"),
if (isPlaylist) jsonObject.getString("title") else "",
arrayListOf(),
diff --git a/app/src/main/java/com/deniscerri/ytdlnis/util/UiUtil.kt b/app/src/main/java/com/deniscerri/ytdlnis/util/UiUtil.kt
index e98f8845..789c2b32 100644
--- a/app/src/main/java/com/deniscerri/ytdlnis/util/UiUtil.kt
+++ b/app/src/main/java/com/deniscerri/ytdlnis/util/UiUtil.kt
@@ -8,6 +8,7 @@ import android.content.Intent
import android.net.Uri
import android.text.Editable
import android.text.TextWatcher
+import android.util.DisplayMetrics
import android.util.Log
import android.view.View
import android.view.ViewGroup
@@ -28,6 +29,7 @@ import com.deniscerri.ytdlnis.database.models.CommandTemplate
import com.deniscerri.ytdlnis.database.models.Format
import com.deniscerri.ytdlnis.database.models.TemplateShortcut
import com.deniscerri.ytdlnis.database.viewmodel.CommandTemplateViewModel
+import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog
import com.google.android.material.chip.Chip
import com.google.android.material.chip.ChipGroup
@@ -154,6 +156,7 @@ class UiUtil(private val fileUtil: FileUtil) {
}
bottomSheet.show()
+ bottomSheet.behavior.state = BottomSheetBehavior.STATE_EXPANDED
bottomSheet.window!!.setLayout(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT
@@ -195,6 +198,7 @@ class UiUtil(private val fileUtil: FileUtil) {
}
bottomSheet.show()
+ bottomSheet.behavior.state = BottomSheetBehavior.STATE_EXPANDED
bottomSheet.window!!.setLayout(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT
diff --git a/app/src/main/java/com/deniscerri/ytdlnis/work/DownloadWorker.kt b/app/src/main/java/com/deniscerri/ytdlnis/work/DownloadWorker.kt
index 8b907b1d..2d13d9b2 100644
--- a/app/src/main/java/com/deniscerri/ytdlnis/work/DownloadWorker.kt
+++ b/app/src/main/java/com/deniscerri/ytdlnis/work/DownloadWorker.kt
@@ -23,6 +23,8 @@ import com.deniscerri.ytdlnis.util.NotificationUtil
import com.yausername.youtubedl_android.YoutubeDL
import com.yausername.youtubedl_android.YoutubeDLRequest
import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.async
+import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext
import java.io.File
@@ -45,6 +47,7 @@ class DownloadWorker(
val dao = dbManager.downloadDao
val repository = DownloadRepository(dao)
val historyDao = dbManager.historyDao
+ val resultDao = dbManager.resultDao
val handler = Handler(Looper.getMainLooper())
@@ -152,7 +155,7 @@ class DownloadWorker(
else if (audioQualityId == context.getString(R.string.worst_quality)) audioQualityId = "worstaudio"
val ext = downloadItem.format.container
- if (audioQualityId.isBlank() || ext == "Default" || ext == context.getString(R.string.defaultValue)) request.addOption("-x")
+ if (audioQualityId.isBlank()) request.addOption("-x")
else request.addOption("-f", audioQualityId)
if(ext != "webm"){
@@ -224,7 +227,7 @@ class DownloadWorker(
Log.e(TAG, formatArgument)
request.addOption("-f", formatArgument)
val format = downloadItem.format.container
- if(format.isNotEmpty() && format != "Default" && format != context.getString(R.string.defaultValue)){
+ if(format.isNotEmpty()){
request.addOption("--merge-output-format", format)
if (format != "webm") {
val embedThumb = sharedPreferences.getBoolean("embed_thumbnail", false)
@@ -267,7 +270,7 @@ class DownloadWorker(
}
}
-
+ var wasQuickDownloaded = false
//update item if its incomplete
if (downloadItem.title.isEmpty() || downloadItem.author.isEmpty() || downloadItem.thumb.isEmpty()){
runCatching {
@@ -275,10 +278,11 @@ class DownloadWorker(
val info = infoUtil.getMissingInfo(downloadItem.url)
if (downloadItem.title.isEmpty()) downloadItem.title = info?.title.toString()
if (downloadItem.author.isEmpty()) downloadItem.author = info?.author.toString()
- if (downloadItem.thumb.isEmpty()) downloadItem.thumb = info?.thumb.toString()
downloadItem.duration = info?.duration.toString()
downloadItem.website = info?.website.toString()
+ if (downloadItem.thumb.isEmpty()) downloadItem.thumb = info?.thumb.toString()
runBlocking {
+ wasQuickDownloaded = resultDao.getCountInt() == 0
dao.update(downloadItem)
}
}
@@ -345,6 +349,19 @@ class DownloadWorker(
NotificationUtil.DOWNLOAD_FINISHED_CHANNEL_ID
)
+ if (wasQuickDownloaded){
+ runCatching {
+ setProgressAsync(workDataOf("progress" to 100, "output" to "Creating Result Items", "id" to downloadItem.id, "log" to false))
+ runBlocking {
+ infoUtil.getFromYTDL(downloadItem.url).forEach { res ->
+ if (res != null) {
+ resultDao.insert(res)
+ }
+ }
+ }
+ }
+ }
+
runBlocking {
dao.delete(downloadItem.id)
}
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 9bd7e37d..75b3f307 100644
--- a/app/src/main/java/com/deniscerri/ytdlnis/work/TerminalDownloadWorker.kt
+++ b/app/src/main/java/com/deniscerri/ytdlnis/work/TerminalDownloadWorker.kt
@@ -64,7 +64,7 @@ class TerminalDownloadWorker(
request.addOption("--cookies", cookiesFile.absolutePath)
}
- if (!command.contains("-P ")) request.addOption("-P", tempFileDir.absolutePath)
+ request.addOption("-P", tempFileDir.absolutePath)
val logDownloads = sharedPreferences.getBoolean("log_downloads", false) && !sharedPreferences.getBoolean("incognito", false)
val logFolder = File(context.filesDir.absolutePath + "/logs")
diff --git a/app/src/main/res/layout/cut_video_sheet.xml b/app/src/main/res/layout/cut_video_sheet.xml
index 278c2798..cef5dd6f 100644
--- a/app/src/main/res/layout/cut_video_sheet.xml
+++ b/app/src/main/res/layout/cut_video_sheet.xml
@@ -15,7 +15,7 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" >
-
+ app:showAsAction="ifRoom"/>
\ No newline at end of file
diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml
index d600d155..48e224bf 100644
--- a/app/src/main/res/values/arrays.xml
+++ b/app/src/main/res/values/arrays.xml
@@ -11,7 +11,7 @@
- - Default
+
- mp3
- m4a
- aac
@@ -29,7 +29,7 @@
- - Default
+
- mp4
- mkv
- webm
@@ -96,6 +96,7 @@
- tr
- uk
- vi
+ - zh
diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml
index 39da5896..6dcb9e81 100644
--- a/app/src/main/res/values/themes.xml
+++ b/app/src/main/res/values/themes.xml
@@ -1,11 +1,8 @@
-