This should work but it hasn't been tested. Waiting on https://github.com/aatikturk/obsws-python/pull/58

This commit is contained in:
onyx-and-iris 2025-06-26 06:46:32 +01:00
parent 6bdbb470c9
commit 9152c83063
3 changed files with 49 additions and 2 deletions

View File

@ -5,6 +5,7 @@ from typing_extensions import override
from .errors import SimpleRecorderError from .errors import SimpleRecorderError
from .gui import SimpleRecorderWindow from .gui import SimpleRecorderWindow
from .split import Split
from .start import Start from .start import Start
from .stop import Stop from .stop import Stop
@ -35,7 +36,7 @@ def theme_parser(value: str) -> str:
class SimpleRecorder(Command): 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") host: str = arg(default="localhost", env="OBS_HOST", help="OBS WebSocket host")
port: int = arg(default=4455, env="OBS_PORT", help="OBS WebSocket port") port: int = arg(default=4455, env="OBS_PORT", help="OBS WebSocket port")
password: str | None = arg( password: str | None = arg(

View File

@ -3,6 +3,7 @@ import logging
import FreeSimpleGUI as fsg import FreeSimpleGUI as fsg
from clypi import ClypiException from clypi import ClypiException
from .split import Split
from .start import Start from .start import Start
from .stop import Stop from .stop import Stop
@ -20,13 +21,18 @@ class SimpleRecorderWindow(fsg.Window):
layout = [ layout = [
[fsg.Text("Enter recording filename:")], [fsg.Text("Enter recording filename:")],
[fsg.InputText("", key="-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-")], [fsg.Text("Status: Not started", key="-OUTPUT-")],
] ]
super().__init__("Simple Recorder", layout, finalize=True) super().__init__("Simple Recorder", layout, finalize=True)
self["-FILENAME-"].bind("<Return>", " || RETURN") self["-FILENAME-"].bind("<Return>", " || RETURN")
self["Start Recording"].bind("<Return>", " || RETURN") self["Start Recording"].bind("<Return>", " || RETURN")
self["Stop Recording"].bind("<Return>", " || RETURN") self["Stop Recording"].bind("<Return>", " || RETURN")
self["Split Recording"].bind("<Return>", " || RETURN")
async def run(self): async def run(self):
while True: while True:
@ -64,6 +70,19 @@ class SimpleRecorderWindow(fsg.Window):
f"Error: {e.raw_message}", text_color="red" 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 _: case _:
self.logger.warning(f"Unhandled event: {event}") self.logger.warning(f"Unhandled event: {event}")

View File

@ -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.")