add ffmpeg preset preference in app for burn subs compatible recoder plugin

pull/1366/head
deniscerri 3 days ago
parent 74a1c21de0
commit 35e6985f77
No known key found for this signature in database
GPG Key ID: 95C43D517D830350

@ -4,6 +4,10 @@ import tempfile
from yt_dlp.postprocessor.ffmpeg import FFmpegPostProcessor
class BurnSubsPP(FFmpegPostProcessor):
def __init__(self, downloader=None, preset=None):
super().__init__(downloader)
self.preset = preset
def run(self, info):
subs = info.get('requested_subtitles') or {}
@ -32,17 +36,14 @@ class BurnSubsPP(FFmpegPostProcessor):
# Basic filter string; drop fixed /system/fonts to avoid Android OS permission crashes
vf_filter = f"subtitles='{esc_sub}'"
opts = ['-vf', vf_filter, '-c:v', 'libx264']
if self.preset and str(self.preset).strip():
opts.extend(['-preset', str(self.preset).strip()])
opts.extend(['-crf', '20', '-c:a', 'copy'])
self.run_ffmpeg_multiple_files(
[path], temp_out,
[
'-vf', vf_filter,
'-c:v', 'libx264',
'-preset', 'ultrafast',
'-crf', '20',
'-c:a', 'copy'
]
)
self.run_ffmpeg_multiple_files([path], temp_out, opts)
os.replace(temp_out, path)
info['filepath'] = path

@ -51,6 +51,10 @@ class CompatibleRecoderPP(FFmpegPostProcessor):
'png',
}
def __init__(self, downloader=None, preset=None):
super().__init__(downloader)
self.preset = str(preset).strip() if preset and str(preset).strip() else None
def _stream_codec(self, stream):
"""Return the codec name and codec tag as lowercase strings."""
codec_name = (stream.get('codec_name') or '').lower()
@ -238,6 +242,13 @@ class CompatibleRecoderPP(FFmpegPostProcessor):
codec,
]
# Apply preset to x264 re-encodes (omit if copying or no preset provided)
if codec == 'libx264' and self.preset:
options += [
f'-preset:{video_index}',
self.preset,
]
# Preserve an already embedded thumbnail as cover art.
if item['attached_pic']:
options += [

@ -60,6 +60,7 @@ import com.deniscerri.ytdl.ui.downloads.DownloadQueueMainFragment
import com.deniscerri.ytdl.ui.downloads.HistoryFragment
import com.deniscerri.ytdl.ui.more.settings.SettingsActivity
import com.deniscerri.ytdl.util.ApkInstallUtil
import com.deniscerri.ytdl.util.BgUtilsPoTokenGeneratorUtil
import com.deniscerri.ytdl.util.CrashListener
import com.deniscerri.ytdl.util.NavbarUtil
import com.deniscerri.ytdl.util.NavbarUtil.applyNavBarStyle
@ -238,6 +239,13 @@ class MainActivity : BaseActivity() {
setupWithNavController(navController)
//terminate button
menu.getItem(8).setOnMenuItemClickListener {
fun terminateApp() {
BgUtilsPoTokenGeneratorUtil.releaseServer(context, 0)
finishAndRemoveTask()
finishAffinity()
exitProcess(0)
}
if (preferences.getBoolean("ask_terminate_app", true)){
var doNotShowAgain = false
val terminateDialog = MaterialAlertDialogBuilder(this@MainActivity)
@ -264,16 +272,13 @@ class MainActivity : BaseActivity() {
if (doNotShowAgain){
preferences.edit().putBoolean("ask_terminate_app", false).apply()
}
finishAndRemoveTask()
finishAffinity()
exitProcess(0)
terminateApp()
}
}
}
terminateDialog.show()
}else{
finishAndRemoveTask()
exitProcess(0)
terminateApp()
}
true
}

@ -1138,6 +1138,8 @@ class YTDLPUtil(private val context: Context, private val commandTemplateDao: Co
request.addOption("--download-archive", FileUtil.getDownloadArchivePath(context))
}
val internalPluginFFmpegPreset = sharedPreferences.getString("internal_plugin_ffmpeg_preset", "")
val preferredAudioCodec = sharedPreferences.getString("audio_codec", "")!!
val aCodecPrefIndex = context.getStringArray(R.array.audio_codec_values).indexOf(preferredAudioCodec)
var aCodecPref = runCatching { context.getStringArray(R.array.audio_codec_values_ytdlp)[aCodecPrefIndex] }.getOrElse { "" }
@ -1322,6 +1324,34 @@ class YTDLPUtil(private val context: Context, private val commandTemplateDao: Co
metadataCommands.add("--embed-metadata")
}
if (downloadItem.videoPreferences.writeSubs){
request.addOption("--write-subs")
}
if(downloadItem.videoPreferences.writeAutoSubs){
request.addOption("--write-auto-subs")
}
if (downloadItem.videoPreferences.embedSubs) {
if (sharedPreferences.getBoolean("no_keep_subs", false) && (downloadItem.videoPreferences.writeSubs || downloadItem.videoPreferences.writeAutoSubs)) {
request.addOption("--compat-options", "no-keep-subs")
}
request.addOption("--embed-subs")
}
if (downloadItem.videoPreferences.embedSubs || downloadItem.videoPreferences.writeSubs || downloadItem.videoPreferences.writeAutoSubs){
val subFormat = sharedPreferences.getString("sub_format", "")
if(subFormat!!.isNotBlank()){
request.addOption("--sub-format", "${subFormat}/best")
request.addOption("--convert-subtitles", subFormat)
}
request.addOption("--sub-langs", downloadItem.videoPreferences.subsLanguages.ifEmpty { ".*-orig" })
}
if (downloadItem.videoPreferences.burnSubs) {
request.addOption("--use-postprocessor", "BurnSubs:when=after_move;preset=$internalPluginFFmpegPreset")
}
var cont = ""
val outputContainer = downloadItem.container
@ -1390,7 +1420,7 @@ class YTDLPUtil(private val context: Context, private val commandTemplateDao: Co
if (downloadItem.videoPreferences.compatibilityMode) {
request.addOption("--merge-output-format", "mp4")
request.addOption("--remux-video", "mp4")
request.addOption("--use-postprocessor", "CompatibleRecoder")
request.addOption("--use-postprocessor", "CompatibleRecoder:preset=$internalPluginFFmpegPreset")
vCodecPref = "h264"
aCodecPref = "aac"
}
@ -1563,37 +1593,6 @@ class YTDLPUtil(private val context: Context, private val commandTemplateDao: Co
request.addOption("-f", f.toString().replace("/$".toRegex(), ""))
if (downloadItem.videoPreferences.writeSubs){
request.addOption("--write-subs")
}
if(downloadItem.videoPreferences.writeAutoSubs){
request.addOption("--write-auto-subs")
}
if (downloadItem.videoPreferences.embedSubs) {
if (sharedPreferences.getBoolean("no_keep_subs", false) && (downloadItem.videoPreferences.writeSubs || downloadItem.videoPreferences.writeAutoSubs)) {
request.addOption("--compat-options", "no-keep-subs")
}
request.addOption("--embed-subs")
}
if (downloadItem.videoPreferences.embedSubs || downloadItem.videoPreferences.writeSubs || downloadItem.videoPreferences.writeAutoSubs){
val subFormat = sharedPreferences.getString("sub_format", "")
if(subFormat!!.isNotBlank()){
request.addOption("--sub-format", "${subFormat}/best")
request.addOption("--convert-subtitles", subFormat)
}
request.addOption("--sub-langs", downloadItem.videoPreferences.subsLanguages.ifEmpty { ".*-orig" })
}
if (downloadItem.videoPreferences.burnSubs) {
request.addOption("--use-postprocessor", "BurnSubs:when=after_move")
}
var copyStream = ""
if (downloadItem.videoPreferences.cropValues.isNotBlank()){

@ -0,0 +1,5 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="?android:colorAccent" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp">
<path android:fillColor="@android:color/white" android:pathData="M4,18l8.5,-6L4,6v12zM13,6v12l8.5,-6L13,6z"/>
</vector>

@ -1627,4 +1627,22 @@
<item>external</item>
</string-array>
<string-array name="internal_plugin_ffmpeg_preset">
<item>@string/defaultValue</item>
<item>veryfast</item>
<item>faster</item>
<item>fast</item>
<item>medium</item>
<item>slow</item>
</string-array>
<string-array name="internal_plugin_ffmpeg_preset_values">
<item></item>
<item>veryfast</item>
<item>faster</item>
<item>fast</item>
<item>medium</item>
<item>slow</item>
</string-array>
</resources>

@ -587,6 +587,8 @@
<string name="check_clipboard_home_summary">Automatically detect URLs in clipboard in the home screen</string>
<string name="check_clipboard_home">Check clipboard in the home screen</string>
<string name="clear_info_json">Clear infojsons</string>
<string name="internal_plugin_ffmpeg_preset">Internal Plugin FFmpeg Preset</string>
<string name="internal_plugin_ffmpeg_preset_summary">Preset FFmpeg uses for internal plugins like burn subs etc. Adjusting this preference affects the final file size!</string>
<plurals name="every_hours"><item quantity="one">Every hour</item><item quantity="other">Every %d hours</item></plurals>
<plurals name="every_days"><item quantity="one">Every day</item><item quantity="other">Every %d days</item></plurals>
<plurals name="every_weeks"><item quantity="one">Every week</item><item quantity="other">Every %d weeks</item></plurals>

@ -291,6 +291,15 @@
app:summary="@string/preferred_format_id_summary"
app:title="@string/preferred_format_id" />
<ListPreference
android:defaultValue=""
android:entries="@array/internal_plugin_ffmpeg_preset"
android:entryValues="@array/internal_plugin_ffmpeg_preset_values"
android:icon="@drawable/baseline_fast_forward_24"
app:key="internal_plugin_ffmpeg_preset"
android:summary="@string/internal_plugin_ffmpeg_preset_summary"
app:title="@string/internal_plugin_ffmpeg_preset" />
<SwitchPreferenceCompat
android:widgetLayout="@layout/preferece_material_switch"
app:defaultValue="false"

Loading…
Cancel
Save