From 1a60bf9e53287e3c497dd368d6b360f409273e76 Mon Sep 17 00:00:00 2001 From: deniscerri <64997243+deniscerri@users.noreply.github.com> Date: Tue, 17 Feb 2026 18:34:16 +0100 Subject: [PATCH] random fixes --- app/build.gradle | 1 + .../java/com/deniscerri/ytdl/MainActivity.kt | 59 +++++++++++-------- .../deniscerri/ytdl/core/RuntimeManager.kt | 4 +- .../more/downloadLogs/DownloadLogFragment.kt | 1 + .../settings/ProcessingSettingsFragment.kt | 9 +++ .../com/deniscerri/ytdl/util/Extensions.kt | 7 ++- .../ytdl/util/extractors/ytdlp/YTDLPUtil.kt | 16 ++--- .../ytdl/work/MoveCacheFilesWorker.kt | 6 +- app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/advanced_preferences.xml | 3 +- 10 files changed, 68 insertions(+), 39 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index adb29637..93c99c5f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -230,4 +230,5 @@ dependencies { implementation("commons-io:commons-io:2.5") implementation("org.apache.commons:commons-compress:1.12") + implementation("androidx.core:core-splashscreen:1.2.0") } diff --git a/app/src/main/java/com/deniscerri/ytdl/MainActivity.kt b/app/src/main/java/com/deniscerri/ytdl/MainActivity.kt index 96b13e2c..122484b5 100644 --- a/app/src/main/java/com/deniscerri/ytdl/MainActivity.kt +++ b/app/src/main/java/com/deniscerri/ytdl/MainActivity.kt @@ -18,6 +18,7 @@ import android.widget.CheckBox import android.widget.TextView import android.widget.Toast import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen import androidx.core.view.WindowInsetsCompat import androidx.core.view.forEach import androidx.core.view.isVisible @@ -90,12 +91,19 @@ class MainActivity : BaseActivity() { private lateinit var navController : NavController override fun onCreate(savedInstanceState: Bundle?) { + val splashScreen = installSplashScreen() + super.onCreate(savedInstanceState) CrashListener(this).registerExceptionHandler() ThemeUtil.updateTheme(this) window.navigationBarColor = SurfaceColors.SURFACE_2.getColor(this) setContentView(R.layout.activity_main) context = baseContext + + splashScreen.setKeepOnScreenCondition { + !RuntimeManager.initialized + } + resultViewModel = ViewModelProvider(this)[ResultViewModel::class.java] cookieViewModel = ViewModelProvider(this)[CookieViewModel::class.java] downloadViewModel = ViewModelProvider(this)[DownloadViewModel::class.java] @@ -109,8 +117,6 @@ class MainActivity : BaseActivity() { } } - - askPermissions() checkUpdate() @@ -269,27 +275,7 @@ class MainActivity : BaseActivity() { cookieViewModel.updateCookiesFile() val intent = intent handleIntents(intent) - - if (preferences.getBoolean("auto_update_ytdlp", false)){ - CoroutineScope(SupervisorJob()).launch(Dispatchers.IO) { - kotlin.runCatching { - if(DBManager.getInstance(this@MainActivity).downloadDao.getDownloadsCountByStatus(listOf("Active", "Queued")) == 0){ - if (UpdateUtil(this@MainActivity).updateYTDL().status == UpdateUtil.YTDLPUpdateStatus.DONE) { - val version = RuntimeManager.getInstance().version(context) - val snack = Snackbar.make(findViewById(R.id.frame_layout), - this@MainActivity.getString(R.string.ytld_update_success) + " [${version}]", - Snackbar.LENGTH_LONG) - - navigationBarView?.apply { - snack.setAnchorView(this) - } - snack.show() - } - } - } - - } - } + checkRuntimeReadyState() } override fun onSaveInstanceState(savedInstanceState: Bundle) { super.onSaveInstanceState(savedInstanceState) @@ -504,6 +490,33 @@ class MainActivity : BaseActivity() { } } + private fun checkRuntimeReadyState() { + if (RuntimeManager.initialized) { + if (preferences.getBoolean("auto_update_ytdlp", false)){ + CoroutineScope(SupervisorJob()).launch(Dispatchers.IO) { + kotlin.runCatching { + if(DBManager.getInstance(this@MainActivity).downloadDao.getDownloadsCountByStatus(listOf("Active", "Queued")) == 0){ + if (UpdateUtil(this@MainActivity).updateYTDL().status == UpdateUtil.YTDLPUpdateStatus.DONE) { + val version = RuntimeManager.getInstance().version(context) + val snack = Snackbar.make(findViewById(R.id.frame_layout), + this@MainActivity.getString(R.string.ytld_update_success) + " [${version}]", + Snackbar.LENGTH_LONG) + + navigationBarView?.apply { + snack.setAnchorView(this) + } + snack.show() + } + } + } + + } + } + } else { + Handler(Looper.getMainLooper()).postDelayed({ checkRuntimeReadyState() }, 50) + } + } + companion object { private const val TAG = "MainActivity" } diff --git a/app/src/main/java/com/deniscerri/ytdl/core/RuntimeManager.kt b/app/src/main/java/com/deniscerri/ytdl/core/RuntimeManager.kt index 9d8c39b6..d44a7cc7 100644 --- a/app/src/main/java/com/deniscerri/ytdl/core/RuntimeManager.kt +++ b/app/src/main/java/com/deniscerri/ytdl/core/RuntimeManager.kt @@ -28,9 +28,9 @@ object RuntimeManager { lateinit var quickJsLocation : PackageBase.PackageLocation var ytdlpPath: File? = null - const val PREFS_NAME = "runtime_prefs" + var initialized = false + private set - private var initialized = false const val BASENAME = "ytdlnis" const val ytdlpDirName = "yt-dlp" const val ytdlpBin = "yt-dlp" diff --git a/app/src/main/java/com/deniscerri/ytdl/ui/more/downloadLogs/DownloadLogFragment.kt b/app/src/main/java/com/deniscerri/ytdl/ui/more/downloadLogs/DownloadLogFragment.kt index 330df076..d00832c2 100644 --- a/app/src/main/java/com/deniscerri/ytdl/ui/more/downloadLogs/DownloadLogFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/more/downloadLogs/DownloadLogFragment.kt @@ -96,6 +96,7 @@ class DownloadLogFragment : Fragment() { logAdapter = LogAdapter() logRecyclerView.layoutManager = LinearLayoutManager(requireContext()) logRecyclerView.adapter = logAdapter + logRecyclerView.itemAnimator = null logAdapter.isWrapped = sharedPreferences.getBoolean("wrap_text_log", false) logAdapter.textSize = sharedPreferences.getFloat("log_zoom", 2f) + 13f diff --git a/app/src/main/java/com/deniscerri/ytdl/ui/more/settings/ProcessingSettingsFragment.kt b/app/src/main/java/com/deniscerri/ytdl/ui/more/settings/ProcessingSettingsFragment.kt index ee8b431c..89993113 100644 --- a/app/src/main/java/com/deniscerri/ytdl/ui/more/settings/ProcessingSettingsFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/more/settings/ProcessingSettingsFragment.kt @@ -130,6 +130,10 @@ class ProcessingSettingsFragment : BaseSettingsFragment() { recodeVideoPreference.performClick() } + editor.putString("audio_codec_tmp", audioCodecPref?.value ?: "").apply() + editor.putString("video_codec_tmp", videoCodecPref?.value ?: "").apply() + editor.putString("video_format_tmp", videoContainerPref?.value ?: "").apply() + val audioCodecs = requireContext().getStringArray(R.array.audio_codec) val audioCodecValues = requireContext().getStringArray(R.array.audio_codec_values) val videoCodecs = requireContext().getStringArray(R.array.video_codec) @@ -142,6 +146,11 @@ class ProcessingSettingsFragment : BaseSettingsFragment() { editor.putString("video_codec", videoCodecValues[videoCodecs.indexOf(newVideoCodec)]).apply() editor.putString("video_format", "").apply() requireActivity().recreate() + } else { + editor.putString("audio_codec", prefs.getString("audio_codec_tmp", "")).apply() + editor.putString("video_codec", prefs.getString("video_codec_tmp", "")).apply() + editor.putString("video_format", prefs.getString("video_format_tmp", "")).apply() + requireActivity().recreate() } true } diff --git a/app/src/main/java/com/deniscerri/ytdl/util/Extensions.kt b/app/src/main/java/com/deniscerri/ytdl/util/Extensions.kt index 253824e0..29e068e7 100644 --- a/app/src/main/java/com/deniscerri/ytdl/util/Extensions.kt +++ b/app/src/main/java/com/deniscerri/ytdl/util/Extensions.kt @@ -365,7 +365,8 @@ object Extensions { lines.addAll(newLines) if (newLines.isNotEmpty()) { newLines.last().apply { - if (this.contains("[download")) { + //common text in yt-dlp and aria2c progress + if (this.contains("[download") || this.contains(") CN:")) { newline = "\n${this}" } } @@ -373,13 +374,13 @@ object Extensions { return lines.distinct().filterNot { - (it.contains("[download") && !finishingProgressLinesRegex.matcher(it).find()) + ((it.contains("[download") || it.contains(") CN:")) && !finishingProgressLinesRegex.matcher(it).find()) || it.contains("does not pass filter (id") }.joinToString("\n") + newline } return lines.filterNot { - (it.contains("[download") && !finishingProgressLinesRegex.matcher(it).find()) + ((it.contains("[download") || it.contains(") CN:")) && !finishingProgressLinesRegex.matcher(it).find()) || it.contains("does not pass filter (id") }.joinToString("\n") } diff --git a/app/src/main/java/com/deniscerri/ytdl/util/extractors/ytdlp/YTDLPUtil.kt b/app/src/main/java/com/deniscerri/ytdl/util/extractors/ytdlp/YTDLPUtil.kt index 82dcb410..90ac07cb 100644 --- a/app/src/main/java/com/deniscerri/ytdl/util/extractors/ytdlp/YTDLPUtil.kt +++ b/app/src/main/java/com/deniscerri/ytdl/util/extractors/ytdlp/YTDLPUtil.kt @@ -772,7 +772,7 @@ class YTDLPUtil(private val context: Context, private val commandTemplateDao: Co //extractorArgs.add("skip=translated_subs") - val useLanguageForMetadata = sharedPreferences.getBoolean("use_app_language_for_metadata", true) + val useLanguageForMetadata = sharedPreferences.getBoolean("use_app_language_for_metadata", false) if (useLanguageForMetadata) { val lang = java.util.Locale.getDefault().language val langTag = java.util.Locale.getDefault().toLanguageTag() @@ -1063,14 +1063,14 @@ class YTDLPUtil(private val context: Context, private val commandTemplateDao: Co audioQualityId += "/ba/b" } - if ((audioQualityId.isBlank() || audioQualityId == "ba/b") && preferredLanguage.isNotBlank()) { - audioQualityId = "ba[language^=$preferredLanguage]/${audioQualityId.ifEmpty { "ba/b" }}" - } - if ((audioQualityId.isBlank() || audioQualityId == "ba/b") && formatImportance.contains("prefer_drc")) { audioQualityId = "ba[format_id$=-drc]/${audioQualityId.ifEmpty { "ba/b" }}" } + if ((audioQualityId.isBlank() || audioQualityId == "ba/b") && preferredLanguage.isNotBlank()) { + audioQualityId = "ba[language^=$preferredLanguage]/${audioQualityId.ifEmpty { "ba/b" }}" + } + if (audioQualityId.isNotBlank()) { if (audioQualityId.matches(".*-[0-9]+.*".toRegex())) { audioQualityId = if(!downloadItem.format.lang.isNullOrBlank() && downloadItem.format.lang != "None"){ @@ -1124,7 +1124,7 @@ class YTDLPUtil(private val context: Context, private val commandTemplateDao: Co if (downloadItem.format.format_id == context.resources.getString(R.string.worst_quality) || downloadItem.format.format_id == "wa" || downloadItem.format.format_id == "worst") { formatSorting.remove("size") formatSorting.remove("+size") - formatSorting.addAll(0,listOf("+abr","+br", "+res", "+fps")) + formatSorting.addAll(0,listOf("+abr")) } if (abrSort.isNotBlank()){ @@ -1298,7 +1298,7 @@ class YTDLPUtil(private val context: Context, private val commandTemplateDao: Co if (!f.contains("$videoF+ba")) { if (preferredAudioLanguage.isNotEmpty()) { f.append("$videoF+ba[language^=$preferredAudioLanguage]/") - } else if (preferDRCAudio) { + }else if (preferDRCAudio) { f.append("$videoF+ba[format_id$=-drc]/") }else { f.append("$videoF+ba/") @@ -1335,8 +1335,8 @@ class YTDLPUtil(private val context: Context, private val commandTemplateDao: Co .filter { it.isNotBlank() } .ifEmpty { val list = mutableListOf() - if (preferDRCAudio) list.add("ba[format_id$=-drc]") if (preferredAudioLanguage.isNotEmpty() && !downloadItem.videoPreferences.removeAudio) list.add("ba[language^=$preferredAudioLanguage]") + if (preferDRCAudio) list.add("ba[format_id$=-drc]") list.add(audioF) list }.apply { diff --git a/app/src/main/java/com/deniscerri/ytdl/work/MoveCacheFilesWorker.kt b/app/src/main/java/com/deniscerri/ytdl/work/MoveCacheFilesWorker.kt index 6ebc7c76..8be5ec4c 100644 --- a/app/src/main/java/com/deniscerri/ytdl/work/MoveCacheFilesWorker.kt +++ b/app/src/main/java/com/deniscerri/ytdl/work/MoveCacheFilesWorker.kt @@ -33,9 +33,9 @@ class MoveCacheFilesWorker( val cachePath = FileUtil.getCachePath(context) val downloadFolders = File(cachePath) val allContent = downloadFolders.walk() - allContent.drop(1) + val totalFiles = allContent.count() - val destination = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).absolutePath + File.separator + "YTDLnis/CACHE_IMPORT") + val destination = File(FileUtil.getDefaultApplicationPath(), "CACHE_IMPORT") val intent = Intent(context, MainActivity::class.java) val pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_IMMUTABLE) @@ -50,6 +50,8 @@ class MoveCacheFilesWorker( var progress = 0 allContent.forEach { progress++ + if (progress == 1) return@forEach + notificationUtil.updateCacheMovingNotification(id, progress, totalFiles) val destFile = File(destination.absolutePath + "/${it.absolutePath.removePrefix(cachePath)}") if (it.isDirectory) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d03be8b8..b8451db8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -513,4 +513,5 @@ Packages Not installed Bundled + If enabled, metadata fields will follow your app language and even affect format selection by preferring dubbed versions instead of original diff --git a/app/src/main/res/xml/advanced_preferences.xml b/app/src/main/res/xml/advanced_preferences.xml index 3e16e754..a83e5875 100644 --- a/app/src/main/res/xml/advanced_preferences.xml +++ b/app/src/main/res/xml/advanced_preferences.xml @@ -20,7 +20,8 @@