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