diff --git a/README.md b/README.md index eb0f9aa..2b8000f 100644 --- a/README.md +++ b/README.md @@ -90,6 +90,13 @@ obsws-cli scene switch LIVE #### Scene Item +- list: List all items in a scene. + - args: + +```console +obsws-cli scene-item list LIVE +``` + - show: Show an item in a scene. - args: @@ -104,15 +111,29 @@ obsws-cli scene-item show START "Colour Source" obsws-cli scene-item hide START "Colour Source" ``` -- list: List all items in a scene. - - args: +- toggle: Toggle an item in a scene. + - args: ```console -obsws-cli scene-item list LIVE +obsws-cli scene-item toggle START "Colour Source" +``` + +- visible: Check if an item in a scene is visible. + - args: + +```console +obsws-cli scene-item visible START "Colour Source" ``` #### Group +- list: List groups in a scene. + - args: + +```console +obsws-cli group list START +``` + - show: Show a group in a scene. - args: @@ -127,13 +148,6 @@ obsws-cli group show START "test_group" obsws-cli group hide START "test_group" ``` -- list: List groups in a scene. - - args: - -```console -obsws-cli group list START -``` - #### Input - list: List all inputs. diff --git a/obsws_cli/__about__.py b/obsws_cli/__about__.py index d6c79aa..dcdf724 100644 --- a/obsws_cli/__about__.py +++ b/obsws_cli/__about__.py @@ -1,4 +1,4 @@ # SPDX-FileCopyrightText: 2025-present onyx-and-iris # # SPDX-License-Identifier: MIT -__version__ = "0.3.0" +__version__ = "0.4.0" diff --git a/obsws_cli/group.py b/obsws_cli/group.py index f3ff7e6..9efd3b0 100644 --- a/obsws_cli/group.py +++ b/obsws_cli/group.py @@ -15,6 +15,21 @@ def main(): """Control groups in OBS scenes.""" +@app.command('list | ls') +def list(ctx: typer.Context, scene_name: str): + """List groups in a scene.""" + try: + resp = ctx.obj['obsws'].get_scene_item_list(scene_name) + groups = ( + item.get('sourceName') for item in resp.scene_items if item.get('isGroup') + ) + typer.echo('\n'.join(groups)) + except obsws.error.OBSSDKRequestError as e: + if e.code == 600: + raise ObswsCliBadParameter(str(e)) from e + raise + + def _get_group(group_name: str, resp: DataclassProtocol) -> dict | None: """Get a group from the scene item list response.""" group = next( @@ -64,18 +79,3 @@ def hide(ctx: typer.Context, scene_name: str, group_name: str): if e.code == 600: raise ObswsCliBadParameter(str(e)) from e raise - - -@app.command('list | ls') -def list(ctx: typer.Context, scene_name: str): - """List groups in a scene.""" - try: - resp = ctx.obj['obsws'].get_scene_item_list(scene_name) - groups = ( - item.get('sourceName') for item in resp.scene_items if item.get('isGroup') - ) - typer.echo('\n'.join(groups)) - except obsws.error.OBSSDKRequestError as e: - if e.code == 600: - raise ObswsCliBadParameter(str(e)) from e - raise diff --git a/obsws_cli/record.py b/obsws_cli/record.py index 125089f..7608ca2 100644 --- a/obsws_cli/record.py +++ b/obsws_cli/record.py @@ -58,7 +58,7 @@ def status(ctx: typer.Context): typer.echo('Recording is not in progress.') -@app.command() +@app.command('toggle | tg') def toggle(ctx: typer.Context): """Toggle recording.""" active, _ = _get_recording_status(ctx) diff --git a/obsws_cli/sceneitem.py b/obsws_cli/sceneitem.py index d57f8ae..b04b692 100644 --- a/obsws_cli/sceneitem.py +++ b/obsws_cli/sceneitem.py @@ -14,6 +14,19 @@ def main(): """Control items in OBS scenes.""" +@app.command('list | ls') +def list(ctx: typer.Context, scene_name: str): + """List all items in a scene.""" + try: + resp = ctx.obj['obsws'].get_scene_item_list(scene_name) + items = (item.get('sourceName') for item in resp.scene_items) + typer.echo('\n'.join(items)) + except obsws.error.OBSSDKRequestError as e: + if e.code == 600: + raise ObswsCliBadParameter(str(e)) from e + raise + + @app.command() def show(ctx: typer.Context, scene_name: str, item_name: str): """Show an item in a scene.""" @@ -48,13 +61,40 @@ def hide(ctx: typer.Context, scene_name: str, item_name: str): raise -@app.command('list | ls') -def list(ctx: typer.Context, scene_name: str): - """List all items in a scene.""" +@app.command('toggle | tg') +def toggle(ctx: typer.Context, scene_name: str, item_name: str): + """Toggle an item in a scene.""" try: - resp = ctx.obj['obsws'].get_scene_item_list(scene_name) - items = (item.get('sourceName') for item in resp.scene_items) - typer.echo('\n'.join(items)) + resp = ctx.obj['obsws'].get_scene_item_id(scene_name, item_name) + enabled = ctx.obj['obsws'].get_scene_item_enabled( + scene_name=scene_name, + item_id=int(resp.scene_item_id), + ) + + new_state = not enabled.scene_item_enabled + ctx.obj['obsws'].set_scene_item_enabled( + scene_name=scene_name, + item_id=int(resp.scene_item_id), + enabled=new_state, + ) + except obsws.error.OBSSDKRequestError as e: + if e.code == 600: + raise ObswsCliBadParameter(str(e)) from e + raise + + +@app.command() +def visible(ctx: typer.Context, scene_name: str, item_name: str): + """Check if an item in a scene is visible.""" + try: + resp = ctx.obj['obsws'].get_scene_item_id(scene_name, item_name) + enabled = ctx.obj['obsws'].get_scene_item_enabled( + scene_name=scene_name, + item_id=int(resp.scene_item_id), + ) + typer.echo( + f"Item '{item_name}' in scene '{scene_name}' is currently {'visible' if enabled.scene_item_enabled else 'hidden'}." + ) except obsws.error.OBSSDKRequestError as e: if e.code == 600: raise ObswsCliBadParameter(str(e)) from e