diff --git a/app/src/main/java/com/deniscerri/ytdlnis/MainActivity.kt b/app/src/main/java/com/deniscerri/ytdlnis/MainActivity.kt index 179eddb2..1c6f7ed6 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/MainActivity.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/MainActivity.kt @@ -12,6 +12,7 @@ import android.graphics.drawable.ColorDrawable import android.net.Uri import android.os.Build import android.os.Bundle +import android.os.Handler import android.provider.Settings import android.util.Log import android.view.View @@ -67,6 +68,7 @@ class MainActivity : BaseActivity() { private lateinit var navigationView: View private lateinit var navHostFragment : NavHostFragment private lateinit var navController : NavController + private lateinit var sharedPreferences: SharedPreferences override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -105,13 +107,18 @@ class MainActivity : BaseActivity() { } } - val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this) + sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this) val graph = navController.navInflater.inflate(R.navigation.nav_graph) + graph.setStartDestination(R.id.homeFragment) + when(sharedPreferences.getString("start_destination", "")) { + "History" -> graph.setStartDestination(R.id.historyFragment) + "More" -> if (navigationView is NavigationBarView) graph.setStartDestination(R.id.moreFragment) + } + navController.graph = graph if (navigationView is NavigationBarView){ - (navigationView as NavigationBarView).selectedItemId = graph.startDestinationId (navigationView as NavigationBarView).setupWithNavController(navController) (navigationView as NavigationBarView).setOnItemReselectedListener { when (it.itemId) { @@ -142,7 +149,6 @@ class MainActivity : BaseActivity() { window.navigationBarColor = SurfaceColors.SURFACE_2.getColor(this) } if (navigationView is NavigationView){ - (navigationView as NavigationView).setCheckedItem(graph.startDestinationId) (navigationView as NavigationView).setupWithNavController(navController) //terminate button (navigationView as NavigationView).menu.getItem(7).setOnMenuItemClickListener { @@ -194,13 +200,14 @@ class MainActivity : BaseActivity() { } } + when(sharedPreferences.getString("start_destination", "")) { - "History" -> navController.navigate(R.id.historyFragment) "Queue" -> navController.navigate(R.id.downloadQueueMainFragment) - "More" -> if (navigationView is NavigationBarView) graph.setStartDestination(R.id.moreFragment) } + } + private fun View.visibilityChanged(action: (View) -> Unit) { this.viewTreeObserver.addOnGlobalLayoutListener { val newVis: Int = this.visibility 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 5b1ad274..72d7f831 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 @@ -64,6 +64,7 @@ class DownloadViewModel(application: Application) : AndroidViewModel(application private val videoQualityPreference: String private val formatIDPreference: String + private val audioFormatIDPreference: String private val resources : Resources enum class Type { audio, video, command @@ -86,6 +87,7 @@ class DownloadViewModel(application: Application) : AndroidViewModel(application videoQualityPreference = sharedPreferences.getString("video_quality", application.getString(R.string.best_quality)).toString() formatIDPreference = sharedPreferences.getString("format_id", "").toString() + audioFormatIDPreference = sharedPreferences.getString("format_id_audio", "").toString() val confTmp = Configuration(application.resources.configuration) confTmp.locale = Locale(sharedPreferences.getString("app_language", "en")!!) @@ -165,7 +167,7 @@ class DownloadViewModel(application: Application) : AndroidViewModel(application val sponsorblock = sharedPreferences.getStringSet("sponsorblock_filters", emptySet()) val audioPreferences = AudioPreferences(embedThumb, false, ArrayList(sponsorblock!!)) - val videoPreferences = VideoPreferences(embedSubs, addChapters, false, ArrayList(sponsorblock), saveSubs) + val videoPreferences = VideoPreferences(embedSubs, addChapters, false, ArrayList(sponsorblock), saveSubs, audioFormatIDs = ArrayList(resultItem.formats.filter { it.format_id == audioFormatIDPreference }.map { it.format_id })) return DownloadItem(0, resultItem.url, @@ -312,7 +314,7 @@ class DownloadViewModel(application: Application) : AndroidViewModel(application return cloneFormat ( try { try{ - formats.first { it.format_note.contains("audio", ignoreCase = true) && it.format_id == formatIDPreference } + formats.first { it.format_note.contains("audio", ignoreCase = true) && it.format_id == audioFormatIDPreference } }catch (e: Exception){ formats.last { it.format_note.contains("audio", ignoreCase = true) } } diff --git a/app/src/main/java/com/deniscerri/ytdlnis/receiver/ShareActivity.kt b/app/src/main/java/com/deniscerri/ytdlnis/receiver/ShareActivity.kt index fd62c566..49f3906b 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/receiver/ShareActivity.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/receiver/ShareActivity.kt @@ -118,9 +118,7 @@ class ShareActivity : BaseActivity() { val inputQuery = intent.getStringExtra(Intent.EXTRA_TEXT)!! lifecycleScope.launch { try { - val result = withContext(Dispatchers.IO){ - resultViewModel.getItemByURL(inputQuery) - } + val result = resultViewModel.getItemByURL(inputQuery) loadingBottomSheet.dismiss() showDownloadSheet(result) }catch (e: Exception){ @@ -130,20 +128,18 @@ class ShareActivity : BaseActivity() { loadingBottomSheet.dismiss() showDownloadSheet(result) }else{ - lifecycleScope.launch { - val res = withContext(Dispatchers.IO){ - resultViewModel.parseQuery(inputQuery, true) - } - if (res.isEmpty()) { - Toast.makeText(this@ShareActivity, "No Results Found!", Toast.LENGTH_SHORT).show() - exit() + val res = withContext(Dispatchers.IO){ + resultViewModel.parseQuery(inputQuery, true) + } + if (res.isEmpty()) { + Toast.makeText(this@ShareActivity, "No Results Found!", Toast.LENGTH_SHORT).show() + exit() + }else{ + loadingBottomSheet.dismiss() + if (res.size == 1){ + showDownloadSheet(res[0]!!) }else{ - loadingBottomSheet.dismiss() - if (res.size == 1){ - showDownloadSheet(res[0]!!) - }else{ - showSelectPlaylistItems(res.toList()) - } + showSelectPlaylistItems(res.toList()) } } } 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 ea9eca87..1729bbf8 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 @@ -176,7 +176,9 @@ class DownloadAudioFragment(private var resultItem: ResultItem, private var curr ) ) - downloadItem.container = if (containerPreference == getString(R.string.defaultValue)) "" else containerPreference!! + if (currentDownloadItem == null || !containers.contains(downloadItem.container)){ + downloadItem.container = if (containerPreference == getString(R.string.defaultValue)) "" else containerPreference!! + } containerAutoCompleteTextView.setText(downloadItem.container.ifEmpty { getString(R.string.defaultValue) }, false) (container!!.editText as AutoCompleteTextView?)!!.onItemClickListener = 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 c5d56198..96d87cfb 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 @@ -180,7 +180,9 @@ class DownloadVideoFragment(private val resultItem: ResultItem, private var curr containers ) ) - downloadItem.container = if (containerPreference == getString(R.string.defaultValue)) "" else containerPreference!! + if (currentDownloadItem == null || !containers.contains(downloadItem.container)){ + downloadItem.container = if (containerPreference == getString(R.string.defaultValue)) "" else containerPreference!! + } containerAutoCompleteTextView!!.setText( downloadItem.container.ifEmpty { getString(R.string.defaultValue) }, false) diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/MainSettingsFragment.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/MainSettingsFragment.kt index d5440197..af7bb5d7 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/MainSettingsFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/MainSettingsFragment.kt @@ -541,7 +541,7 @@ class MainSettingsFragment : PreferenceFragmentCompat() { val intent: Intent? = requireContext().packageManager .getLaunchIntentForPackage(requireContext().packageName) intent?.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) - startActivity(intent) + startActivity(intent!!) if(json.has("settings")){ AppCompatDelegate.setApplicationLocales(LocaleListCompat.forLanguageTags(preferences.getString("app_language", "en"))) } diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/ProcessingSettingsFragment.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/ProcessingSettingsFragment.kt index 22582125..e4d4b9d8 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/ProcessingSettingsFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/ProcessingSettingsFragment.kt @@ -9,6 +9,15 @@ class ProcessingSettingsFragment : BaseSettingsFragment() { override val title: Int = R.string.processing override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.processing_preferences, rootKey) + + val preferredFormatID : EditTextPreference? = findPreference("format_id") + val preferredFormatIDAudio : EditTextPreference? = findPreference("format_id_audio") + + preferredFormatID?.title = "${getString(R.string.preferred_format_id)} [${getString(R.string.video)}]" + preferredFormatID?.dialogTitle = "${getString(R.string.file_name_template)} [${getString(R.string.video)}]" + + preferredFormatIDAudio?.title = "${getString(R.string.preferred_format_id)} [${getString(R.string.audio)}]" + preferredFormatIDAudio?.dialogTitle = "${getString(R.string.file_name_template)} [${getString(R.string.audio)}]" } } \ No newline at end of file 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 72b925d7..0087ad86 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/work/DownloadWorker.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/work/DownloadWorker.kt @@ -69,7 +69,7 @@ class DownloadWorker( CoroutineScope(Dispatchers.IO).launch { //update item if its incomplete - updateDownloadItem(downloadItem, infoUtil, dao, resultDao, false, notificationUtil) + updateDownloadItem(downloadItem, infoUtil, dao, resultDao) } val pendingIntent = NavDeepLinkBuilder(context) @@ -173,6 +173,8 @@ class DownloadWorker( when(type){ DownloadViewModel.Type.audio -> { + val supportedContainers = context.resources.getStringArray(R.array.audio_containers) + var audioQualityId : String = downloadItem.format.format_id if (audioQualityId.isBlank() || audioQualityId == "0" || audioQualityId == context.getString(R.string.best_quality) || audioQualityId == "best") audioQualityId = "" else if (audioQualityId == context.getString(R.string.worst_quality) || audioQualityId == "worst") audioQualityId = "worstaudio" @@ -182,7 +184,7 @@ class DownloadWorker( request.addOption("-x") if(ext.isNotBlank()){ - if(!ext.matches("(webm)|(Default)|(${context.getString(R.string.defaultValue)})".toRegex())){ + if(!ext.matches("(webm)|(Default)|(${context.getString(R.string.defaultValue)})".toRegex()) && supportedContainers.contains(ext)){ request.addOption("--audio-format", ext) } } @@ -220,6 +222,8 @@ class DownloadWorker( } DownloadViewModel.Type.video -> { + val supportedContainers = context.resources.getStringArray(R.array.video_containers) + if (downloadItem.videoPreferences.addChapters) { request.addOption("--sponsorblock-mark", "all") request.addOption("--embed-chapters") @@ -250,7 +254,7 @@ class DownloadWorker( Log.e(TAG, formatArgument) request.addOption("-f", formatArgument) val outputFormat = downloadItem.container - if(outputFormat.isNotEmpty() && outputFormat != "Default" && outputFormat != context.getString(R.string.defaultValue)){ + if(outputFormat.isNotEmpty() && outputFormat != "Default" && outputFormat != context.getString(R.string.defaultValue) && supportedContainers.contains(outputFormat)){ request.addOption("--merge-output-format", outputFormat.lowercase()) if (outputFormat != "webm") { val embedThumb = sharedPreferences.getBoolean("embed_thumbnail", false) @@ -343,7 +347,7 @@ class DownloadWorker( }, 1000) } - val wasQuickDownloaded = updateDownloadItem(downloadItem, infoUtil, dao, resultDao, false, notificationUtil) + val wasQuickDownloaded = updateDownloadItem(downloadItem, infoUtil, dao, resultDao) //put download in history val incognito = sharedPreferences.getBoolean("incognito", false) @@ -359,7 +363,9 @@ class DownloadWorker( notificationUtil.cancelDownloadNotification(downloadItem.id.toInt()) notificationUtil.createDownloadFinished( - downloadItem.title, if (finalPaths?.first().equals(context.getString(R.string.unfound_file))) null else finalPaths, + downloadItem.title, if (finalPaths?.first().equals(context.getString(R.string.unfound_file))) null else listOf( + finalPaths!!.maxByOrNull { it.length }!! + ), NotificationUtil.DOWNLOAD_FINISHED_CHANNEL_ID ) @@ -420,10 +426,14 @@ class DownloadWorker( return Result.success() } - private fun updateDownloadItem(downloadItem: DownloadItem, infoUtil: InfoUtil, dao: DownloadDao, resultDao: ResultDao, logDownloads: Boolean, notificationUtil: NotificationUtil) : Boolean { + private fun updateDownloadItem( + downloadItem: DownloadItem, + infoUtil: InfoUtil, + dao: DownloadDao, + resultDao: ResultDao + ) : Boolean { var wasQuickDownloaded = false if (downloadItem.title.isEmpty() || downloadItem.author.isEmpty() || downloadItem.thumb.isEmpty()){ - if (logDownloads) notificationUtil.createUpdatingItemNotification(NotificationUtil.DOWNLOAD_SERVICE_CHANNEL_ID) runCatching { setProgressAsync(workDataOf("progress" to 0, "output" to context.getString(R.string.updating_download_data), "id" to downloadItem.id, "log" to false)) val info = infoUtil.getMissingInfo(downloadItem.url) @@ -437,7 +447,6 @@ class DownloadWorker( dao.update(downloadItem) } } - if (logDownloads) notificationUtil.cancelDownloadNotification(NotificationUtil.DOWNLOAD_UPDATING_NOTIFICATION_ID) } return wasQuickDownloaded } diff --git a/app/src/main/res/layout/download_card.xml b/app/src/main/res/layout/download_card.xml index 1c97e79b..66b9d353 100644 --- a/app/src/main/res/layout/download_card.xml +++ b/app/src/main/res/layout/download_card.xml @@ -132,7 +132,7 @@ app:layout_constraintTop_toTopOf="parent" /> nb pl pt + pt-BR ru ro sq diff --git a/app/src/main/res/xml/locales_config.xml b/app/src/main/res/xml/locales_config.xml index 84e8ccd5..42e0204b 100644 --- a/app/src/main/res/xml/locales_config.xml +++ b/app/src/main/res/xml/locales_config.xml @@ -17,6 +17,7 @@ + diff --git a/app/src/main/res/xml/processing_preferences.xml b/app/src/main/res/xml/processing_preferences.xml index 26fb92ee..f79762c3 100644 --- a/app/src/main/res/xml/processing_preferences.xml +++ b/app/src/main/res/xml/processing_preferences.xml @@ -126,4 +126,10 @@ app:defaultValue="" app:summary="@string/preferred_format_id_summary" app:title="@string/preferred_format_id" /> + + \ No newline at end of file