feat: aprimorada a edição por voz com validação de frases, margens

- aprimorada a edição por voz com validação de frases, margens seguras e backup único antes da timeline.
- adicionada consulta expansível dos detalhes de cada trilha diretamente do banco

Resumo:
- 23 arquivos alterados
- 5 novos
- 18 modificados
- 0 removidos

 18 files changed, 321 insertions(+), 216 deletions(-)

Arquivos:
  - .gitignore
  - .jhonny/analises.db
  - code/cep-plugin/index.html
  - code/cep-plugin/main.js
  - code/cep-plugin/styles.css
  - code/engine/analisar_trilhas.py
  - code/engine/aplicar_plano_de_edicao.py
  - code/engine/editor/__init__.py
  - code/engine/editor/backup_de_sequencia.py
  - code/engine/persistencia/__init__.py
  - code/engine/testes/test_aplicar_plano_de_edicao.py
  - code/plugins/premiere-pro/skills/edit-video-by-voice/SKILL.md
  - code/plugins/premiere-pro/skills/editar-por-voz/SKILL.md
  - code/plugins/premiere-pro/skills/editar-por-voz/criterios/05-zoom.md
  - code/plugins/premiere-pro/skills/editar-por-voz/criterios/06-texto-corte-marcador.md
  - code/plugins/premiere-pro/skills/editar-por-voz/criterios/08-formato-de-saida.md
  - code/plugins/premiere-pro/skills/editar-por-voz/criterios/10-revisao-humana.md
  - code/plugins/premiere-pro/skills/transcript-to-edit-actions/SKILL.md
  - code/engine/consultar_detalhes_de_trilha.py
  - code/engine/editor/validacao_semantica.py
  - code/engine/persistencia/leitura_semantica_do_plano.py
  - code/engine/testes/test_leitura_semantica_do_plano.py
  - code/engine/testes/test_validador_semantico_de_plano.py
This commit is contained in:
João Henrique
2026-09-10 14:38:42 -04:00
parent b038d9b2e4
commit 9edde2df37
23 changed files with 873 additions and 216 deletions
@@ -1,10 +1,13 @@
"""Testes da resolução do executável Node usada pelo aplicador de planos."""
import os
import tempfile
import unittest
from pathlib import Path
from unittest.mock import patch
from engine import aplicar_plano_de_edicao
from engine.editor import ErroDePlanoInvalido
class TesteResolucaoDoNode(unittest.TestCase):
@@ -35,5 +38,50 @@ class TesteResolucaoDoNode(unittest.TestCase):
aplicar_plano_de_edicao.resolver_caminho_do_node()
class TestePreValidacaoDoPlano(unittest.TestCase):
"""Garante que planos semanticamente perigosos não alcancem o Premiere."""
def test_interrompe_antes_de_resolver_node_e_criar_backup(self) -> None:
"""A validação semântica ocorre antes de abrir a sessão do editor."""
with tempfile.TemporaryDirectory() as pasta:
caminho_do_plano = Path(pasta) / "plano.json"
caminho_do_plano.write_text(
'{"source":"video.mp4","actions":['
'{"kind":"cut","start":1.0,"end":2.0,"reason":"teste"}]}',
encoding="utf-8",
)
with patch(
"engine.aplicar_plano_de_edicao._validar_integridade_semantica",
side_effect=ErroDePlanoInvalido("frase interrompida"),
) as validar, patch(
"engine.aplicar_plano_de_edicao.resolver_caminho_do_node"
) as resolver_node:
with self.assertRaisesRegex(ErroDePlanoInvalido, "frase interrompida"):
aplicar_plano_de_edicao.executar(caminho_do_plano, plano_id=7)
validar.assert_called_once()
resolver_node.assert_not_called()
def test_painel_rejeita_corte_sem_plano_associado_ao_banco(self) -> None:
"""Não permite contornar a validação colando um corte sem transcrição vinculada."""
with tempfile.TemporaryDirectory() as pasta:
caminho_do_plano = Path(pasta) / "plano.json"
caminho_do_plano.write_text(
'{"source":"video.mp4","actions":['
'{"kind":"cut","start":1.0,"end":2.0,"reason":"teste"}]}',
encoding="utf-8",
)
with patch(
"engine.aplicar_plano_de_edicao.resolver_caminho_do_node"
) as resolver_node:
with self.assertRaisesRegex(ErroDePlanoInvalido, "Salve ou carregue"):
aplicar_plano_de_edicao.executar(
caminho_do_plano,
exigir_validacao_semantica=True,
)
resolver_node.assert_not_called()
if __name__ == "__main__":
unittest.main()