From b038d9b2e435bbd9036c80776955a67dbe7dc7f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Henrique?= Date: Thu, 10 Sep 2026 14:07:23 -0400 Subject: [PATCH] =?UTF-8?q?feat:=20corrigida=20a=20resolu=C3=A7=C3=A3o=20d?= =?UTF-8?q?a=20m=C3=ADdia=20real=20ao=20aplicar=20planos=20editor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- .jhonny/analises.db | Bin 1155072 -> 1155072 bytes code/cep-plugin/main.js | 49 ++++++++++++++++-- code/engine/analisar_trilhas.py | 24 +++++++-- .../persistencia/repositorio_de_trilhas.py | 7 ++- .../testes/test_repositorio_de_trilhas.py | 17 ++++++ 5 files changed, 88 insertions(+), 9 deletions(-) diff --git a/.jhonny/analises.db b/.jhonny/analises.db index 172c4fc0d6bf1f3ef346ae48db090cdbc3c00816..813750af1c5cf3afb3973c4659074d429509f9bc 100644 GIT binary patch delta 86 zcmX}Zy8(hQ007ZM@k;<{aRoa!u*e)YN-VC&31kWSj7G span").textContent = status === "concluida" ? "Analisada" : status === "erro" ? "Erro na análise anterior" : "Aguardando análise"; + if (status === "concluida") item.querySelector(".progress-fill").style.width = "100%"; lista.appendChild(item); }); document.getElementById("trilhasContagem").textContent = (nomes || []).length + " trilha(s)"; @@ -2929,7 +2971,8 @@ function trilhasRenderizarLista(nomes) { } function trilhasAtualizarEvento(evento) { - if (evento.evento === "lote_iniciado") { trilhasRenderizarLista(evento.nomes || []); return; } + if (evento.evento === "catalogo_atualizado") { trilhasRenderizarLista(evento.trilhas || []); return; } + if (evento.evento === "lote_iniciado") { trilhasRenderizarLista(evento.trilhas || evento.nomes || []); return; } if (!evento.nome) return; var itens = Array.prototype.slice.call(document.querySelectorAll(".trilha-item")); var item = itens.filter(function (elemento) { return elemento.querySelector("strong").textContent === evento.nome; })[0]; diff --git a/code/engine/analisar_trilhas.py b/code/engine/analisar_trilhas.py index 45d4a70..3c3d9e5 100644 --- a/code/engine/analisar_trilhas.py +++ b/code/engine/analisar_trilhas.py @@ -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 diff --git a/code/engine/persistencia/repositorio_de_trilhas.py b/code/engine/persistencia/repositorio_de_trilhas.py index a81519c..dd1455f 100644 --- a/code/engine/persistencia/repositorio_de_trilhas.py +++ b/code/engine/persistencia/repositorio_de_trilhas.py @@ -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( diff --git a/code/engine/testes/test_repositorio_de_trilhas.py b/code/engine/testes/test_repositorio_de_trilhas.py index 1294db1..cb9a211 100644 --- a/code/engine/testes/test_repositorio_de_trilhas.py +++ b/code/engine/testes/test_repositorio_de_trilhas.py @@ -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()