diff --git a/.jhonny/analises.db b/.jhonny/analises.db index 766e617..f3dbc6c 100644 Binary files a/.jhonny/analises.db and b/.jhonny/analises.db differ diff --git a/CONTEXT.md b/CONTEXT.md index 1105d0a..3e01983 100644 --- a/CONTEXT.md +++ b/CONTEXT.md @@ -4,6 +4,8 @@ - **Scanner**: caso de uso que coordena a leitura, análise, decisão, planejamento, aplicação e validação de uma edição. - **Sequência**: timeline do Premiere e raiz operacional de um trabalho de edição; no banco é representada pelo vídeo identificado por `video_id` e nomeada pelo campo `sequencia`. +- **Projeto de edição**: unidade de trabalho que contém exatamente uma sequência, suas escolhas de faixas e clipes, e os planos editoriais associados; uma sequência pode usar vários arquivos de mídia. +- **Arquivo de mídia**: arquivo físico de vídeo ou áudio usado por um ou mais clipes da sequência; não é sinônimo de projeto nem de sequência. - **Edição de vídeo**: versão da configuração editorial concluída para uma sequência; registra tipo, instruções e origem, mas não representa ainda uma aplicação na timeline. - **Conteúdo**: unidade analisável identificada por um `content_id`, com texto e metadados. - **Análise**: observações estruturadas produzidas a partir do conteúdo. @@ -22,5 +24,6 @@ - O domínio não conhece filesystem, banco de dados, SDK de IA ou plataforma de edição; essas integrações entram por interfaces e adaptadores. - O primeiro fluxo é síncrono e determinístico, permitindo evolução posterior para operações assíncronas sem alterar o domínio. - A sequência é a unidade de retomada: ao selecioná-la, o sistema deve localizar a edição concluída mais recente, reutilizar suas análises e oferecer o plano pendente para aprovação e aplicação. +- Cada projeto possui uma única sequência, mas pode reunir vários arquivos de mídia e vários clipes dessa sequência; a seleção do projeto nunca deve misturar timelines diferentes. - Uma edição concluída, um plano gerado e uma aplicação realizada são estados distintos e devem permanecer auditáveis; concluir a configuração não significa que o Premiere já foi alterado. - O plano deve evoluir para referenciar diretamente a versão de edição que o originou, além do `video_id`, para impedir que uma nova configuração editorial seja aplicada por engano sobre um plano antigo. diff --git a/code/cep-plugin/abas/projeto/projeto.js b/code/cep-plugin/abas/projeto/projeto.js new file mode 100644 index 0000000..78336af --- /dev/null +++ b/code/cep-plugin/abas/projeto/projeto.js @@ -0,0 +1,100 @@ +"use strict"; + +// A guia Projeto mantém a seleção da sequência, faixas e clipes fora das +// regras específicas de edição. O estado definitivo será persistido pelo +// repositório SQLite na próxima etapa da integração. +var projetoSequencias = []; +var projetoAtual = null; + +function projetoListarSequencias() { + var botao = document.getElementById("btnProjetoCarregar"); + if (botao) botao.disabled = true; + var select = document.getElementById("projetoSequenciaSelect"); + var info = document.getElementById("projetoInfo"); + info.textContent = "Lendo sequências, faixas e clipes do Premiere…"; + cs.evalScript( + "(function(){try{" + + "if(!app.project)return JSON.stringify({ok:false,error:'Nenhum projeto aberto.'});" + + "var saida=[];" + + "for(var i=0;i= 0 ? ativa : 0; + projetoSelecionarSequencia(); + } else { + info.textContent = "Nenhuma sequência encontrada no projeto do Premiere."; + } + } + ); +} + +function projetoSelecionarSequencia() { + var select = document.getElementById("projetoSequenciaSelect"); + projetoAtual = projetoSequencias.find(function (item) { return item.id === select.value; }) || null; + if (!projetoAtual) return; + document.getElementById("projetoTimelineCard").hidden = false; + document.getElementById("projetoStatus").textContent = "Sequência selecionada"; + document.getElementById("projetoTimelineStatus").textContent = projetoAtual.nome; + document.getElementById("projetoDuracao").textContent = formatSequenceDuration(projetoAtual.duracao); + document.getElementById("projetoResolucao").textContent = projetoAtual.largura && projetoAtual.altura ? projetoAtual.largura + " × " + projetoAtual.altura : "Não informada"; + document.getElementById("projetoTotalFaixas").textContent = projetoAtual.faixas.length; + document.getElementById("projetoTotalClipes").textContent = projetoAtual.faixas.reduce(function (total, faixa) { return total + faixa.clipes.length; }, 0); + var container = document.getElementById("projetoFaixas"); + container.innerHTML = ""; + projetoAtual.faixas.forEach(function (faixa) { + var bloco = document.createElement("div"); + bloco.className = "scanner-subsection"; + bloco.innerHTML = '"; + faixa.clipes.forEach(function (clipe) { + bloco.innerHTML += '"; + }); + container.appendChild(bloco); + }); + document.getElementById("btnProjetoContinuar").disabled = false; + document.getElementById("btnProjetoSalvar").disabled = false; + document.getElementById("projetoInfo").textContent = "A sequência foi carregada. Selecione as faixas e clipes que participarão do plano."; +} + +function projetoSalvar() { + if (!projetoAtual) return; + var faixas = Array.prototype.slice.call(document.querySelectorAll("[data-projeto-faixa]:checked")).map(function (item) { return item.getAttribute("data-projeto-faixa"); }); + var clipes = Array.prototype.slice.call(document.querySelectorAll("[data-projeto-clipe]:checked")).map(function (item) { return item.getAttribute("data-projeto-clipe"); }); + var pedido = path.join(os.tmpdir(), "pedido-projeto-edicao-" + Date.now() + ".json"); + fs.writeFileSync(pedido, JSON.stringify({ + nome: projetoAtual.nome, video_id: projetoAtual.id, faixas: faixas, clipes: clipes, + }, null, 2), "utf-8"); + setBusy("btnProjetoSalvar", true); + runStreamed(SCANNER_PYTHON_BIN, [REGISTRAR_PROJETO_SCRIPT, pedido, "--banco", ANALISES_DB_PATH], + function (linha) { silenceLog(linha); }, + function (codigo, ultimoErro) { + setBusy("btnProjetoSalvar", false); + if (codigo !== 0) { showToast("err", ultimoErro || "Não foi possível salvar o projeto."); return; } + document.getElementById("projetoStatus").textContent = "Projeto salvo no banco"; + showToast("ok", "Projeto salvo com " + faixas.length + " faixa(s) e " + clipes.length + " clipe(s)."); + }); +} + +function projetoContinuarEdicao() { + if (!projetoAtual) return; + switchTab("silence"); + silenceListSequences(); +} diff --git a/code/cep-plugin/index.html b/code/cep-plugin/index.html index 5f15ac9..b7e39f1 100755 --- a/code/cep-plugin/index.html +++ b/code/cep-plugin/index.html @@ -28,7 +28,10 @@