Spaces:
Running
Running
| import os | |
| from pathlib import Path | |
| import typer | |
| import uvicorn | |
| from hibiapi import __file__ as root_file | |
| from hibiapi import __version__ | |
| from hibiapi.utils.config import CONFIG_DIR, DEFAULT_DIR, Config | |
| from hibiapi.utils.log import LOG_LEVEL, logger | |
| COPYRIGHT = r""" | |
| <b><g> | |
| _ _ _ _ _ _____ _____ | |
| | | | (_) | (_) /\ | __ \_ _| | |
| | |__| |_| |__ _ / \ | |__) || | | |
| | __ | | '_ \| | / /\ \ | ___/ | | | |
| | | | | | |_) | |/ ____ \| | _| |_ | |
| |_| |_|_|_.__/|_/_/ \_\_| |_____| | |
| </g><e> | |
| A program that implements easy-to-use APIs for a variety of commonly used sites | |
| Repository: https://github.com/mixmoe/HibiAPI | |
| </e></b>""".strip() # noqa:W291 | |
| LOG_CONFIG = { | |
| "version": 1, | |
| "disable_existing_loggers": False, | |
| "handlers": { | |
| "default": { | |
| "class": "hibiapi.utils.log.LoguruHandler", | |
| }, | |
| }, | |
| "loggers": { | |
| "uvicorn.error": { | |
| "handlers": ["default"], | |
| "level": LOG_LEVEL, | |
| }, | |
| "uvicorn.access": { | |
| "handlers": ["default"], | |
| "level": LOG_LEVEL, | |
| }, | |
| }, | |
| } | |
| RELOAD_CONFIG = { | |
| "reload": True, | |
| "reload_dirs": [ | |
| *map(str, [Path(root_file).parent.absolute(), CONFIG_DIR.absolute()]) | |
| ], | |
| "reload_includes": ["*.py", "*.yml"], | |
| } | |
| cli = typer.Typer() | |
| def run( | |
| ctx: typer.Context, | |
| host: str = Config["server"]["host"].as_str(), | |
| port: int = Config["server"]["port"].as_number(), | |
| workers: int = 1, | |
| reload: bool = False, | |
| ): | |
| if ctx.invoked_subcommand is not None: | |
| return | |
| if ctx.info_name != (func_name := run.__name__): | |
| logger.warning( | |
| f"Directly usage of command <r>{ctx.info_name}</r> is <b>deprecated</b>, " | |
| f"please use <g>{ctx.info_name} {func_name}</g> instead." | |
| ) | |
| try: | |
| terminal_width, _ = os.get_terminal_size() | |
| except OSError: | |
| terminal_width = 0 | |
| logger.warning( | |
| "\n".join(i.center(terminal_width) for i in COPYRIGHT.splitlines()), | |
| ) | |
| logger.info(f"HibiAPI version: <g><b>{__version__}</b></g>") | |
| uvicorn.run( | |
| "hibiapi.app:app", | |
| host=host, | |
| port=port, | |
| access_log=False, | |
| log_config=LOG_CONFIG, | |
| workers=workers, | |
| forwarded_allow_ips=Config["server"]["allowed-forward"].get_optional(str), | |
| **(RELOAD_CONFIG if reload else {}), | |
| ) | |
| def config(force: bool = False): | |
| total_written = 0 | |
| CONFIG_DIR.mkdir(parents=True, exist_ok=True) | |
| for file in os.listdir(DEFAULT_DIR): | |
| default_path = DEFAULT_DIR / file | |
| config_path = CONFIG_DIR / file | |
| if not (existed := config_path.is_file()) or force: | |
| total_written += config_path.write_text( | |
| default_path.read_text(encoding="utf-8"), | |
| encoding="utf-8", | |
| ) | |
| typer.echo( | |
| typer.style(("Overwritten" if existed else "Created") + ": ", fg="blue") | |
| + typer.style(str(config_path), fg="yellow") | |
| ) | |
| if total_written > 0: | |
| typer.echo(f"Config folder generated, {total_written=}") | |
| if __name__ == "__main__": | |
| cli() | |