Extd cut parameter

This commit is contained in:
Javanaut
2026-04-11 20:27:58 +02:00
parent 0a41998e29
commit 5eee7e1161
3 changed files with 195 additions and 7 deletions

View File

@@ -17,6 +17,8 @@ from ffx.constants import (
DEFAULT_AC3_BANDWIDTH,
DEFAULT_CROPDETECT_DURATION_SECONDS,
DEFAULT_CROPDETECT_SEEK_SECONDS,
DEFAULT_cut_length,
DEFAULT_cut_start,
DEFAULT_CONTAINER_EXTENSION,
DEFAULT_CONTAINER_FORMAT,
DEFAULT_DTS_BANDWIDTH,
@@ -45,6 +47,14 @@ CROPDETECT_DURATION_OPTION_HELP = (
"Analyze this many seconds for crop detection. "
+ "Shorter windows are faster; longer windows are usually steadier."
)
DEFAULT_CUT_OPTION_VALUE = f"{DEFAULT_cut_start},{DEFAULT_cut_length}"
CUT_OPTION_HELP = (
"Cut output in seconds. "
+ f"Use --cut for the default {DEFAULT_CUT_OPTION_VALUE}, "
+ "--cut DURATION to cut from 0 for DURATION seconds, "
+ "or --cut START,DURATION for an explicit start and duration. "
+ "Omit to disable."
)
def normalizeNicenessOption(ctx, param, value):
@@ -65,6 +75,48 @@ def normalizeCpuOption(ctx, param, value):
raise click.BadParameter(str(ex)) from ex
def parseCutOptionValue(value) -> tuple[int, int] | None:
if value is None:
return None
cutValue = str(value).strip()
if not cutValue:
raise ValueError(
"Cut value must be DURATION or START,DURATION, or use --cut without a value."
)
cutTokens = [token.strip() for token in cutValue.split(',')]
try:
if len(cutTokens) == 1:
cutStart = 0
cutLength = int(cutTokens[0])
elif len(cutTokens) == 2:
cutStart = int(cutTokens[0])
cutLength = int(cutTokens[1])
else:
raise ValueError
except ValueError as ex:
raise ValueError(
"Cut value must be DURATION or START,DURATION, or use --cut without a value."
) from ex
if cutStart < 0:
raise ValueError("Cut start must be 0 or greater.")
if cutLength <= 0:
raise ValueError("Cut duration must be greater than 0.")
return cutStart, cutLength
def normalizeCutOption(ctx, param, value):
try:
return parseCutOptionValue(value)
except ValueError as ex:
raise click.BadParameter(str(ex)) from ex
@click.group()
@click.pass_context
@@ -582,7 +634,16 @@ def checkUniqueDispositions(context, mediaDescriptor: MediaDescriptor):
show_default=True,
help='When --crop auto is used, analyze this many seconds for crop detection.',
)
@click.option("--cut", is_flag=False, flag_value="default", default="none")
@click.option(
"--cut",
type=str,
metavar="DURATION|START,DURATION",
is_flag=False,
flag_value=DEFAULT_CUT_OPTION_VALUE,
default=None,
callback=normalizeCutOption,
help=CUT_OPTION_HELP,
)
@click.option("--output-directory", type=str, default='')
@@ -823,13 +884,15 @@ def convert(ctx,
#->
# Process cut parameters
context['perform_cut'] = (cut != 'none')
context['perform_cut'] = (cut is not None)
if context['perform_cut']:
cutTokens = cut.split(',')
if cutTokens and len(cutTokens) == 2:
context['cut_start'] = int(cutTokens[0])
context['cut_length'] = int(cutTokens[1])
ctx.obj['logger'].debug(f"Cut start={context['cut_start']} length={context['cut_length']}")
context['cut_start'], context['cut_length'] = cut
click.echo(
f"Cutting enabled: start {context['cut_start']} s, duration {context['cut_length']} s."
)
ctx.obj['logger'].debug(
f"Cut start={context['cut_start']} length={context['cut_length']}"
)
tc = TmdbController() if context['use_tmdb'] else None