Compare commits

..

4 Commits

Author SHA1 Message Date
2ca89515be add command lock/unlock
patch bump
2026-03-05 20:12:36 +00:00
6cd92a2975 add bus label/gain commands
patch bump
2026-03-05 20:05:00 +00:00
36a8ec124a add strip label command
patch bump
2026-03-05 20:04:40 +00:00
4dd01a0e99 add missing help messages
patch bump
2026-03-05 19:59:32 +00:00
9 changed files with 108 additions and 8 deletions

View File

@ -1,11 +1,11 @@
[project] [project]
name = "vban-cli" name = "vban-cli"
version = "0.12.1" version = "0.12.5"
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.4"] dependencies = ["cyclopts>=4.6.0", "loguru>=0.7.3", "vban-cmd>=2.9.6"]
classifiers = [ classifiers = [
"Development Status :: 4 - Beta", "Development Status :: 4 - Beta",
"Programming Language :: Python", "Programming Language :: Python",

View File

@ -106,3 +106,43 @@ def mode(
app.console.print(ctx.client.bus[index].mode.get()) app.console.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)
@app.command(name='gain')
def gain(
new_value: Annotated[Optional[float], Argument()] = None,
*,
index: Annotated[int, Parameter(parse=False)],
ctx: Annotated[Context, Parameter(parse=False)],
):
"""Get or set the gain of the specified bus.
Parameters
----------
new_value : float, optional
If provided, sets the gain to this value. If not provided, the current gain is printed.
"""
if new_value is None:
app.console.print(ctx.client.bus[index].gain)
return
ctx.client.bus[index].gain = new_value
@app.command(name='label')
def label(
new_value: Annotated[Optional[str], Argument()] = None,
*,
index: Annotated[int, Parameter(parse=False)],
ctx: Annotated[Context, Parameter(parse=False)],
):
"""Get or set the label of the specified bus.
Parameters
----------
new_value : str, optional
If provided, sets the label to this value. If not provided, the current label is printed.
"""
if new_value is None:
app.console.print(ctx.client.bus[index].label)
return
ctx.client.bus[index].label = new_value

View File

@ -5,7 +5,11 @@ from cyclopts import App, Parameter
from .context import Context from .context import Context
from .help import BaseHelpFormatter from .help import BaseHelpFormatter
app = App(name='command', help_formatter=BaseHelpFormatter()) app = App(
name='command',
help='Execute commands that perform actions',
help_formatter=BaseHelpFormatter(),
)
@app.command(name='show') @app.command(name='show')
@ -46,3 +50,23 @@ def restart(
"""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.') app.console.print('Voicemeeter engine should now be restarting.')
@app.command(name='lock')
def lock(
*,
ctx: Annotated[Context, Parameter(parse=False)],
):
"""Lock the Voicemeeter GUI."""
ctx.client.command.lock = True
app.console.print('Voicemeeter GUI should now be locked.')
@app.command(name='unlock')
def unlock(
*,
ctx: Annotated[Context, Parameter(parse=False)],
):
"""Unlock the Voicemeeter GUI."""
ctx.client.command.lock = False
app.console.print('Voicemeeter GUI should now be unlocked.')

View File

@ -5,7 +5,11 @@ from cyclopts import App, Argument, Parameter
from .context import Context from .context import Context
from .help import StripHelpFormatter from .help import StripHelpFormatter
app = App(name='comp', help_formatter=StripHelpFormatter()) app = App(
name='comp',
help='Control the compressor settings',
help_formatter=StripHelpFormatter(),
)
@app.command(name='knob') @app.command(name='knob')

View File

@ -5,7 +5,11 @@ from cyclopts import App, Argument, Parameter
from .context import Context from .context import Context
from .help import StripHelpFormatter from .help import StripHelpFormatter
app = App(name='denoiser', help_formatter=StripHelpFormatter()) app = App(
name='denoiser',
help='Control the denoiser settings',
help_formatter=StripHelpFormatter(),
)
@app.command(name='knob') @app.command(name='knob')

View File

@ -5,7 +5,11 @@ from cyclopts import App, Argument, Parameter
from .context import Context from .context import Context
from .help import StripHelpFormatter from .help import StripHelpFormatter
app = App(name='gate', help_formatter=StripHelpFormatter()) app = App(
name='gate',
help='Control the gate settings',
help_formatter=StripHelpFormatter(),
)
@app.command(name='knob') @app.command(name='knob')

View File

@ -7,7 +7,11 @@ from . import validation
from .context import Context from .context import Context
from .help import BaseHelpFormatter from .help import BaseHelpFormatter
app = App(name='recorder', help_formatter=BaseHelpFormatter()) app = App(
name='recorder',
help='Control the recorder playback and recording',
help_formatter=BaseHelpFormatter(),
)
@app.command(name='play') @app.command(name='play')

View File

@ -270,3 +270,23 @@ def b3(
app.console.print(ctx.client.strip[index].B3) app.console.print(ctx.client.strip[index].B3)
return return
ctx.client.strip[index].B3 = new_value ctx.client.strip[index].B3 = new_value
@app.command(name='label')
def label(
new_value: Annotated[Optional[str], Argument()] = None,
*,
index: Annotated[int, Parameter(parse=False)],
ctx: Annotated[Context, Parameter(parse=False)],
):
"""Get or set the label of the specified strip.
Parameters
----------
new_value : str, optional
If provided, sets the label to this value. If not provided, the current label is printed.
"""
if new_value is None:
app.console.print(ctx.client.strip[index].label)
return
ctx.client.strip[index].label = new_value

2
uv.lock generated
View File

@ -124,7 +124,7 @@ wheels = [
[[package]] [[package]]
name = "vban-cli" name = "vban-cli"
version = "0.12.1" version = "0.12.5"
source = { editable = "." } source = { editable = "." }
dependencies = [ dependencies = [
{ name = "cyclopts" }, { name = "cyclopts" },