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