Files
João Henrique b9bf3b2863 feat: criado repositório jhonny-editor no Gitea
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
2026-09-08 16:13:27 -04:00

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.")