feat: criado repositório jhonny-editor no Gitea
criado repositório jhonny-editor no Gitea adicionado script admin/deploy.command com commit automático atualizado admin/DEV-NOTES.md com template limpo Resumo: - 4 arquivos alterados - 2 novos - 2 modificados - 0 removidos 2 files changed, 48 insertions(+) Arquivos: - .jhonny/analises.db - code/engine/persistencia/esquema.py - code/engine/analisar_trilhas.py - code/engine/persistencia/repositorio_de_trilhas.py
This commit is contained in:
@@ -0,0 +1,70 @@
|
||||
"""Executa a análise em lote de uma pasta de trilhas e emite progresso JSON."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import json
|
||||
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))
|
||||
|
||||
from engine.integracoes.audio import AnalisadorDeMusicaInstrumentalEssentia, ClassificadorDeMusicaEssentia
|
||||
from engine.persistencia.conexao import abrir_banco
|
||||
from engine.persistencia.repositorio_de_trilhas import RepositorioDeTrilhasSQLite
|
||||
|
||||
EXTENSOES_DE_AUDIO = {".wav", ".mp3", ".flac", ".m4a", ".aiff", ".ogg"}
|
||||
|
||||
|
||||
def emitir(evento: str, **dados: object) -> None:
|
||||
"""Emite uma linha de progresso consumível pelo painel CEP."""
|
||||
print("@@PROGRESS " + json.dumps({"evento": evento, **dados}, ensure_ascii=False), flush=True)
|
||||
|
||||
|
||||
def executar(pasta: Path, banco: Path, diretorio_dos_modelos: Path | None) -> int:
|
||||
"""Analisa todos os arquivos musicais diretamente encontrados na pasta."""
|
||||
arquivos = tuple(sorted(
|
||||
arquivo for arquivo in pasta.iterdir()
|
||||
if arquivo.is_file() and arquivo.suffix.lower() in EXTENSOES_DE_AUDIO
|
||||
))
|
||||
conexao = abrir_banco(banco)
|
||||
try:
|
||||
repositorio = RepositorioDeTrilhasSQLite(conexao)
|
||||
trilhas = repositorio.registrar_pasta_e_arquivos(pasta, arquivos)
|
||||
classificador = ClassificadorDeMusicaEssentia(diretorio_dos_modelos) if diretorio_dos_modelos else None
|
||||
analisador = AnalisadorDeMusicaInstrumentalEssentia(classificador=classificador)
|
||||
emitir("lote_iniciado", total=len(trilhas), pasta=str(pasta))
|
||||
for ordem, trilha in enumerate(trilhas, start=1):
|
||||
repositorio.iniciar_analise(trilha.identificador)
|
||||
emitir("trilha_iniciada", nome=trilha.nome_do_arquivo, indice=ordem, total=len(trilhas), percentual=(ordem - 1) * 100 / max(1, len(trilhas)))
|
||||
try:
|
||||
resultado = analisador.analisar(trilha.caminho)
|
||||
repositorio.registrar_analise(trilha, resultado)
|
||||
emitir("trilha_concluida", nome=trilha.nome_do_arquivo, indice=ordem, total=len(trilhas), percentual=ordem * 100 / max(1, len(trilhas)))
|
||||
except (OSError, RuntimeError, ValueError) as erro:
|
||||
repositorio.registrar_erro(trilha.identificador, str(erro))
|
||||
emitir("trilha_com_erro", nome=trilha.nome_do_arquivo, indice=ordem, total=len(trilhas), erro=str(erro), percentual=ordem * 100 / max(1, len(trilhas)))
|
||||
emitir("lote_concluido", total=len(trilhas), percentual=100)
|
||||
return 0
|
||||
finally:
|
||||
conexao.close()
|
||||
|
||||
|
||||
def principal() -> None:
|
||||
"""Lê argumentos e executa o lote de análise."""
|
||||
argumentos = argparse.ArgumentParser()
|
||||
argumentos.add_argument("pasta", type=Path)
|
||||
argumentos.add_argument("--banco", type=Path, default=Path(".jhonny/analises.db"))
|
||||
argumentos.add_argument("--modelos", type=Path, default=None)
|
||||
opcoes = argumentos.parse_args()
|
||||
try:
|
||||
raise SystemExit(executar(opcoes.pasta, opcoes.banco, opcoes.modelos))
|
||||
except (OSError, ValueError) as erro:
|
||||
emitir("lote_com_erro", erro=str(erro))
|
||||
raise SystemExit(1) from erro
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
principal()
|
||||
Reference in New Issue
Block a user