diff --git a/src/simple_recorder/cli.py b/src/simple_recorder/cli.py index 0364dac..25bd479 100644 --- a/src/simple_recorder/cli.py +++ b/src/simple_recorder/cli.py @@ -5,6 +5,7 @@ from typing_extensions import override from .errors import SimpleRecorderError from .gui import SimpleRecorderWindow +from .split import Split from .start import Start from .stop import Stop @@ -35,7 +36,7 @@ def theme_parser(value: str) -> str: class SimpleRecorder(Command): - subcommand: Start | Stop | None = None + subcommand: Start | Stop | Split | None = None host: str = arg(default="localhost", env="OBS_HOST", help="OBS WebSocket host") port: int = arg(default=4455, env="OBS_PORT", help="OBS WebSocket port") password: str | None = arg( diff --git a/src/simple_recorder/gui.py b/src/simple_recorder/gui.py index 5935df2..87f4298 100644 --- a/src/simple_recorder/gui.py +++ b/src/simple_recorder/gui.py @@ -3,6 +3,7 @@ import logging import FreeSimpleGUI as fsg from clypi import ClypiException +from .split import Split from .start import Start from .stop import Stop @@ -20,13 +21,18 @@ class SimpleRecorderWindow(fsg.Window): layout = [ [fsg.Text("Enter recording filename:")], [fsg.InputText("", key="-FILENAME-")], - [fsg.Button("Start Recording"), fsg.Button("Stop Recording")], + [ + fsg.Button("Start Recording"), + fsg.Button("Stop Recording"), + fsg.Button("Split Recording"), + ], [fsg.Text("Status: Not started", key="-OUTPUT-")], ] super().__init__("Simple Recorder", layout, finalize=True) self["-FILENAME-"].bind("", " || RETURN") self["Start Recording"].bind("", " || RETURN") self["Stop Recording"].bind("", " || RETURN") + self["Split Recording"].bind("", " || RETURN") async def run(self): while True: @@ -64,6 +70,19 @@ class SimpleRecorderWindow(fsg.Window): f"Error: {e.raw_message}", text_color="red" ) + case ["Split Recording", "RETURN" | None]: + try: + await Split( + host=self.host, port=self.port, password=self.password + ).run() + self["-OUTPUT-"].update( + "Recording split successfully", text_color="green" + ) + except ClypiException as e: + self["-OUTPUT-"].update( + f"Error: {e.raw_message}", text_color="red" + ) + case _: self.logger.warning(f"Unhandled event: {event}") diff --git a/src/simple_recorder/split.py b/src/simple_recorder/split.py new file mode 100644 index 0000000..d7655cc --- /dev/null +++ b/src/simple_recorder/split.py @@ -0,0 +1,27 @@ +import obsws_python as obsws +from clypi import Command, arg + +from .errors import SimpleRecorderError + + +class Split(Command): + """Split recording.""" + + host: str = arg(inherited=True) + port: int = arg(inherited=True) + password: str = arg(inherited=True) + + async def run(self): + with obsws.ReqClient( + host=self.host, port=self.port, password=self.password + ) as client: + resp = client.get_record_status() + if not resp.output_active: + raise SimpleRecorderError("Recording is not active.") + if resp.output_paused: + raise SimpleRecorderError( + "Recording is paused. Please resume before splitting." + ) + + client.split_record_file() + print("Recording split successfully.")