Compare commits

..

No commits in common. "6035e09e4392c73ffeeaa86670d3dd9de9975f3f" and "cb892d66d8da6a11cea87119992c35ef0efd915b" have entirely different histories.

6 changed files with 47 additions and 126 deletions

View File

@ -49,38 +49,6 @@ OBS_THEME=Reds
## Use
### CLI
To launch the CLI pass any subcommand, for example:
```console
simple-recorder start "File Name"
simple-recorder stop
```
#### Commands:
```shell
Usage: simple-recorder [OPTIONS] COMMAND
┏━ Subcommands ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ start Start recording ┃
┃ stop Stop recording ┃
┃ pause Pause recording ┃
┃ resume Resume recording ┃
┃ directory Get or set the recording directory ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
┏━ Options ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ --host <HOST> OBS WebSocket host ┃
┃ --port <PORT> OBS WebSocket port ┃
┃ --password <PASSWORD> OBS WebSocket password ┃
┃ --theme <THEME> GUI theme (Light Purple, Neutral Blue, Reds, Sandy Beach, ┃
┃ Kayak, Light Blue 2) ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
```
### GUI
To launch the GUI run the root command without any subcommands:
@ -101,4 +69,36 @@ You can change the colour theme with the --theme option:
simple-recorder --theme="Light Purple"
```
### CLI
```shell
Usage: simple-recorder [OPTIONS] COMMAND
┏━ Subcommands ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ start Start recording ┃
┃ stop Stop recording ┃
┃ pause Pause recording ┃
┃ resume Resume recording ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
┏━ Options ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ --host <HOST> OBS WebSocket host ┃
┃ --port <PORT> OBS WebSocket port ┃
┃ --password <PASSWORD> OBS WebSocket password ┃
┃ --theme <THEME> GUI theme (Light Purple, Neutral Blue, Reds, Sandy Beach, ┃
┃ Kayak, Light Blue 2) ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
```
To launch the CLI pass any subcommand (start/stop etc...), for example:
```console
simple-recorder start "File Name"
simple-recorder stop
```
- If no filename is passed to start then you will be prompted for one.
- A default_name will be used if none is supplied to the prompt.
[obs-studio]: https://obsproject.com/

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

After

Width:  |  Height:  |  Size: 84 KiB

View File

@ -1,6 +1,6 @@
[project]
name = "simple-recorder"
version = "0.3.1"
version = "0.2.0"
description = "A simple OBS recorder"
authors = [{ name = "onyx-and-iris", email = "code@onyxandiris.online" }]
dependencies = [

View File

@ -3,7 +3,6 @@ import logging
from clypi import ClypiConfig, ClypiException, Command, arg, configure
from typing_extensions import override
from .directory import Directory
from .errors import SimpleRecorderError
from .gui import SimpleRecorderWindow
from .pause import Pause
@ -38,7 +37,7 @@ def theme_parser(value: str) -> str:
class SimpleRecorder(Command):
subcommand: Start | Stop | Pause | Resume | Directory | None = None
subcommand: Start | Stop | Pause | Resume | 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(

View File

@ -1,36 +0,0 @@
import obsws_python as obsws
from clypi import Command, Positional, arg
from typing_extensions import override
from .errors import SimpleRecorderError
from .styler import highlight
class Directory(Command):
"""Get or set the recording directory."""
directory: Positional[str] = arg(
default=None,
help="Directory to set for recordings. If not provided, the current directory will be displayed.",
)
host: str = arg(inherited=True)
port: int = arg(inherited=True)
password: str = arg(inherited=True)
@override
async def run(self):
try:
with obsws.ReqClient(
host=self.host, port=self.port, password=self.password
) as client:
if self.directory:
client.set_record_directory(self.directory)
print(f"Recording directory set to: {highlight(self.directory)}")
else:
resp = client.get_record_directory()
print(
f"Current recording directory: {highlight(resp.record_directory)}"
)
return resp.record_directory
except TimeoutError:
raise SimpleRecorderError("Failed to connect to OBS. Is it running?")

View File

@ -3,7 +3,6 @@ import logging
import FreeSimpleGUI as fsg
import obsws_python as obsws
from .directory import Directory
from .errors import SimpleRecorderError
from .pause import Pause
from .resume import Resume
@ -27,8 +26,6 @@ class SimpleRecorderWindow(fsg.Window):
) as client:
resp = client.get_version()
status_message = f"Connected to OBS {resp.obs_version}"
resp = client.get_record_directory()
current_directory = resp.record_directory
except (ConnectionRefusedError, TimeoutError):
status_message = "Failed to connect to OBS. Is it running?"
@ -62,7 +59,7 @@ class SimpleRecorderWindow(fsg.Window):
[
fsg.Text(
f"Status: {status_message}",
key="-OUTPUT-RECORDER-",
key="-OUTPUT-",
text_color="white"
if status_message.startswith("Connected")
else "red",
@ -73,12 +70,7 @@ class SimpleRecorderWindow(fsg.Window):
settings_layout = [
[fsg.Text("Enter the filepath for the recording:")],
[fsg.InputText(current_directory, key="-FILEPATH-", size=(45, 1))],
[
fsg.Button("Get Current", key="-GET-CURRENT-", size=(10, 1)),
fsg.Button("Update", key="-UPDATE-", size=(10, 1)),
],
[fsg.Text("", key="-OUTPUT-SETTINGS-", text_color="white")],
[fsg.InputText("", key="-FILEPATH-", size=(45, 1))],
]
settings_tab = fsg.Tab("Settings", settings_layout)
@ -118,11 +110,11 @@ class SimpleRecorderWindow(fsg.Window):
port=self.port,
password=self.password,
).run()
self["-OUTPUT-RECORDER-"].update(
self["-OUTPUT-"].update(
"Recording started successfully", text_color="green"
)
except SimpleRecorderError as e:
self["-OUTPUT-RECORDER-"].update(
self["-OUTPUT-"].update(
f"Error: {e.raw_message}", text_color="red"
)
@ -131,11 +123,11 @@ class SimpleRecorderWindow(fsg.Window):
await Stop(
host=self.host, port=self.port, password=self.password
).run()
self["-OUTPUT-RECORDER-"].update(
self["-OUTPUT-"].update(
"Recording stopped successfully", text_color="green"
)
except SimpleRecorderError as e:
self["-OUTPUT-RECORDER-"].update(
self["-OUTPUT-"].update(
f"Error: {e.raw_message}", text_color="red"
)
@ -144,11 +136,11 @@ class SimpleRecorderWindow(fsg.Window):
await Pause(
host=self.host, port=self.port, password=self.password
).run()
self["-OUTPUT-RECORDER-"].update(
self["-OUTPUT-"].update(
"Recording paused successfully", text_color="green"
)
except SimpleRecorderError as e:
self["-OUTPUT-RECORDER-"].update(
self["-OUTPUT-"].update(
f"Error: {e.raw_message}", text_color="red"
)
@ -157,21 +149,21 @@ class SimpleRecorderWindow(fsg.Window):
await Resume(
host=self.host, port=self.port, password=self.password
).run()
self["-OUTPUT-RECORDER-"].update(
self["-OUTPUT-"].update(
"Recording resumed successfully", text_color="green"
)
except SimpleRecorderError as e:
self["-OUTPUT-RECORDER-"].update(
self["-OUTPUT-"].update(
f"Error: {e.raw_message}", text_color="red"
)
case ["Add Chapter", "FOCUS" | "LEAVE" as focus_event]:
if focus_event == "FOCUS":
self["-OUTPUT-RECORDER-"].update(
self["-OUTPUT-"].update(
"Right-click to set a chapter name", text_color="white"
)
else:
self["-OUTPUT-RECORDER-"].update("", text_color="white")
self["-OUTPUT-"].update("", text_color="white")
case ["Add Chapter", "RIGHT_CLICK"]:
_ = fsg.popup_get_text(
@ -181,44 +173,10 @@ class SimpleRecorderWindow(fsg.Window):
)
case ["Split Recording" | "Add Chapter"]:
self["-OUTPUT-RECORDER-"].update(
self["-OUTPUT-"].update(
"This feature is not implemented yet", text_color="orange"
)
case ["-GET-CURRENT-"]:
try:
current_directory = await Directory(
host=self.host, port=self.port, password=self.password
).run()
self["-FILEPATH-"].update(current_directory)
except SimpleRecorderError as e:
self["-OUTPUT-SETTINGS-"].update(
f"Error: {e.raw_message}", text_color="red"
)
case ["-UPDATE-"]:
filepath = values["-FILEPATH-"]
if not filepath:
self["-OUTPUT-SETTINGS-"].update(
"Filepath cannot be empty", text_color="red"
)
else:
try:
await Directory(
directory=filepath,
host=self.host,
port=self.port,
password=self.password,
).run()
self["-OUTPUT-SETTINGS-"].update(
"Recording directory updated successfully.",
text_color="green",
)
except SimpleRecorderError as e:
self["-OUTPUT-SETTINGS-"].update(
f"Error: {e.raw_message}", text_color="red"
)
case _:
self.logger.debug(f"Unhandled event: {e}")