vban-cli/src/vban_cli/recorder.py
2026-03-05 19:59:32 +00:00

136 lines
3.4 KiB
Python

from pathlib import Path
from typing import Annotated
from cyclopts import App, Parameter, validators
from . import validation
from .context import Context
from .help import BaseHelpFormatter
app = App(
name='recorder',
help='Control the recorder playback and recording',
help_formatter=BaseHelpFormatter(),
)
@app.command(name='play')
def play(
*,
ctx: Annotated[Context, Parameter(parse=False)],
):
"""Start the recorder playback."""
ctx.client.recorder.play()
app.console.print('Recorder playback started.')
@app.command(name='pause')
def pause(
*,
ctx: Annotated[Context, Parameter(parse=False)],
):
"""Pause the recorder playback."""
ctx.client.recorder.stop()
app.console.print('Recorder playback paused.')
@app.command(name='stop')
def stop(
*,
ctx: Annotated[Context, Parameter(parse=False)],
):
"""Stop the recorder playback/recording and reset to the beginning."""
ctx.client.recorder.stop()
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.
# See https://github.com/onyx-and-iris/vban-cli?tab=readme-ov-file#implementation-notes - 4.
app.console.print('Recorder stopped.')
@app.command(name='replay')
def replay(
*,
ctx: Annotated[Context, Parameter(parse=False)],
):
"""Replay the recorder playback."""
ctx.client.recorder.replay()
app.console.print('Recorder playback replay started.')
@app.command(name='record')
def record(
*,
ctx: Annotated[Context, Parameter(parse=False)],
):
"""Start recording."""
ctx.client.recorder.record()
app.console.print('Recorder recording started.')
@app.command(name='pause-recording')
def pause_recording(
*,
ctx: Annotated[Context, Parameter(parse=False)],
):
"""Pause the recorder recording."""
ctx.client.recorder.pause()
app.console.print('Recorder recording paused.')
@app.command(name='ff')
def ff(
*,
ctx: Annotated[Context, Parameter(parse=False)],
):
"""Fast forward the recorder playback."""
ctx.client.recorder.ff()
app.console.print('Recorder playback fast forwarded.')
@app.command(name='rew')
def rew(
*,
ctx: Annotated[Context, Parameter(parse=False)],
):
"""Rewind the recorder playback."""
ctx.client.recorder.rew()
app.console.print('Recorder playback rewound.')
@app.command(name='load')
def load(
file_path: Annotated[
Path,
Parameter(
help='The path to the recording file to load.',
validator=validators.Path(exists=True),
),
],
/,
*,
ctx: Annotated[Context, Parameter(parse=False)],
):
"""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."""
ctx.client.recorder.load(file_path)
app.console.print(f'Loaded file: {file_path}')
@app.command(name='goto')
def goto(
time_string: Annotated[
str,
Parameter(
help='The timestamp to go to in the recorder playback (format: HH:MM:SS).',
validator=validation.is_valid_time_string,
),
],
/,
*,
ctx: Annotated[Context, Parameter(parse=False)],
):
"""Go to a specific timestamp in the recorder playback."""
ctx.client.recorder.goto(time_string)
app.console.print(f'Went to timestamp {time_string} in recorder playback.')