From 14f89dd636938b61c0f9ef20d05405ff98fc64ce Mon Sep 17 00:00:00 2001 From: onyx-and-iris Date: Tue, 10 Jun 2025 17:54:37 +0100 Subject: [PATCH] add studiomode command group minor bump --- pyproject.toml | 2 +- src/slobs_cli/__init__.py | 3 +- src/slobs_cli/studiomode.py | 100 ++++++++++++++++++++++++++++++++++++ 3 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 src/slobs_cli/studiomode.py diff --git a/pyproject.toml b/pyproject.toml index 3d638f8..6093771 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "slobs-cli" -version = "0.6.1" +version = "0.7.0" description = "A command line application for Streamlabs Desktop" authors = [{ name = "onyx-and-iris", email = "code@onyxandiris.online" }] dependencies = ["pyslobs>=2.0.4", "asyncclick>=8.1.8"] diff --git a/src/slobs_cli/__init__.py b/src/slobs_cli/__init__.py index 9d3f809..b7e1834 100644 --- a/src/slobs_cli/__init__.py +++ b/src/slobs_cli/__init__.py @@ -4,5 +4,6 @@ from .record import record from .replaybuffer import replaybuffer from .scene import scene from .stream import stream +from .studiomode import studiomode -__all__ = ["cli", "scene", "stream", "record", "audio", "replaybuffer"] +__all__ = ["cli", "scene", "stream", "record", "audio", "replaybuffer", "studiomode"] diff --git a/src/slobs_cli/studiomode.py b/src/slobs_cli/studiomode.py new file mode 100644 index 0000000..a038eb0 --- /dev/null +++ b/src/slobs_cli/studiomode.py @@ -0,0 +1,100 @@ +import asyncclick as click +from anyio import create_task_group +from pyslobs import TransitionsService + +from .cli import cli + + +@cli.group() +def studiomode(): + """Studio mode management commands.""" + + +@studiomode.command() +@click.pass_context +async def enable(ctx: click.Context): + """Enable studio mode.""" + + conn = ctx.obj["connection"] + ts = TransitionsService(conn) + + async def _run(): + current_state = await ts.get_model() + if current_state.studio_mode: + conn.close() + raise click.Abort(click.style("Studio mode is already enabled.", fg="red")) + + await ts.enable_studio_mode() + click.echo("Studio mode enabled successfully.") + conn.close() + + async with create_task_group() as tg: + tg.start_soon(conn.background_processing) + tg.start_soon(_run) + + +@studiomode.command() +@click.pass_context +async def disable(ctx: click.Context): + """Disable studio mode.""" + + conn = ctx.obj["connection"] + ts = TransitionsService(conn) + + async def _run(): + current_state = await ts.get_model() + if not current_state.studio_mode: + conn.close() + raise click.Abort(click.style("Studio mode is already disabled.", fg="red")) + + await ts.disable_studio_mode() + click.echo("Studio mode disabled successfully.") + conn.close() + + async with create_task_group() as tg: + tg.start_soon(conn.background_processing) + tg.start_soon(_run) + + +@studiomode.command() +@click.pass_context +async def status(ctx: click.Context): + """Check the status of studio mode.""" + + conn = ctx.obj["connection"] + ts = TransitionsService(conn) + + async def _run(): + current_state = await ts.get_model() + if current_state.studio_mode: + click.echo("Studio mode is currently enabled.") + else: + click.echo("Studio mode is currently disabled.") + conn.close() + + async with create_task_group() as tg: + tg.start_soon(conn.background_processing) + tg.start_soon(_run) + + +@studiomode.command() +@click.pass_context +async def toggle(ctx: click.Context): + """Toggle studio mode.""" + + conn = ctx.obj["connection"] + ts = TransitionsService(conn) + + async def _run(): + current_state = await ts.get_model() + if current_state.studio_mode: + await ts.disable_studio_mode() + click.echo("Studio mode disabled successfully.") + else: + await ts.enable_studio_mode() + click.echo("Studio mode enabled successfully.") + conn.close() + + async with create_task_group() as tg: + tg.start_soon(conn.background_processing) + tg.start_soon(_run)