130 lines
3.9 KiB
Python
130 lines
3.9 KiB
Python
import json
|
|
import os
|
|
from functools import update_wrapper
|
|
|
|
from loguru import logger
|
|
import click
|
|
from click_help_colors import HelpColorsGroup, version_option
|
|
import uvicorn
|
|
from fastapi import FastAPI
|
|
|
|
import glados_tts
|
|
import glados_tts.restapi
|
|
from glados_tts.engine import GLaDOS
|
|
|
|
|
|
DEFAULT_GLADOS_CONFIG = os.path.join(os.environ["HOME"], ".config", "glados.json")
|
|
CONTEXT_SETTINGS = {
|
|
"max_content_width": 200,
|
|
"terminal_width": 120,
|
|
"auto_envvar_prefix": "GLADOS",
|
|
"show_default": True,
|
|
"color": True,
|
|
# gets populated by GladosConfig.read_config_file, and in turn
|
|
# populates/overwrites default values of cmdline options, working
|
|
# as a way to use a config file
|
|
"default_map": {}
|
|
}
|
|
|
|
def read_config_file(ctx, param, value):
|
|
try:
|
|
with open(value, 'r') as f:
|
|
config = json.load(f)
|
|
ctx.default_map.update(config)
|
|
ctx.meta.update(config)
|
|
except json.decoder.JSONDecodeError as e:
|
|
logger.error(e)
|
|
raise SystemExit from e
|
|
|
|
except FileNotFoundError:
|
|
logger.error(f"file not found: '{value}', no config file loaded")
|
|
config = {}
|
|
|
|
return value
|
|
|
|
def update_meta(f):
|
|
@click.pass_context
|
|
def new_func(ctx, *args, **kwargs):
|
|
if ctx.info_name == "gladosctl":
|
|
ctx.meta.update(ctx.params)
|
|
else:
|
|
ctx.meta.setdefault(ctx.info_name, {})
|
|
ctx.meta[ctx.info_name].update(ctx.params)
|
|
|
|
return ctx.invoke(f, *args, **kwargs)
|
|
return update_wrapper(new_func, f)
|
|
|
|
@click.group(
|
|
cls=HelpColorsGroup,
|
|
context_settings=CONTEXT_SETTINGS,
|
|
invoke_without_command=False,
|
|
help_headers_color="yellow",
|
|
help_options_color="green",
|
|
)
|
|
@click.help_option(is_eager=True)
|
|
@click.option(
|
|
"-c", "--config",
|
|
type=click.Path(dir_okay=False),
|
|
help="read config options from file\n",
|
|
callback=read_config_file,
|
|
is_eager=True,
|
|
expose_value=False,
|
|
show_envvar=True,
|
|
show_default=True,
|
|
default=DEFAULT_GLADOS_CONFIG
|
|
)
|
|
@click.option("--debug/--no-debug", default=False, show_envvar=True, show_default=True)
|
|
@click.option("--log-level", show_envvar=True, show_default=True, default="INFO")
|
|
@click.option(
|
|
"--audio-dir", default="audio/", show_default=True, show_envvar=True,
|
|
type=click.Path(dir_okay=True),
|
|
help="where generated audiofiles get saved",
|
|
)
|
|
@click.option(
|
|
"--audio-format", default="wav", show_default=True, show_envvar=True,
|
|
type=click.Choice(GLaDOS.audio_formats, case_sensitive=False),
|
|
)
|
|
@version_option(
|
|
prog_name=glados_tts.__name__, version=glados_tts.__version__,
|
|
version_color="yellow", prog_name_color="green"
|
|
)
|
|
@update_meta
|
|
@click.pass_context
|
|
def cli(ctx, *args, **kwargs):
|
|
glados = GLaDOS.get()
|
|
glados.start(kwargs['audio_dir'], kwargs['audio_format'])
|
|
|
|
|
|
@cli.command(name="restapi")
|
|
@click.option("--host", default="127.0.0.1", show_envvar=True, show_default=True)
|
|
@click.option("--port", default="8124", type=int, show_envvar=True, show_default=True)
|
|
@click.option("--root-path", default="", show_envvar=True, show_default=True)
|
|
@click.option("--forwarded-allow-ips", default="127.0.0.1", show_envvar=True, show_default=True)
|
|
@click.option("--workers", default=1, show_envvar=True, show_default=True)
|
|
@update_meta
|
|
@click.pass_context
|
|
def cli_gladosapi(ctx, host, port, root_path, forwarded_allow_ips, workers):
|
|
debug_mode = ctx.meta.get("debug", False)
|
|
if root_path != "":
|
|
logger.warning(f'path="{root_path}"')
|
|
|
|
config = uvicorn.Config(
|
|
"glados_tts.restapi:create_app",
|
|
host=host,
|
|
port=port,
|
|
log_level=ctx.meta.get("log_level").lower(),
|
|
proxy_headers=True,
|
|
forwarded_allow_ips=forwarded_allow_ips,
|
|
reload=debug_mode,
|
|
workers=workers if not debug_mode else None,
|
|
factory=True,
|
|
root_path=root_path
|
|
)
|
|
server = uvicorn.Server(config)
|
|
server.run()
|
|
|
|
|
|
def main():
|
|
# load config and stuff here?
|
|
cli()
|