From 3ae3c02e8ba4edd10c978ea467fa1c2120d8881d Mon Sep 17 00:00:00 2001 From: onyx-and-iris Date: Wed, 25 Jun 2025 14:38:54 +0100 Subject: [PATCH] first commit --- .gitignore | 165 ++++++++++++++++++++++++++++++++ README.md | 59 ++++++++++++ img/simple-recorder.png | Bin 0 -> 59708 bytes pdm.lock | 98 +++++++++++++++++++ pyproject.toml | 27 ++++++ src/simple_recorder/__init__.py | 3 + src/simple_recorder/app.py | 149 ++++++++++++++++++++++++++++ tests/__init__.py | 0 8 files changed, 501 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100755 img/simple-recorder.png create mode 100644 pdm.lock create mode 100644 pyproject.toml create mode 100644 src/simple_recorder/__init__.py create mode 100644 src/simple_recorder/app.py create mode 100644 tests/__init__.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..dcad9ad --- /dev/null +++ b/.gitignore @@ -0,0 +1,165 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm-project.org/#use-with-ide +.pdm.toml +.pdm-python +.pdm-build/ + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ +.envrc + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +bin/ \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..2f46e52 --- /dev/null +++ b/README.md @@ -0,0 +1,59 @@ +# simple-recorder + +A single purpose application for naming a file recording in OBS. + +Run it as a CLI or a GUI. + +## Requirements + +- Python 3.11 or greater + +## Installation + +*with uv* + +```console +uv tool install simple-recorder +``` + +*with pipx* + +```console +pipx install simple-recorder +``` + +## Use + +Without passing a subcommand (start/stop) a GUI will be launched, otherwise a CLI will be launched. + +### GUI + +![simple-recorder](./img/simple-recorder.png) + +Just enter the filename and click *Start Recording*. + +### CLI + +```shell +Usage: simple-recorder [OPTIONS] COMMAND + +┏━ Subcommands ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ +┃ start Start recording ┃ +┃ stop Stop recording ┃ +┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + +┏━ Options ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ +┃ --host ┃ +┃ --port ┃ +┃ --password ┃ +┃ --theme ┃ +┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ +``` + +```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. diff --git a/img/simple-recorder.png b/img/simple-recorder.png new file mode 100755 index 0000000000000000000000000000000000000000..c288b5e2a88f2f1480023d26f2794f36b2067ef7 GIT binary patch literal 59708 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.9.0.post0", + "typing-extensions>=4.4.0", +] +files = [ + {file = "clypi-1.8.1-py3-none-any.whl", hash = "sha256:7218807e31f698fe5585c63d397645e481ca846d1491a4f1fde017c7892dbe3c"}, + {file = "clypi-1.8.1.tar.gz", hash = "sha256:9efa0a5a0e3668dd390e0d90321587dcb8eea12e28facd2ac437383f0de3dc76"}, +] + +[[package]] +name = "freesimplegui" +version = "5.2.0.post1" +summary = "The free-forever Python GUI framework." +groups = ["default"] +files = [ + {file = "freesimplegui-5.2.0.post1-py3-none-any.whl", hash = "sha256:3d61eb519324503232f86b2f1bd7f5c6813ce225f6e189d0fd737ddb036af4d5"}, + {file = "freesimplegui-5.2.0.post1.tar.gz", hash = "sha256:e58a0e6758e9a9e87152256911f94fcc3998356d1309973a9f4d9df2dc55f98a"}, +] + +[[package]] +name = "obsws-python" +version = "1.7.2" +requires_python = ">=3.9" +summary = "A Python SDK for OBS Studio WebSocket v5.0" +groups = ["default"] +dependencies = [ + "tomli>=2.0.1; python_version < \"3.11\"", + "websocket-client", +] +files = [ + {file = "obsws_python-1.7.2-py3-none-any.whl", hash = "sha256:acda31852ad9d7165de915b0603c13f6df527d3f61619970bf5fb562e300bc85"}, + {file = "obsws_python-1.7.2.tar.gz", hash = "sha256:b5cdaad30fbe1f6d4787b6530048b9882f070c3ee7830abb6dad4a47f84d7fa0"}, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +summary = "Extensions to the standard Python datetime module" +groups = ["default"] +dependencies = [ + "six>=1.5", +] +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[[package]] +name = "six" +version = "1.17.0" +requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +summary = "Python 2 and 3 compatibility utilities" +groups = ["default"] +files = [ + {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, + {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, +] + +[[package]] +name = "typing-extensions" +version = "4.14.0" +requires_python = ">=3.9" +summary = "Backported and Experimental Type Hints for Python 3.9+" +groups = ["default"] +files = [ + {file = "typing_extensions-4.14.0-py3-none-any.whl", hash = "sha256:a1514509136dd0b477638fc68d6a91497af5076466ad0fa6c338e44e359944af"}, + {file = "typing_extensions-4.14.0.tar.gz", hash = "sha256:8676b788e32f02ab42d9e7c61324048ae4c6d844a399eebace3d4979d75ceef4"}, +] + +[[package]] +name = "websocket-client" +version = "1.8.0" +requires_python = ">=3.8" +summary = "WebSocket client for Python with low level API options" +groups = ["default"] +files = [ + {file = "websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526"}, + {file = "websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da"}, +] diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..0cbe892 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,27 @@ +[project] +name = "simple-recorder" +version = "0.1.0" +description = "A simple OBS recorder" +authors = [{ name = "onyx-and-iris", email = "code@onyxandiris.online" }] +dependencies = [ + "clypi>=1.8.1", + "FreeSimpleGUI>=5.2.0.post1", + "obsws-python>=1.7.2", +] +requires-python = ">=3.11" +readme = "README.md" +license = { text = "MIT" } + +[project.scripts] +simple-recorder = "simple_recorder:run" + +[build-system] +requires = ["pdm-backend"] +build-backend = "pdm.backend" + + +[tool.pdm] +distribution = true + +[tool.pdm.scripts] +compile = "uvx shiv -c simple-recorder -o bin/simple-recorder-bin ." diff --git a/src/simple_recorder/__init__.py b/src/simple_recorder/__init__.py new file mode 100644 index 0000000..0565668 --- /dev/null +++ b/src/simple_recorder/__init__.py @@ -0,0 +1,3 @@ +from .app import run + +__all__ = ["run"] diff --git a/src/simple_recorder/app.py b/src/simple_recorder/app.py new file mode 100644 index 0000000..6515d39 --- /dev/null +++ b/src/simple_recorder/app.py @@ -0,0 +1,149 @@ +import logging +from datetime import datetime + +import FreeSimpleGUI as fsg +import obsws_python as obsws +from clypi import ClypiConfig, ClypiException, Command, Positional, arg, configure +from typing_extensions import override + +logger = logging.getLogger(__name__) + +config = ClypiConfig( + nice_errors=(ClypiException,), +) +configure(config) + + +class Start(Command): + """Start recording.""" + + filename: Positional[str] = arg( + default="default_name", + help="Name of the recording", + prompt="Enter the name for the recording", + ) + host: str = arg(inherited=True) + port: int = arg(inherited=True) + password: str = arg(inherited=True) + + @staticmethod + def get_timestamp(): + return datetime.now().strftime("%Y-%m-%d %H-%M-%S") + + @override + async def run(self): + if not self.filename: + raise ClypiException("Recording name cannot be empty.") + + with obsws.ReqClient( + host=self.host, port=self.port, password=self.password + ) as client: + resp = client.get_record_status() + if resp.output_active: + raise ClypiException("Recording is already active.") + + client.set_profile_parameter( + "Output", + "FilenameFormatting", + f"{self.filename} {self.get_timestamp()}", + ) + client.start_record() + + +class Stop(Command): + """Stop recording.""" + + host: str = arg(inherited=True) + port: int = arg(inherited=True) + password: str = arg(inherited=True) + + @override + 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 ClypiException("Recording is not active.") + + client.stop_record() + + +def theme_parser(value: str) -> str: + """Parse the theme argument.""" + themes = ["Light Purple", "Neutral Blue", "Reds", "Sandy Beach"] + if value not in themes: + raise ClypiException( + f"Invalid theme: {value}. Available themes: {', '.join(themes)}" + ) + return value + + +class SimpleRecorder(Command): + subcommand: Start | Stop | None = None + host: str = arg(default="localhost", env="OBS_HOST") + port: int = arg(default=4455, env="OBS_PORT") + password: str | None = arg(default=None, env="OBS_PASSWORD") + theme: str = arg(default="Reds", parser=theme_parser, env="OBS_THEME") + + @override + async def run(self): + fsg.theme(self.theme) + + input_text = fsg.InputText("", key="-FILENAME-") + start_record_button = fsg.Button("Start Recording", key="Start Recording") + stop_record_button = fsg.Button("Stop Recording", key="Stop Recording") + + layout = [ + [fsg.Text("Enter recording filename:")], + [input_text], + [start_record_button, stop_record_button], + [fsg.Text("Status: Not started", key="-OUTPUT-")], + ] + window = fsg.Window("Simple Recorder", layout, finalize=True) + status_text = window["-OUTPUT-"] + input_text.bind("", "-ENTER-") + start_record_button.bind("", "-ENTER-") + stop_record_button.bind("", "-ENTER-") + + while True: + event, values = window.read() + logger.debug(f"Event: {event}, Values: {values}") + if event == fsg.WIN_CLOSED: + break + elif event in ( + "Start Recording", + "Start Recording-ENTER-", + "-FILENAME--ENTER-", + ): + try: + await Start( + filename=input_text.get(), + host=self.host, + port=self.port, + password=self.password, + ).run() + status_text.update("Status: Recording started", text_color="green") + except ClypiException as e: + status_text.update(str(e), text_color="red") + logger.error(f"Error starting recording: {e}") + elif event in ("Stop Recording", "Stop Recording-ENTER-"): + try: + await Stop( + host=self.host, + port=self.port, + password=self.password, + ).run() + status_text.update("Status: Recording stopped", text_color="green") + except ClypiException as e: + status_text.update(str(e), text_color="red") + logger.error(f"Error stopping recording: {e}") + + +def run(): + """Run the CLI application.""" + SimpleRecorder.parse().start() + + +if __name__ == "__main__": + run() diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29