Files
João Henrique b541f502ba feat: initial commit - Jhonny Editor
- Adicionado estrutura completa do projeto
- Configurado MCP server para Premiere Pro
- Adicionado documentação e skills
- Configurado Gitignore para o projeto
2026-09-08 09:59:31 -04:00

77 lines
3.8 KiB
Python

import unittest
from engine.dominio import IntervaloDeTempo
from engine.integracoes.premiere.conversores import ConversorDeTimeline
from engine.scanner import ErroDeAnalise
from engine.scanner.analise import AnaliseVisual, DeteccaoDeCenas, TranscricaoDeAudio
from engine.scanner.modelos import SegmentoDeTranscricao
from engine.scanner.coordenacao import AnalisadorDeTimeline, PipelineDoScanner
from engine.scanner.descoberta import DescobertaDaTimeline
class AcessoAoEditorSimulado:
nome = "acesso_ao_editor_simulado"
def obter_timeline_ativa(self):
return {"id": "seq-1", "name": "Principal", "duration": 10.0, "video_tracks": [{"id": "v1", "name": "V1", "clips": [{"id": "c1", "name": "Camera", "timeline_start": 0.0, "timeline_end": 10.0}]}], "audio_tracks": []}
class TestePrimeiraEtapa(unittest.TestCase):
def test_intervalo_rejeita_fim_anterior_ao_inicio(self):
with self.assertRaises(ValueError):
IntervaloDeTempo(2, 1)
def test_scanner_descobre_timeline_simulada(self):
etapa = DescobertaDaTimeline(AcessoAoEditorSimulado(), ConversorDeTimeline())
contexto = AnalisadorDeTimeline(PipelineDoScanner([etapa])).analisar()
self.assertEqual(contexto.timeline.nome, "Principal")
self.assertEqual(contexto.timeline.faixas[0].clipes[0].identificador, "c1")
self.assertEqual(contexto.analises_concluidas, ["descoberta_da_timeline"])
def test_converte_formato_real_da_timeline_do_premiere(self):
dados = {"id": "seq-1", "name": "Principal", "frameSizeHorizontal": 3840,
"frameSizeVertical": 2160, "end": 196.66,
"videoTracks": [{"index": 0, "name": "Vídeo 1", "clips": [
{"nodeId": "clip-1", "name": "camera.mp4", "start": 0,
"end": 196.66, "inPoint": 0, "outPoint": 196.66}]}],
"audioTracks": [{"index": 0, "name": "Áudio 1", "clips": []}]}
timeline = ConversorDeTimeline().converter(dados)
self.assertEqual((timeline.largura, timeline.altura), (3840, 2160))
self.assertEqual(timeline.faixas[0].clipes[0].identificador, "clip-1")
self.assertEqual(timeline.faixas[0].clipes[0].intervalo_na_origem.fim, 196.66)
def test_preserva_midia_offline_sem_interromper_a_timeline(self):
dados = {"id": "seq-1", "videoTracks": [{"clips": [
{"id": "c1", "name": "offline.mov", "start": 0, "end": 2, "offline": True}
]}]}
clipe = ConversorDeTimeline().converter(dados).faixas[0].clipes[0]
self.assertTrue(clipe.offline)
self.assertIsNone(clipe.intervalo_na_origem)
def test_resposta_incompleta_produz_erro_estruturado(self):
with self.assertRaises(ErroDeAnalise) as contexto:
ConversorDeTimeline().converter({"id": "seq-1", "videoTracks": [{"clips": [{"id": "c1"}]}]})
self.assertEqual(contexto.exception.codigo, "resposta_incompleta")
self.assertEqual(contexto.exception.caminho, "clipes[0]")
def test_transcreve_clipes_e_consolida_cenas(self):
class TranscritorSimulado:
def transcrever(self, clipe):
return [SegmentoDeTranscricao(0, clipe.intervalo_na_timeline.duracao, "Olá", 0.98)]
class VisaoSimulada:
def analisar(self, clipe, quadros=None):
return {"confianca": 0.91, "foco": 0.88}
etapa = DescobertaDaTimeline(AcessoAoEditorSimulado(), ConversorDeTimeline())
pipeline = PipelineDoScanner([etapa, TranscricaoDeAudio(TranscritorSimulado()),
AnaliseVisual(VisaoSimulada()), DeteccaoDeCenas()])
contexto = AnalisadorDeTimeline(pipeline).analisar()
self.assertEqual(contexto.transcricoes["c1"][0].texto, "Olá")
self.assertEqual(len(contexto.cenas), 1)
self.assertEqual(contexto.cenas[0].confianca, 0.91)
if __name__ == "__main__":
unittest.main()