Files
jhonny-editor/code/engine/persistencia/esquema.py
T
João Henrique ee181360c8 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/
2026-09-08 17:13:19 -04:00

167 lines
4.9 KiB
Python

"""DDL do banco SQLite de análises (vídeo, imagem e áudio)."""
from __future__ import annotations
import sqlite3
_DDL = """
CREATE TABLE IF NOT EXISTS videos (
id TEXT PRIMARY KEY,
nome TEXT,
duracao REAL,
taxa_de_quadros REAL,
largura INTEGER,
altura INTEGER,
criado_em TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now'))
);
CREATE TABLE IF NOT EXISTS faixas (
id TEXT NOT NULL,
video_id TEXT NOT NULL REFERENCES videos(id) ON DELETE CASCADE,
nome TEXT,
tipo TEXT,
indice INTEGER,
PRIMARY KEY (video_id, id)
);
CREATE TABLE IF NOT EXISTS clipes (
id TEXT NOT NULL,
video_id TEXT NOT NULL REFERENCES videos(id) ON DELETE CASCADE,
faixa_id TEXT NOT NULL,
nome TEXT,
inicio_na_timeline REAL NOT NULL,
fim_na_timeline REAL NOT NULL,
inicio_na_origem REAL,
fim_na_origem REAL,
arquivo TEXT,
offline INTEGER NOT NULL DEFAULT 0,
metadados TEXT,
PRIMARY KEY (video_id, id),
FOREIGN KEY (video_id, faixa_id) REFERENCES faixas(video_id, id) ON DELETE CASCADE
);
CREATE INDEX IF NOT EXISTS idx_clipes_faixa ON clipes(video_id, faixa_id);
CREATE TABLE IF NOT EXISTS arquivos (
id INTEGER PRIMARY KEY AUTOINCREMENT,
video_id TEXT REFERENCES videos(id) ON DELETE CASCADE,
caminho TEXT NOT NULL,
formato TEXT,
duracao REAL,
codec_de_video TEXT,
codec_de_audio TEXT,
largura INTEGER,
altura INTEGER,
taxa_de_quadros REAL,
canais_de_audio INTEGER,
taxa_de_amostragem INTEGER,
tamanho_em_bytes INTEGER,
orientacao TEXT,
timecode TEXT,
hash_do_conteudo TEXT,
UNIQUE (video_id, caminho)
);
CREATE TABLE IF NOT EXISTS analises_versao (
video_id TEXT NOT NULL REFERENCES videos(id) ON DELETE CASCADE,
etapa TEXT NOT NULL,
hash_versao TEXT NOT NULL,
concluido_em TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
PRIMARY KEY (video_id, etapa)
);
CREATE TABLE IF NOT EXISTS segmentos_de_transcricao (
id INTEGER PRIMARY KEY AUTOINCREMENT,
video_id TEXT NOT NULL REFERENCES videos(id) ON DELETE CASCADE,
clipe_id TEXT NOT NULL,
inicio REAL NOT NULL,
fim REAL NOT NULL,
texto TEXT NOT NULL,
confianca REAL,
falante TEXT,
voz_aparente TEXT,
confianca_voz REAL,
emocao TEXT,
confianca_emocao REAL,
caracteristicas_acusticas TEXT
);
CREATE INDEX IF NOT EXISTS idx_segmentos_video_clipe
ON segmentos_de_transcricao(video_id, clipe_id);
CREATE TABLE IF NOT EXISTS palavras_de_transcricao (
id INTEGER PRIMARY KEY AUTOINCREMENT,
segmento_id INTEGER NOT NULL REFERENCES segmentos_de_transcricao(id) ON DELETE CASCADE,
ordem INTEGER NOT NULL,
texto TEXT NOT NULL,
inicio REAL NOT NULL,
fim REAL NOT NULL,
confianca REAL,
falante TEXT
);
CREATE INDEX IF NOT EXISTS idx_palavras_segmento ON palavras_de_transcricao(segmento_id);
CREATE TABLE IF NOT EXISTS evidencias_visuais (
id INTEGER PRIMARY KEY AUTOINCREMENT,
video_id TEXT NOT NULL REFERENCES videos(id) ON DELETE CASCADE,
clipe_id TEXT NOT NULL,
tipo TEXT NOT NULL,
inicio REAL NOT NULL,
fim REAL NOT NULL,
valor TEXT NOT NULL,
confianca REAL,
provider TEXT NOT NULL,
modelo TEXT
);
CREATE INDEX IF NOT EXISTS idx_evidencias_video_clipe
ON evidencias_visuais(video_id, clipe_id);
CREATE TABLE IF NOT EXISTS cenas (
id INTEGER PRIMARY KEY AUTOINCREMENT,
video_id TEXT NOT NULL REFERENCES videos(id) ON DELETE CASCADE,
clipe_id TEXT,
inicio REAL NOT NULL,
fim REAL NOT NULL,
confianca REAL,
referencias TEXT
);
CREATE INDEX IF NOT EXISTS idx_cenas_video ON cenas(video_id);
CREATE TABLE IF NOT EXISTS grupos_de_retake (
id TEXT PRIMARY KEY,
video_id TEXT NOT NULL REFERENCES videos(id) ON DELETE CASCADE,
faixa_id TEXT NOT NULL,
tipo TEXT NOT NULL,
confianca REAL NOT NULL,
criado_em TEXT NOT NULL
);
CREATE INDEX IF NOT EXISTS idx_grupos_video ON grupos_de_retake(video_id);
CREATE TABLE IF NOT EXISTS tomadas_de_retake (
id INTEGER PRIMARY KEY AUTOINCREMENT,
grupo_id TEXT NOT NULL REFERENCES grupos_de_retake(id) ON DELETE CASCADE,
ordem INTEGER NOT NULL,
fala_id TEXT NOT NULL,
segmento_id TEXT NOT NULL,
inicio REAL NOT NULL,
fim REAL NOT NULL,
texto TEXT NOT NULL,
similaridade_com_anterior REAL NOT NULL,
confianca REAL NOT NULL
);
CREATE INDEX IF NOT EXISTS idx_tomadas_grupo ON tomadas_de_retake(grupo_id);
CREATE TABLE IF NOT EXISTS evidencias_de_retake (
id INTEGER PRIMARY KEY AUTOINCREMENT,
grupo_id TEXT NOT NULL REFERENCES grupos_de_retake(id) ON DELETE CASCADE,
tipo TEXT NOT NULL,
descricao TEXT NOT NULL,
valor REAL
);
CREATE INDEX IF NOT EXISTS idx_evidencias_retake_grupo ON evidencias_de_retake(grupo_id);
"""
def criar_esquema(conexao: sqlite3.Connection) -> None:
"""Cria (de forma idempotente) todas as tabelas do banco de análises."""
conexao.executescript(_DDL)
conexao.commit()