import logging
import sys
import traceback
from argparse import ArgumentParser, Namespace
from typing import Dict, List
import pycliarr
from pycliarr.api import exceptions
from pycliarr.cli import utils
from pycliarr.cli.cli_cmd import CLI_LIST, CliApiCommand
log = logging.getLogger(__name__)
def _parse_args(cli_mapping: Dict[str, CliApiCommand]) -> Namespace:
"""
cliarr host api-key sonarr list/get/delete/add
cliarr host api-key radarr list/get/delete/add
"""
parser = ArgumentParser(description="Radarr/Sonarr client")
parser.add_argument("--host", "-t", help="Host url, e.g 'http://192.168.0.1'", required=True)
parser.add_argument("--api-key", "-k", help="API key, e.g '5f5e32xf3ff8463d9f1d2u88ef0fd3e8'", required=True)
parser.add_argument("--user", "-u", help="Username if using basic authentication", default=None)
parser.add_argument("--password", "-p", help="Password if using basic authentication", default=None)
parser.add_argument("--debug", "-d", default=False, action="store_true", help="Enable debug logging")
client_subparser = parser.add_subparsers(dest="client")
client_subparser.required = True
# Add a client
for cli in cli_mapping:
client_parser = client_subparser.add_parser(cli, help=f"use {cli} client")
client_parser.set_defaults(cli_name=cli)
cmd_subparser = client_parser.add_subparsers(dest=f"{cli} command")
cmd_subparser.required = True
cli_mapping[cli].add_commands_args(cmd_subparser)
args = parser.parse_args()
args.log_level = logging.DEBUG if args.debug else logging.INFO
return args
def _run_command(cli_mapping: Dict[str, CliApiCommand], cli_name: str, cmd_name: str, args: Namespace) -> None:
"""Execute a command from the client name and the command name."""
cli_mapping[cli_name].run_command(cmd_name, args)
def _build_mapping(cli_list: List[CliApiCommand]) -> Dict[str, CliApiCommand]:
"""Build a mapping to get an api client entry from its name."""
return {cli.name: cli for cli in cli_list}
[docs]def main() -> None:
"""Main entry point."""
print(f"PyCliarr version {pycliarr.__version__}", file=sys.stderr)
cli_mapping = _build_mapping(CLI_LIST)
args = _parse_args(cli_mapping)
utils.setup_logging(level=args.log_level)
try:
_run_command(cli_mapping, args.cli_name, args.cmd_name, args)
sys.exit(0)
except exceptions.CliArrError as e:
print(f"API error: {e}")
if args.debug:
traceback.print_exc()
sys.exit(1)
except Exception as e:
print(f"Unexpected error: {e}")
if args.debug:
traceback.print_exc()
sys.exit(2)