Extd cut parameter
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user