- 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
69 lines
2.9 KiB
Python
69 lines
2.9 KiB
Python
"""Testes da leitura de falas usada antes da aplicação de um plano."""
|
|
|
|
import tempfile
|
|
import unittest
|
|
from pathlib import Path
|
|
|
|
from engine.editor import ErroDePlanoInvalido
|
|
from engine.persistencia import LeitorDeTranscricaoDoPlano, abrir_banco
|
|
|
|
|
|
class TesteLeitorDeTranscricaoDoPlano(unittest.TestCase):
|
|
"""Valida vínculo do plano e conversão de timeline para mídia original."""
|
|
|
|
def setUp(self) -> None:
|
|
"""Cria um banco isolado com um clipe deslocado na timeline."""
|
|
self._pasta_temporaria = tempfile.TemporaryDirectory()
|
|
self.addCleanup(self._pasta_temporaria.cleanup)
|
|
caminho_do_banco = Path(self._pasta_temporaria.name) / "analises.db"
|
|
self.conexao = abrir_banco(caminho_do_banco)
|
|
self.addCleanup(self.conexao.close)
|
|
with self.conexao:
|
|
self.conexao.execute(
|
|
"INSERT INTO videos (id, nome, duracao) VALUES ('video-1', 'Vídeo', 40.0)"
|
|
)
|
|
self.conexao.execute(
|
|
"""INSERT INTO faixas (id, video_id, nome, tipo, indice)
|
|
VALUES ('audio-1', 'video-1', 'A1', 'audio', 0)"""
|
|
)
|
|
self.conexao.execute(
|
|
"""INSERT INTO clipes
|
|
(id, video_id, faixa_id, nome, inicio_na_timeline, fim_na_timeline,
|
|
inicio_na_origem, fim_na_origem, arquivo, offline, metadados)
|
|
VALUES ('clipe-1', 'video-1', 'audio-1', 'Clipe', 10.0, 30.0,
|
|
2.0, 22.0, '/video.mp4', 0, '{}')"""
|
|
)
|
|
segmento = self.conexao.execute(
|
|
"""INSERT INTO segmentos_de_transcricao
|
|
(video_id, clipe_id, inicio, fim, texto)
|
|
VALUES ('video-1', 'clipe-1', 12.0, 14.0, 'Frase completa.')"""
|
|
)
|
|
self.conexao.execute(
|
|
"""INSERT INTO palavras_de_transcricao
|
|
(segmento_id, ordem, texto, inicio, fim)
|
|
VALUES (?, 0, 'Frase', 12.0, 12.5)""",
|
|
(segmento.lastrowid,),
|
|
)
|
|
self.conexao.execute(
|
|
"""INSERT INTO planos_de_edicao (video_id, origem)
|
|
VALUES ('video-1', '/video.mp4')"""
|
|
)
|
|
|
|
def test_converte_tempos_para_a_origem_do_clipe(self) -> None:
|
|
"""Subtrai a posição da timeline e soma o início na mídia original."""
|
|
falas = LeitorDeTranscricaoDoPlano(self.conexao).carregar(1)
|
|
|
|
self.assertEqual(falas[0].inicio, 4.0)
|
|
self.assertEqual(falas[0].fim, 6.0)
|
|
self.assertEqual(falas[0].palavras[0].inicio, 4.0)
|
|
self.assertEqual(falas[0].palavras[0].fim, 4.5)
|
|
|
|
def test_rejeita_plano_inexistente(self) -> None:
|
|
"""Evita validar uma transcrição que não pertence ao plano solicitado."""
|
|
with self.assertRaisesRegex(ErroDePlanoInvalido, "não existe"):
|
|
LeitorDeTranscricaoDoPlano(self.conexao).carregar(999)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|