mirror of
https://github.com/onyx-and-iris/slobs-cli.git
synced 2025-06-27 15:20:24 +01:00
142 lines
4.2 KiB
Python
142 lines
4.2 KiB
Python
import asyncclick as click
|
|
from anyio import create_task_group
|
|
from pyslobs import AudioService
|
|
|
|
from .cli import cli
|
|
from .errors import SlobsCliError
|
|
|
|
|
|
@cli.group()
|
|
def audio():
|
|
"""Audio management commands."""
|
|
|
|
|
|
@audio.command()
|
|
@click.option("--id", is_flag=True, help="Include audio source IDs in the output.")
|
|
@click.pass_context
|
|
async def list(ctx: click.Context, id: bool = False):
|
|
"""List all audio sources."""
|
|
|
|
conn = ctx.obj["connection"]
|
|
as_ = AudioService(conn)
|
|
|
|
async def _run():
|
|
sources = await as_.get_sources()
|
|
if not sources:
|
|
click.echo("No audio sources found.")
|
|
conn.close()
|
|
return
|
|
|
|
click.echo("Available audio sources:")
|
|
for source in sources:
|
|
model = await source.get_model()
|
|
click.echo(
|
|
f"- {click.style(model.name, fg='blue')} "
|
|
f"{f'ID: {model.source_id}, ' if id else ''}"
|
|
f"Muted: {click.style('✅', fg='green') if model.muted else click.style('❌', fg='red')}"
|
|
)
|
|
conn.close()
|
|
|
|
async with create_task_group() as tg:
|
|
tg.start_soon(conn.background_processing)
|
|
tg.start_soon(_run)
|
|
|
|
|
|
@audio.command()
|
|
@click.argument("source_name")
|
|
@click.pass_context
|
|
async def mute(ctx: click.Context, source_name: str):
|
|
"""Mute an audio source by name."""
|
|
|
|
conn = ctx.obj["connection"]
|
|
as_ = AudioService(conn)
|
|
|
|
async def _run():
|
|
sources = await as_.get_sources()
|
|
for source in sources:
|
|
model = await source.get_model()
|
|
if model.name.lower() == source_name.lower():
|
|
break
|
|
else: # If no source by the given name was found
|
|
conn.close()
|
|
raise SlobsCliError(f"Source '{source_name}' not found.")
|
|
|
|
await source.set_muted(True)
|
|
click.echo(f"Muted audio source: {source_name}")
|
|
conn.close()
|
|
|
|
try:
|
|
async with create_task_group() as tg:
|
|
tg.start_soon(conn.background_processing)
|
|
tg.start_soon(_run)
|
|
except* SlobsCliError as excgroup:
|
|
for e in excgroup.exceptions:
|
|
raise e
|
|
|
|
|
|
@audio.command()
|
|
@click.argument("source_name")
|
|
@click.pass_context
|
|
async def unmute(ctx: click.Context, source_name: str):
|
|
"""Unmute an audio source by name."""
|
|
|
|
conn = ctx.obj["connection"]
|
|
as_ = AudioService(conn)
|
|
|
|
async def _run():
|
|
sources = await as_.get_sources()
|
|
for source in sources:
|
|
model = await source.get_model()
|
|
if model.name.lower() == source_name.lower():
|
|
break
|
|
else: # If no source by the given name was found
|
|
conn.close()
|
|
raise SlobsCliError(f"Source '{source_name}' not found.")
|
|
|
|
await source.set_muted(False)
|
|
click.echo(f"Unmuted audio source: {source_name}")
|
|
conn.close()
|
|
|
|
try:
|
|
async with create_task_group() as tg:
|
|
tg.start_soon(conn.background_processing)
|
|
tg.start_soon(_run)
|
|
except* SlobsCliError as excgroup:
|
|
for e in excgroup.exceptions:
|
|
raise e
|
|
|
|
|
|
@audio.command()
|
|
@click.argument("source_name")
|
|
@click.pass_context
|
|
async def toggle(ctx: click.Context, source_name: str):
|
|
"""Toggle mute state of an audio source by name."""
|
|
|
|
conn = ctx.obj["connection"]
|
|
as_ = AudioService(conn)
|
|
|
|
async def _run():
|
|
sources = await as_.get_sources()
|
|
for source in sources:
|
|
model = await source.get_model()
|
|
if model.name.lower() == source_name.lower():
|
|
if model.muted:
|
|
await source.set_muted(False)
|
|
click.echo(f"Unmuted audio source: {source_name}")
|
|
else:
|
|
await source.set_muted(True)
|
|
click.echo(f"Muted audio source: {source_name}")
|
|
conn.close()
|
|
break
|
|
else: # If no source by the given name was found
|
|
conn.close()
|
|
raise SlobsCliError(f"Source '{source_name}' not found.")
|
|
|
|
try:
|
|
async with create_task_group() as tg:
|
|
tg.start_soon(conn.background_processing)
|
|
tg.start_soon(_run)
|
|
except* SlobsCliError as excgroup:
|
|
for e in excgroup.exceptions:
|
|
raise e
|