feat: destacado no deploy o resumo que será gravado na mensagem do

- destacado no deploy o resumo que será gravado na mensagem do commit

Resumo:
- 8 arquivos alterados
- 1 novos
- 7 modificados
- 0 removidos

 7 files changed, 143 insertions(+), 11 deletions(-)

Arquivos:
  - .jhonny/analises.db
  - admin/deploy.command
  - code/engine/executar_scanner.py
  - code/engine/integracoes/midia/__init__.py
  - code/engine/integracoes/visual/apple_vision.py
  - code/engine/scanner/configuracao_visual.py
  - code/engine/scanner/visual.py
  - code/engine/integracoes/midia/compactador_de_proxy.py
This commit is contained in:
João Henrique
2026-09-08 18:40:52 -04:00
parent 5cc50f00a4
commit 400c3c93dd
8 changed files with 313 additions and 11 deletions
@@ -3,6 +3,8 @@
from dataclasses import dataclass
from typing import Any
from ..integracoes.midia import RESOLUCAO_PADRAO_DO_PROXY
RECURSOS_VISION = frozenset((
"faces", "qualidade_facial", "pessoas", "pose", "maos", "ocr", "categorias",
@@ -21,6 +23,13 @@ SENSIBILIDADES_VISUAIS: dict[str, float] = {
}
def _inteiro_ou_nulo(valor: Any) -> int | None:
"""Converte um valor de perfil em int, preservando None."""
if valor is None or valor == "":
return None
return int(valor)
@dataclass(frozen=True)
class ConfiguracaoVisualDoScanner:
"""Interface curta para uma execução de leitura visual da timeline."""
@@ -38,6 +47,13 @@ class ConfiguracaoVisualDoScanner:
usar_analise_visual: bool = False
detectar_cortes: bool = True
sensibilidade: str = "media"
# Leitura via proxy compactado. Para arquivos de origem pesados (MOV de
# vários GB), ler os frames de uma cópia leve é muito mais rápido.
usar_proxy: bool = True
resolucao_do_proxy: int = RESOLUCAO_PADRAO_DO_PROXY
# Limita quantos frames por clipe recebem a interpretação editorial da Apple
# Intelligence (Foundation Models) — a etapa mais cara. None interpreta todos.
maximo_de_frames_interpretados: int | None = None
def __post_init__(self) -> None:
if not 0.04 <= self.intervalo_em_segundos <= 60:
@@ -75,6 +91,9 @@ class ConfiguracaoVisualDoScanner:
usar_analise_visual=bool(dados.get("usar_analise_visual", False)),
detectar_cortes=bool(dados.get("detectar_cortes", True)),
sensibilidade=str(dados.get("sensibilidade", "media")),
usar_proxy=bool(dados.get("usar_proxy", True)),
resolucao_do_proxy=int(dados.get("resolucao_do_proxy", RESOLUCAO_PADRAO_DO_PROXY)),
maximo_de_frames_interpretados=_inteiro_ou_nulo(dados.get("maximo_de_frames_interpretados", None)),
)
def para_dict(self) -> dict[str, Any]:
@@ -92,4 +111,7 @@ class ConfiguracaoVisualDoScanner:
"usar_analise_visual": self.usar_analise_visual,
"detectar_cortes": self.detectar_cortes,
"sensibilidade": self.sensibilidade,
"usar_proxy": self.usar_proxy,
"resolucao_do_proxy": self.resolucao_do_proxy,
"maximo_de_frames_interpretados": self.maximo_de_frames_interpretados,
}