mirror of
https://github.com/onyx-and-iris/vban-cli.git
synced 2026-03-03 05:29:11 +00:00
Compare commits
No commits in common. "main" and "v0.9.1" have entirely different histories.
52
README.md
52
README.md
@ -5,6 +5,8 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
This CLI is still in an early stage of development with many more things that could be implemented. However, the commands that are implemented should be working without issues.
|
||||||
|
|
||||||
## Install
|
## Install
|
||||||
|
|
||||||
#### With uv
|
#### With uv
|
||||||
@ -49,7 +51,7 @@ export VBAN_CLI_STREAMNAME=Command1
|
|||||||
|
|
||||||
### Strip Command
|
### Strip Command
|
||||||
|
|
||||||
*Usage: vban-cli strip \<index> COMMAND [OPTIONS]*
|
Usage: vban-cli strip \<index> COMMAND [ARGS]
|
||||||
|
|
||||||
examples:
|
examples:
|
||||||
|
|
||||||
@ -63,9 +65,9 @@ vban-cli strip 2 gain -18.7
|
|||||||
|
|
||||||
see `vban-cli strip --help` for more info.
|
see `vban-cli strip --help` for more info.
|
||||||
|
|
||||||
##### Strip EQ
|
#### Strip EQ
|
||||||
|
|
||||||
*Usage: vban-cli strip \<index> eq COMMAND [OPTIONS]*
|
Usage: vban-cli strip \<index> eq COMMAND [OPTIONS]
|
||||||
|
|
||||||
examples:
|
examples:
|
||||||
|
|
||||||
@ -75,9 +77,9 @@ vban-cli strip 0 eq on true
|
|||||||
|
|
||||||
see `vban-cli strip eq --help` for more info.
|
see `vban-cli strip eq --help` for more info.
|
||||||
|
|
||||||
##### Strip EQ Cell Command
|
#### Strip EQ Cell Command
|
||||||
|
|
||||||
*Usage: vban-cli strip \<index> eq cell \<band> COMMAND [ARGS]*
|
Usage: vban-cli strip \<index> eq cell \<band> COMMAND [ARGS]
|
||||||
|
|
||||||
examples:
|
examples:
|
||||||
|
|
||||||
@ -91,37 +93,9 @@ vban-cli strip 4 eq cell 5 type 5
|
|||||||
|
|
||||||
see `vban-cli strip eq cell --help` for more info.
|
see `vban-cli strip eq cell --help` for more info.
|
||||||
|
|
||||||
##### Strip Comp Command
|
#### Strip Gainlayer Command
|
||||||
|
|
||||||
*Usage: vban-cli strip \<index> comp COMMAND [OPTIONS]*
|
Usage: vban-cli strip \<index> gainlayer \<gainlayer_index> COMMAND [OPTIONS] [ARGS]
|
||||||
|
|
||||||
examples:
|
|
||||||
|
|
||||||
```console
|
|
||||||
vban-cli strip 0 comp attack 2.0
|
|
||||||
|
|
||||||
vban-cli strip 3 comp auto-makeup true
|
|
||||||
```
|
|
||||||
|
|
||||||
see `vban-cli strip comp --help` for more info.
|
|
||||||
|
|
||||||
##### Strip Gate Command
|
|
||||||
|
|
||||||
*Usage: vban-cli strip \<index> gate COMMAND [OPTIONS]*
|
|
||||||
|
|
||||||
examples:
|
|
||||||
|
|
||||||
```console
|
|
||||||
vban-cli strip 2 gate attack 634
|
|
||||||
|
|
||||||
vban-cli strip 5 gate hold 2088.7
|
|
||||||
```
|
|
||||||
|
|
||||||
see `vban-cli strip comp --help` for more info.
|
|
||||||
|
|
||||||
##### Strip Gainlayer Command
|
|
||||||
|
|
||||||
*Usage: vban-cli strip \<index> gainlayer \<gainlayer_index> COMMAND [OPTIONS] [ARGS]*
|
|
||||||
|
|
||||||
examples:
|
examples:
|
||||||
|
|
||||||
@ -135,7 +109,7 @@ see `vban-cli strip gainlayer --help` for more info.
|
|||||||
|
|
||||||
### Bus Command
|
### Bus Command
|
||||||
|
|
||||||
*Usage: vban-cli bus \<index> COMMAND [OPTIONS]*
|
Usage: vban-cli bus \<index> COMMAND [ARGS]
|
||||||
|
|
||||||
examples:
|
examples:
|
||||||
|
|
||||||
@ -149,7 +123,7 @@ see `vban-cli bus --help` for more info.
|
|||||||
|
|
||||||
### Command Command
|
### Command Command
|
||||||
|
|
||||||
*Usage: vban-cli command COMMAND*
|
Usage: vban-cli command COMMAND
|
||||||
|
|
||||||
examples:
|
examples:
|
||||||
|
|
||||||
@ -163,7 +137,7 @@ see `vban-cli command --help` for more info.
|
|||||||
|
|
||||||
### Recorder Command
|
### Recorder Command
|
||||||
|
|
||||||
*Usage: vban-cli recorder COMMAND*
|
Usage: vban-cli recorder COMMAND
|
||||||
|
|
||||||
examples:
|
examples:
|
||||||
|
|
||||||
@ -179,7 +153,7 @@ see `vban-cli recorder --help` for more info.
|
|||||||
|
|
||||||
### Sendtext Command
|
### Sendtext Command
|
||||||
|
|
||||||
*Usage: vban-cli sendtext TEXT*
|
Usage: vban-cli sendtext TEXT
|
||||||
|
|
||||||
examples:
|
examples:
|
||||||
|
|
||||||
|
|||||||
@ -1,13 +1,13 @@
|
|||||||
[project]
|
[project]
|
||||||
name = "vban-cli"
|
name = "vban-cli"
|
||||||
version = "0.12.0"
|
version = "0.9.1"
|
||||||
description = "A command-line interface for Voicemeeter leveraging VBAN."
|
description = "A command-line interface for Voicemeeter leveraging VBAN."
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
license = { text = "LICENSE" }
|
license = { text = "LICENSE" }
|
||||||
requires-python = ">=3.13"
|
requires-python = ">=3.13"
|
||||||
dependencies = ["cyclopts>=4.6.0", "loguru>=0.7.3", "vban-cmd>=2.9.1"]
|
dependencies = ["cyclopts>=4.6.0", "loguru>=0.7.3", "vban-cmd>=2.8.1"]
|
||||||
classifiers = [
|
classifiers = [
|
||||||
"Development Status :: 4 - Beta",
|
"Development Status :: 3 - Alpha",
|
||||||
"Programming Language :: Python",
|
"Programming Language :: Python",
|
||||||
"Programming Language :: Python :: 3.10",
|
"Programming Language :: Python :: 3.10",
|
||||||
"Programming Language :: Python :: 3.11",
|
"Programming Language :: Python :: 3.11",
|
||||||
|
|||||||
@ -3,21 +3,16 @@ from typing import Annotated
|
|||||||
|
|
||||||
import vban_cmd
|
import vban_cmd
|
||||||
from cyclopts import App, Argument, Parameter, config
|
from cyclopts import App, Argument, Parameter, config
|
||||||
from rich.traceback import install as install_rich_traceback
|
|
||||||
|
|
||||||
from . import __version__ as version
|
from . import __version__ as version
|
||||||
from . import bus, command, console, recorder, strip
|
from . import bus, command, console, recorder, strip
|
||||||
from .context import Context
|
from .context import Context
|
||||||
from .error import VbanCLIConnectionError
|
|
||||||
|
|
||||||
app = App(
|
app = App(
|
||||||
config=config.Env(
|
config=config.Env(
|
||||||
'VBAN_CLI_',
|
'VBAN_CLI_',
|
||||||
), # Environment variable prefix for configuration parameters
|
), # Environment variable prefix for configuration parameters
|
||||||
version=version,
|
version=version,
|
||||||
console=console.out,
|
|
||||||
error_console=console.err,
|
|
||||||
exit_on_error=True,
|
|
||||||
)
|
)
|
||||||
app.command(strip.app.meta, name='strip')
|
app.command(strip.app.meta, name='strip')
|
||||||
app.command(bus.app.meta, name='bus')
|
app.command(bus.app.meta, name='bus')
|
||||||
@ -25,8 +20,6 @@ app.command(command.app, name='command')
|
|||||||
app.command(recorder.app, name='recorder')
|
app.command(recorder.app, name='recorder')
|
||||||
app.register_install_completion_command()
|
app.register_install_completion_command()
|
||||||
|
|
||||||
install_rich_traceback(console=console.err)
|
|
||||||
|
|
||||||
|
|
||||||
@Parameter(name='*')
|
@Parameter(name='*')
|
||||||
@dataclass
|
@dataclass
|
||||||
@ -50,17 +43,14 @@ def launcher(
|
|||||||
if command.__name__ == 'sendtext':
|
if command.__name__ == 'sendtext':
|
||||||
disable_rt_listeners = True
|
disable_rt_listeners = True
|
||||||
|
|
||||||
try:
|
|
||||||
with vban_cmd.api(
|
with vban_cmd.api(
|
||||||
vban_config.kind,
|
vban_config.kind,
|
||||||
host=vban_config.host,
|
ip=vban_config.host,
|
||||||
port=vban_config.port,
|
port=vban_config.port,
|
||||||
streamname=vban_config.streamname,
|
streamname=vban_config.streamname,
|
||||||
disable_rt_listeners=disable_rt_listeners,
|
disable_rt_listeners=disable_rt_listeners,
|
||||||
) as client:
|
) as client:
|
||||||
return command(*bound.args, **bound.kwargs, ctx=Context(client=client))
|
return command(*bound.args, **bound.kwargs, ctx=Context(client=client))
|
||||||
except vban_cmd.error.VBANCMDConnectionError as e:
|
|
||||||
raise VbanCLIConnectionError(str(e)) from e
|
|
||||||
|
|
||||||
|
|
||||||
@app.command(name='sendtext')
|
@app.command(name='sendtext')
|
||||||
@ -68,12 +58,16 @@ def sendtext(
|
|||||||
text: Annotated[str, Argument()],
|
text: Annotated[str, Argument()],
|
||||||
/,
|
/,
|
||||||
*,
|
*,
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
ctx: Annotated[Context, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Send a text command to the current Voicemeeter/Matrix instance."""
|
"""Send a text command to the current Voicemeeter/Matrix instance."""
|
||||||
if resp := ctx.client.sendtext(text):
|
if resp := ctx.client.sendtext(text):
|
||||||
app.console.print(resp)
|
console.out.print(resp)
|
||||||
|
|
||||||
|
|
||||||
def run():
|
def run():
|
||||||
|
try:
|
||||||
app.meta()
|
app.meta()
|
||||||
|
except Exception as e:
|
||||||
|
console.err.print(f'Error: {e}')
|
||||||
|
return e.code
|
||||||
|
|||||||
@ -2,6 +2,7 @@ from typing import Annotated, Literal, Optional
|
|||||||
|
|
||||||
from cyclopts import App, Argument, Parameter
|
from cyclopts import App, Argument, Parameter
|
||||||
|
|
||||||
|
from . import console
|
||||||
from .context import Context
|
from .context import Context
|
||||||
from .help import BusHelpFormatter
|
from .help import BusHelpFormatter
|
||||||
|
|
||||||
@ -12,17 +13,18 @@ app = App(name='bus', help_formatter=BusHelpFormatter())
|
|||||||
|
|
||||||
@app.meta.default
|
@app.meta.default
|
||||||
def launcher(
|
def launcher(
|
||||||
index: Annotated[int, Argument()],
|
index: Annotated[int, Argument()] = None,
|
||||||
/,
|
|
||||||
*tokens: Annotated[str, Parameter(show=False, allow_leading_hyphen=True)],
|
*tokens: Annotated[str, Parameter(show=False, allow_leading_hyphen=True)],
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
ctx: Annotated[Context, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Control the bus parameters."""
|
"""Control the bus parameters."""
|
||||||
additional_kwargs = {}
|
additional_kwargs = {}
|
||||||
command, bound, _ = app.parse_args(tokens)
|
command, bound, _ = app.parse_args(tokens)
|
||||||
if tokens[0] == 'eq':
|
if tokens[0] == 'eq':
|
||||||
additional_kwargs['eq_kind'] = app.name[0]
|
additional_kwargs['eq_kind'] = app.name[0]
|
||||||
|
if index is not None:
|
||||||
additional_kwargs['index'] = index
|
additional_kwargs['index'] = index
|
||||||
|
if ctx is not None:
|
||||||
additional_kwargs['ctx'] = ctx
|
additional_kwargs['ctx'] = ctx
|
||||||
|
|
||||||
return command(*bound.args, **bound.kwargs, **additional_kwargs)
|
return command(*bound.args, **bound.kwargs, **additional_kwargs)
|
||||||
@ -34,8 +36,8 @@ def mono(
|
|||||||
Optional[Literal['off', 'mono', 'stereoreverse']], Argument()
|
Optional[Literal['off', 'mono', 'stereoreverse']], Argument()
|
||||||
] = None,
|
] = None,
|
||||||
*,
|
*,
|
||||||
index: Annotated[int, Parameter(parse=False)],
|
index: Annotated[int, Parameter(show=False)] = None,
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
ctx: Annotated[Context, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Get or set the mono state of the specified bus.
|
"""Get or set the mono state of the specified bus.
|
||||||
|
|
||||||
@ -45,7 +47,7 @@ def mono(
|
|||||||
If provided, sets the mono state to this value. If not provided, the current mono state is printed.
|
If provided, sets the mono state to this value. If not provided, the current mono state is printed.
|
||||||
"""
|
"""
|
||||||
if new_value is None:
|
if new_value is None:
|
||||||
app.console.print(['off', 'mono', 'stereoreverse'][ctx.client.bus[index].mono])
|
console.out.print(['off', 'mono', 'stereoreverse'][ctx.client.bus[index].mono])
|
||||||
return
|
return
|
||||||
ctx.client.bus[index].mono = ['off', 'mono', 'stereoreverse'].index(new_value)
|
ctx.client.bus[index].mono = ['off', 'mono', 'stereoreverse'].index(new_value)
|
||||||
|
|
||||||
@ -54,8 +56,8 @@ def mono(
|
|||||||
def mute(
|
def mute(
|
||||||
new_value: Annotated[Optional[bool], Argument()] = None,
|
new_value: Annotated[Optional[bool], Argument()] = None,
|
||||||
*,
|
*,
|
||||||
index: Annotated[int, Parameter(parse=False)],
|
index: Annotated[int, Parameter(show=False)] = None,
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
ctx: Annotated[Context, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Get or set the mute state of the specified bus.
|
"""Get or set the mute state of the specified bus.
|
||||||
|
|
||||||
@ -65,7 +67,7 @@ def mute(
|
|||||||
If provided, sets the mute state to this value. If not provided, the current mute state is printed.
|
If provided, sets the mute state to this value. If not provided, the current mute state is printed.
|
||||||
"""
|
"""
|
||||||
if new_value is None:
|
if new_value is None:
|
||||||
app.console.print(ctx.client.bus[index].mute)
|
console.out.print(ctx.client.bus[index].mute)
|
||||||
return
|
return
|
||||||
ctx.client.bus[index].mute = new_value
|
ctx.client.bus[index].mute = new_value
|
||||||
|
|
||||||
@ -92,8 +94,8 @@ def mode(
|
|||||||
Argument(),
|
Argument(),
|
||||||
] = None,
|
] = None,
|
||||||
*,
|
*,
|
||||||
index: Annotated[int, Parameter(parse=False)],
|
index: Annotated[int, Parameter(show=False)] = None,
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
ctx: Annotated[Context, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Get or set the bus mode of the specified bus.
|
"""Get or set the bus mode of the specified bus.
|
||||||
|
|
||||||
@ -103,6 +105,6 @@ def mode(
|
|||||||
If provided, sets the bus mode to this value. If not provided, the current bus mode is printed.
|
If provided, sets the bus mode to this value. If not provided, the current bus mode is printed.
|
||||||
"""
|
"""
|
||||||
if type_ is None:
|
if type_ is None:
|
||||||
app.console.print(ctx.client.bus[index].mode.get())
|
console.out.print(ctx.client.bus[index].mode.get())
|
||||||
return
|
return
|
||||||
setattr(ctx.client.bus[index].mode, type_, True)
|
setattr(ctx.client.bus[index].mode, type_, True)
|
||||||
|
|||||||
@ -2,6 +2,7 @@ from typing import Annotated
|
|||||||
|
|
||||||
from cyclopts import App, Parameter
|
from cyclopts import App, Parameter
|
||||||
|
|
||||||
|
from . import console
|
||||||
from .context import Context
|
from .context import Context
|
||||||
from .help import BaseHelpFormatter
|
from .help import BaseHelpFormatter
|
||||||
|
|
||||||
@ -11,38 +12,38 @@ app = App(name='command', help_formatter=BaseHelpFormatter())
|
|||||||
@app.command(name='show')
|
@app.command(name='show')
|
||||||
def show(
|
def show(
|
||||||
*,
|
*,
|
||||||
ctx: Annotated[Context, Parameter(parse=False)] = None,
|
ctx: Annotated[Context, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Bring the Voicemeeter GUI to the foreground."""
|
"""Bring the Voicemeeter GUI to the foreground."""
|
||||||
ctx.client.command.show()
|
ctx.client.command.show()
|
||||||
app.console.print('Voicemeeter GUI should now be in the foreground.')
|
console.out.print('Voicemeeter GUI should now be in the foreground.')
|
||||||
|
|
||||||
|
|
||||||
@app.command(name='hide')
|
@app.command(name='hide')
|
||||||
def hide(
|
def hide(
|
||||||
*,
|
*,
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
ctx: Annotated[Context, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Send the Voicemeeter GUI to the background."""
|
"""Send the Voicemeeter GUI to the background."""
|
||||||
ctx.client.command.hide()
|
ctx.client.command.hide()
|
||||||
app.console.print('Voicemeeter GUI should now be in the background.')
|
console.out.print('Voicemeeter GUI should now be in the background.')
|
||||||
|
|
||||||
|
|
||||||
@app.command(name='shutdown')
|
@app.command(name='shutdown')
|
||||||
def shutdown(
|
def shutdown(
|
||||||
*,
|
*,
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
ctx: Annotated[Context, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Shut down Voicemeeter."""
|
"""Shut down Voicemeeter."""
|
||||||
ctx.client.command.shutdown()
|
ctx.client.command.shutdown()
|
||||||
app.console.print('Voicemeeter should now be shut down.')
|
console.out.print('Voicemeeter should now be shut down.')
|
||||||
|
|
||||||
|
|
||||||
@app.command(name='restart')
|
@app.command(name='restart')
|
||||||
def restart(
|
def restart(
|
||||||
*,
|
*,
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
ctx: Annotated[Context, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Restart the Voicemeeter engine."""
|
"""Restart the Voicemeeter engine."""
|
||||||
ctx.client.command.restart()
|
ctx.client.command.restart()
|
||||||
app.console.print('Voicemeeter engine should now be restarting.')
|
console.out.print('Voicemeeter engine should now be restarting.')
|
||||||
|
|||||||
@ -11,13 +11,15 @@ app = App(name='comp', help_formatter=StripHelpFormatter())
|
|||||||
@app.meta.default
|
@app.meta.default
|
||||||
def launcher(
|
def launcher(
|
||||||
*tokens: Annotated[str, Parameter(show=False, allow_leading_hyphen=True)],
|
*tokens: Annotated[str, Parameter(show=False, allow_leading_hyphen=True)],
|
||||||
index: Annotated[int, Parameter(parse=False)],
|
index: Annotated[int, Argument()] = None,
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
ctx: Annotated[Context, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Control the compressor parameters."""
|
"""Control the compressor parameters."""
|
||||||
additional_kwargs = {}
|
additional_kwargs = {}
|
||||||
command, bound, _ = app.parse_args(tokens)
|
command, bound, _ = app.parse_args(tokens)
|
||||||
|
if index is not None:
|
||||||
additional_kwargs['index'] = index
|
additional_kwargs['index'] = index
|
||||||
|
if ctx is not None:
|
||||||
additional_kwargs['ctx'] = ctx
|
additional_kwargs['ctx'] = ctx
|
||||||
|
|
||||||
return command(*bound.args, **bound.kwargs, **additional_kwargs)
|
return command(*bound.args, **bound.kwargs, **additional_kwargs)
|
||||||
@ -27,8 +29,8 @@ def launcher(
|
|||||||
def knob(
|
def knob(
|
||||||
new_knob: Annotated[float, Argument()] = None,
|
new_knob: Annotated[float, Argument()] = None,
|
||||||
*,
|
*,
|
||||||
index: Annotated[int, Parameter(parse=False)],
|
index: Annotated[int, Parameter(show=False)] = None,
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
ctx: Annotated[Context, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Get or set the knob of the specified compressor.
|
"""Get or set the knob of the specified compressor.
|
||||||
|
|
||||||
@ -39,7 +41,7 @@ def knob(
|
|||||||
"""
|
"""
|
||||||
if new_knob is None:
|
if new_knob is None:
|
||||||
# See https://github.com/onyx-and-iris/vban-cli?tab=readme-ov-file#implementation-notes - 2.
|
# See https://github.com/onyx-and-iris/vban-cli?tab=readme-ov-file#implementation-notes - 2.
|
||||||
# app.console.print(ctx.client.strip[index].comp.knob)
|
# console.out.print(ctx.client.strip[index].comp.knob)
|
||||||
return
|
return
|
||||||
ctx.client.strip[index].comp.knob = new_knob
|
ctx.client.strip[index].comp.knob = new_knob
|
||||||
|
|
||||||
@ -48,8 +50,8 @@ def knob(
|
|||||||
def input_gain(
|
def input_gain(
|
||||||
new_gain: Annotated[float, Argument()] = None,
|
new_gain: Annotated[float, Argument()] = None,
|
||||||
*,
|
*,
|
||||||
index: Annotated[int, Parameter(parse=False)],
|
index: Annotated[int, Parameter(show=False)] = None,
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
ctx: Annotated[Context, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Get or set the input gain of the specified compressor.
|
"""Get or set the input gain of the specified compressor.
|
||||||
|
|
||||||
@ -60,153 +62,6 @@ def input_gain(
|
|||||||
"""
|
"""
|
||||||
if new_gain is None:
|
if new_gain is None:
|
||||||
# See https://github.com/onyx-and-iris/vban-cli?tab=readme-ov-file#implementation-notes - 2.
|
# See https://github.com/onyx-and-iris/vban-cli?tab=readme-ov-file#implementation-notes - 2.
|
||||||
# app.console.print(ctx.client.strip[index].comp.gainin)
|
# console.out.print(ctx.client.strip[index].comp.gainin)
|
||||||
return
|
return
|
||||||
ctx.client.strip[index].comp.gainin = new_gain
|
ctx.client.strip[index].comp.gainin = new_gain
|
||||||
|
|
||||||
|
|
||||||
@app.command(name='ratio')
|
|
||||||
def ratio(
|
|
||||||
new_ratio: Annotated[float, Argument()] = None,
|
|
||||||
*,
|
|
||||||
index: Annotated[int, Parameter(parse=False)],
|
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
|
||||||
):
|
|
||||||
"""Get or set the ratio of the specified compressor.
|
|
||||||
|
|
||||||
Parameters
|
|
||||||
----------
|
|
||||||
new_ratio : float, optional
|
|
||||||
If provided, sets the ratio to this value. If not provided, the current ratio is printed.
|
|
||||||
"""
|
|
||||||
if new_ratio is None:
|
|
||||||
# See https://github.com/onyx-and-iris/vban-cli?tab=readme-ov-file#implementation-notes - 2.
|
|
||||||
# app.console.print(ctx.client.strip[index].comp.ratio)
|
|
||||||
return
|
|
||||||
ctx.client.strip[index].comp.ratio = new_ratio
|
|
||||||
|
|
||||||
|
|
||||||
@app.command(name='threshold')
|
|
||||||
def threshold(
|
|
||||||
new_threshold: Annotated[float, Argument()] = None,
|
|
||||||
*,
|
|
||||||
index: Annotated[int, Parameter(parse=False)],
|
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
|
||||||
):
|
|
||||||
"""Get or set the threshold of the specified compressor.
|
|
||||||
|
|
||||||
Parameters
|
|
||||||
----------
|
|
||||||
new_threshold : float, optional
|
|
||||||
If provided, sets the threshold to this value. If not provided, the current threshold is printed.
|
|
||||||
"""
|
|
||||||
if new_threshold is None:
|
|
||||||
# See https://github.com/onyx-and-iris/vban-cli?tab=readme-ov-file#implementation-notes - 2.
|
|
||||||
# app.console.print(ctx.client.strip[index].comp.threshold)
|
|
||||||
return
|
|
||||||
ctx.client.strip[index].comp.threshold = new_threshold
|
|
||||||
|
|
||||||
|
|
||||||
@app.command(name='attack')
|
|
||||||
def attack(
|
|
||||||
new_attack: Annotated[float, Argument()] = None,
|
|
||||||
*,
|
|
||||||
index: Annotated[int, Parameter(parse=False)],
|
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
|
||||||
):
|
|
||||||
"""Get or set the attack of the specified compressor.
|
|
||||||
|
|
||||||
Parameters
|
|
||||||
----------
|
|
||||||
new_attack : float, optional
|
|
||||||
If provided, sets the attack to this value. If not provided, the current attack is printed.
|
|
||||||
"""
|
|
||||||
if new_attack is None:
|
|
||||||
# See https://github.com/onyx-and-iris/vban-cli?tab=readme-ov-file#implementation-notes - 2.
|
|
||||||
# app.console.print(ctx.client.strip[index].comp.attack)
|
|
||||||
return
|
|
||||||
ctx.client.strip[index].comp.attack = new_attack
|
|
||||||
|
|
||||||
|
|
||||||
@app.command(name='release')
|
|
||||||
def release(
|
|
||||||
new_release: Annotated[float, Argument()] = None,
|
|
||||||
*,
|
|
||||||
index: Annotated[int, Parameter(parse=False)],
|
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
|
||||||
):
|
|
||||||
"""Get or set the release of the specified compressor.
|
|
||||||
|
|
||||||
Parameters
|
|
||||||
----------
|
|
||||||
new_release : float, optional
|
|
||||||
If provided, sets the release to this value. If not provided, the current release is printed.
|
|
||||||
"""
|
|
||||||
if new_release is None:
|
|
||||||
# See https://github.com/onyx-and-iris/vban-cli?tab=readme-ov-file#implementation-notes - 2.
|
|
||||||
# app.console.print(ctx.client.strip[index].comp.release)
|
|
||||||
return
|
|
||||||
ctx.client.strip[index].comp.release = new_release
|
|
||||||
|
|
||||||
|
|
||||||
@app.command(name='knee')
|
|
||||||
def knee(
|
|
||||||
new_knee: Annotated[float, Argument()] = None,
|
|
||||||
*,
|
|
||||||
index: Annotated[int, Parameter(parse=False)],
|
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
|
||||||
):
|
|
||||||
"""Get or set the knee of the specified compressor.
|
|
||||||
|
|
||||||
Parameters
|
|
||||||
----------
|
|
||||||
new_knee : float, optional
|
|
||||||
If provided, sets the knee to this value. If not provided, the current knee is printed.
|
|
||||||
"""
|
|
||||||
if new_knee is None:
|
|
||||||
# See https://github.com/onyx-and-iris/vban-cli?tab=readme-ov-file#implementation-notes - 2.
|
|
||||||
# app.console.print(ctx.client.strip[index].comp.knee)
|
|
||||||
return
|
|
||||||
ctx.client.strip[index].comp.knee = new_knee
|
|
||||||
|
|
||||||
|
|
||||||
@app.command(name='output-gain')
|
|
||||||
def output_gain(
|
|
||||||
new_gain: Annotated[float, Argument()] = None,
|
|
||||||
*,
|
|
||||||
index: Annotated[int, Parameter(parse=False)],
|
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
|
||||||
):
|
|
||||||
"""Get or set the output gain of the specified compressor.
|
|
||||||
|
|
||||||
Parameters
|
|
||||||
----------
|
|
||||||
new_gain : float, optional
|
|
||||||
If provided, sets the output gain to this value. If not provided, the current output gain is printed.
|
|
||||||
"""
|
|
||||||
if new_gain is None:
|
|
||||||
# See https://github.com/onyx-and-iris/vban-cli?tab=readme-ov-file#implementation-notes - 2.
|
|
||||||
# app.console.print(ctx.client.strip[index].comp.gainout)
|
|
||||||
return
|
|
||||||
ctx.client.strip[index].comp.gainout = new_gain
|
|
||||||
|
|
||||||
|
|
||||||
@app.command(name='auto-makeup')
|
|
||||||
def makeup(
|
|
||||||
new_makeup: Annotated[bool, Argument()] = None,
|
|
||||||
*,
|
|
||||||
index: Annotated[int, Parameter(parse=False)],
|
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
|
||||||
):
|
|
||||||
"""Get or set the auto-makeup of the specified compressor.
|
|
||||||
|
|
||||||
Parameters
|
|
||||||
----------
|
|
||||||
new_makeup : bool, optional
|
|
||||||
If provided, sets the auto-makeup to this value. If not provided, the current auto-makeup is printed.
|
|
||||||
"""
|
|
||||||
if new_makeup is None:
|
|
||||||
# See https://github.com/onyx-and-iris/vban-cli?tab=readme-ov-file#implementation-notes - 2.
|
|
||||||
# app.console.print(ctx.client.strip[index].comp.makeup)
|
|
||||||
return
|
|
||||||
ctx.client.strip[index].comp.makeup = new_makeup
|
|
||||||
|
|||||||
@ -11,13 +11,15 @@ app = App(name='denoiser', help_formatter=StripHelpFormatter())
|
|||||||
@app.meta.default
|
@app.meta.default
|
||||||
def launcher(
|
def launcher(
|
||||||
*tokens: Annotated[str, Parameter(show=False, allow_leading_hyphen=True)],
|
*tokens: Annotated[str, Parameter(show=False, allow_leading_hyphen=True)],
|
||||||
index: Annotated[int, Parameter(parse=False)],
|
index: Annotated[int, Argument()] = None,
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
ctx: Annotated[Context, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Control the denoiser parameters."""
|
"""Control the denoiser parameters."""
|
||||||
additional_kwargs = {}
|
additional_kwargs = {}
|
||||||
command, bound, _ = app.parse_args(tokens)
|
command, bound, _ = app.parse_args(tokens)
|
||||||
|
if index is not None:
|
||||||
additional_kwargs['index'] = index
|
additional_kwargs['index'] = index
|
||||||
|
if ctx is not None:
|
||||||
additional_kwargs['ctx'] = ctx
|
additional_kwargs['ctx'] = ctx
|
||||||
|
|
||||||
return command(*bound.args, **bound.kwargs, **additional_kwargs)
|
return command(*bound.args, **bound.kwargs, **additional_kwargs)
|
||||||
@ -27,8 +29,8 @@ def launcher(
|
|||||||
def knob(
|
def knob(
|
||||||
new_knob: Annotated[float, Argument()] = None,
|
new_knob: Annotated[float, Argument()] = None,
|
||||||
*,
|
*,
|
||||||
index: Annotated[int, Parameter(parse=False)],
|
index: Annotated[int, Parameter(show=False)] = None,
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
ctx: Annotated[Context, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Get or set the knob of the specified denoiser.
|
"""Get or set the knob of the specified denoiser.
|
||||||
|
|
||||||
@ -39,6 +41,6 @@ def knob(
|
|||||||
"""
|
"""
|
||||||
if new_knob is None:
|
if new_knob is None:
|
||||||
# See https://github.com/onyx-and-iris/vban-cli?tab=readme-ov-file#implementation-notes - 2.
|
# See https://github.com/onyx-and-iris/vban-cli?tab=readme-ov-file#implementation-notes - 2.
|
||||||
# app.console.print(ctx.client.strip[index].denoiser.knob)
|
# console.out.print(ctx.client.strip[index].denoiser.knob)
|
||||||
return
|
return
|
||||||
ctx.client.strip[index].denoiser.knob = new_knob
|
ctx.client.strip[index].denoiser.knob = new_knob
|
||||||
|
|||||||
@ -14,9 +14,9 @@ app.command(cell_app.meta, name='cell')
|
|||||||
@app.meta.default
|
@app.meta.default
|
||||||
def launcher(
|
def launcher(
|
||||||
*tokens: Annotated[str, Parameter(show=False, allow_leading_hyphen=True)],
|
*tokens: Annotated[str, Parameter(show=False, allow_leading_hyphen=True)],
|
||||||
eq_kind: Annotated[str, Parameter(parse=False)],
|
eq_kind: Annotated[str, Parameter(show=False)] = None,
|
||||||
index: Annotated[int, Parameter(parse=False)],
|
index: Annotated[int, Argument()] = None,
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
ctx: Annotated[Context, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Control the EQ parameters."""
|
"""Control the EQ parameters."""
|
||||||
additional_kwargs = {}
|
additional_kwargs = {}
|
||||||
@ -37,7 +37,7 @@ def launcher(
|
|||||||
def on(
|
def on(
|
||||||
new_state: Annotated[bool, Argument()] = None,
|
new_state: Annotated[bool, Argument()] = None,
|
||||||
*,
|
*,
|
||||||
target: Annotated[object, Parameter(parse=False)],
|
target: Annotated[object, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Get or set the on state of the specified EQ band.
|
"""Get or set the on state of the specified EQ band.
|
||||||
|
|
||||||
@ -48,17 +48,16 @@ def on(
|
|||||||
"""
|
"""
|
||||||
if new_state is None:
|
if new_state is None:
|
||||||
# See https://github.com/onyx-and-iris/vban-cli?tab=readme-ov-file#implementation-notes - 2.
|
# See https://github.com/onyx-and-iris/vban-cli?tab=readme-ov-file#implementation-notes - 2.
|
||||||
# app.console.print(target.on)
|
# console.out.print(target.on)
|
||||||
return
|
return
|
||||||
target.on = new_state
|
target.on = new_state
|
||||||
|
|
||||||
|
|
||||||
@cell_app.meta.default
|
@cell_app.meta.default
|
||||||
def cell_launcher(
|
def cell_launcher(
|
||||||
band: Annotated[int, Argument()],
|
band: Annotated[int, Argument()] = None,
|
||||||
/,
|
|
||||||
*tokens: Annotated[str, Parameter(show=False, allow_leading_hyphen=True)],
|
*tokens: Annotated[str, Parameter(show=False, allow_leading_hyphen=True)],
|
||||||
target: Annotated[object, Parameter(parse=False)],
|
target: Annotated[object, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Control the EQ Cell parameters.
|
"""Control the EQ Cell parameters.
|
||||||
|
|
||||||
@ -75,7 +74,7 @@ def cell_launcher(
|
|||||||
def cell_on(
|
def cell_on(
|
||||||
new_state: Annotated[bool, Argument()] = None,
|
new_state: Annotated[bool, Argument()] = None,
|
||||||
*,
|
*,
|
||||||
target: Annotated[object, Parameter(parse=False)],
|
target: Annotated[object, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Get or set the on state of the specified EQ cell.
|
"""Get or set the on state of the specified EQ cell.
|
||||||
|
|
||||||
@ -86,7 +85,7 @@ def cell_on(
|
|||||||
"""
|
"""
|
||||||
if new_state is None:
|
if new_state is None:
|
||||||
# See https://github.com/onyx-and-iris/vban-cli?tab=readme-ov-file#implementation-notes - 2.
|
# See https://github.com/onyx-and-iris/vban-cli?tab=readme-ov-file#implementation-notes - 2.
|
||||||
# app.console.print(target.on)
|
# console.out.print(target.on)
|
||||||
return
|
return
|
||||||
target.on = new_state
|
target.on = new_state
|
||||||
|
|
||||||
@ -95,7 +94,7 @@ def cell_on(
|
|||||||
def cell_freq(
|
def cell_freq(
|
||||||
new_freq: Annotated[float, Argument()] = None,
|
new_freq: Annotated[float, Argument()] = None,
|
||||||
*,
|
*,
|
||||||
target: Annotated[object, Parameter(parse=False)],
|
target: Annotated[object, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Get or set the frequency of the specified EQ cell.
|
"""Get or set the frequency of the specified EQ cell.
|
||||||
|
|
||||||
@ -106,7 +105,7 @@ def cell_freq(
|
|||||||
"""
|
"""
|
||||||
if new_freq is None:
|
if new_freq is None:
|
||||||
# See https://github.com/onyx-and-iris/vban-cli?tab=readme-ov-file#implementation-notes - 2.
|
# See https://github.com/onyx-and-iris/vban-cli?tab=readme-ov-file#implementation-notes - 2.
|
||||||
# app.console.print(target.f)
|
# console.out.print(target.f)
|
||||||
return
|
return
|
||||||
target.f = new_freq
|
target.f = new_freq
|
||||||
|
|
||||||
@ -115,7 +114,7 @@ def cell_freq(
|
|||||||
def cell_gain(
|
def cell_gain(
|
||||||
new_gain: Annotated[float, Argument()] = None,
|
new_gain: Annotated[float, Argument()] = None,
|
||||||
*,
|
*,
|
||||||
target: Annotated[object, Parameter(parse=False)],
|
target: Annotated[object, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Get or set the gain of the specified EQ cell.
|
"""Get or set the gain of the specified EQ cell.
|
||||||
|
|
||||||
@ -126,7 +125,7 @@ def cell_gain(
|
|||||||
"""
|
"""
|
||||||
if new_gain is None:
|
if new_gain is None:
|
||||||
# See https://github.com/onyx-and-iris/vban-cli?tab=readme-ov-file#implementation-notes - 2.
|
# See https://github.com/onyx-and-iris/vban-cli?tab=readme-ov-file#implementation-notes - 2.
|
||||||
# app.console.print(target.gain)
|
# console.out.print(target.gain)
|
||||||
return
|
return
|
||||||
target.gain = new_gain
|
target.gain = new_gain
|
||||||
|
|
||||||
@ -135,7 +134,7 @@ def cell_gain(
|
|||||||
def cell_q(
|
def cell_q(
|
||||||
new_q: Annotated[float, Argument()] = None,
|
new_q: Annotated[float, Argument()] = None,
|
||||||
*,
|
*,
|
||||||
target: Annotated[object, Parameter(parse=False)],
|
target: Annotated[object, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Get or set the Q of the specified EQ cell.
|
"""Get or set the Q of the specified EQ cell.
|
||||||
|
|
||||||
@ -146,7 +145,7 @@ def cell_q(
|
|||||||
"""
|
"""
|
||||||
if new_q is None:
|
if new_q is None:
|
||||||
# See https://github.com/onyx-and-iris/vban-cli?tab=readme-ov-file#implementation-notes - 2.
|
# See https://github.com/onyx-and-iris/vban-cli?tab=readme-ov-file#implementation-notes - 2.
|
||||||
# app.console.print(target.q)
|
# console.out.print(target.q)
|
||||||
return
|
return
|
||||||
target.q = new_q
|
target.q = new_q
|
||||||
|
|
||||||
@ -155,7 +154,7 @@ def cell_q(
|
|||||||
def cell_type(
|
def cell_type(
|
||||||
new_type: Annotated[int, Argument()] = None,
|
new_type: Annotated[int, Argument()] = None,
|
||||||
*,
|
*,
|
||||||
target: Annotated[object, Parameter(parse=False)],
|
target: Annotated[object, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Get or set the type of the specified EQ cell.
|
"""Get or set the type of the specified EQ cell.
|
||||||
|
|
||||||
@ -166,6 +165,6 @@ def cell_type(
|
|||||||
"""
|
"""
|
||||||
if new_type is None:
|
if new_type is None:
|
||||||
# See https://github.com/onyx-and-iris/vban-cli?tab=readme-ov-file#implementation-notes - 2.
|
# See https://github.com/onyx-and-iris/vban-cli?tab=readme-ov-file#implementation-notes - 2.
|
||||||
# app.console.print(target.type)
|
# console.out.print(target.type)
|
||||||
return
|
return
|
||||||
target.type = new_type
|
target.type = new_type
|
||||||
|
|||||||
@ -1,14 +0,0 @@
|
|||||||
class VbanCLIError(Exception):
|
|
||||||
"""Base class for exceptions in this module."""
|
|
||||||
|
|
||||||
def __init__(self, message: str, code: int = 1):
|
|
||||||
super().__init__(message)
|
|
||||||
self.code = code
|
|
||||||
|
|
||||||
|
|
||||||
class VbanCLIConnectionError(VbanCLIError):
|
|
||||||
"""Exception raised for connection errors."""
|
|
||||||
|
|
||||||
|
|
||||||
class VbanCLIValidationError(VbanCLIError):
|
|
||||||
"""Exception raised for validation errors."""
|
|
||||||
@ -2,6 +2,7 @@ from typing import Annotated
|
|||||||
|
|
||||||
from cyclopts import App, Argument, Parameter
|
from cyclopts import App, Argument, Parameter
|
||||||
|
|
||||||
|
from . import console
|
||||||
from .context import Context
|
from .context import Context
|
||||||
from .help import GainlayerHelpFormatter
|
from .help import GainlayerHelpFormatter
|
||||||
|
|
||||||
@ -10,17 +11,20 @@ app = App(name='gainlayer', help_formatter=GainlayerHelpFormatter())
|
|||||||
|
|
||||||
@app.meta.default
|
@app.meta.default
|
||||||
def launcher(
|
def launcher(
|
||||||
gainlayer_index: Annotated[int, Argument()],
|
gainlayer_index: Annotated[int, Argument()] = None,
|
||||||
/,
|
|
||||||
*tokens: Annotated[str, Parameter(show=False, allow_leading_hyphen=True)],
|
*tokens: Annotated[str, Parameter(show=False, allow_leading_hyphen=True)],
|
||||||
index: Annotated[int, Parameter(parse=False)],
|
index: Annotated[int, Argument()] = None,
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
ctx: Annotated[Context, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Control the gainlayers."""
|
"""Control the gainlayers."""
|
||||||
additional_kwargs = {}
|
additional_kwargs = {}
|
||||||
command, bound, _ = app.parse_args(tokens)
|
command, bound, _ = app.parse_args(tokens)
|
||||||
|
if index is not None and gainlayer_index is not None:
|
||||||
additional_kwargs['strip_index'] = index
|
additional_kwargs['strip_index'] = index
|
||||||
additional_kwargs['gainlayer_index'] = gainlayer_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
|
additional_kwargs['ctx'] = ctx
|
||||||
|
|
||||||
return command(*bound.args, **bound.kwargs, **additional_kwargs)
|
return command(*bound.args, **bound.kwargs, **additional_kwargs)
|
||||||
@ -30,9 +34,9 @@ def launcher(
|
|||||||
def level(
|
def level(
|
||||||
new_level: Annotated[float, Argument()] = None,
|
new_level: Annotated[float, Argument()] = None,
|
||||||
*,
|
*,
|
||||||
strip_index: Annotated[int, Parameter(parse=False)],
|
strip_index: Annotated[int, Parameter(show=False)] = None,
|
||||||
gainlayer_index: Annotated[int, Parameter(parse=False)],
|
gainlayer_index: Annotated[int, Parameter(show=False)] = None,
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
ctx: Annotated[Context, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Get or set the level of the specified gainlayer.
|
"""Get or set the level of the specified gainlayer.
|
||||||
|
|
||||||
@ -42,6 +46,6 @@ def level(
|
|||||||
If provided, sets the level to this value. If not provided, the current level is printed.
|
If provided, sets the level to this value. If not provided, the current level is printed.
|
||||||
"""
|
"""
|
||||||
if new_level is None:
|
if new_level is None:
|
||||||
app.console.print(ctx.client.strip[strip_index].gainlayer[gainlayer_index].gain)
|
console.out.print(ctx.client.strip[strip_index].gainlayer[gainlayer_index].gain)
|
||||||
return
|
return
|
||||||
ctx.client.strip[strip_index].gainlayer[gainlayer_index].gain = new_level
|
ctx.client.strip[strip_index].gainlayer[gainlayer_index].gain = new_level
|
||||||
|
|||||||
@ -11,13 +11,15 @@ app = App(name='gate', help_formatter=StripHelpFormatter())
|
|||||||
@app.meta.default
|
@app.meta.default
|
||||||
def launcher(
|
def launcher(
|
||||||
*tokens: Annotated[str, Parameter(show=False, allow_leading_hyphen=True)],
|
*tokens: Annotated[str, Parameter(show=False, allow_leading_hyphen=True)],
|
||||||
index: Annotated[int, Parameter(parse=False)],
|
index: Annotated[int, Argument()] = None,
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
ctx: Annotated[Context, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Control the compressor parameters."""
|
"""Control the compressor parameters."""
|
||||||
additional_kwargs = {}
|
additional_kwargs = {}
|
||||||
command, bound, _ = app.parse_args(tokens)
|
command, bound, _ = app.parse_args(tokens)
|
||||||
|
if index is not None:
|
||||||
additional_kwargs['index'] = index
|
additional_kwargs['index'] = index
|
||||||
|
if ctx is not None:
|
||||||
additional_kwargs['ctx'] = ctx
|
additional_kwargs['ctx'] = ctx
|
||||||
|
|
||||||
return command(*bound.args, **bound.kwargs, **additional_kwargs)
|
return command(*bound.args, **bound.kwargs, **additional_kwargs)
|
||||||
@ -27,8 +29,8 @@ def launcher(
|
|||||||
def knob(
|
def knob(
|
||||||
new_knob: Annotated[float, Argument()] = None,
|
new_knob: Annotated[float, Argument()] = None,
|
||||||
*,
|
*,
|
||||||
index: Annotated[int, Parameter(parse=False)],
|
index: Annotated[int, Parameter(show=False)] = None,
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
ctx: Annotated[Context, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Get or set the knob of the specified gate.
|
"""Get or set the knob of the specified gate.
|
||||||
|
|
||||||
@ -39,7 +41,7 @@ def knob(
|
|||||||
"""
|
"""
|
||||||
if new_knob is None:
|
if new_knob is None:
|
||||||
# See https://github.com/onyx-and-iris/vban-cli?tab=readme-ov-file#implementation-notes - 2.
|
# See https://github.com/onyx-and-iris/vban-cli?tab=readme-ov-file#implementation-notes - 2.
|
||||||
# app.console.print(ctx.client.strip[index].gate.knob)
|
# console.out.print(ctx.client.strip[index].gate.knob)
|
||||||
return
|
return
|
||||||
ctx.client.strip[index].gate.knob = new_knob
|
ctx.client.strip[index].gate.knob = new_knob
|
||||||
|
|
||||||
@ -48,8 +50,8 @@ def knob(
|
|||||||
def threshold(
|
def threshold(
|
||||||
new_threshold: Annotated[float, Argument()] = None,
|
new_threshold: Annotated[float, Argument()] = None,
|
||||||
*,
|
*,
|
||||||
index: Annotated[int, Parameter(parse=False)],
|
index: Annotated[int, Parameter(show=False)] = None,
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
ctx: Annotated[Context, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Get or set the threshold of the specified gate.
|
"""Get or set the threshold of the specified gate.
|
||||||
|
|
||||||
@ -60,111 +62,6 @@ def threshold(
|
|||||||
"""
|
"""
|
||||||
if new_threshold is None:
|
if new_threshold is None:
|
||||||
# See https://github.com/onyx-and-iris/vban-cli?tab=readme-ov-file#implementation-notes - 2.
|
# See https://github.com/onyx-and-iris/vban-cli?tab=readme-ov-file#implementation-notes - 2.
|
||||||
# app.console.print(ctx.client.strip[index].gate.threshold)
|
# console.out.print(ctx.client.strip[index].gate.threshold)
|
||||||
return
|
return
|
||||||
ctx.client.strip[index].gate.threshold = new_threshold
|
ctx.client.strip[index].gate.threshold = new_threshold
|
||||||
|
|
||||||
|
|
||||||
@app.command(name='damping-max')
|
|
||||||
def damping_max(
|
|
||||||
new_damping_max: Annotated[float, Argument()] = None,
|
|
||||||
*,
|
|
||||||
index: Annotated[int, Parameter(parse=False)],
|
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
|
||||||
):
|
|
||||||
"""Get or set the damping max of the specified gate.
|
|
||||||
|
|
||||||
Parameters
|
|
||||||
----------
|
|
||||||
new_damping_max : float, optional
|
|
||||||
If provided, sets the damping max to this value. If not provided, the current damping max is printed.
|
|
||||||
"""
|
|
||||||
if new_damping_max is None:
|
|
||||||
# See https://github.com/onyx-and-iris/vban-cli?tab=readme-ov-file#implementation-notes - 2.
|
|
||||||
# app.console.print(ctx.client.strip[index].gate.damping)
|
|
||||||
return
|
|
||||||
ctx.client.strip[index].gate.damping = new_damping_max
|
|
||||||
|
|
||||||
|
|
||||||
@app.command(name='bp-sidechain')
|
|
||||||
def bp_sidechain(
|
|
||||||
new_bp_sidechain: Annotated[float, Argument()] = None,
|
|
||||||
*,
|
|
||||||
index: Annotated[int, Parameter(parse=False)],
|
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
|
||||||
):
|
|
||||||
"""Get or set the BP sidechain of the specified gate.
|
|
||||||
|
|
||||||
Parameters
|
|
||||||
----------
|
|
||||||
new_bp_sidechain : float, optional
|
|
||||||
If provided, sets the BP sidechain to this value. If not provided, the current BP sidechain is printed.
|
|
||||||
"""
|
|
||||||
if new_bp_sidechain is None:
|
|
||||||
# See https://github.com/onyx-and-iris/vban-cli?tab=readme-ov-file#implementation-notes - 2.
|
|
||||||
# app.console.print(ctx.client.strip[index].gate.bpsidechain)
|
|
||||||
return
|
|
||||||
ctx.client.strip[index].gate.bpsidechain = new_bp_sidechain
|
|
||||||
|
|
||||||
|
|
||||||
@app.command(name='attack')
|
|
||||||
def attack(
|
|
||||||
new_attack: Annotated[float, Argument()] = None,
|
|
||||||
*,
|
|
||||||
index: Annotated[int, Parameter(parse=False)],
|
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
|
||||||
):
|
|
||||||
"""Get or set the attack of the specified gate.
|
|
||||||
|
|
||||||
Parameters
|
|
||||||
----------
|
|
||||||
new_attack : float, optional
|
|
||||||
If provided, sets the attack to this value. If not provided, the current attack is printed.
|
|
||||||
"""
|
|
||||||
if new_attack is None:
|
|
||||||
# See https://github.com/onyx-and-iris/vban-cli?tab=readme-ov-file#implementation-notes - 2.
|
|
||||||
# app.console.print(ctx.client.strip[index].gate.attack)
|
|
||||||
return
|
|
||||||
ctx.client.strip[index].gate.attack = new_attack
|
|
||||||
|
|
||||||
|
|
||||||
@app.command(name='hold')
|
|
||||||
def hold(
|
|
||||||
new_hold: Annotated[float, Argument()] = None,
|
|
||||||
*,
|
|
||||||
index: Annotated[int, Parameter(parse=False)],
|
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
|
||||||
):
|
|
||||||
"""Get or set the hold of the specified gate.
|
|
||||||
|
|
||||||
Parameters
|
|
||||||
----------
|
|
||||||
new_hold : float, optional
|
|
||||||
If provided, sets the hold to this value. If not provided, the current hold is printed.
|
|
||||||
"""
|
|
||||||
if new_hold is None:
|
|
||||||
# See https://github.com/onyx-and-iris/vban-cli?tab=readme-ov-file#implementation-notes - 2.
|
|
||||||
# app.console.print(ctx.client.strip[index].gate.hold)
|
|
||||||
return
|
|
||||||
ctx.client.strip[index].gate.hold = new_hold
|
|
||||||
|
|
||||||
|
|
||||||
@app.command(name='release')
|
|
||||||
def release(
|
|
||||||
new_release: Annotated[float, Argument()] = None,
|
|
||||||
*,
|
|
||||||
index: Annotated[int, Parameter(parse=False)],
|
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
|
||||||
):
|
|
||||||
"""Get or set the release of the specified gate.
|
|
||||||
|
|
||||||
Parameters
|
|
||||||
----------
|
|
||||||
new_release : float, optional
|
|
||||||
If provided, sets the release to this value. If not provided, the current release is printed.
|
|
||||||
"""
|
|
||||||
if new_release is None:
|
|
||||||
# See https://github.com/onyx-and-iris/vban-cli?tab=readme-ov-file#implementation-notes - 2.
|
|
||||||
# app.console.print(ctx.client.strip[index].gate.release)
|
|
||||||
return
|
|
||||||
ctx.client.strip[index].gate.release = new_release
|
|
||||||
|
|||||||
@ -56,16 +56,8 @@ class StripHelpFormatter(BaseHelpFormatter):
|
|||||||
)
|
)
|
||||||
if modified_usage == str(usage):
|
if modified_usage == str(usage):
|
||||||
modified_usage = re.sub(
|
modified_usage = re.sub(
|
||||||
r'(\S+\s+strip)\s+(\w+)',
|
r'(\S+\s+strip)\s+(\w+)', r'\1 <index> \2', str(usage)
|
||||||
r'\1 <index> \2 [OPTIONS] [ARGS]',
|
|
||||||
str(usage),
|
|
||||||
)
|
)
|
||||||
# Handle main strip command and subcommand groups
|
|
||||||
modified_usage = re.sub(
|
|
||||||
r'\bCOMMAND\b(?!\s+\[)', 'COMMAND [OPTIONS]', modified_usage
|
|
||||||
)
|
|
||||||
# Remove the duplicate INDEX that gets automatically added by cyclopts
|
|
||||||
modified_usage = re.sub(r'\s+INDEX$', '', modified_usage)
|
|
||||||
console.print(f'[bold]Usage:[/bold] {modified_usage}')
|
console.print(f'[bold]Usage:[/bold] {modified_usage}')
|
||||||
|
|
||||||
|
|
||||||
@ -84,16 +76,8 @@ class BusHelpFormatter(BaseHelpFormatter):
|
|||||||
)
|
)
|
||||||
if modified_usage == str(usage):
|
if modified_usage == str(usage):
|
||||||
modified_usage = re.sub(
|
modified_usage = re.sub(
|
||||||
r'(\S+\s+bus)\s+(\w+)',
|
r'(\S+\s+bus)\s+(\w+)', r'\1 <index> \2', str(usage)
|
||||||
r'\1 <index> \2 [OPTIONS] [ARGS]',
|
|
||||||
str(usage),
|
|
||||||
)
|
)
|
||||||
# Handle main bus command and subcommand groups
|
|
||||||
modified_usage = re.sub(
|
|
||||||
r'\bCOMMAND\b(?!\s+\[)', 'COMMAND [OPTIONS]', modified_usage
|
|
||||||
)
|
|
||||||
# Remove the duplicate INDEX that gets automatically added by cyclopts
|
|
||||||
modified_usage = re.sub(r'\s+INDEX$', '', modified_usage)
|
|
||||||
console.print(f'[bold]Usage:[/bold] {modified_usage}')
|
console.print(f'[bold]Usage:[/bold] {modified_usage}')
|
||||||
|
|
||||||
|
|
||||||
@ -106,9 +90,7 @@ class EqHelpFormatter(BaseHelpFormatter):
|
|||||||
"""Render the usage line with proper <index> placement for both strip and bus commands."""
|
"""Render the usage line with proper <index> placement for both strip and bus commands."""
|
||||||
if usage:
|
if usage:
|
||||||
modified_usage = re.sub(
|
modified_usage = re.sub(
|
||||||
r'(\S+\s+)(\w+)(\s+eq\s+)(COMMAND)',
|
r'(\S+\s+)(\w+)(\s+eq\s+)(COMMAND)', r'\1\2 <index>\3\4', str(usage)
|
||||||
r'\1\2 <index>\3\4 [OPTIONS]',
|
|
||||||
str(usage),
|
|
||||||
)
|
)
|
||||||
console.print(f'[bold]Usage:[/bold] {modified_usage}')
|
console.print(f'[bold]Usage:[/bold] {modified_usage}')
|
||||||
|
|
||||||
@ -123,11 +105,9 @@ class GainlayerHelpFormatter(BaseHelpFormatter):
|
|||||||
if usage:
|
if usage:
|
||||||
modified_usage = re.sub(
|
modified_usage = re.sub(
|
||||||
r'(\S+\s+strip)(\s+gainlayer\s+)(COMMAND)',
|
r'(\S+\s+strip)(\s+gainlayer\s+)(COMMAND)',
|
||||||
r'\1 <index>\2<[cyan]gainlayer_index[/cyan]> \3 [OPTIONS] [ARGS]',
|
r'\1 <index>\2<[cyan]gainlayer_index[/cyan]> \3',
|
||||||
str(usage),
|
str(usage),
|
||||||
)
|
)
|
||||||
# Remove the duplicate GAINLAYER_INDEX that gets automatically added by cyclopts
|
|
||||||
modified_usage = re.sub(r'\s+GAINLAYER_INDEX$', '', modified_usage)
|
|
||||||
console.print(f'[bold]Usage:[/bold] {modified_usage}')
|
console.print(f'[bold]Usage:[/bold] {modified_usage}')
|
||||||
|
|
||||||
|
|
||||||
@ -141,9 +121,7 @@ class CellHelpFormatter(BaseHelpFormatter):
|
|||||||
if usage:
|
if usage:
|
||||||
modified_usage = re.sub(
|
modified_usage = re.sub(
|
||||||
r'(\S+\s+)(\w+)(\s+eq\s+cell\s+)(COMMAND)',
|
r'(\S+\s+)(\w+)(\s+eq\s+cell\s+)(COMMAND)',
|
||||||
r'\1\2 <index>\3<[cyan]band[/cyan]> \4 [ARGS]',
|
r'\1\2 <index>\3<[cyan]band[/cyan]> \4',
|
||||||
str(usage),
|
str(usage),
|
||||||
)
|
)
|
||||||
# Remove the duplicate BAND that gets automatically added by cyclopts
|
|
||||||
modified_usage = re.sub(r'\s+BAND$', '', modified_usage)
|
|
||||||
console.print(f'[bold]Usage:[/bold] {modified_usage}')
|
console.print(f'[bold]Usage:[/bold] {modified_usage}')
|
||||||
|
|||||||
@ -3,7 +3,7 @@ from typing import Annotated
|
|||||||
|
|
||||||
from cyclopts import App, Parameter, validators
|
from cyclopts import App, Parameter, validators
|
||||||
|
|
||||||
from . import validation
|
from . import console, validation
|
||||||
from .context import Context
|
from .context import Context
|
||||||
from .help import BaseHelpFormatter
|
from .help import BaseHelpFormatter
|
||||||
|
|
||||||
@ -13,84 +13,84 @@ app = App(name='recorder', help_formatter=BaseHelpFormatter())
|
|||||||
@app.command(name='play')
|
@app.command(name='play')
|
||||||
def play(
|
def play(
|
||||||
*,
|
*,
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
ctx: Annotated[Context, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Start the recorder playback."""
|
"""Start the recorder playback."""
|
||||||
ctx.client.recorder.play()
|
ctx.client.recorder.play()
|
||||||
app.console.print('Recorder playback started.')
|
console.out.print('Recorder playback started.')
|
||||||
|
|
||||||
|
|
||||||
@app.command(name='pause')
|
@app.command(name='pause')
|
||||||
def pause(
|
def pause(
|
||||||
*,
|
*,
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
ctx: Annotated[Context, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Pause the recorder playback."""
|
"""Pause the recorder playback."""
|
||||||
ctx.client.recorder.stop()
|
ctx.client.recorder.stop()
|
||||||
app.console.print('Recorder playback paused.')
|
console.out.print('Recorder playback paused.')
|
||||||
|
|
||||||
|
|
||||||
@app.command(name='stop')
|
@app.command(name='stop')
|
||||||
def stop(
|
def stop(
|
||||||
*,
|
*,
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
ctx: Annotated[Context, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Stop the recorder playback/recording and reset to the beginning."""
|
"""Stop the recorder playback/recording and reset to the beginning."""
|
||||||
ctx.client.recorder.stop()
|
ctx.client.recorder.stop()
|
||||||
ctx.client.recorder.goto('00:00:00')
|
ctx.client.recorder.goto('00:00:00')
|
||||||
# We have no way of knowing if the recorder was playing or recording, so we print a generic message.
|
# We have no way of knowing if the recorder was playing or recording, so we print a generic message.
|
||||||
# See https://github.com/onyx-and-iris/vban-cli?tab=readme-ov-file#implementation-notes - 4.
|
# See https://github.com/onyx-and-iris/vban-cli?tab=readme-ov-file#implementation-notes - 4.
|
||||||
app.console.print('Recorder stopped.')
|
console.out.print('Recorder stopped.')
|
||||||
|
|
||||||
|
|
||||||
@app.command(name='replay')
|
@app.command(name='replay')
|
||||||
def replay(
|
def replay(
|
||||||
*,
|
*,
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
ctx: Annotated[Context, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Replay the recorder playback."""
|
"""Replay the recorder playback."""
|
||||||
ctx.client.recorder.replay()
|
ctx.client.recorder.replay()
|
||||||
app.console.print('Recorder playback replay started.')
|
console.out.print('Recorder playback replay started.')
|
||||||
|
|
||||||
|
|
||||||
@app.command(name='record')
|
@app.command(name='record')
|
||||||
def record(
|
def record(
|
||||||
*,
|
*,
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
ctx: Annotated[Context, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Start recording."""
|
"""Start recording."""
|
||||||
ctx.client.recorder.record()
|
ctx.client.recorder.record()
|
||||||
app.console.print('Recorder recording started.')
|
console.out.print('Recorder recording started.')
|
||||||
|
|
||||||
|
|
||||||
@app.command(name='pause-recording')
|
@app.command(name='pause-recording')
|
||||||
def pause_recording(
|
def pause_recording(
|
||||||
*,
|
*,
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
ctx: Annotated[Context, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Pause the recorder recording."""
|
"""Pause the recorder recording."""
|
||||||
ctx.client.recorder.pause()
|
ctx.client.recorder.pause()
|
||||||
app.console.print('Recorder recording paused.')
|
console.out.print('Recorder recording paused.')
|
||||||
|
|
||||||
|
|
||||||
@app.command(name='ff')
|
@app.command(name='ff')
|
||||||
def ff(
|
def ff(
|
||||||
*,
|
*,
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
ctx: Annotated[Context, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Fast forward the recorder playback."""
|
"""Fast forward the recorder playback."""
|
||||||
ctx.client.recorder.ff()
|
ctx.client.recorder.ff()
|
||||||
app.console.print('Recorder playback fast forwarded.')
|
console.out.print('Recorder playback fast forwarded.')
|
||||||
|
|
||||||
|
|
||||||
@app.command(name='rew')
|
@app.command(name='rew')
|
||||||
def rew(
|
def rew(
|
||||||
*,
|
*,
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
ctx: Annotated[Context, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Rewind the recorder playback."""
|
"""Rewind the recorder playback."""
|
||||||
ctx.client.recorder.rew()
|
ctx.client.recorder.rew()
|
||||||
app.console.print('Recorder playback rewound.')
|
console.out.print('Recorder playback rewound.')
|
||||||
|
|
||||||
|
|
||||||
@app.command(name='load')
|
@app.command(name='load')
|
||||||
@ -104,13 +104,13 @@ def load(
|
|||||||
],
|
],
|
||||||
/,
|
/,
|
||||||
*,
|
*,
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
ctx: Annotated[Context, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Load a file into the recorder.
|
"""Load a file into the recorder.
|
||||||
|
|
||||||
note: This command may only work if vban-cli is running on localhost and may not work if vban-cli is running on a remote server."""
|
note: This command may only work if vban-cli is running on localhost and may not work if vban-cli is running on a remote server."""
|
||||||
ctx.client.recorder.load(file_path)
|
ctx.client.recorder.load(file_path)
|
||||||
app.console.print(f'Loaded file: {file_path}')
|
console.out.print(f'Loaded file: {file_path}')
|
||||||
|
|
||||||
|
|
||||||
@app.command(name='goto')
|
@app.command(name='goto')
|
||||||
@ -124,8 +124,8 @@ def goto(
|
|||||||
],
|
],
|
||||||
/,
|
/,
|
||||||
*,
|
*,
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
ctx: Annotated[Context, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Go to a specific timestamp in the recorder playback."""
|
"""Go to a specific timestamp in the recorder playback."""
|
||||||
ctx.client.recorder.goto(time_string)
|
ctx.client.recorder.goto(time_string)
|
||||||
app.console.print(f'Went to timestamp {time_string} in recorder playback.')
|
console.out.print(f'Went to timestamp {time_string} in recorder playback.')
|
||||||
|
|||||||
@ -2,7 +2,7 @@ from typing import Annotated, Optional
|
|||||||
|
|
||||||
from cyclopts import App, Argument, Parameter
|
from cyclopts import App, Argument, Parameter
|
||||||
|
|
||||||
from . import comp, denoiser, eq, gainlayer, gate
|
from . import comp, console, denoiser, eq, gainlayer, gate
|
||||||
from .context import Context
|
from .context import Context
|
||||||
from .help import StripHelpFormatter
|
from .help import StripHelpFormatter
|
||||||
|
|
||||||
@ -16,17 +16,18 @@ app.command(gainlayer.app.meta, name='gainlayer')
|
|||||||
|
|
||||||
@app.meta.default
|
@app.meta.default
|
||||||
def launcher(
|
def launcher(
|
||||||
index: Annotated[int, Argument()],
|
index: Annotated[int, Argument()] = None,
|
||||||
/,
|
|
||||||
*tokens: Annotated[str, Parameter(show=False, allow_leading_hyphen=True)],
|
*tokens: Annotated[str, Parameter(show=False, allow_leading_hyphen=True)],
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
ctx: Annotated[Context, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Control the strip parameters."""
|
"""Control the strip parameters."""
|
||||||
additional_kwargs = {}
|
additional_kwargs = {}
|
||||||
command, bound, _ = app.parse_args(tokens)
|
command, bound, _ = app.parse_args(tokens)
|
||||||
if tokens[0] == 'eq':
|
if tokens[0] == 'eq':
|
||||||
additional_kwargs['eq_kind'] = app.name[0]
|
additional_kwargs['eq_kind'] = app.name[0]
|
||||||
|
if index is not None:
|
||||||
additional_kwargs['index'] = index
|
additional_kwargs['index'] = index
|
||||||
|
if ctx is not None:
|
||||||
additional_kwargs['ctx'] = ctx
|
additional_kwargs['ctx'] = ctx
|
||||||
|
|
||||||
return command(*bound.args, **bound.kwargs, **additional_kwargs)
|
return command(*bound.args, **bound.kwargs, **additional_kwargs)
|
||||||
@ -36,8 +37,8 @@ def launcher(
|
|||||||
def mono(
|
def mono(
|
||||||
new_state: Annotated[Optional[bool], Argument()] = None,
|
new_state: Annotated[Optional[bool], Argument()] = None,
|
||||||
*,
|
*,
|
||||||
index: Annotated[int, Parameter(parse=False)],
|
index: Annotated[int, Parameter(show=False)] = None,
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
ctx: Annotated[Context, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Get or set the mono state of the specified strip.
|
"""Get or set the mono state of the specified strip.
|
||||||
|
|
||||||
@ -47,7 +48,7 @@ def mono(
|
|||||||
If provided, sets the mono state to this value. If not provided, the current mono state is printed.
|
If provided, sets the mono state to this value. If not provided, the current mono state is printed.
|
||||||
"""
|
"""
|
||||||
if new_state is None:
|
if new_state is None:
|
||||||
app.console.print(ctx.client.strip[index].mono)
|
console.out.print(ctx.client.strip[index].mono)
|
||||||
return
|
return
|
||||||
ctx.client.strip[index].mono = new_state
|
ctx.client.strip[index].mono = new_state
|
||||||
|
|
||||||
@ -56,8 +57,8 @@ def mono(
|
|||||||
def solo(
|
def solo(
|
||||||
new_state: Annotated[Optional[bool], Argument()] = None,
|
new_state: Annotated[Optional[bool], Argument()] = None,
|
||||||
*,
|
*,
|
||||||
index: Annotated[int, Parameter(parse=False)],
|
index: Annotated[int, Parameter(show=False)] = None,
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
ctx: Annotated[Context, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Get or set the solo state of the specified strip.
|
"""Get or set the solo state of the specified strip.
|
||||||
|
|
||||||
@ -67,7 +68,7 @@ def solo(
|
|||||||
If provided, sets the solo state to this value. If not provided, the current solo state is printed.
|
If provided, sets the solo state to this value. If not provided, the current solo state is printed.
|
||||||
"""
|
"""
|
||||||
if new_state is None:
|
if new_state is None:
|
||||||
app.console.print(ctx.client.strip[index].solo)
|
console.out.print(ctx.client.strip[index].solo)
|
||||||
return
|
return
|
||||||
ctx.client.strip[index].solo = new_state
|
ctx.client.strip[index].solo = new_state
|
||||||
|
|
||||||
@ -76,8 +77,8 @@ def solo(
|
|||||||
def mute(
|
def mute(
|
||||||
new_state: Annotated[Optional[bool], Argument()] = None,
|
new_state: Annotated[Optional[bool], Argument()] = None,
|
||||||
*,
|
*,
|
||||||
index: Annotated[int, Parameter(parse=False)],
|
index: Annotated[int, Parameter(show=False)] = None,
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
ctx: Annotated[Context, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Get or set the mute state of the specified strip.
|
"""Get or set the mute state of the specified strip.
|
||||||
|
|
||||||
@ -87,7 +88,7 @@ def mute(
|
|||||||
If provided, sets the mute state to this value. If not provided, the current mute state is printed.
|
If provided, sets the mute state to this value. If not provided, the current mute state is printed.
|
||||||
"""
|
"""
|
||||||
if new_state is None:
|
if new_state is None:
|
||||||
app.console.print(ctx.client.strip[index].mute)
|
console.out.print(ctx.client.strip[index].mute)
|
||||||
return
|
return
|
||||||
ctx.client.strip[index].mute = new_state
|
ctx.client.strip[index].mute = new_state
|
||||||
|
|
||||||
@ -96,8 +97,8 @@ def mute(
|
|||||||
def gain(
|
def gain(
|
||||||
new_value: Annotated[Optional[float], Argument()] = None,
|
new_value: Annotated[Optional[float], Argument()] = None,
|
||||||
*,
|
*,
|
||||||
index: Annotated[int, Parameter(parse=False)],
|
index: Annotated[int, Parameter(show=False)] = None,
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
ctx: Annotated[Context, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Get or set the gain of the specified strip.
|
"""Get or set the gain of the specified strip.
|
||||||
|
|
||||||
@ -107,7 +108,7 @@ def gain(
|
|||||||
If provided, sets the gain to this value. If not provided, the current gain is printed.
|
If provided, sets the gain to this value. If not provided, the current gain is printed.
|
||||||
"""
|
"""
|
||||||
if new_value is None:
|
if new_value is None:
|
||||||
app.console.print(ctx.client.strip[index].gain)
|
console.out.print(ctx.client.strip[index].gain)
|
||||||
return
|
return
|
||||||
ctx.client.strip[index].gain = new_value
|
ctx.client.strip[index].gain = new_value
|
||||||
|
|
||||||
@ -116,8 +117,8 @@ def gain(
|
|||||||
def a1(
|
def a1(
|
||||||
new_value: Annotated[Optional[bool], Argument()] = None,
|
new_value: Annotated[Optional[bool], Argument()] = None,
|
||||||
*,
|
*,
|
||||||
index: Annotated[int, Parameter(parse=False)],
|
index: Annotated[int, Parameter(show=False)] = None,
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
ctx: Annotated[Context, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Get or set the A1 state of the specified strip.
|
"""Get or set the A1 state of the specified strip.
|
||||||
|
|
||||||
@ -127,7 +128,7 @@ def a1(
|
|||||||
If provided, sets the A1 state to this value. If not provided, the current A1 state is printed.
|
If provided, sets the A1 state to this value. If not provided, the current A1 state is printed.
|
||||||
"""
|
"""
|
||||||
if new_value is None:
|
if new_value is None:
|
||||||
app.console.print(ctx.client.strip[index].A1)
|
console.out.print(ctx.client.strip[index].A1)
|
||||||
return
|
return
|
||||||
ctx.client.strip[index].A1 = new_value
|
ctx.client.strip[index].A1 = new_value
|
||||||
|
|
||||||
@ -136,8 +137,8 @@ def a1(
|
|||||||
def a2(
|
def a2(
|
||||||
new_value: Annotated[Optional[bool], Argument()] = None,
|
new_value: Annotated[Optional[bool], Argument()] = None,
|
||||||
*,
|
*,
|
||||||
index: Annotated[int, Parameter(parse=False)],
|
index: Annotated[int, Parameter(show=False)] = None,
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
ctx: Annotated[Context, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Get or set the A2 state of the specified strip.
|
"""Get or set the A2 state of the specified strip.
|
||||||
|
|
||||||
@ -147,7 +148,7 @@ def a2(
|
|||||||
If provided, sets the A2 state to this value. If not provided, the current A2 state is printed.
|
If provided, sets the A2 state to this value. If not provided, the current A2 state is printed.
|
||||||
"""
|
"""
|
||||||
if new_value is None:
|
if new_value is None:
|
||||||
app.console.print(ctx.client.strip[index].A2)
|
console.out.print(ctx.client.strip[index].A2)
|
||||||
return
|
return
|
||||||
ctx.client.strip[index].A2 = new_value
|
ctx.client.strip[index].A2 = new_value
|
||||||
|
|
||||||
@ -156,8 +157,8 @@ def a2(
|
|||||||
def a3(
|
def a3(
|
||||||
new_value: Annotated[Optional[bool], Argument()] = None,
|
new_value: Annotated[Optional[bool], Argument()] = None,
|
||||||
*,
|
*,
|
||||||
index: Annotated[int, Parameter(parse=False)],
|
index: Annotated[int, Parameter(show=False)] = None,
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
ctx: Annotated[Context, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Get or set the A3 state of the specified strip.
|
"""Get or set the A3 state of the specified strip.
|
||||||
|
|
||||||
@ -167,7 +168,7 @@ def a3(
|
|||||||
If provided, sets the A3 state to this value. If not provided, the current A3 state is printed.
|
If provided, sets the A3 state to this value. If not provided, the current A3 state is printed.
|
||||||
"""
|
"""
|
||||||
if new_value is None:
|
if new_value is None:
|
||||||
app.console.print(ctx.client.strip[index].A3)
|
console.out.print(ctx.client.strip[index].A3)
|
||||||
return
|
return
|
||||||
ctx.client.strip[index].A3 = new_value
|
ctx.client.strip[index].A3 = new_value
|
||||||
|
|
||||||
@ -176,8 +177,8 @@ def a3(
|
|||||||
def a4(
|
def a4(
|
||||||
new_value: Annotated[Optional[bool], Argument()] = None,
|
new_value: Annotated[Optional[bool], Argument()] = None,
|
||||||
*,
|
*,
|
||||||
index: Annotated[int, Parameter(parse=False)],
|
index: Annotated[int, Parameter(show=False)] = None,
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
ctx: Annotated[Context, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Get or set the A4 state of the specified strip.
|
"""Get or set the A4 state of the specified strip.
|
||||||
|
|
||||||
@ -187,7 +188,7 @@ def a4(
|
|||||||
If provided, sets the A4 state to this value. If not provided, the current A4 state is printed.
|
If provided, sets the A4 state to this value. If not provided, the current A4 state is printed.
|
||||||
"""
|
"""
|
||||||
if new_value is None:
|
if new_value is None:
|
||||||
app.console.print(ctx.client.strip[index].A4)
|
console.out.print(ctx.client.strip[index].A4)
|
||||||
return
|
return
|
||||||
ctx.client.strip[index].A4 = new_value
|
ctx.client.strip[index].A4 = new_value
|
||||||
|
|
||||||
@ -196,8 +197,8 @@ def a4(
|
|||||||
def a5(
|
def a5(
|
||||||
new_value: Annotated[Optional[bool], Argument()] = None,
|
new_value: Annotated[Optional[bool], Argument()] = None,
|
||||||
*,
|
*,
|
||||||
index: Annotated[int, Parameter(parse=False)],
|
index: Annotated[int, Parameter(show=False)] = None,
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
ctx: Annotated[Context, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Get or set the A5 state of the specified strip.
|
"""Get or set the A5 state of the specified strip.
|
||||||
|
|
||||||
@ -207,7 +208,7 @@ def a5(
|
|||||||
If provided, sets the A5 state to this value. If not provided, the current A5 state is printed.
|
If provided, sets the A5 state to this value. If not provided, the current A5 state is printed.
|
||||||
"""
|
"""
|
||||||
if new_value is None:
|
if new_value is None:
|
||||||
app.console.print(ctx.client.strip[index].A5)
|
console.out.print(ctx.client.strip[index].A5)
|
||||||
return
|
return
|
||||||
ctx.client.strip[index].A5 = new_value
|
ctx.client.strip[index].A5 = new_value
|
||||||
|
|
||||||
@ -216,8 +217,8 @@ def a5(
|
|||||||
def b1(
|
def b1(
|
||||||
new_value: Annotated[Optional[bool], Argument()] = None,
|
new_value: Annotated[Optional[bool], Argument()] = None,
|
||||||
*,
|
*,
|
||||||
index: Annotated[int, Parameter(parse=False)],
|
index: Annotated[int, Parameter(show=False)] = None,
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
ctx: Annotated[Context, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Get or set the B1 state of the specified strip.
|
"""Get or set the B1 state of the specified strip.
|
||||||
|
|
||||||
@ -227,7 +228,7 @@ def b1(
|
|||||||
If provided, sets the B1 state to this value. If not provided, the current B1 state is printed.
|
If provided, sets the B1 state to this value. If not provided, the current B1 state is printed.
|
||||||
"""
|
"""
|
||||||
if new_value is None:
|
if new_value is None:
|
||||||
app.console.print(ctx.client.strip[index].B1)
|
console.out.print(ctx.client.strip[index].B1)
|
||||||
return
|
return
|
||||||
ctx.client.strip[index].B1 = new_value
|
ctx.client.strip[index].B1 = new_value
|
||||||
|
|
||||||
@ -236,8 +237,8 @@ def b1(
|
|||||||
def b2(
|
def b2(
|
||||||
new_value: Annotated[Optional[bool], Argument()] = None,
|
new_value: Annotated[Optional[bool], Argument()] = None,
|
||||||
*,
|
*,
|
||||||
index: Annotated[int, Parameter(parse=False)],
|
index: Annotated[int, Parameter(show=False)] = None,
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
ctx: Annotated[Context, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Get or set the B2 state of the specified strip.
|
"""Get or set the B2 state of the specified strip.
|
||||||
|
|
||||||
@ -247,7 +248,7 @@ def b2(
|
|||||||
If provided, sets the B2 state to this value. If not provided, the current B2 state is printed.
|
If provided, sets the B2 state to this value. If not provided, the current B2 state is printed.
|
||||||
"""
|
"""
|
||||||
if new_value is None:
|
if new_value is None:
|
||||||
app.console.print(ctx.client.strip[index].B2)
|
console.out.print(ctx.client.strip[index].B2)
|
||||||
return
|
return
|
||||||
ctx.client.strip[index].B2 = new_value
|
ctx.client.strip[index].B2 = new_value
|
||||||
|
|
||||||
@ -256,8 +257,8 @@ def b2(
|
|||||||
def b3(
|
def b3(
|
||||||
new_value: Annotated[Optional[bool], Argument()] = None,
|
new_value: Annotated[Optional[bool], Argument()] = None,
|
||||||
*,
|
*,
|
||||||
index: Annotated[int, Parameter(parse=False)],
|
index: Annotated[int, Parameter(show=False)] = None,
|
||||||
ctx: Annotated[Context, Parameter(parse=False)],
|
ctx: Annotated[Context, Parameter(show=False)] = None,
|
||||||
):
|
):
|
||||||
"""Get or set the B3 state of the specified strip.
|
"""Get or set the B3 state of the specified strip.
|
||||||
|
|
||||||
@ -267,6 +268,6 @@ def b3(
|
|||||||
If provided, sets the B3 state to this value. If not provided, the current B3 state is printed.
|
If provided, sets the B3 state to this value. If not provided, the current B3 state is printed.
|
||||||
"""
|
"""
|
||||||
if new_value is None:
|
if new_value is None:
|
||||||
app.console.print(ctx.client.strip[index].B3)
|
console.out.print(ctx.client.strip[index].B3)
|
||||||
return
|
return
|
||||||
ctx.client.strip[index].B3 = new_value
|
ctx.client.strip[index].B3 = new_value
|
||||||
|
|||||||
@ -1,11 +1,9 @@
|
|||||||
import re
|
import re
|
||||||
|
|
||||||
from .error import VbanCLIValidationError
|
|
||||||
|
|
||||||
|
|
||||||
def is_valid_time_string(type_, value: str) -> str:
|
def is_valid_time_string(type_, value: str) -> str:
|
||||||
"""Validate if the given string is a valid time format (HH:MM:SS)."""
|
"""Validate if the given string is a valid time format (HH:MM:SS)."""
|
||||||
pattern = r'^(?:[01]\d|2[0123]):(?:[012345]\d):(?:[012345]\d)$'
|
pattern = r'^(?:[01]\d|2[0123]):(?:[012345]\d):(?:[012345]\d)$'
|
||||||
if not re.match(pattern, value):
|
if not re.match(pattern, value):
|
||||||
raise VbanCLIValidationError('Invalid time format. Expected HH:MM:SS.')
|
raise ValueError('Invalid time format. Expected HH:MM:SS.')
|
||||||
return value
|
return value
|
||||||
|
|||||||
4
uv.lock
generated
4
uv.lock
generated
@ -124,7 +124,7 @@ wheels = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "vban-cli"
|
name = "vban-cli"
|
||||||
version = "0.12.0"
|
version = "0.9.1"
|
||||||
source = { editable = "." }
|
source = { editable = "." }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "cyclopts" },
|
{ name = "cyclopts" },
|
||||||
@ -141,7 +141,7 @@ requires-dist = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "vban-cmd"
|
name = "vban-cmd"
|
||||||
version = "2.9.1"
|
version = "2.8.1"
|
||||||
source = { editable = "../vban-cmd-python" }
|
source = { editable = "../vban-cmd-python" }
|
||||||
|
|
||||||
[package.metadata]
|
[package.metadata]
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user