from typing import Any from ...dominio import Clipe from ...scanner.modelos import Cena from .contratos import DetectorDeIntervalosDeCena from .modelos import QuadroDeVideo class DetectorDeCenasPySceneDetect(DetectorDeIntervalosDeCena): """Adapter PySceneDetect que devolve somente cenas do domínio.""" nome = "pyscenedetect" def __init__(self, limiar: float = 27.0, detector: Any | None = None, detectar_funcao: Any | None = None) -> None: self.limiar = limiar self._detector = detector self._detectar_funcao = detectar_funcao def detectar(self, clipe: Clipe, quadros: list[QuadroDeVideo]) -> list[Cena]: if not clipe.arquivo: raise ValueError("Clipe não possui arquivo de origem.") if self._detectar_funcao is None: try: from scenedetect import ContentDetector, detect except ImportError as exc: raise RuntimeError("PySceneDetect não está instalado. Instale scenedetect.") from exc detector = self._detector or ContentDetector(threshold=self.limiar) detectar = lambda arquivo: detect(arquivo, detector) else: detectar = self._detectar_funcao resultado = detectar(str(clipe.arquivo)) return [Cena(float(inicio.get_seconds()), float(fim.get_seconds()), referencias=(float(inicio.get_seconds()),)) for inicio, fim in resultado]