From c7a007973726b90f875ea5fb05cce996114392ba Mon Sep 17 00:00:00 2001 From: deniscerri <64997243+deniscerri@users.noreply.github.com> Date: Sun, 21 Sep 2025 14:24:04 +0200 Subject: [PATCH] lot of features, forgor to note --- .github/workflows/android.yml | 57 ------------- .../ui/downloadcard/DownloadAudioFragment.kt | 3 +- .../DownloadMultipleBottomSheetDialog.kt | 6 +- .../ui/downloadcard/DownloadVideoFragment.kt | 3 +- .../ytdl/ui/more/WebViewActivity.kt | 6 +- .../ui/more/settings/MainSettingsFragment.kt | 2 +- .../ytdl/ui/more/terminal/TerminalFragment.kt | 12 ++- .../com/deniscerri/ytdl/util/Extensions.kt | 23 ++++++ .../java/com/deniscerri/ytdl/util/UiUtil.kt | 80 +++++++++++++++++-- .../ytdl/util/extractors/YTDLPUtil.kt | 14 +++- .../main/res/layout/command_template_item.xml | 5 +- .../fragment_generate_youtube_po_token.xml | 20 ++--- ...tube_player_client_create_bottom_sheet.xml | 3 +- app/src/main/res/menu/terminal_menu.xml | 4 + app/src/main/res/menu/webview_menu.xml | 5 +- app/src/main/res/values/strings.xml | 9 +++ app/src/main/res/xml/advanced_preferences.xml | 9 +++ 17 files changed, 161 insertions(+), 100 deletions(-) diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index 2b33f1c7..8ecfddfe 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -37,60 +37,11 @@ jobs: - name: Set current date as env variable run: echo "date_today=$(date +'%Y-%m-%d')" >> $GITHUB_ENV - # Create APK Debug - - name: Build apk debug project (APK) - run: ./gradlew assembleDebug # Create APK Release - name: Build apk release project (APK) run: ./gradlew assemble # Upload Artifact Build - # Noted For Output [main_project_module]/build/outputs/apk/debug/ - - name: Find Debug arm64 - run: echo "APK_PATH=$(find ${{ env.main_project_module }}/build/outputs/apk/debug/ -type f -name '*arm64*.apk')" >> $GITHUB_ENV - - - name: Upload APK Debug arm64 - uses: actions/upload-artifact@v4 - with: - name: ytdlnis-autogenerated-arm64-v8a-debug - path: ${{ env.APK_PATH }} - - - name: Find Debug armeabiv7 - run: echo "APK_PATH=$(find ${{ env.main_project_module }}/build/outputs/apk/debug/ -type f -name '*armeabi*.apk')" >> $GITHUB_ENV - - - name: Upload APK Debug armeabiv7 - uses: actions/upload-artifact@v4 - with: - name: ytdlnis-autogenerated-armeabi-v7a-debug - path: ${{ env.APK_PATH }} - - - name: Find Debug universal - run: echo "APK_PATH=$(find ${{ env.main_project_module }}/build/outputs/apk/debug/ -type f -name '*universal*.apk')" >> $GITHUB_ENV - - - name: Upload APK Debug universal - uses: actions/upload-artifact@v4 - with: - name: ytdlnis-autogenerated-universal-debug - path: ${{ env.APK_PATH }} - - - name: Find Debug x86 - run: echo "APK_PATH=$(find ${{ env.main_project_module }}/build/outputs/apk/debug/ -type f -name '*x86-*.apk')" >> $GITHUB_ENV - - - name: Upload APK Debug x86 - uses: actions/upload-artifact@v4 - with: - name: ytdlnis-autogenerated-x86-debug - path: ${{ env.APK_PATH }} - - - name: Find Debug x86_64 - run: echo "APK_PATH=$(find ${{ env.main_project_module }}/build/outputs/apk/debug/ -type f -name '*x86_64*.apk')" >> $GITHUB_ENV - - - name: Upload APK Debug x86_64 - uses: actions/upload-artifact@v4 - with: - name: ytdlnis-autogenerated-x86_64-debug - path: ${{ env.APK_PATH }} - # Noted For Output [main_project_module]/build/outputs/apk/release/ - name: Find Release arm64 run: echo "APK_PATH=$(find ${{ env.main_project_module }}/build/outputs/apk/release/ -type f -name '*arm64*.apk')" >> $GITHUB_ENV @@ -137,13 +88,6 @@ jobs: name: ytdlnis-autogenerated-x86_64-release path: ${{ env.APK_PATH }} - # Noted For Output [main_project_module]/build/outputs/apk/debug/ - - name: Upload APK Debug - uses: actions/upload-artifact@v4 - with: - name: YTDLnis APK debug generated - path: ${{ env.main_project_module }}/build/outputs/apk/debug/ - # Noted For Output [main_project_module]/build/outputs/apk/release/ - name: Upload APK Release uses: actions/upload-artifact@v4 @@ -220,5 +164,4 @@ jobs: # prerelease: true # files: | # ${{ env.main_project_module }}/build/outputs/apk/release/* -# ${{ env.main_project_module }}/build/outputs/apk/debug/* diff --git a/app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/DownloadAudioFragment.kt b/app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/DownloadAudioFragment.kt index fd8a280b..8b335e76 100644 --- a/app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/DownloadAudioFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/DownloadAudioFragment.kt @@ -374,10 +374,11 @@ class DownloadAudioFragment(private var resultItem: ResultItem? = null, private } }, - extraCommandsClicked = { + extraCommandsClicked = { returnValue -> val callback = object : ExtraCommandsListener { override fun onChangeExtraCommand(c: String) { downloadItem.extraCommands = c + returnValue(c) } } diff --git a/app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/DownloadMultipleBottomSheetDialog.kt b/app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/DownloadMultipleBottomSheetDialog.kt index 84c82bda..fc310aec 100644 --- a/app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/DownloadMultipleBottomSheetDialog.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/DownloadMultipleBottomSheetDialog.kt @@ -591,13 +591,14 @@ class DownloadMultipleBottomSheetDialog : BottomSheetDialogFragment(), Configure cutClicked = {}, cutDisabledClicked = {}, cutValueChanged = {}, - extraCommandsClicked = { + extraCommandsClicked = { returnValue -> val callback = object : ExtraCommandsListener { override fun onChangeExtraCommand(c: String) { items.forEach { it.extraCommands = c } requireActivity().lifecycleScope.launch { items.forEach { downloadViewModel.updateDownload(it) } } + returnValue(c) bottomSheet.dismiss() } } @@ -696,11 +697,12 @@ class DownloadMultipleBottomSheetDialog : BottomSheetDialogFragment(), Configure CoroutineScope(Dispatchers.IO).launch { items.forEach { downloadViewModel.updateDownload(it) } } }, alsoDownloadAsAudioClicked = {}, - extraCommandsClicked = { + extraCommandsClicked = { returnValue -> val callback = object : ExtraCommandsListener { override fun onChangeExtraCommand(c: String) { items.forEach { it.extraCommands = c } CoroutineScope(Dispatchers.IO).launch { items.forEach { downloadViewModel.updateDownload(it) } } + returnValue(c) bottomSheet.dismiss() } } diff --git a/app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/DownloadVideoFragment.kt b/app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/DownloadVideoFragment.kt index 6d7a3c35..ef7b5ead 100644 --- a/app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/DownloadVideoFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/DownloadVideoFragment.kt @@ -457,10 +457,11 @@ class DownloadVideoFragment(private var resultItem: ResultItem? = null, private alsoDownloadAsAudioClicked = { downloadItem.videoPreferences.alsoDownloadAsAudio = it }, - extraCommandsClicked = { + extraCommandsClicked = { returnValue -> val callback = object : ExtraCommandsListener { override fun onChangeExtraCommand(c: String) { downloadItem.extraCommands = c + returnValue(c) } } diff --git a/app/src/main/java/com/deniscerri/ytdl/ui/more/WebViewActivity.kt b/app/src/main/java/com/deniscerri/ytdl/ui/more/WebViewActivity.kt index cd1450bf..63ba33ab 100644 --- a/app/src/main/java/com/deniscerri/ytdl/ui/more/WebViewActivity.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/more/WebViewActivity.kt @@ -75,14 +75,10 @@ class WebViewActivity : BaseActivity() { } toolbar.menu.children.firstOrNull { it.itemId == R.id.incognito }?.isChecked = incognito + toolbar.menu.children.firstOrNull { it.itemId == R.id.get_data_sync_id }?.isVisible = false toolbar.setOnMenuItemClickListener { m : MenuItem -> when(m.itemId) { - R.id.get_data_sync_id -> { - webView?.evaluateJavascript("ytcfg.get('DATASYNC_ID')") { id -> - UiUtil.copyToClipboard(id.replace("\"", ""), this@WebViewActivity) - } - } R.id.incognito -> { intent.putExtra("incognito", !incognito) recreate() diff --git a/app/src/main/java/com/deniscerri/ytdl/ui/more/settings/MainSettingsFragment.kt b/app/src/main/java/com/deniscerri/ytdl/ui/more/settings/MainSettingsFragment.kt index a2b2251a..8804b6ea 100644 --- a/app/src/main/java/com/deniscerri/ytdl/ui/more/settings/MainSettingsFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/more/settings/MainSettingsFragment.kt @@ -492,7 +492,7 @@ class MainSettingsFragment : PreferenceFragmentCompat() { val builder = MaterialAlertDialogBuilder(requireContext()) builder.setTitle(getString(R.string.restore)) - builder.setMessage("${getString(R.string.restore_complete)}\n $restoreDataMessage") + builder.setMessage("${getString(R.string.restore_complete)}\n$restoreDataMessage") builder.setCancelable(false) builder.setPositiveButton( getString(R.string.ok) diff --git a/app/src/main/java/com/deniscerri/ytdl/ui/more/terminal/TerminalFragment.kt b/app/src/main/java/com/deniscerri/ytdl/ui/more/terminal/TerminalFragment.kt index 1d7134d6..ebac5157 100644 --- a/app/src/main/java/com/deniscerri/ytdl/ui/more/terminal/TerminalFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/more/terminal/TerminalFragment.kt @@ -173,16 +173,24 @@ class TerminalFragment : Fragment() { if (shortcutCount > 0){ UiUtil.showShortcuts(requireActivity(), commandTemplateViewModel, itemSelected = {sh -> - val txt = "${input.text} $sh" + val txt = "${input.text.trim()} $sh" input.setText(txt) + input.setSelection(input.text.length) }, itemRemoved = {removed -> - input.setText(input.text.replace("(${Regex.escape(removed)})(?!.*\\1)".toRegex(), "").trimEnd()) + input.setText(input.text.replace("(${Regex.escape(removed)})(?!.*\\1)".toRegex(), "").trim()) input.setSelection(input.text.length) }) } } } + R.id.filename_template -> { + UiUtil.showFilenameTemplateDialog(requireActivity(), "") { filenameSelected -> + val txt = "${input.text.replace("-o\\s+(?:\"([^\"]+)\"|(\\S+))".toRegex(), "").trim()} -o \"$filenameSelected\"" + input.setText(txt) + input.setSelection(input.text.length) + } + } R.id.folder -> { val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE) intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION) 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 fb3388ae..1f4deed5 100644 --- a/app/src/main/java/com/deniscerri/ytdl/util/Extensions.kt +++ b/app/src/main/java/com/deniscerri/ytdl/util/Extensions.kt @@ -24,12 +24,14 @@ import android.util.TypedValue import android.view.MotionEvent import android.view.View import android.view.ViewGroup +import android.view.ViewGroupOverlay import android.view.ViewOutlineProvider import android.view.animation.Interpolator import android.widget.EditText import android.widget.ImageView import android.widget.ScrollView import android.widget.TextView +import androidx.annotation.OptIn import androidx.annotation.Px import androidx.core.content.ContextCompat import androidx.core.graphics.drawable.DrawableCompat @@ -44,8 +46,12 @@ import com.deniscerri.ytdl.database.models.DownloadItem import com.deniscerri.ytdl.database.models.observeSources.ObserveSourcesItem import com.deniscerri.ytdl.database.repository.DownloadRepository import com.deniscerri.ytdl.database.repository.ObserveSourcesRepository.EveryCategory +import com.google.android.material.badge.BadgeDrawable +import com.google.android.material.badge.BadgeUtils +import com.google.android.material.badge.ExperimentalBadgeUtils 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.tabs.TabLayout import com.neoutils.highlight.core.Highlight import com.neoutils.highlight.core.scheme.TextColorScheme @@ -284,6 +290,23 @@ object Extensions { animator.start() } + @OptIn(ExperimentalBadgeUtils::class) + fun Chip.createBadge(context: Context, nr: Int) { + this.overlay.clear() + if (nr > 0) { + val badge = BadgeDrawable.create(context).apply { + number = nr + backgroundColor = context.getColor(R.color.white) + verticalOffset = 25 + horizontalOffset = + if (nr < 10) dp(App.instance.resources, 17f) + else if (nr < 100) dp(App.instance.resources, 19f) + else dp(App.instance.resources, 22f) + } + BadgeUtils.attachBadgeDrawable(badge, this) + } + } + fun TabLayout.Tab.createBadge(nr: Int){ removeBadge() if (nr > 0) { diff --git a/app/src/main/java/com/deniscerri/ytdl/util/UiUtil.kt b/app/src/main/java/com/deniscerri/ytdl/util/UiUtil.kt index 8cbb36fb..15ebaeac 100644 --- a/app/src/main/java/com/deniscerri/ytdl/util/UiUtil.kt +++ b/app/src/main/java/com/deniscerri/ytdl/util/UiUtil.kt @@ -67,6 +67,7 @@ import com.deniscerri.ytdl.database.viewmodel.CommandTemplateViewModel import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel import com.deniscerri.ytdl.database.viewmodel.YTDLPViewModel import com.deniscerri.ytdl.ui.downloadcard.VideoCutListener +import com.deniscerri.ytdl.util.Extensions.createBadge import com.deniscerri.ytdl.util.Extensions.enableTextHighlight import com.deniscerri.ytdl.util.Extensions.getMediaDuration import com.deniscerri.ytdl.util.Extensions.toStringDuration @@ -1318,7 +1319,7 @@ object UiUtil { recodeVideoClicked: (Boolean) -> Unit, compatibilityModeClicked: (Boolean) -> Unit, alsoDownloadAsAudioClicked: (Boolean) -> Unit, - extraCommandsClicked: () -> Unit, + extraCommandsClicked: (changed: (newExtraCommandString: String) -> Unit) -> Unit, liveFromStart: (Boolean) -> Unit, waitForVideo: (Boolean, Int) -> Unit, ){ @@ -1362,6 +1363,18 @@ object UiUtil { val adjustSubtitles = view.findViewById(R.id.adjust_subtitles) + fun calculateAdjustSubtitlesChangeCount() { + if (items.size == 1) { + val firstItem = items.first() + val count = listOf( + firstItem.videoPreferences.embedSubs, + firstItem.videoPreferences.writeSubs, + firstItem.videoPreferences.writeAutoSubs, + ) + adjustSubtitles.createBadge(context, count.filter { it }.size) + } + } + calculateAdjustSubtitlesChangeCount() adjustSubtitles.setOnClickListener { val adjustSubtitleView = context.layoutInflater.inflate(R.layout.subtitle_download_preferences_dialog, null) val embedSubs = adjustSubtitleView.findViewById(R.id.embed_subtitles) @@ -1376,6 +1389,9 @@ object UiUtil { embedSubs.setOnClickListener { subtitleLanguages.isClickable = embedSubs.isChecked || saveSubtitles.isChecked embedSubsClicked(embedSubs.isChecked) + + items.forEach { it.videoPreferences.embedSubs = embedSubs.isChecked } + calculateAdjustSubtitlesChangeCount() } if (items.all { it.videoPreferences.writeSubs}) { @@ -1391,11 +1407,15 @@ object UiUtil { saveSubtitles.setOnCheckedChangeListener { _, _ -> subtitleLanguages.isClickable = embedSubs.isChecked || saveSubtitles.isChecked || saveAutoSubtitles.isChecked saveSubtitlesClicked(saveSubtitles.isChecked) + items.forEach { it.videoPreferences.writeSubs = saveSubtitles.isChecked } + calculateAdjustSubtitlesChangeCount() } saveAutoSubtitles.setOnCheckedChangeListener { _, _ -> subtitleLanguages.isClickable = embedSubs.isChecked || saveSubtitles.isChecked || saveAutoSubtitles.isChecked saveAutoSubtitlesClicked(saveAutoSubtitles.isChecked) + items.forEach { it.videoPreferences.writeAutoSubs = saveAutoSubtitles.isChecked } + calculateAdjustSubtitlesChangeCount() } subtitleLanguages.isClickable = embedSubs.isChecked || saveSubtitles.isChecked @@ -1424,12 +1444,19 @@ object UiUtil { if (items.size == 1){ val adjustAudio = view.findViewById(R.id.adjust_audio) + fun calculateAdjustAudioChanges() { + val count = listOf(items.first().videoPreferences.removeAudio, items.first().videoPreferences.alsoDownloadAsAudio) + adjustAudio.createBadge(context, count.filter { it }.size) + } + calculateAdjustAudioChanges() adjustAudio.setOnClickListener { val adjustAudioView = context.layoutInflater.inflate(R.layout.audio_download_preferences_dialog, null) adjustAudioView.findViewById(R.id.remove_audio).apply { isChecked = items.first().videoPreferences.removeAudio setOnCheckedChangeListener { _, b -> removeAudioClicked(b) + items.first().videoPreferences.removeAudio = b + calculateAdjustAudioChanges() } } @@ -1437,6 +1464,8 @@ object UiUtil { isChecked = items.first().videoPreferences.alsoDownloadAsAudio setOnCheckedChangeListener { _, b -> alsoDownloadAsAudioClicked(b) + items.first().videoPreferences.alsoDownloadAsAudio = b + calculateAdjustAudioChanges() } } @@ -1462,6 +1491,13 @@ object UiUtil { } val recodeVideo = view.findViewById(R.id.recode_video) + fun calculateRecodeVideoChanges() { + if (items.size == 1) { + val count = listOf(items.first().videoPreferences.recodeVideo, items.first().videoPreferences.compatibilityMode) + recodeVideo.createBadge(context, count.filter { it }.size) + } + } + calculateRecodeVideoChanges() recodeVideo.setOnClickListener { val adjustVideoView = context.layoutInflater.inflate(R.layout.video_download_preferences_dialog, null) @@ -1475,6 +1511,7 @@ object UiUtil { compatibilityModeSwitch.isChecked = false compatibilityModeClicked(false) + recodeVideo.createBadge(context, if (isChecked) 1 else 0) } } @@ -1485,6 +1522,7 @@ object UiUtil { recodeVideoSwitch.isChecked = false recodeVideoClicked(false) + recodeVideo.createBadge(context, if (isChecked) 1 else 0) } } @@ -1559,6 +1597,9 @@ object UiUtil { val sponsorBlock = view.findViewById(R.id.sponsorblock_filters) sponsorBlock.isEnabled = sharedPreferences.getBoolean("use_sponsorblock", true) + if (items.size == 1 && sponsorBlock.isEnabled) { + sponsorBlock.createBadge(context, items.first().videoPreferences.sponsorBlockFilters.size) + } sponsorBlock!!.setOnClickListener { val builder = MaterialAlertDialogBuilder(context) builder.setTitle(context.getString(R.string.select_sponsorblock_filtering)) @@ -1583,6 +1624,9 @@ object UiUtil { builder.setPositiveButton( context.getString(R.string.ok) ) { _: DialogInterface?, _: Int -> + if (items.size == 1) { + sponsorBlock.createBadge(context, checkedItems.filter { it }.size) + } sponsorBlockItemsSet(values, checkedItems) } @@ -1658,10 +1702,18 @@ object UiUtil { } val extraCommands = view.findViewById(R.id.extra_commands) + if (items.size == 1) { + extraCommands.createBadge(context, if (items.first().extraCommands.isNotBlank()) 1 else 0) + } if (sharedPreferences.getBoolean("use_extra_commands", false)){ extraCommands.visibility = View.VISIBLE extraCommands.setOnClickListener { - extraCommandsClicked() + extraCommandsClicked { newExtraCommandString -> + items.forEach { it.extraCommands = newExtraCommandString } + if (items.size == 1) { + extraCommands.createBadge(context, if (newExtraCommandString.isNotBlank()) 1 else 0) + } + } } }else{ extraCommands.visibility = View.GONE @@ -1681,8 +1733,10 @@ object UiUtil { cutClicked: (VideoCutListener) -> Unit, cutDisabledClicked: () -> Unit, cutValueChanged: (String) -> Unit, - extraCommandsClicked: () -> Unit + extraCommandsClicked: (changed: (newExtraCommandString: String) -> Unit) -> Unit ){ + val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context) + val embedThumb = view.findViewById(R.id.embed_thumb) val cropThumb = view.findViewById(R.id.crop_thumb) @@ -1751,6 +1805,10 @@ object UiUtil { } val sponsorBlock = view.findViewById(R.id.sponsorblock_filters) + sponsorBlock.isEnabled = sharedPreferences.getBoolean("use_sponsorblock", true) + if (items.size == 1 && sponsorBlock.isEnabled) { + sponsorBlock.createBadge(context, items.first().videoPreferences.sponsorBlockFilters.size) + } sponsorBlock!!.setOnClickListener { val builder = MaterialAlertDialogBuilder(context) builder.setTitle(context.getString(R.string.select_sponsorblock_filtering)) @@ -1775,6 +1833,9 @@ object UiUtil { builder.setPositiveButton( context.getString(R.string.ok) ) { _: DialogInterface?, _: Int -> + if (items.size == 1) { + sponsorBlock.createBadge(context, checkedItems.filter { it }.size) + } sponsorBlockItemsSet(values, checkedItems) } @@ -1829,14 +1890,19 @@ object UiUtil { } } - - val extraCommands = view.findViewById(R.id.extra_commands) - val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context) + if (items.size == 1) { + extraCommands.createBadge(context, if (items.first().extraCommands.isNotBlank()) 1 else 0) + } if (sharedPreferences.getBoolean("use_extra_commands", false)){ extraCommands.visibility = View.VISIBLE extraCommands.setOnClickListener { - extraCommandsClicked() + extraCommandsClicked { newExtraCommandString -> + items.forEach { it.extraCommands = newExtraCommandString } + if (items.size == 1) { + extraCommands.createBadge(context, if (newExtraCommandString.isNotBlank()) 1 else 0) + } + } } }else{ extraCommands.visibility = View.GONE diff --git a/app/src/main/java/com/deniscerri/ytdl/util/extractors/YTDLPUtil.kt b/app/src/main/java/com/deniscerri/ytdl/util/extractors/YTDLPUtil.kt index 6896762b..bf689c5c 100644 --- a/app/src/main/java/com/deniscerri/ytdl/util/extractors/YTDLPUtil.kt +++ b/app/src/main/java/com/deniscerri/ytdl/util/extractors/YTDLPUtil.kt @@ -133,7 +133,10 @@ class YTDLPUtil(private val context: Context, private val commandTemplateDao: Co request.setYoutubeExtractorArgs(query) } - request.addOption("--flat-playlist") + if (!sharedPreferences.getBoolean("no_flat_playlist", false)) { + request.addOption("--flat-playlist") + } + request.addOption("--lazy-playlist") request.addOption(if (singleItem) "-J" else "-j") request.applyDefaultOptionsForFetchingData(if (query.isURL()) query else null) @@ -508,6 +511,7 @@ class YTDLPUtil(private val context: Context, private val commandTemplateDao: Co if (formatProper.format_note.contains("storyboard", ignoreCase = true)) continue + formatProper.format_note = formatProper.format_note.trim() formatProper.container = format.getString("ext") if (formatProper.tbr == "None") formatProper.tbr = "" if (!formatProper.tbr.isNullOrBlank()){ @@ -817,9 +821,6 @@ class YTDLPUtil(private val context: Context, private val commandTemplateDao: Co request.addOption("--socket-timeout", socketTimeout) } - val sponsorblockURL = sharedPreferences.getString("sponsorblock_url", "")!! - if (sponsorblockURL.isNotBlank()) request.addOption("--sponsorblock-api", sponsorblockURL) - if (sharedPreferences.getBoolean("restrict_filenames", true)) request.addOption("--restrict-filenames") if (sharedPreferences.getBoolean("force_ipv4", false)){ request.addOption("-4") @@ -1426,6 +1427,11 @@ class YTDLPUtil(private val context: Context, private val commandTemplateDao: Co request.addOption(downloadItem.extraCommands) } + if (request.toString().contains("sponsorblock")) { + val sponsorBlockURL = sharedPreferences.getString("sponsorblock_url", "")!! + if (sponsorBlockURL.isNotBlank()) request.addOption("--sponsorblock-api", sponsorBlockURL) + } + val cache = File(FileUtil.getCachePath(context)) cache.mkdirs() val conf = File(cache.absolutePath + "/${System.currentTimeMillis()}${UUID.randomUUID()}.txt") diff --git a/app/src/main/res/layout/command_template_item.xml b/app/src/main/res/layout/command_template_item.xml index c3b3d069..a60345b5 100644 --- a/app/src/main/res/layout/command_template_item.xml +++ b/app/src/main/res/layout/command_template_item.xml @@ -118,7 +118,7 @@ android:layout_width="wrap_content" android:visibility="gone" android:layout_height="wrap_content" - android:text="URL Regex" + android:text="@string/url_regex" android:background="@drawable/rounded_corner" android:backgroundTint="?attr/colorTertiaryContainer" android:clickable="false" @@ -130,8 +130,7 @@ app:cornerRadius="10dp" app:layout_constraintTop_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintEnd_toEndOf="parent" - tools:ignore="HardcodedText" /> + app:layout_constraintEnd_toEndOf="parent"/> diff --git a/app/src/main/res/layout/fragment_generate_youtube_po_token.xml b/app/src/main/res/layout/fragment_generate_youtube_po_token.xml index 5b446be0..ddb50608 100644 --- a/app/src/main/res/layout/fragment_generate_youtube_po_token.xml +++ b/app/src/main/res/layout/fragment_generate_youtube_po_token.xml @@ -51,11 +51,10 @@ android:layout_marginEnd="10dp" android:textSize="15sp" android:textStyle="bold" - android:text="PO Token (GVS)" + android:text="@string/potoken_gvs" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" - tools:ignore="HardcodedText" /> + app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="parent"/> + app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="parent"/> + android:text="@string/potoken"/> + + android:title="@string/get_data_sync_id" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7cf0472d..a56bded0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -490,4 +490,13 @@ Smallest Largest Don\'t prefer DRC Audio + PO Token (GVS) + PO Token (Player) + PO Token (Subs) + Visitor Data + Visitor Data + Desktop + URL Regex + Disable flat playlist + Don\'t use --flat-playlist. Slower data fetching, but more data rich diff --git a/app/src/main/res/xml/advanced_preferences.xml b/app/src/main/res/xml/advanced_preferences.xml index 17aa858e..2b3468a6 100644 --- a/app/src/main/res/xml/advanced_preferences.xml +++ b/app/src/main/res/xml/advanced_preferences.xml @@ -79,6 +79,15 @@ android:title="@string/disable_write_info_json" /> + + + +