diff --git a/obsws_cli/__about__.py b/obsws_cli/__about__.py index 4329030..92afa06 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.10.3" +__version__ = "0.10.4" diff --git a/obsws_cli/app.py b/obsws_cli/app.py index e60b2ea..0a7d827 100644 --- a/obsws_cli/app.py +++ b/obsws_cli/app.py @@ -1,11 +1,9 @@ """Command line interface for the OBS WebSocket API.""" -from pathlib import Path -from typing import Annotated, Optional +from typing import Annotated import obsws_python as obsws import typer -from pydantic_settings import BaseSettings, SettingsConfigDict from . import ( group, @@ -16,31 +14,13 @@ from . import ( scene, scenecollection, sceneitem, + settings, stream, studiomode, virtualcam, ) from .alias import AliasGroup - -class Settings(BaseSettings): - """Settings for the OBS WebSocket client.""" - - model_config = SettingsConfigDict( - env_file=( - '.env', - Path.home() / '.config' / 'obsws-cli' / 'obsws.env', - ), - env_file_encoding='utf-8', - env_prefix='OBS_', - ) - - HOST: str = 'localhost' - PORT: int = 4455 - PASSWORD: str = '' # No password by default - TIMEOUT: int = 5 # Timeout for requests in seconds - - app = typer.Typer(cls=AliasGroup) for module in ( group, @@ -61,31 +41,26 @@ for module in ( @app.callback() def main( ctx: typer.Context, - host: Annotated[Optional[str], typer.Option(help='WebSocket host')] = None, - port: Annotated[Optional[int], typer.Option(help='WebSocket port')] = None, - password: Annotated[Optional[str], typer.Option(help='WebSocket password')] = None, - timeout: Annotated[Optional[int], typer.Option(help='WebSocket timeout')] = None, + host: Annotated[ + str, + typer.Option( + envvar='OBS_HOST', help='WebSocket host', show_default='localhost' + ), + ] = settings.get('HOST'), + port: Annotated[ + int, typer.Option(envvar='OBS_PORT', help='WebSocket port', show_default=4455) + ] = settings.get('PORT'), + password: Annotated[ + str, + typer.Option(envvar='OBS_PASSWORD', help='WebSocket password', show_default=''), + ] = settings.get('PASSWORD'), + timeout: Annotated[ + int, + typer.Option(envvar='OBS_TIMEOUT', help='WebSocket timeout', show_default=5), + ] = settings.get('TIMEOUT'), ): """obsws_cli is a command line interface for the OBS WebSocket API.""" - settings = Settings() - # Allow overriding settings with command line options - if host: - settings.HOST = host - if port: - settings.PORT = port - if password: - settings.PASSWORD = password - if timeout: - settings.TIMEOUT = timeout - - ctx.obj = ctx.with_resource( - obsws.ReqClient( - host=settings.HOST, - port=settings.PORT, - password=settings.PASSWORD, - timeout=settings.TIMEOUT, - ) - ) + ctx.obj = ctx.with_resource(obsws.ReqClient(**ctx.params)) @app.command() diff --git a/obsws_cli/settings.py b/obsws_cli/settings.py new file mode 100644 index 0000000..a6914e6 --- /dev/null +++ b/obsws_cli/settings.py @@ -0,0 +1,31 @@ +"""module for settings management.""" + +from pathlib import Path + +from pydantic_settings import BaseSettings, SettingsConfigDict + + +class Settings(BaseSettings): + """Settings for the OBS WebSocket client.""" + + model_config = SettingsConfigDict( + env_file=( + '.env', + Path.home() / '.config' / 'obsws-cli' / 'obsws.env', + ), + env_file_encoding='utf-8', + env_prefix='OBS_', + ) + + HOST: str = 'localhost' + PORT: int = 4455 + PASSWORD: str = '' # No password by default + TIMEOUT: int = 5 # Timeout for requests in seconds + + +_settings = Settings().model_dump() + + +def get(key: str) -> str: + """Get a setting by key.""" + return _settings.get(key)