diff --git a/obsws_cli/__about__.py b/obsws_cli/__about__.py index 03afa96..059dd9c 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.6.3" +__version__ = "0.6.4" diff --git a/obsws_cli/sceneitem.py b/obsws_cli/sceneitem.py index ff4f9f9..99aa365 100644 --- a/obsws_cli/sceneitem.py +++ b/obsws_cli/sceneitem.py @@ -27,28 +27,54 @@ def list(ctx: typer.Context, scene_name: str): typer.echo('\n'.join(items)) +def _get_scene_name_and_item_id( + ctx: typer.Context, scene_name: str, item_name: str, parent: bool = False +): + if parent: + resp = ctx.obj['obsws'].get_group_scene_item_list(parent) + for item in resp.scene_items: + if item.get('sourceName') == item_name: + scene_name = parent + scene_item_id = item.get('sceneItemId') + break + else: + typer.echo(f"Item '{item_name}' not found in group '{parent}'.") + raise typer.Exit(code=1) + else: + resp = ctx.obj['obsws'].get_scene_item_id(scene_name, item_name) + scene_item_id = resp.scene_item_id + + return scene_name, scene_item_id + + @app.command() def show( ctx: typer.Context, scene_name: str, item_name: str, - validated: Annotated[bool, validate.skipped_option] = False, + parent: Annotated[str, typer.Option(help='Parent group name')] = None, ): """Show an item in a scene.""" - if not validated: - if not validate.scene_in_scenes(ctx, scene_name): - typer.echo(f"Scene '{scene_name}' not found.") - raise typer.Exit(code=1) + if not validate.scene_in_scenes(ctx, scene_name): + typer.echo(f"Scene '{scene_name}' not found.") + raise typer.Exit(code=1) + if parent: + if not validate.item_in_scene_item_list(ctx, scene_name, parent): + typer.echo(f"Parent group '{parent}' not found in scene '{scene_name}'.") + raise typer.Exit(code=1) + else: if not validate.item_in_scene_item_list(ctx, scene_name, item_name): typer.echo(f"Item '{item_name}' not found in scene '{scene_name}'.") raise typer.Exit(code=1) - resp = ctx.obj['obsws'].get_scene_item_id(scene_name, item_name) + scene_name, scene_item_id = _get_scene_name_and_item_id( + ctx, scene_name, item_name, parent + ) ctx.obj['obsws'].set_scene_item_enabled( scene_name=scene_name, - item_id=int(resp.scene_item_id), + item_id=int(scene_item_id), enabled=True, ) @@ -58,50 +84,69 @@ def hide( ctx: typer.Context, scene_name: str, item_name: str, - validated: Annotated[bool, validate.skipped_option] = False, + parent: Annotated[str, typer.Option(help='Parent group name')] = None, ): """Hide an item in a scene.""" - if not validated: - if not validate.scene_in_scenes(ctx, scene_name): - typer.echo(f"Scene '{scene_name}' not found.") - raise typer.Exit(code=1) + if not validate.scene_in_scenes(ctx, scene_name): + typer.echo(f"Scene '{scene_name}' not found.") + raise typer.Exit(code=1) + if parent: + if not validate.item_in_scene_item_list(ctx, scene_name, parent): + typer.echo(f"Parent group '{parent}' not found in scene '{scene_name}'.") + raise typer.Exit(code=1) + else: if not validate.item_in_scene_item_list(ctx, scene_name, item_name): typer.echo(f"Item '{item_name}' not found in scene '{scene_name}'.") raise typer.Exit(code=1) - resp = ctx.obj['obsws'].get_scene_item_id(scene_name, item_name) + scene_name, scene_item_id = _get_scene_name_and_item_id( + ctx, scene_name, item_name, parent + ) + ctx.obj['obsws'].set_scene_item_enabled( scene_name=scene_name, - item_id=int(resp.scene_item_id), + item_id=int(scene_item_id), enabled=False, ) @app.command('toggle | tg') -def toggle(ctx: typer.Context, scene_name: str, item_name: str): +def toggle( + ctx: typer.Context, + scene_name: str, + item_name: str, + parent: Annotated[str, typer.Option(help='Parent group name')] = None, +): """Toggle an item in a scene.""" if not validate.scene_in_scenes(ctx, scene_name): typer.echo(f"Scene '{scene_name}' not found.") raise typer.Exit(code=1) - if not validate.item_in_scene_item_list(ctx, scene_name, item_name): - typer.echo(f"Item '{item_name}' not found in scene '{scene_name}'.") - raise typer.Exit(code=1) + if parent: + if not validate.item_in_scene_item_list(ctx, scene_name, parent): + typer.echo(f"Parent group '{parent}' not found in scene '{scene_name}'.") + raise typer.Exit(code=1) + else: + if not validate.item_in_scene_item_list(ctx, scene_name, item_name): + typer.echo(f"Item '{item_name}' not found in scene '{scene_name}'.") + raise typer.Exit(code=1) + + scene_name, scene_item_id = _get_scene_name_and_item_id( + ctx, scene_name, item_name, parent + ) - 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), + item_id=int(scene_item_id), + ) + new_state = not enabled.scene_item_enabled + + ctx.obj['obsws'].set_scene_item_enabled( + scene_name=scene_name, + item_id=int(scene_item_id), + enabled=new_state, ) - if enabled.scene_item_enabled: - ctx.invoke( - hide, ctx=ctx, scene_name=scene_name, item_name=item_name, validated=True - ) - else: - ctx.invoke( - show, ctx=ctx, scene_name=scene_name, item_name=item_name, validated=True - ) @app.command()