From e6734cb4efe29fbec4782d1d8995b69f2710d483 Mon Sep 17 00:00:00 2001 From: Maveno Date: Sat, 14 Sep 2024 14:12:27 +0200 Subject: [PATCH] inc handling dispositions --- bin/ffx.py | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/bin/ffx.py b/bin/ffx.py index 9ee17ef..730b693 100755 --- a/bin/ffx.py +++ b/bin/ffx.py @@ -409,8 +409,8 @@ def streams(filename): @click.option('-dts', '--dts-bitrate', type=int, default=DEFAULT_DTS_BANDWIDTH, help=f"Bitrate in kbit/s to be used to encode 6.1 audio streams (default: {DEFAULT_DTS_BANDWIDTH})") @click.option('-ds', '--default-subtitle', type=int, default=-1, help='Index of default subtitle stream') +@click.option('-fa', '--forced-subtitle', type=int, default=-1, help='Index of forced subtitle stream') # (including default audio stream tag) -@click.option('-fa', '--forced-audio', type=int, default=-1, help='Index of forced audio stream (including default audio stream tag)') @click.option('-da', '--default-audio', type=int, default=-1, help='Index of default audio stream') @@ -427,7 +427,7 @@ def streams(filename): @click.option("--dry-run", is_flag=True, default=False) -def convert(ctx, paths, label, video_encoder, quality, preset, stereo_bitrate, ac3_bitrate, dts_bitrate, default_subtitle, forced_audio, default_audio, crop, output_directory, clear_metadata, denoise, no_jellyfin_tweaks, dry_run): +def convert(ctx, paths, label, video_encoder, quality, preset, stereo_bitrate, ac3_bitrate, dts_bitrate, default_subtitle, forced_subtitle, default_audio, crop, output_directory, clear_metadata, denoise, no_jellyfin_tweaks, dry_run): """Batch conversion of audiovideo files in format suitable for web playback, e.g. jellyfin Files found under PATHS will be converted according to parameters. @@ -569,19 +569,30 @@ def convert(ctx, paths, label, video_encoder, quality, preset, stereo_bitrate, a audioTokens = [] + audioStreams = streamDescriptor[STREAM_TYPE_AUDIO] + subtitleStreams = streamDescriptor[STREAM_TYPE_SUBTITLE] if default_audio == -1: - sourceAudioStreams = streamDescriptor[STREAM_TYPE_AUDIO] + sourceAudioStreams = audioStreams else: - sourceAudioStreams = getReorderedSubstreams(streamDescriptor[STREAM_TYPE_AUDIO], default_audio) + for streamIndex in range(len(audioStreams)): + audioStreams[streamIndex]['disposition']['default'] = 1 if streamIndex == default_audio else 0 + sourceAudioStreams = getReorderedSubstreams(audioStreams, default_audio) dispositionTokens += generateDispositionTokens(sourceAudioStreams) + if forced_subtitle != -1: + for streamIndex in range(len(subtitleStreams)): + subtitleStreams[streamIndex]['disposition']['forced'] = 1 if streamIndex == forced_subtitle else 0 + if default_subtitle == -1: - sourceSubtitleStreams = streamDescriptor[STREAM_TYPE_SUBTITLE] + sourceSubtitleStreams = subtitleStreams else: - sourceSubtitleStreams = getReorderedSubstreams(streamDescriptor[STREAM_TYPE_SUBTITLE], default_subtitle) + for streamIndex in range(len(subtitleStreams)): + subtitleStreams[streamIndex]['disposition']['default'] = 1 if streamIndex == default_subtitle else 0 + sourceSubtitleStreams = getReorderedSubstreams(subtitleStreams, default_subtitle) dispositionTokens += generateDispositionTokens(sourceSubtitleStreams) + for audioStream in sourceAudioStreams: mappingTokens += ['-map', f"a:{audioStream['src_sub_index']}"] audioTokens += generateAudioTokens(context, audioStream['src_sub_index'], audioStream['layout'])