cli.py•3.83 kB
import json
import sys
import typer
from typing import Optional
from . import tools
app = typer.Typer(add_completion=False)
artists_app = typer.Typer()
albums_app = typer.Typer()
tracks_app = typer.Typer()
app.add_typer(artists_app, name="artists")
app.add_typer(albums_app, name="albums")
app.add_typer(tracks_app, name="tracks")
@artists_app.command("list")
def artists_list():
"""Lister tous les artistes"""
res = tools.tool_list_artists()
print(json.dumps(res, ensure_ascii=False, indent=2))
@artists_app.command("get")
def artists_get(id: int = typer.Option(..., help="Artist ID")):
res = tools.tool_get_artist(id)
print(json.dumps(res, ensure_ascii=False, indent=2))
@artists_app.command("create")
def artists_create(data: str = typer.Option(..., help="JSON payload or @path to file")):
payload = _load_data(data)
res = tools.tool_create_artist(payload)
print(json.dumps(res, ensure_ascii=False, indent=2))
@artists_app.command("update")
def artists_update(id: int = typer.Option(...), data: str = typer.Option(...)):
payload = _load_data(data)
res = tools.tool_update_artist(id, payload)
print(json.dumps(res, ensure_ascii=False, indent=2))
@artists_app.command("delete")
def artists_delete(id: int = typer.Option(...)):
res = tools.tool_delete_artist(id)
print(json.dumps(res, ensure_ascii=False, indent=2))
# Albums
@albums_app.command("list")
def albums_list(artist_id: int = typer.Option(..., help="Artist ID")):
res = tools.tool_list_albums_by_artist(artist_id)
print(json.dumps(res, ensure_ascii=False, indent=2))
@albums_app.command("get")
def albums_get(id: int = typer.Option(...)):
res = tools.tool_get_album(id)
print(json.dumps(res, ensure_ascii=False, indent=2))
@albums_app.command("create")
def albums_create(data: str = typer.Option(...)):
payload = _load_data(data)
res = tools.tool_create_album(payload)
print(json.dumps(res, ensure_ascii=False, indent=2))
@albums_app.command("update")
def albums_update(id: int = typer.Option(...), data: str = typer.Option(...)):
payload = _load_data(data)
res = tools.tool_update_album(id, payload)
print(json.dumps(res, ensure_ascii=False, indent=2))
@albums_app.command("delete")
def albums_delete(id: int = typer.Option(...)):
res = tools.tool_delete_album(id)
print(json.dumps(res, ensure_ascii=False, indent=2))
# Tracks
@tracks_app.command("list")
def tracks_list(album_id: int = typer.Option(..., help="Album/Release ID")):
res = tools.tool_list_tracks_by_album(album_id)
print(json.dumps(res, ensure_ascii=False, indent=2))
@tracks_app.command("get")
def tracks_get(id: int = typer.Option(...)):
res = tools.tool_get_track(id)
print(json.dumps(res, ensure_ascii=False, indent=2))
@tracks_app.command("create")
def tracks_create(data: str = typer.Option(...)):
payload = _load_data(data)
res = tools.tool_create_track(payload)
print(json.dumps(res, ensure_ascii=False, indent=2))
@tracks_app.command("update")
def tracks_update(id: int = typer.Option(...), data: str = typer.Option(...)):
payload = _load_data(data)
res = tools.tool_update_track(id, payload)
print(json.dumps(res, ensure_ascii=False, indent=2))
@tracks_app.command("delete")
def tracks_delete(id: int = typer.Option(...)):
res = tools.tool_delete_track(id)
print(json.dumps(res, ensure_ascii=False, indent=2))
def _load_data(data: str):
# support @file.json or raw JSON string
if data.startswith("@"):
path = data[1:]
with open(path, "r", encoding="utf-8") as f:
return json.load(f)
try:
return json.loads(data)
except Exception:
typer.echo("Invalid JSON payload", err=True)
raise typer.Exit(code=1)
if __name__ == "__main__":
app()