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:
- 32 arquivos alterados
- 16 novos
- 15 modificados
- 0 removidos

 16 files changed, 638 insertions(+), 61 deletions(-)

Arquivos:
  - code/engine/skills/boas-praticas-oo.md -> .agents/skills/boas-praticas-oo/SKILL.md
  - AGENTS.md
  - code/cep-plugin/index.html
  - code/cep-plugin/main.js
  - code/cep-plugin/styles.css
  - code/engine/integracoes/visual/apple_vision.py
  - code/engine/integracoes/visual/apple_vision_runner.swift
  - code/engine/integracoes/visual/extrator_ffmpeg.py
  - code/engine/scanner/__init__.py
  - code/engine/scanner/configuracao_visual.py
  - code/engine/scanner/coordenacao/__init__.py
  - code/engine/scanner/retakes/adaptador_de_falas.py
  - code/engine/scanner/retakes/agrupador_de_takes.py
  - code/engine/scanner/retakes/detector_de_reinicios.py
  - code/engine/scanner/retakes/modelos_de_retakes.py
  - code/engine/scanner/visual.py
  - .jhonny/
  - .retakes/
  - CODING_STANDARDS.md
  - code/engine/executar_retakes.py
  - code/engine/persistencia/
  - code/engine/scanner/retakes/__init__.py
  - code/engine/scanner/retakes/carregador_de_artefatos.py
  - code/engine/scanner/retakes/classificador_de_retakes.py
  - code/engine/scanner/retakes/coordenador_de_retakes.py
  - code/engine/scanner/retakes/deteccao_de_retakes.py
  - code/engine/scanner/retakes/gerador_de_evidencias.py
  - code/engine/scanner/retakes/repositorio_de_retakes.py
  - code/engine/testes/test_consultas_de_persistencia.py
  - code/engine/testes/test_deteccao_de_retakes.py
  - code/engine/testes/test_persistencia_sqlite.py
  - code/relatorios/audio/arquivos/92f97877259a86a8095b1eecafdefe357212a12247d04b78df60e0c0ae38b2ea/
This commit is contained in:
João Henrique
2026-09-08 17:13:19 -04:00
parent b9bf3b2863
commit ee181360c8
40 changed files with 3674 additions and 61 deletions
@@ -69,6 +69,11 @@ class AdaptadorDeFalas:
self.video_id = video_id
self.faixa_id = faixa_id
@staticmethod
def normalizar(texto: str) -> str:
"""Normaliza um texto (minúsculas, sem pontuação, sem espaços duplos)."""
return _normalizar(texto)
def converter(
self,
transcricoes: Iterable[TranscricaoDoClipe],
@@ -84,20 +89,59 @@ class AdaptadorDeFalas:
for segmento in transcricao.segmentos:
if _e_ruido(segmento.texto):
continue
falas.append(Fala(
id=f"{segmento_id}:{segmento.inicio:.3f}",
video_id=video_id,
faixa_id=faixa_id,
segmento_id=segmento_id,
ordem=-1, # preenchida após a ordenação
inicio=segmento.inicio,
fim=segmento.fim,
texto=segmento.texto,
texto_normalizado=_normalizar(segmento.texto),
palavras=segmento.palavras,
falante=segmento.falante,
))
falas.append(self._fala_de_segmento(segmento, segmento_id, video_id, faixa_id))
return self._ordenar(falas)
def converter_de_segmentos(
self,
segmentos_por_clipe: Iterable[tuple[str, Iterable[object]]],
video_id: str | None = None,
faixa_id: str | None = None,
) -> list[Fala]:
"""Converte ``(segmento_id, [SegmentoDeTranscricao])`` em falas.
Usado quando a transcrição chega no ``ContextoDeAnalise`` do scanner
já como segmentos individuais (padrão do pipeline), em vez de
``TranscricaoDoClipe``.
"""
video_id = video_id or self.video_id or "video"
faixa_id = faixa_id or self.faixa_id or "faixa"
falas: list[Fala] = []
for segmento_id, segmentos in segmentos_por_clipe:
for segmento in segmentos:
if _e_ruido(getattr(segmento, "texto", "")):
continue
falas.append(self._fala_de_segmento(segmento, segmento_id, video_id, faixa_id))
return self._ordenar(falas)
@staticmethod
def _fala_de_segmento(
segmento: object,
segmento_id: str,
video_id: str,
faixa_id: str,
) -> Fala:
texto = str(getattr(segmento, "texto", "")).strip()
inicio = float(getattr(segmento, "inicio", 0.0))
fim = float(getattr(segmento, "fim", inicio))
return Fala(
id=f"{segmento_id}:{inicio:.3f}",
video_id=video_id,
faixa_id=faixa_id,
segmento_id=segmento_id,
ordem=-1, # preenchida na ordenação
inicio=inicio,
fim=fim,
texto=texto,
texto_normalizado=_normalizar(texto),
palavras=getattr(segmento, "palavras", ()) or (),
falante=getattr(segmento, "falante", None),
)
@staticmethod
def _ordenar(falas: list[Fala]) -> list[Fala]:
falas.sort(key=lambda item: (item.inicio, item.fim))
for indice, fala in enumerate(falas):
falas[indice] = Fala(