feat: copiada a skill editar-por-voz e seus critérios para as skil

- copiada a skill editar-por-voz e seus critérios para as skills do projeto
- adaptada a skill editar-por-voz para usar o banco SQLite como fonte oficial
- corrigida a cópia do JSON do tipo de vídeo para priorizar clipboard Unicode
- criado carregador único do contexto de edição por voz a partir do SQLite
- criada entrada para registrar planos no SQLite e reaproveitar o mesmo plano na aplicação
- habilitado carregamento do plano editorial diretamente do SQLite na interface
- corrigido o bloqueio visual da etapa de carregamento do plano salvo
- configurado carregamento automático do plano salvo após selecionar a sequência
- documentada a sequência como raiz de retomada do fluxo de edição
- criada a estrutura local para análise de músicas instrumentais com Essentia

Resumo:
- 22 arquivos alterados
- 11 novos
- 11 modificados
- 0 removidos

 11 files changed, 270 insertions(+), 34 deletions(-)

Arquivos:
  - .jhonny/analises.db
  - CONTEXT.md
  - code/cep-plugin/index.html
  - code/cep-plugin/main.js
  - code/engine/README.md
  - code/engine/aplicar_plano_de_edicao.py
  - code/engine/integracoes/audio/__init__.py
  - code/engine/persistencia/consultas.py
  - code/engine/requirements-audio.txt
  - code/engine/testes/test_consultas_de_persistencia.py
  - code/tests/cep-tipos-video-encoding.test.ts
  - code/.jhonny/
  - code/engine/carregar_plano_de_edicao.py
  - code/engine/integracoes/audio/contratos.py
  - code/engine/integracoes/audio/modelos_de_analise_musical.py
  - code/engine/integracoes/audio/provider_de_analise_musical_essentia.py
  - code/engine/preparar_edicao_por_voz.py
  - code/engine/registrar_plano_de_edicao.py
  - code/engine/testes/test_analisador_de_musica_essentia.py
  - code/engine/testes/test_carregar_plano_de_edicao.py
  - code/engine/testes/test_registrar_plano_de_edicao.py
  - code/plugins/premiere-pro/skills/editar-por-voz/
This commit is contained in:
João Henrique
2026-09-10 13:09:01 -04:00
parent eda1b1aadc
commit a9e5b5ff58
33 changed files with 1811 additions and 34 deletions
+26 -9
View File
@@ -17,6 +17,7 @@ troca de sequência.
from __future__ import annotations
import argparse
import json
import os
import shutil
@@ -81,7 +82,13 @@ def resolver_caminho_do_node() -> str:
)
def _registrar_no_banco(caminho_do_plano: Path, resultado: object, sequencia: str) -> None:
def _registrar_no_banco(
caminho_do_plano: Path,
resultado: object,
sequencia: str,
plano_id: int | None = None,
caminho_do_banco: Path = CAMINHO_DO_BANCO,
) -> None:
"""Guarda no banco de análises o plano aplicado e o resultado da aplicação.
O registro é o único vestígio de como uma edição foi decidida: sem ele o
@@ -103,8 +110,9 @@ def _registrar_no_banco(caminho_do_plano: Path, resultado: object, sequencia: st
)
dados = json.loads(caminho_do_plano.read_text(encoding="utf-8"))
repositorio = RepositorioDePlanos(abrir_banco(CAMINHO_DO_BANCO))
plano_id = repositorio.registrar_plano(plano_de_dict(dados))
repositorio = RepositorioDePlanos(abrir_banco(caminho_do_banco))
if plano_id is None:
plano_id = repositorio.registrar_plano(plano_de_dict(dados))
aplicadas = sum(1 for item in resultado.resultados if item.sucesso)
repositorio.registrar_aplicacao(
plano_id,
@@ -117,7 +125,11 @@ def _registrar_no_banco(caminho_do_plano: Path, resultado: object, sequencia: st
file=sys.stderr)
def executar(caminho_do_plano: Path) -> dict:
def executar(
caminho_do_plano: Path,
plano_id: int | None = None,
caminho_do_banco: Path = CAMINHO_DO_BANCO,
) -> dict:
"""Lê o plano em ``caminho_do_plano`` e o aplica na sequência ativa do Premiere.
Devolve um dicionário pronto para virar JSON, com o resultado de cada
@@ -154,7 +166,10 @@ def executar(caminho_do_plano: Path) -> dict:
)
resultado = aplicador.aplicar(plano)
_registrar_no_banco(caminho_do_plano, resultado, sequencia_ativa.nome)
_registrar_no_banco(
caminho_do_plano, resultado, sequencia_ativa.nome,
plano_id=plano_id, caminho_do_banco=caminho_do_banco,
)
return {
"arquivo_de_origem": plano.arquivo_de_origem,
@@ -175,10 +190,12 @@ def executar(caminho_do_plano: Path) -> dict:
def main() -> None:
"""Ponto de entrada da linha de comando."""
if len(sys.argv) != 2:
print("Uso: python aplicar_plano_de_edicao.py <caminho_do_plano.json>", file=sys.stderr)
sys.exit(2)
resultado = executar(Path(sys.argv[1]))
argumentos = argparse.ArgumentParser()
argumentos.add_argument("plano", type=Path)
argumentos.add_argument("--plano-id", type=int)
argumentos.add_argument("--banco", type=Path, default=CAMINHO_DO_BANCO)
opcoes = argumentos.parse_args()
resultado = executar(opcoes.plano, opcoes.plano_id, opcoes.banco)
print(json.dumps(resultado, ensure_ascii=False, indent=2))
if not resultado["todas_bem_sucedidas"]:
sys.exit(1)