diff --git a/src/vban_cli/gainlayer.py b/src/vban_cli/gainlayer.py new file mode 100644 index 0000000..e425b22 --- /dev/null +++ b/src/vban_cli/gainlayer.py @@ -0,0 +1,51 @@ +from typing import Annotated + +from cyclopts import App, Argument, Parameter + +from . import console +from .context import Context +from .help import GainlayerHelpFormatter + +app = App(name='gainlayer', help_formatter=GainlayerHelpFormatter()) + + +@app.meta.default +def launcher( + gainlayer_index: Annotated[int, Argument()] = None, + *tokens: Annotated[str, Parameter(show=False, allow_leading_hyphen=True)], + index: Annotated[int, Argument()] = None, + ctx: Annotated[Context, Parameter(show=False)] = None, +): + """Control the gainlayers.""" + additional_kwargs = {} + command, bound, _ = app.parse_args(tokens) + if index is not None and gainlayer_index is not None: + additional_kwargs['strip_index'] = index + additional_kwargs['gainlayer_index'] = gainlayer_index + else: + raise ValueError('Both gainlayer_index and index must be provided.') + if ctx is not None: + additional_kwargs['ctx'] = ctx + + return command(*bound.args, **bound.kwargs, **additional_kwargs) + + +@app.command(name='level') +def level( + new_level: Annotated[float, Argument()] = None, + *, + strip_index: Annotated[int, Parameter(show=False)] = None, + gainlayer_index: Annotated[int, Parameter(show=False)] = None, + ctx: Annotated[Context, Parameter(show=False)] = None, +): + """Get or set the level of the specified gainlayer. + + Parameters + ---------- + new_level : float + If provided, sets the level to this value. If not provided, the current level is printed. + """ + if new_level is None: + console.out.print(ctx.client.strip[strip_index].gainlayer[gainlayer_index].gain) + return + ctx.client.strip[strip_index].gainlayer[gainlayer_index].gain = new_level diff --git a/src/vban_cli/help.py b/src/vban_cli/help.py index 51eaa58..3bfc286 100644 --- a/src/vban_cli/help.py +++ b/src/vban_cli/help.py @@ -95,6 +95,22 @@ class EqHelpFormatter(BaseHelpFormatter): console.print(f'[bold]Usage:[/bold] {modified_usage}') +class GainlayerHelpFormatter(BaseHelpFormatter): + """Help formatter for gainlayer commands that works with strip commands. + + Injects after 'strip' and after 'gainlayer'.""" + + def render_usage(self, console: Console, options: ConsoleOptions, usage) -> None: + """Render the usage line with proper placement for strip commands.""" + if usage: + modified_usage = re.sub( + r'(\S+\s+strip)(\s+gainlayer\s+)(COMMAND)', + r'\1 \2<[cyan]gainlayer_index[/cyan]> \3', + str(usage), + ) + console.print(f'[bold]Usage:[/bold] {modified_usage}') + + class CellHelpFormatter(BaseHelpFormatter): """Help formatter for cell commands that works with both strip and bus commands. @@ -105,7 +121,7 @@ class CellHelpFormatter(BaseHelpFormatter): if usage: modified_usage = re.sub( r'(\S+\s+)(\w+)(\s+eq\s+cell\s+)(COMMAND)', - r'\1\2 \3 \4', + r'\1\2 \3<[cyan]band[/cyan]> \4', str(usage), ) console.print(f'[bold]Usage:[/bold] {modified_usage}') diff --git a/src/vban_cli/strip.py b/src/vban_cli/strip.py index da9b7c3..70cd0a7 100644 --- a/src/vban_cli/strip.py +++ b/src/vban_cli/strip.py @@ -2,7 +2,7 @@ from typing import Annotated, Optional from cyclopts import App, Argument, Parameter -from . import comp, console, denoiser, eq, gate +from . import comp, console, denoiser, eq, gainlayer, gate from .context import Context from .help import StripHelpFormatter @@ -11,6 +11,7 @@ app.command(eq.app.meta, name='eq') app.command(comp.app.meta, name='comp') app.command(gate.app.meta, name='gate') app.command(denoiser.app.meta, name='denoiser') +app.command(gainlayer.app.meta, name='gainlayer') @app.meta.default