- criado monitoramento contínuo de trilhas com varredura recursiva e baixa prioridade - gerado e validado plano editorial revisável do depoimento da Erika sem aplicação na timeline - adicionada leitura e comparação estrutural da timeline após aplicar planos de edição - limitadas as classificações de trilhas às duas maiores probabilidades de cada categoria - limpo o catálogo musical para reiniciar as análises sem remover dados de vídeo Resumo: - 34 arquivos alterados - 6 novos - 28 modificados - 0 removidos 28 files changed, 833 insertions(+), 75 deletions(-) Arquivos: - .jhonny/analises.db - code/cep-plugin/index.html - code/cep-plugin/main.js - code/engine/analisar_trilhas.py - code/engine/aplicar_plano_de_edicao.py - code/engine/consultar_detalhes_de_trilha.py - code/engine/editor/__init__.py - code/engine/editor/aplicador_de_plano_de_edicao.py - code/engine/editor/backup_de_sequencia.py - code/engine/editor/escrita/escrita_no_editor.py - code/engine/editor/modelos.py - code/engine/editor/validacao_semantica.py - code/engine/integracoes/audio/classificador_de_musica_essentia.py - code/engine/integracoes/audio/modelos_de_analise_musical.py - code/engine/integracoes/audio/provider_de_analise_musical_essentia.py - code/engine/persistencia/esquema.py - code/engine/persistencia/repositorio_de_trilhas.py - code/engine/testes/duplos_de_premiere.py - code/engine/testes/test_aplicador_de_plano_de_edicao.py - code/engine/testes/test_aplicar_plano_de_edicao.py - code/engine/testes/test_escrita_no_editor.py - code/engine/testes/test_leitor_de_plano_de_edicao.py - code/engine/testes/test_validador_semantico_de_plano.py - code/plugins/premiere-pro/skills/editar-por-voz/SKILL.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/src/tools/timeline.ts - code/tests/tools/tool-modules.test.ts - .jhonny/planos/ - code/.jhonny/analises.db-shm - code/.jhonny/analises.db-wal - code/engine/editor/verificador_da_aplicacao.py - code/engine/testes/test_verificador_da_aplicacao.py - code/plugins/premiere-pro/skills/editar-por-voz/criterios/11-gancho.md
73 lines
3.1 KiB
Python
73 lines
3.1 KiB
Python
"""Testes da leitura estrutural depois da aplicação do plano."""
|
|
|
|
import unittest
|
|
|
|
from engine.dominio import Clipe, Faixa, IntervaloDeTempo, Timeline
|
|
from engine.editor.modelos import AcaoDeEdicao, PlanoDeEdicao, TipoDeAcao
|
|
from engine.editor.verificador_da_aplicacao import VerificadorDaAplicacao
|
|
|
|
|
|
class TesteVerificadorDaAplicacao(unittest.TestCase):
|
|
"""Garante que sobras e lacunas na timeline sejam detectadas."""
|
|
|
|
def _timeline(self, fim_do_ultimo_clipe: float) -> Timeline:
|
|
"""Monta uma timeline simples com vídeo e áudio vinculados por intervalo."""
|
|
faixas = []
|
|
for tipo in ("video", "audio"):
|
|
faixas.append(Faixa(
|
|
f"{tipo}_0", tipo, tipo, 0, [Clipe(
|
|
f"clipe_{tipo}", "fonte.mp4",
|
|
IntervaloDeTempo(0.0, fim_do_ultimo_clipe),
|
|
IntervaloDeTempo(0.0, fim_do_ultimo_clipe),
|
|
)]
|
|
))
|
|
return Timeline("sequencia", "Sequência", 100.0, faixas=faixas)
|
|
|
|
def test_aprova_cobertura_exata_depois_do_corte(self):
|
|
"""Aprova quando os dois tipos de faixa preservam exatamente o esperado."""
|
|
antes = self._timeline(100.0)
|
|
depois = Timeline("sequencia", "Sequência", 90.0, faixas=[
|
|
Faixa("video_0", "video", "video", 0, [
|
|
Clipe("v1", "fonte.mp4", IntervaloDeTempo(0, 10), IntervaloDeTempo(0, 10)),
|
|
Clipe("v2", "fonte.mp4", IntervaloDeTempo(10, 90), IntervaloDeTempo(20, 100)),
|
|
]),
|
|
Faixa("audio_0", "audio", "audio", 0, [
|
|
Clipe("a1", "fonte.mp4", IntervaloDeTempo(0, 10), IntervaloDeTempo(0, 10)),
|
|
Clipe("a2", "fonte.mp4", IntervaloDeTempo(10, 90), IntervaloDeTempo(20, 100)),
|
|
]),
|
|
])
|
|
plano = PlanoDeEdicao("fonte.mp4", (
|
|
AcaoDeEdicao(TipoDeAcao.CORTE, 10, 20, "remover trecho"),
|
|
))
|
|
|
|
resultado = VerificadorDaAplicacao().verificar(antes, depois, plano)
|
|
|
|
self.assertTrue(resultado.aprovada)
|
|
self.assertTrue(resultado.avisos)
|
|
|
|
def test_reprova_quando_sobra_um_trecho_na_timeline(self):
|
|
"""Reprova quando o Premiere deixa uma sobra além do plano."""
|
|
antes = self._timeline(100.0)
|
|
depois = Timeline("sequencia", "Sequência", 91.0, faixas=[
|
|
Faixa("video_0", "video", "video", 0, [
|
|
Clipe("v1", "fonte.mp4", IntervaloDeTempo(0, 10), IntervaloDeTempo(0, 10)),
|
|
Clipe("v2", "fonte.mp4", IntervaloDeTempo(10, 91), IntervaloDeTempo(20, 101)),
|
|
]),
|
|
Faixa("audio_0", "audio", "audio", 0, [
|
|
Clipe("a1", "fonte.mp4", IntervaloDeTempo(0, 10), IntervaloDeTempo(0, 10)),
|
|
Clipe("a2", "fonte.mp4", IntervaloDeTempo(10, 91), IntervaloDeTempo(20, 101)),
|
|
]),
|
|
])
|
|
plano = PlanoDeEdicao("fonte.mp4", (
|
|
AcaoDeEdicao(TipoDeAcao.CORTE, 10, 20, "remover trecho"),
|
|
))
|
|
|
|
resultado = VerificadorDaAplicacao().verificar(antes, depois, plano)
|
|
|
|
self.assertFalse(resultado.aprovada)
|
|
self.assertIn("esperado", resultado.mensagem)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|