- Adicionado estrutura completa do projeto - Configurado MCP server para Premiere Pro - Adicionado documentação e skills - Configurado Gitignore para o projeto
68 lines
2.3 KiB
Python
68 lines
2.3 KiB
Python
from typing import Any, Protocol
|
|
|
|
from .modelos import Cena, SegmentoDeTranscricao
|
|
|
|
|
|
class ProviderDeTranscricao(Protocol):
|
|
def transcrever(self, clipe: Any) -> list[SegmentoDeTranscricao]: ...
|
|
|
|
|
|
class ProviderDeAnaliseVisual(Protocol):
|
|
def analisar(self, clipe: Any, quadros: list[Any] | None = None) -> dict[str, Any]: ...
|
|
|
|
|
|
class TranscricaoDeAudio:
|
|
nome = "transcricao_de_audio"
|
|
|
|
def __init__(self, provider: ProviderDeTranscricao) -> None:
|
|
self.provider = provider
|
|
|
|
def executar(self, contexto):
|
|
if contexto.timeline is None:
|
|
return contexto
|
|
for faixa in contexto.timeline.faixas:
|
|
for clipe in faixa.clipes:
|
|
contexto.transcricoes[clipe.identificador] = self.provider.transcrever(clipe)
|
|
return contexto
|
|
|
|
|
|
class AnaliseVisual:
|
|
nome = "analise_visual"
|
|
|
|
def __init__(self, provider: ProviderDeAnaliseVisual) -> None:
|
|
self.provider = provider
|
|
|
|
def executar(self, contexto):
|
|
if contexto.timeline is None:
|
|
return contexto
|
|
for faixa in contexto.timeline.faixas:
|
|
for clipe in faixa.clipes:
|
|
contexto.caracteristicas_visuais[clipe.identificador] = self.provider.analisar(clipe)
|
|
return contexto
|
|
|
|
|
|
class DeteccaoDeCenas:
|
|
nome = "deteccao_de_cenas"
|
|
|
|
def executar(self, contexto):
|
|
cenas: list[Cena] = []
|
|
for faixa in (contexto.timeline.faixas if contexto.timeline else []):
|
|
for clipe in faixa.clipes:
|
|
cenas.append(Cena(clipe.intervalo_na_timeline.inicio,
|
|
clipe.intervalo_na_timeline.fim,
|
|
contexto.caracteristicas_visuais.get(clipe.identificador, {}).get("confianca")))
|
|
contexto.cenas = self._consolidar(cenas)
|
|
return contexto
|
|
|
|
@staticmethod
|
|
def _consolidar(cenas: list[Cena]) -> list[Cena]:
|
|
resultado: list[Cena] = []
|
|
for cena in sorted(cenas, key=lambda item: item.inicio):
|
|
if resultado and cena.inicio <= resultado[-1].fim:
|
|
anterior = resultado[-1]
|
|
resultado[-1] = Cena(anterior.inicio, max(anterior.fim, cena.fim),
|
|
anterior.confianca or cena.confianca)
|
|
else:
|
|
resultado.append(cena)
|
|
return resultado
|