feat: criada a guia Trilhas com processamento em lote e progresso
- criada a guia Trilhas com processamento em lote e progresso por música - simplificada a guia Trilhas para ocultar a configuração interna dos modelos Resumo: - 12 arquivos alterados - 1 novos - 11 modificados - 0 removidos 11 files changed, 173 insertions(+), 41 deletions(-) Arquivos: - .jhonny/analises.db - code/cep-plugin/index.html - code/cep-plugin/main.js - code/cep-plugin/styles.css - code/engine/analisar_trilhas.py - code/engine/carregar_plano_de_edicao.py - code/engine/executar_scanner.py - code/engine/persistencia/__init__.py - code/engine/persistencia/repositorio_de_trilhas.py - code/engine/testes/test_carregar_plano_de_edicao.py - code/engine/testes/test_executar_scanner.py - code/engine/testes/test_repositorio_de_trilhas.py
This commit is contained in:
@@ -5,6 +5,7 @@ from __future__ import annotations
|
||||
import argparse
|
||||
import json
|
||||
from pathlib import Path
|
||||
import sqlite3
|
||||
import sys
|
||||
|
||||
CAMINHO_DO_CODIGO = Path(__file__).resolve().parent.parent
|
||||
@@ -15,6 +16,45 @@ from engine.persistencia.conexao import abrir_banco
|
||||
from engine.persistencia.repositorio_de_planos import RepositorioDePlanos
|
||||
|
||||
|
||||
def resolver_arquivo_de_origem(
|
||||
conexao: sqlite3.Connection,
|
||||
video_id: str | None,
|
||||
origem_informada: str,
|
||||
) -> str:
|
||||
"""Resolve a mídia física de um plano histórico associado a uma sequência.
|
||||
|
||||
Preserva a origem quando ela já identifica um clipe do vídeo. Quando o
|
||||
plano guardou o nome editorial da sequência, usa automaticamente o
|
||||
arquivo dos clipes somente se todas as ocorrências apontarem para um
|
||||
único nome-base de mídia. Em timelines com fontes distintas, não escolhe
|
||||
uma delas por suposição.
|
||||
"""
|
||||
if not video_id:
|
||||
return origem_informada
|
||||
|
||||
linhas = conexao.execute(
|
||||
"""SELECT nome, arquivo FROM clipes
|
||||
WHERE video_id = ? AND (trim(coalesce(nome, '')) <> ''
|
||||
OR trim(coalesce(arquivo, '')) <> '')""",
|
||||
(video_id,),
|
||||
).fetchall()
|
||||
alvo = Path(origem_informada.strip()).name.casefold()
|
||||
for linha in linhas:
|
||||
nome = str(linha["nome"] or "").strip().casefold()
|
||||
nome_base_do_arquivo = Path(str(linha["arquivo"] or "").strip()).name.casefold()
|
||||
if alvo and alvo in {nome, nome_base_do_arquivo}:
|
||||
return origem_informada
|
||||
|
||||
arquivos_por_nome_base: dict[str, str] = {}
|
||||
for linha in linhas:
|
||||
arquivo = str(linha["arquivo"] or "").strip()
|
||||
if arquivo:
|
||||
arquivos_por_nome_base.setdefault(Path(arquivo).name.casefold(), arquivo)
|
||||
if len(arquivos_por_nome_base) == 1:
|
||||
return next(iter(arquivos_por_nome_base.values()))
|
||||
return origem_informada
|
||||
|
||||
|
||||
def carregar(
|
||||
caminho_do_banco: Path,
|
||||
plano_id: int | None = None,
|
||||
@@ -37,9 +77,14 @@ def carregar(
|
||||
plano = RepositorioDePlanos(conexao).carregar_plano(plano_id)
|
||||
if plano is None:
|
||||
return None
|
||||
arquivo_de_origem = resolver_arquivo_de_origem(
|
||||
conexao,
|
||||
plano.video_id,
|
||||
plano.origem,
|
||||
)
|
||||
return {
|
||||
"plano_id": plano_id,
|
||||
"source": plano.origem,
|
||||
"source": arquivo_de_origem,
|
||||
"actions": [
|
||||
{
|
||||
"kind": acao.tipo,
|
||||
|
||||
Reference in New Issue
Block a user