criado repositório jhonny-editor no Gitea adicionado script admin/deploy.command com commit automático atualizado admin/DEV-NOTES.md com template limpo Resumo: - 48 arquivos alterados - 26 novos - 19 modificados - 3 removidos 22 files changed, 658 insertions(+), 568 deletions(-) Arquivos: - AGENTS.md - admin/DEV-NOTES.md - admin/OpenCut.command - admin/commit.command - admin/deploy.command - admin/update.command - code/cep-plugin/index.html - code/cep-plugin/main.js - code/cep-plugin/styles.css - code/engine/ARQUITETURA.md - code/engine/arquitetura/README.md - code/engine/gerar_relatorio_timeline.py - code/engine/integracoes/apple_speech/apple_speech_transcriber.swift - code/engine/integracoes/apple_speech/provider_de_transcricao_apple.py - code/engine/integracoes/midia/__init__.py - code/engine/integracoes/whisper/provider_de_transcricao_local.py - code/engine/scanner/__init__.py - code/engine/scanner/coordenacao/__init__.py - code/engine/scanner/descoberta/__init__.py - code/engine/scanner/modelos.py - code/engine/scanner/transcricao_da_timeline.py - code/src/tools/discovery.ts - :memory:.ses - admin/Jhonny.command - admin/inativos/OpenCut.command - admin/inativos/update.command - code/docs/glossario-analise-emocional.md - code/docs/levantamento-apple-vision-e-apple-intelligence.md - code/docs/levantamento-ferramentas-analise-visual-local.md - code/engine/arquitetura/biblioteca-inteligente-de-videos.md - code/engine/executar_scanner.py - code/engine/integracoes/huggingface/ - code/engine/integracoes/midia/extracao_de_metadados.py - code/engine/integracoes/visual/ - code/engine/requirements-visual.txt - code/engine/scanner/configuracao_visual.py - code/engine/scanner/descoberta/descoberta_de_arquivos.py - code/engine/scanner/metadados.py - code/engine/scanner/relatorio_visual.py - code/engine/scanner/retakes/ - code/engine/scanner/visual.py - code/engine/testes/test_analise_visual_local.py - code/engine/testes/test_arquivos_e_metadados.py - code/engine/testes/test_provider_de_transcricao_apple.py - code/relatorios/analise-brools/ - code/relatorios/analise-visual/ - code/relatorios/audio/arquivos/ - code/relatorios/transcricao-timeline.md
112 lines
2.8 KiB
Python
112 lines
2.8 KiB
Python
from dataclasses import dataclass, field
|
|
from enum import Enum
|
|
from typing import Any
|
|
|
|
|
|
class StatusDaAnalise(str, Enum):
|
|
CONCLUIDA = "concluida"
|
|
CONCLUIDA_COM_AVISOS = "concluida_com_avisos"
|
|
FALHOU = "falhou"
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class ErroDeAnalise(Exception):
|
|
codigo: str
|
|
mensagem: str
|
|
caminho: str | None = None
|
|
detalhes: dict[str, Any] = field(default_factory=dict)
|
|
|
|
def __post_init__(self) -> None:
|
|
Exception.__init__(self, self.mensagem)
|
|
|
|
|
|
@dataclass
|
|
class ResultadoDaAnalise:
|
|
status: StatusDaAnalise
|
|
timeline: Any = None
|
|
erros: list[ErroDeAnalise] = field(default_factory=list)
|
|
avisos: list[str] = field(default_factory=list)
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class PalavraDeTranscricao:
|
|
texto: str
|
|
inicio: float
|
|
fim: float
|
|
confianca: float | None = None
|
|
falante: str | None = None
|
|
|
|
def __post_init__(self) -> None:
|
|
if self.inicio < 0 or self.fim < self.inicio:
|
|
raise ValueError("Intervalo de palavra inválido.")
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class SegmentoDeTranscricao:
|
|
inicio: float
|
|
fim: float
|
|
texto: str
|
|
confianca: float | None = None
|
|
palavras: tuple[PalavraDeTranscricao, ...] = ()
|
|
emocao: str | None = None
|
|
confianca_emocao: float | None = None
|
|
caracteristicas_acusticas: dict[str, float] = field(default_factory=dict)
|
|
falante: str | None = None
|
|
voz_aparente: str | None = None
|
|
confianca_voz: float | None = None
|
|
|
|
def __post_init__(self) -> None:
|
|
if self.inicio < 0 or self.fim < self.inicio:
|
|
raise ValueError("Intervalo de transcrição inválido.")
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class Cena:
|
|
inicio: float
|
|
fim: float
|
|
confianca: float | None = None
|
|
referencias: tuple[float, ...] = ()
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class Evento:
|
|
tipo: str
|
|
inicio: float
|
|
fim: float
|
|
confianca: float | None = None
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class EvidenciaVisual:
|
|
"""Fato visual normalizado, independente da biblioteca que o produziu."""
|
|
|
|
tipo: str
|
|
inicio: float
|
|
fim: float
|
|
valor: dict[str, Any]
|
|
confianca: float | None = None
|
|
provider: str = ""
|
|
modelo: str | None = None
|
|
|
|
def __post_init__(self) -> None:
|
|
if self.inicio < 0 or self.fim < self.inicio:
|
|
raise ValueError("Intervalo de evidência visual inválido.")
|
|
|
|
|
|
ObservacaoVisual = EvidenciaVisual
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class CenaVisual:
|
|
"""Intervalo visual enriquecido com as observações que o sustentam."""
|
|
|
|
identificador_do_clipe: str
|
|
inicio: float
|
|
fim: float
|
|
observacoes: tuple[EvidenciaVisual, ...] = ()
|
|
referencias_de_cena: tuple[float, ...] = ()
|
|
|
|
def __post_init__(self) -> None:
|
|
if self.inicio < 0 or self.fim < self.inicio:
|
|
raise ValueError("Intervalo de cena visual inválido.")
|