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 @@ -