"""Consulta no SQLite os detalhes da análise mais recente de uma trilha.""" from __future__ import annotations import argparse import json import sqlite3 from pathlib import Path import sys CAMINHO_DO_CODIGO = Path(__file__).resolve().parent.parent if str(CAMINHO_DO_CODIGO) not in sys.path: sys.path.insert(0, str(CAMINHO_DO_CODIGO)) def consultar(caminho: Path, banco: Path) -> dict[str, object]: """Retorna descritores e etiquetas da última análise do arquivo informado.""" caminho_do_banco = banco.expanduser().resolve() conexao = sqlite3.connect(f"file:{caminho_do_banco}?mode=ro", uri=True) conexao.row_factory = sqlite3.Row try: analise = conexao.execute( """SELECT a.id, a.provedor, a.modelo, a.duracao_em_segundos, a.batidas_por_minuto, a.tonalidade, a.modo, a.intensidade, a.dancabilidade FROM trilhas_musicais t JOIN analises_musicais a ON a.trilha_id = t.id WHERE t.caminho = ? ORDER BY a.criada_em DESC, a.id DESC LIMIT 1""", (str(caminho.expanduser().resolve()),), ).fetchone() if analise is None: return {"encontrada": False, "mensagem": "Esta trilha ainda não possui uma análise salva."} etiquetas = conexao.execute( "SELECT tipo, etiqueta, confianca FROM etiquetas_musicais WHERE analise_id = ? ORDER BY tipo, ordem", (analise["id"],), ).fetchall() return { "encontrada": True, "provedor": analise["provedor"], "modelo": analise["modelo"], "duracao_em_segundos": analise["duracao_em_segundos"], "batidas_por_minuto": analise["batidas_por_minuto"], "tonalidade": analise["tonalidade"], "modo": analise["modo"], "intensidade": analise["intensidade"], "dancabilidade": analise["dancabilidade"], "etiquetas": [dict(etiqueta) for etiqueta in etiquetas], } finally: conexao.close() def principal() -> None: """Lê os argumentos e imprime a consulta como JSON.""" argumentos = argparse.ArgumentParser() argumentos.add_argument("caminho", type=Path) argumentos.add_argument("--banco", type=Path, required=True) opcoes = argumentos.parse_args() print(json.dumps(consultar(opcoes.caminho, opcoes.banco), ensure_ascii=False)) if __name__ == "__main__": principal()