From 81a47c3407cdb24906aacecfb3f772289bd8306a Mon Sep 17 00:00:00 2001 From: deniscerri <64997243+deniscerri@users.noreply.github.com> Date: Tue, 18 Apr 2023 23:12:30 +0200 Subject: [PATCH] implemented fetching common formats for a playlist (WIP) --- .../database/viewmodel/DownloadViewModel.kt | 41 +++++-- .../ConfigureDownloadBottomSheetDialog.kt | 15 +-- .../downloadcard/CutVideoBottomSheetDialog.kt | 8 +- .../ui/downloadcard/DownloadAudioFragment.kt | 26 ++--- .../downloadcard/DownloadBottomSheetDialog.kt | 22 ++-- .../DownloadMultipleBottomSheetDialog.kt | 108 ++++++++++------- .../ui/downloadcard/DownloadVideoFragment.kt | 26 ++--- .../FormatSelectionBottomSheetDialog.kt | 109 +++++++++++++++--- .../SelectPlaylistItemsBottomSheetDialog.kt | 8 +- .../downloads/CancelledDownloadsFragment.kt | 1 + .../ui/downloads/ErroredDownloadsFragment.kt | 1 + .../ytdlnis/ui/downloads/HistoryFragment.kt | 1 + .../ui/downloads/QueuedDownloadsFragment.kt | 1 + .../ytdlnis/ui/more/TerminalActivity.kt | 51 +++----- .../com/deniscerri/ytdlnis/util/InfoUtil.kt | 40 ++++--- .../com/deniscerri/ytdlnis/util/UiUtil.kt | 34 ++++++ .../deniscerri/ytdlnis/work/DownloadWorker.kt | 2 +- app/src/main/res/values/strings.xml | 1 + 18 files changed, 320 insertions(+), 175 deletions(-) diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/DownloadViewModel.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/DownloadViewModel.kt index 7182a340..ddde87e6 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/DownloadViewModel.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/DownloadViewModel.kt @@ -4,6 +4,7 @@ import android.app.Activity import android.app.Application import android.content.Context import android.content.SharedPreferences +import android.content.res.Resources import android.net.ConnectivityManager import android.widget.Toast import androidx.lifecycle.AndroidViewModel @@ -24,7 +25,7 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import java.util.concurrent.TimeUnit -class DownloadViewModel(application: Application) : AndroidViewModel(application) { +class DownloadViewModel(private val application: Application) : AndroidViewModel(application) { private val repository : DownloadRepository private val sharedPreferences: SharedPreferences private val commandTemplateDao: CommandTemplateDao @@ -213,19 +214,39 @@ class DownloadViewModel(application: Application) : AndroidViewModel(application } else -> { val c = commandTemplateDao.getFirst() - return Format( - c.title, - "", - "", - "", - "", - 0, - c.content.replace("\n", " ") - ) + return generateCommandFormat(c) } } } + fun generateCommandFormat(c: CommandTemplate) : Format { + return Format( + c.title, + "", + "", + "", + "", + 0, + c.content.replace("\n", " ") + ) + } + + fun getGenericAudioFormats() : MutableList{ + val audioFormats = application.resources.getStringArray(R.array.audio_formats) + val formats = mutableListOf() + val containerPreference = sharedPreferences.getString("audio_format", "Default") + audioFormats.forEach { formats.add(Format(it, containerPreference!!,"","", "",0, it)) } + return formats + } + + fun getGenericVideoFormats() : MutableList{ + val videoFormats = application.resources.getStringArray(R.array.video_formats) + val formats = mutableListOf() + val containerPreference = sharedPreferences.getString("video_format", "Default") + videoFormats.forEach { formats.add(Format(it, containerPreference!!,"","", "",0, it)) } + return formats + } + fun getLatestCommandTemplateAsFormat() : Format { val t = commandTemplateDao.getFirst() return Format(t.title, "", "", "", "", 0, t.content) diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/ConfigureDownloadBottomSheetDialog.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/ConfigureDownloadBottomSheetDialog.kt index 33f4bd74..6bea2317 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/ConfigureDownloadBottomSheetDialog.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/ConfigureDownloadBottomSheetDialog.kt @@ -45,7 +45,6 @@ class ConfigureDownloadBottomSheetDialog(private val resultItem: ResultItem, pri private lateinit var onDownloadItemUpdateListener: OnDownloadItemUpdateListener private lateinit var uiUtil: UiUtil - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) downloadViewModel = ViewModelProvider(this)[DownloadViewModel::class.java] @@ -71,7 +70,7 @@ class ConfigureDownloadBottomSheetDialog(private val resultItem: ResultItem, pri behavior = BottomSheetBehavior.from(view.parent as View) val displayMetrics = DisplayMetrics() requireActivity().windowManager.defaultDisplay.getMetrics(displayMetrics) - behavior.peekHeight = displayMetrics.heightPixels - 700 + behavior.peekHeight = displayMetrics.heightPixels - 400 } tabLayout = view.findViewById(R.id.download_tablayout) @@ -82,7 +81,7 @@ class ConfigureDownloadBottomSheetDialog(private val resultItem: ResultItem, pri overScrollMode = View.OVER_SCROLL_NEVER } - val fragments = mutableListOf(DownloadAudioFragment(resultItem, downloadItem), DownloadVideoFragment(resultItem, downloadItem)) + val fragments = mutableListOf(DownloadAudioFragment(resultItem, downloadItem), DownloadVideoFragment(resultItem, downloadItem)) var commandTemplateNr = 0 lifecycleScope.launch{ withContext(Dispatchers.IO){ @@ -211,10 +210,12 @@ class ConfigureDownloadBottomSheetDialog(private val resultItem: ResultItem, pri // } private fun cleanUp(){ - parentFragmentManager.beginTransaction().remove(parentFragmentManager.findFragmentByTag("configureDownloadSingleSheet")!!).commit() - for (i in 0 until viewPager2.adapter?.itemCount!!){ - if (parentFragmentManager.findFragmentByTag("f${i}") != null){ - parentFragmentManager.beginTransaction().remove(parentFragmentManager.findFragmentByTag("f$i")!!).commit() + kotlin.runCatching { + parentFragmentManager.beginTransaction().remove(parentFragmentManager.findFragmentByTag("configureDownloadSingleSheet")!!).commit() + for (i in 0 until viewPager2.adapter?.itemCount!!){ + if (parentFragmentManager.findFragmentByTag("f${i}") != null){ + parentFragmentManager.beginTransaction().remove(parentFragmentManager.findFragmentByTag("f$i")!!).commit() + } } } } 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 5cab16d6..49f3e5de 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 @@ -570,9 +570,11 @@ class CutVideoBottomSheetDialog(private val item: DownloadItem, private val list private fun cleanUp(){ - player.stop() - cache.release() - parentFragmentManager.beginTransaction().remove(parentFragmentManager.findFragmentByTag("cutVideoSheet")!!).commit() + kotlin.runCatching { + player.stop() + cache.release() + parentFragmentManager.beginTransaction().remove(parentFragmentManager.findFragmentByTag("cutVideoSheet")!!).commit() + } } } diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadAudioFragment.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadAudioFragment.kt index f4a9c324..e40b55fa 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadAudioFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadAudioFragment.kt @@ -123,42 +123,40 @@ class DownloadAudioFragment(private var resultItem: ResultItem, private var curr var formats = mutableListOf() formats.addAll(resultItem.formats.filter { it.format_note.contains("audio", ignoreCase = true) }) - val audioFormats = resources.getStringArray(R.array.audio_formats) + if (formats.isEmpty()) formats.addAll(downloadItem.allFormats.filter { it.format_note.contains("audio", ignoreCase = true) }) val containers = requireContext().resources.getStringArray(R.array.audio_containers) - val containerPreference = sharedPreferences.getString("audio_format", getString(R.string.defaultValue)) + val containerPreference = sharedPreferences.getString("audio_format", "Default") val container = view.findViewById(R.id.downloadContainer) val containerAutoCompleteTextView = view.findViewById(R.id.container_textview) - if (formats.isEmpty()) { - audioFormats.forEach { formats.add(Format(it, containerPreference!!,"","", "",0, it)) } - } + if (formats.isEmpty()) formats = downloadViewModel.getGenericAudioFormats() val formatCard = view.findViewById(R.id.format_card_constraintLayout) val chosenFormat = downloadItem.format uiUtil.populateFormatCard(formatCard, chosenFormat) val listener = object : OnFormatClickListener { - override fun onFormatClick(allFormats: List, item: Format) { - downloadItem.format = item - uiUtil.populateFormatCard(formatCard, item) - if (containers.contains(item.container)){ - downloadItem.format.container = item.container - containerAutoCompleteTextView.setText(item.container, false) + override fun onFormatClick(allFormats: List>, item: List) { + downloadItem.format = item.first() + uiUtil.populateFormatCard(formatCard, item.first()) + if (containers.contains(item.first().container)){ + downloadItem.format.container = item.first().container + containerAutoCompleteTextView.setText(item.first().container, false) } lifecycleScope.launch { withContext(Dispatchers.IO){ resultItem.formats.removeAll(formats.toSet()) - resultItem.formats.addAll(allFormats) + resultItem.formats.addAll(allFormats.first()) resultViewModel.update(resultItem) } } - formats = allFormats.toMutableList() + formats = allFormats.first().toMutableList() } } formatCard.setOnClickListener{_ -> if (parentFragmentManager.findFragmentByTag("formatSheet") == null){ - val bottomSheet = FormatSelectionBottomSheetDialog(downloadItem, formats, listener) + val bottomSheet = FormatSelectionBottomSheetDialog(listOf(downloadItem), listOf(formats), listener) bottomSheet.show(parentFragmentManager, "formatSheet") } } 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 c3deefa6..87e16b90 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 @@ -15,6 +15,7 @@ import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.RecyclerView +import androidx.viewpager.widget.ViewPager import androidx.viewpager2.widget.ViewPager2 import com.deniscerri.ytdlnis.R import com.deniscerri.ytdlnis.database.DBManager @@ -30,6 +31,8 @@ import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.google.android.material.button.MaterialButton import com.google.android.material.tabs.TabLayout +import com.google.android.material.tabs.TabLayout.TabLayoutOnPageChangeListener +import com.google.android.material.tabs.TabLayoutMediator import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking @@ -64,7 +67,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 - 700 + behavior.peekHeight = displayMetrics.heightPixels - 400 } @@ -158,7 +161,6 @@ class DownloadBottomSheetDialog(private val resultItem: ResultItem, private val dismiss() } } - val download = view.findViewById