feat: corrigida a resolução da mídia real ao aplicar planos editor
- corrigida a resolução da mídia real ao aplicar planos editoriais salvos. - atualizada a guia Trilhas para recuperar e reaproveitar o catálogo salvo Resumo: - 5 arquivos alterados - 0 novos - 5 modificados - 0 removidos 5 files changed, 88 insertions(+), 9 deletions(-) Arquivos: - .jhonny/analises.db - code/cep-plugin/main.js - code/engine/analisar_trilhas.py - code/engine/persistencia/repositorio_de_trilhas.py - code/engine/testes/test_repositorio_de_trilhas.py
This commit is contained in:
@@ -23,8 +23,8 @@ def emitir(evento: str, **dados: object) -> None:
|
||||
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 encontrados na pasta e subpastas."""
|
||||
def executar(pasta: Path, banco: Path, diretorio_dos_modelos: Path | None, apenas_listar: bool = False) -> int:
|
||||
"""Atualiza o catálogo e, opcionalmente, analisa as trilhas pendentes."""
|
||||
arquivos = tuple(sorted(
|
||||
arquivo for arquivo in pasta.rglob("*")
|
||||
if arquivo.is_file() and arquivo.suffix.lower() in EXTENSOES_DE_AUDIO
|
||||
@@ -33,14 +33,27 @@ def executar(pasta: Path, banco: Path, diretorio_dos_modelos: Path | None) -> in
|
||||
try:
|
||||
repositorio = RepositorioDeTrilhasSQLite(conexao)
|
||||
trilhas = repositorio.registrar_pasta_e_arquivos(pasta, arquivos)
|
||||
if apenas_listar:
|
||||
emitir("catalogo_atualizado", trilhas=[
|
||||
{"nome": trilha.nome_do_arquivo, "status": trilha.status}
|
||||
for trilha in trilhas
|
||||
])
|
||||
return 0
|
||||
classificador = (
|
||||
ClassificadorDeMusicaEssentia(diretorio_dos_modelos)
|
||||
if diretorio_dos_modelos and diretorio_dos_modelos.is_dir()
|
||||
else None
|
||||
)
|
||||
analisador = AnalisadorDeMusicaInstrumentalEssentia(classificador=classificador)
|
||||
emitir("lote_iniciado", total=len(trilhas), pasta=str(pasta), nomes=[trilha.nome_do_arquivo for trilha in trilhas])
|
||||
for ordem, trilha in enumerate(trilhas, start=1):
|
||||
pendentes = tuple(trilha for trilha in trilhas if trilha.status != "concluida")
|
||||
emitir(
|
||||
"lote_iniciado",
|
||||
total=len(pendentes),
|
||||
pasta=str(pasta),
|
||||
nomes=[trilha.nome_do_arquivo for trilha in pendentes],
|
||||
trilhas=[{"nome": trilha.nome_do_arquivo, "status": trilha.status} for trilha in trilhas],
|
||||
)
|
||||
for ordem, trilha in enumerate(pendentes, 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:
|
||||
@@ -62,9 +75,10 @@ def principal() -> None:
|
||||
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)
|
||||
argumentos.add_argument("--listar", action="store_true")
|
||||
opcoes = argumentos.parse_args()
|
||||
try:
|
||||
raise SystemExit(executar(opcoes.pasta, opcoes.banco, opcoes.modelos))
|
||||
raise SystemExit(executar(opcoes.pasta, opcoes.banco, opcoes.modelos, opcoes.listar))
|
||||
except (OSError, RuntimeError, ValueError) as erro:
|
||||
emitir("lote_com_erro", erro=str(erro))
|
||||
raise SystemExit(1) from erro
|
||||
|
||||
@@ -52,7 +52,12 @@ class RepositorioDeTrilhasSQLite:
|
||||
"""INSERT INTO trilhas_musicais(pasta_id, caminho, nome_do_arquivo, tamanho_em_bytes)
|
||||
VALUES (?, ?, ?, ?)
|
||||
ON CONFLICT(caminho) DO UPDATE SET nome_do_arquivo = excluded.nome_do_arquivo,
|
||||
tamanho_em_bytes = excluded.tamanho_em_bytes, atualizada_em = strftime('%Y-%m-%dT%H:%M:%fZ','now')""",
|
||||
status = CASE WHEN trilhas_musicais.tamanho_em_bytes != excluded.tamanho_em_bytes
|
||||
THEN 'aguardando' ELSE trilhas_musicais.status END,
|
||||
hash_do_conteudo = CASE WHEN trilhas_musicais.tamanho_em_bytes != excluded.tamanho_em_bytes
|
||||
THEN NULL ELSE trilhas_musicais.hash_do_conteudo END,
|
||||
tamanho_em_bytes = excluded.tamanho_em_bytes,
|
||||
atualizada_em = strftime('%Y-%m-%dT%H:%M:%fZ','now')""",
|
||||
(pasta_id, str(arquivo), arquivo.name, arquivo.stat().st_size),
|
||||
)
|
||||
identificador = linha.lastrowid or self.conexao.execute(
|
||||
|
||||
@@ -58,6 +58,23 @@ class TesteRepositorioDeTrilhasSQLite(unittest.TestCase):
|
||||
self.assertEqual(primeira[0].identificador, segunda[0].identificador)
|
||||
self.assertEqual(quantidade, 1)
|
||||
|
||||
def test_arquivo_alterado_volta_para_aguardando(self):
|
||||
with tempfile.TemporaryDirectory() as diretorio:
|
||||
pasta = Path(diretorio) / "trilhas"
|
||||
pasta.mkdir()
|
||||
arquivo = pasta / "tema.wav"
|
||||
arquivo.write_bytes(b"audio")
|
||||
repositorio = RepositorioDeTrilhasSQLite(Path(diretorio) / "trilhas.db")
|
||||
trilha = repositorio.registrar_pasta_e_arquivos(pasta, (arquivo,))[0]
|
||||
repositorio.iniciar_analise(trilha.identificador)
|
||||
repositorio.registrar_analise(trilha, ResultadoDaAnaliseMusical(caminho_do_arquivo=arquivo))
|
||||
|
||||
arquivo.write_bytes(b"audio alterado")
|
||||
atualizada = repositorio.registrar_pasta_e_arquivos(pasta, (arquivo,))[0]
|
||||
repositorio.conexao.close()
|
||||
|
||||
self.assertEqual(atualizada.status, "aguardando")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
||||
Reference in New Issue
Block a user