6 Commits

Author SHA1 Message Date
0814678278 debug should be a hidden option
patch bump
2025-06-26 14:38:53 +01:00
68041f1406 fix bug with parser (regression)
patch bump
2025-06-26 09:56:53 +01:00
bba2361964 add available themes to --theme help string
patch bump
2025-06-26 08:56:32 +01:00
d8cdae61a9 upd --help output in README 2025-06-26 06:54:47 +01:00
a43813fc00 fix help string for theme option 2025-06-26 06:53:36 +01:00
87dbd0b8e5 typo 2025-06-26 06:52:20 +01:00
4 changed files with 45 additions and 33 deletions

View File

@@ -30,7 +30,7 @@ pipx install simple-recorder
*with pyz* *with pyz*
An executable pyz has been included in [Release](https://github.com/onyx-and-iris/simple-recorder/releases) which you can run in Windows. Follow the steps in this [Setting up Windows for Zipapps](https://jhermann.github.io/blog/python/deployment/2020/02/29/python_zippapps_on_windows.html#Setting-Up-Windows-10-for-Zipapps) guide. An executable pyz has been included in [Releases](https://github.com/onyx-and-iris/simple-recorder/releases) which you can run in Windows. Follow the steps in this [Setting up Windows for Zipapps](https://jhermann.github.io/blog/python/deployment/2020/02/29/python_zippapps_on_windows.html#Setting-Up-Windows-10-for-Zipapps) guide.
## Configuration ## Configuration
@@ -65,33 +65,32 @@ Just enter the filename and click *Start Recording*.
#### Themes #### Themes
Passing flags is fine, however, for example to set the theme: However, passing flags is fine, for example to set the theme:
```console ```console
simple-recorder --theme="Light Purple" simple-recorder --theme="Light Purple"
``` ```
Available themes: Light Purple, Neutral Blue, Reds, Sandy Beach, Kayak, Light Blue 2, Dark Teal1
### CLI ### CLI
```shell ```shell
Usage: simple-recorder [OPTIONS] COMMAND Usage: simple-recorder [OPTIONS] COMMAND
┏━ Subcommands ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┏━ Subcommands ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┃ start Start recording ┃ ┃ start Start recording ┃
┃ stop Stop recording ┃ ┃ stop Stop recording ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┏━ Options ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┏━ Options ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┃ --host <HOST> OBS WebSocket host ┃ ┃ --host <HOST> OBS WebSocket host ┃
┃ --port <PORT> OBS WebSocket port ┃ ┃ --port <PORT> OBS WebSocket port ┃
┃ --password <PASSWORD> OBS WebSocket password ┃ ┃ --password <PASSWORD> OBS WebSocket password ┃
┃ --theme <THEME> OBS WebSocket theme ┃ --theme <THEME> GUI theme (Light Purple, Neutral Blue, Reds, Sandy Beach,
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ┃ Kayak, Light Blue 2)
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
``` ```
For example: To launch the CLI pass any subcommand (start/stop etc...), for example:
```console ```console
simple-recorder start "File Name" simple-recorder start "File Name"

View File

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

View File

@@ -15,18 +15,18 @@ config = ClypiConfig(
) )
configure(config) configure(config)
themes = [
def theme_parser(value: str) -> str:
"""Parse the theme argument."""
themes = [
"Light Purple", "Light Purple",
"Neutral Blue", "Neutral Blue",
"Reds", "Reds",
"Sandy Beach", "Sandy Beach",
"Kayak", "Kayak",
"Light Blue 2", "Light Blue 2",
"Dark Teal1", ]
]
def theme_parser(value: str) -> str:
"""Parse the theme argument."""
if value not in themes: if value not in themes:
raise ClypiException( raise ClypiException(
f"Invalid theme: {value}. Available themes: {', '.join(themes)}" f"Invalid theme: {value}. Available themes: {', '.join(themes)}"
@@ -42,12 +42,24 @@ class SimpleRecorder(Command):
default=None, env="OBS_PASSWORD", help="OBS WebSocket password" default=None, env="OBS_PASSWORD", help="OBS WebSocket password"
) )
theme: str = arg( theme: str = arg(
default="Reds", parser=theme_parser, env="OBS_THEME", help="OBS WebSocket theme" default="Reds",
parser=theme_parser,
env="OBS_THEME",
help=f"GUI theme ({', '.join(themes)})",
)
debug: bool = arg(
default=False,
env="DEBUG",
help="Enable debug logging",
hidden=True,
) )
@override @override
async def run(self): async def run(self):
"""Run the Simple Recorder GUI.""" """Run the Simple Recorder GUI."""
if self.debug:
logging.basicConfig(level=logging.DEBUG)
window = SimpleRecorderWindow(self.host, self.port, self.password, self.theme) window = SimpleRecorderWindow(self.host, self.port, self.password, self.theme)
await window.run() await window.run()

View File

@@ -1,8 +1,8 @@
import logging import logging
import FreeSimpleGUI as fsg import FreeSimpleGUI as fsg
from clypi import ClypiException
from .errors import SimpleRecorderError
from .start import Start from .start import Start
from .stop import Stop from .stop import Stop
@@ -31,11 +31,12 @@ class SimpleRecorderWindow(fsg.Window):
async def run(self): async def run(self):
while True: while True:
event, values = self.read() event, values = self.read()
self.logger.debug(f"Event: {event}, Values: {values}")
if event == fsg.WIN_CLOSED: if event == fsg.WIN_CLOSED:
break break
match event.split(" || "): match e := event.split(" || "):
case ["Start Recording", "RETURN" | None] | ["-FILENAME-", "RETURN"]: case ["Start Recording"] | ["Start Recording" | "-FILENAME-", "RETURN"]:
try: try:
await Start( await Start(
filename=values["-FILENAME-"], filename=values["-FILENAME-"],
@@ -46,12 +47,12 @@ class SimpleRecorderWindow(fsg.Window):
self["-OUTPUT-"].update( self["-OUTPUT-"].update(
"Recording started successfully", text_color="green" "Recording started successfully", text_color="green"
) )
except ClypiException as e: except SimpleRecorderError as e:
self["-OUTPUT-"].update( self["-OUTPUT-"].update(
f"Error: {e.raw_message}", text_color="red" f"Error: {e.raw_message}", text_color="red"
) )
case ["Stop Recording", "RETURN" | None]: case ["Stop Recording"] | ["Stop Recording", "RETURN"]:
try: try:
await Stop( await Stop(
host=self.host, port=self.port, password=self.password host=self.host, port=self.port, password=self.password
@@ -59,12 +60,12 @@ class SimpleRecorderWindow(fsg.Window):
self["-OUTPUT-"].update( self["-OUTPUT-"].update(
"Recording stopped successfully", text_color="green" "Recording stopped successfully", text_color="green"
) )
except ClypiException as e: except SimpleRecorderError as e:
self["-OUTPUT-"].update( self["-OUTPUT-"].update(
f"Error: {e.raw_message}", text_color="red" f"Error: {e.raw_message}", text_color="red"
) )
case _: case _:
self.logger.warning(f"Unhandled event: {event}") self.logger.warning(f"Unhandled event: {e}")
self.close() self.close()