primocode 8.22.0 → 8.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/lib/act.js +41 -1
  2. package/lib/catalogo.js +2 -0
  3. package/lib/config.js +53 -2
  4. package/lib/referencia.js +145 -18
  5. package/lib/studio.js +125 -11
  6. package/lib/tools.js +35 -1
  7. package/package.json +2 -2
  8. package/studio/__pycache__/voz.cpython-311.pyc +0 -0
  9. package/studio/arquivos/corte-estatico-corte-a5bab.json +150 -0
  10. package/studio/arquivos/corte-founders-ai-teste-do-player-2de1d.json +65 -0
  11. package/studio/arquivos/corte-legado-teste.json +1 -0
  12. package/studio/arquivos/corte-legado2.json +1 -0
  13. package/studio/arquivos/corte-minimo-2a829.json +24 -0
  14. package/studio/arquivos/corte-ok-00a3b.json +18 -0
  15. package/studio/arquivos/corte-ok-1270e.json +22 -0
  16. package/studio/arquivos/corte-sweep-corte-cfb29.json +147 -0
  17. package/studio/arquivos/corte-visual-completo-78f50.json +35 -0
  18. package/studio/arquivos/grade-sweep-grade-0c2f1.json +119 -0
  19. package/studio/arquivos/prisma-estatico-prisma-d8740.json +182 -0
  20. package/studio/arquivos/prisma-sweep-prisma-4c58c.json +166 -0
  21. package/studio/arquivos/prisma-y-b0785.json +52 -0
  22. package/studio/arquivos/prosa-sweep-prosa-f29cf.json +80 -0
  23. package/studio/arquivos/tela-estatico-tela-c7daf.json +90 -0
  24. package/studio/arquivos/tela-sweep-tela-0d2bf.json +84 -0
  25. package/studio/arquivos/traco-estatico-traco-25872.json +113 -0
  26. package/studio/arquivos/traco-sweep-traco-0bcf4.json +102 -0
  27. package/studio/ferramentas/corte.md +159 -12
  28. package/studio/server.py +264 -8
  29. package/studio/web/analise.html +52 -0
  30. package/studio/web/js/analise.js +202 -0
  31. package/studio/web/js/exportar.js +88 -1
  32. package/studio/web/js/player.js +172 -46
  33. package/studio/web/js/render.js +99 -1
  34. package/studio/web/js/video.js +434 -0
  35. package/studio/web/render.css +27 -0
  36. package/studio/web/tool.html +1 -0
  37. package/studio/web/view.html +2 -0
@@ -0,0 +1,113 @@
1
+ {
2
+ "id": "traco-estatico-traco-25872",
3
+ "ferramenta": "traco",
4
+ "titulo": "estatico-traco",
5
+ "doc": {
6
+ "tema": "meia-noite",
7
+ "largura": 1920,
8
+ "altura": 1080,
9
+ "cenas": [
10
+ {
11
+ "layout": "livre",
12
+ "fundo": "pontos",
13
+ "elementos": [
14
+ {
15
+ "id": "ped",
16
+ "tipo": "no",
17
+ "texto": "Pedido aberto",
18
+ "x": 120,
19
+ "y": 480,
20
+ "l": 320,
21
+ "a": 140,
22
+ "destaque": true,
23
+ "anim": "nenhuma"
24
+ },
25
+ {
26
+ "id": "val",
27
+ "tipo": "no",
28
+ "texto": "Validação\nfiscal",
29
+ "x": 620,
30
+ "y": 480,
31
+ "l": 320,
32
+ "a": 140,
33
+ "anim": "nenhuma"
34
+ },
35
+ {
36
+ "id": "ger",
37
+ "tipo": "no",
38
+ "texto": "Aprovação\ngerência",
39
+ "x": 1120,
40
+ "y": 300,
41
+ "l": 320,
42
+ "a": 140,
43
+ "anim": "nenhuma"
44
+ },
45
+ {
46
+ "id": "dir",
47
+ "tipo": "no",
48
+ "texto": "Aprovação\ndiretoria",
49
+ "x": 1120,
50
+ "y": 660,
51
+ "l": 320,
52
+ "a": 140,
53
+ "anim": "nenhuma"
54
+ },
55
+ {
56
+ "id": "ok",
57
+ "tipo": "no",
58
+ "texto": "Compra\nemitida",
59
+ "x": 1560,
60
+ "y": 480,
61
+ "l": 280,
62
+ "a": 140,
63
+ "destaque": true,
64
+ "anim": "nenhuma"
65
+ },
66
+ {
67
+ "tipo": "conector",
68
+ "de": "ped",
69
+ "para": "val",
70
+ "anim": "nenhuma"
71
+ },
72
+ {
73
+ "tipo": "conector",
74
+ "de": "val",
75
+ "para": "ger",
76
+ "texto": "até R$ 20 mil",
77
+ "anim": "nenhuma"
78
+ },
79
+ {
80
+ "tipo": "conector",
81
+ "de": "val",
82
+ "para": "dir",
83
+ "texto": "acima de R$ 20 mil",
84
+ "anim": "nenhuma"
85
+ },
86
+ {
87
+ "tipo": "conector",
88
+ "de": "ger",
89
+ "para": "ok",
90
+ "anim": "nenhuma"
91
+ },
92
+ {
93
+ "tipo": "conector",
94
+ "de": "dir",
95
+ "para": "ok",
96
+ "anim": "nenhuma"
97
+ },
98
+ {
99
+ "tipo": "texto",
100
+ "x": 120,
101
+ "y": 120,
102
+ "l": 900,
103
+ "a": 120,
104
+ "texto": "Compras · fluxo vigente",
105
+ "papel": "chapeu",
106
+ "anim": "nenhuma"
107
+ }
108
+ ]
109
+ }
110
+ ]
111
+ },
112
+ "atualizado": "2026-08-16T15:08:28+00:00"
113
+ }
@@ -0,0 +1,102 @@
1
+ {
2
+ "id": "traco-sweep-traco-0bcf4",
3
+ "ferramenta": "traco",
4
+ "titulo": "sweep-traco",
5
+ "doc": {
6
+ "tema": "meia-noite",
7
+ "largura": 1920,
8
+ "altura": 1080,
9
+ "cenas": [
10
+ {
11
+ "layout": "livre",
12
+ "fundo": "pontos",
13
+ "elementos": [
14
+ {
15
+ "id": "ped",
16
+ "tipo": "no",
17
+ "texto": "Pedido aberto",
18
+ "x": 120,
19
+ "y": 480,
20
+ "l": 320,
21
+ "a": 140,
22
+ "destaque": true
23
+ },
24
+ {
25
+ "id": "val",
26
+ "tipo": "no",
27
+ "texto": "Validação\nfiscal",
28
+ "x": 620,
29
+ "y": 480,
30
+ "l": 320,
31
+ "a": 140
32
+ },
33
+ {
34
+ "id": "ger",
35
+ "tipo": "no",
36
+ "texto": "Aprovação\ngerência",
37
+ "x": 1120,
38
+ "y": 300,
39
+ "l": 320,
40
+ "a": 140
41
+ },
42
+ {
43
+ "id": "dir",
44
+ "tipo": "no",
45
+ "texto": "Aprovação\ndiretoria",
46
+ "x": 1120,
47
+ "y": 660,
48
+ "l": 320,
49
+ "a": 140
50
+ },
51
+ {
52
+ "id": "ok",
53
+ "tipo": "no",
54
+ "texto": "Compra\nemitida",
55
+ "x": 1560,
56
+ "y": 480,
57
+ "l": 280,
58
+ "a": 140,
59
+ "destaque": true
60
+ },
61
+ {
62
+ "tipo": "conector",
63
+ "de": "ped",
64
+ "para": "val"
65
+ },
66
+ {
67
+ "tipo": "conector",
68
+ "de": "val",
69
+ "para": "ger",
70
+ "texto": "até R$ 20 mil"
71
+ },
72
+ {
73
+ "tipo": "conector",
74
+ "de": "val",
75
+ "para": "dir",
76
+ "texto": "acima de R$ 20 mil"
77
+ },
78
+ {
79
+ "tipo": "conector",
80
+ "de": "ger",
81
+ "para": "ok"
82
+ },
83
+ {
84
+ "tipo": "conector",
85
+ "de": "dir",
86
+ "para": "ok"
87
+ },
88
+ {
89
+ "tipo": "texto",
90
+ "x": 120,
91
+ "y": 120,
92
+ "l": 900,
93
+ "a": 120,
94
+ "texto": "Compras · fluxo vigente",
95
+ "papel": "chapeu"
96
+ }
97
+ ]
98
+ }
99
+ ]
100
+ },
101
+ "atualizado": "2026-08-16T15:07:33+00:00"
102
+ }
@@ -70,18 +70,69 @@ fatos da SUA tarefa. O servidor recusa documento que venha com estas frases.
70
70
 
71
71
  ---
72
72
 
73
- ## Como pensar um vídeo curto
74
-
75
- Um Reels de 30 s são 7 a 9 cenas de 3 a 5 segundos. A regra é dura:
76
- **uma frase por cena**. Se não dá para ler em voz alta dentro da duração, corte texto.
77
-
78
- | Cena | Papel | Duração |
79
- |---|---|---|
80
- | 1 | gancho — a frase que segura o dedo | 2–3 s |
81
- | 2–3 | o problema, concreto | 3–4 s |
82
- | 4–6 | a virada, um argumento por cena | 4 s |
83
- | 7 | número ou prova | 4 s |
84
- | 8 | chamada — o que fazer agora | 3 s |
73
+ ## ANTES DE ESCREVER: escolha, não repita
74
+
75
+ O exemplo acima é UMA receita. Usar sempre ela — `brasa`, `pulso`, gancho →
76
+ problema → virada — é o que faz todo vídeo sair com a mesma cara. O dono já
77
+ reclamou disso: *"ele não alterna entre os temas, usa um tema só pra todos os
78
+ vídeos, e o vídeo sempre tem a mesma estrutura, fica tudo genérico"*.
79
+
80
+ Escolha as quatro coisas abaixo **pelo assunto**, antes de escrever a primeira
81
+ cena. Se o assunto não empurrar para nenhuma, escolha a que você NÃO usou da
82
+ última vez — nunca a primeira da lista por comodidade.
83
+
84
+ | Assunto | `tema` | `trilha` | Estrutura |
85
+ |---|---|---|---|
86
+ | produto, tecnologia, lançamento | `meia-noite` ou `neon` | `pulso` | **Gancho** |
87
+ | institucional, quem somos, serviço | `oceano` ou `floresta` | `ambiente` | **Retrato** |
88
+ | urgência, notícia, alerta, dado duro | `brasa` | `tenso` | **Manchete** |
89
+ | explicação, tutorial, passo a passo | `papel` ou `claro` | `lofi` | **Aula** |
90
+ | conquista, agradecimento, celebração | `doce` ou `neon` | `alegre` | **Brinde** |
91
+ | memória, história, retrospectiva | `retro` ou `mono` | `lofi` | **Linha** |
92
+
93
+ ### As seis estruturas
94
+
95
+ Cada uma tem ritmo próprio. Não misture, e não use "Gancho" para tudo.
96
+
97
+ **Gancho** (vender algo) — 7 a 9 cenas de 3 a 5 s
98
+ frase que segura o dedo · o problema, concreto · a virada, um argumento por
99
+ cena · número ou prova · chamada.
100
+
101
+ **Retrato** (apresentar quem faz) — 5 a 6 cenas de 4 a 6 s, mais calmo
102
+ o nome e o que faz · para quem · como trabalha · uma prova (número, cliente,
103
+ tempo de casa) · convite. Transições suaves (`fade`, `limpar`), sem `flash`.
104
+
105
+ **Manchete** (informar rápido) — 4 a 6 cenas de 2 a 4 s, seco
106
+ o fato em uma linha · o número que dói · por que aconteceu · o que muda para
107
+ você. Corte duro entre cenas (`corte`, `flash`), texto grande, pouca palavra.
108
+
109
+ **Aula** (ensinar) — 6 a 10 cenas de 4 a 7 s
110
+ a pergunta · por que importa · passo 1, 2, 3 (uma cena cada, com `lista`
111
+ revelando) · o resumo · o erro comum a evitar. Fundo calmo, sem fogos.
112
+
113
+ **Brinde** (celebrar) — 4 a 6 cenas de 3 a 4 s
114
+ a conquista · os números dela · quem fez acontecer · agradecimento.
115
+ Animações vivas (`saltar`, `elastico`), fundo com brilho.
116
+
117
+ **Linha** (contar uma história no tempo) — 6 a 8 cenas de 4 a 5 s
118
+ o começo · o que mudou em cada etapa (uma cena por marco, com o ano no
119
+ `chapeu`) · onde chegou · o que vem. Um `tema` por época, se fizer sentido.
120
+
121
+ ### Regras que matam o genérico
122
+
123
+ - **O `fundo` muda a cena a cena.** Onze existem. Dez cenas com o mesmo fundo
124
+ é o que faz parecer template. Repetir um fundo tudo bem; repetir TODOS não.
125
+ - **A `transicao` muda também.** Tudo em `fade` parece slide, não vídeo.
126
+ - **A `trilha` combina com o assunto.** Seis estilos existem; `pulso` não é o
127
+ padrão de nada — é o de vídeo de produto.
128
+ - **Cor de destaque.** Se o usuário tem marca, `marca.cor` pinta números,
129
+ gráficos e detalhes. Sem marca, escolha `tom` na cena que mais importa.
130
+ - **Uma cena fora do tom.** Uma citação em `papel` no meio de um deck escuro,
131
+ ou uma cena `mono` antes do fecho, vale mais que dez efeitos.
132
+
133
+ Um Reels de 30 s é 7 a 9 cenas de 3 a 5 segundos. A regra é dura:
134
+ **uma frase por cena**. Se não dá para ler em voz alta dentro da duração,
135
+ corte texto.
85
136
 
86
137
  Vertical é `1080 × 1920`. Horizontal (`1920 × 1080`) só quando o destino for YouTube
87
138
  ou tela grande. Em vertical, os tamanhos padrão de texto já crescem sozinhos.
@@ -127,6 +178,102 @@ livre de direitos, ou uma das trilhas geradas acima.
127
178
 
128
179
  ---
129
180
 
181
+ ## Editar o vídeo do usuário (`clipe`)
182
+
183
+ Quando a pessoa manda uma gravação dela — o rosto falando, uma tela gravada,
184
+ uma cena de celular — o trabalho é EDITAR, não ilustrar. O elemento `clipe`
185
+ põe um trecho dessa gravação dentro de uma cena.
186
+
187
+ **Primeiro passo, sempre:** `studio_midia` com o caminho do arquivo. Ele
188
+ devolve uma URL `/midia/...`. Um caminho do disco (`/Users/...`, `C:\...`)
189
+ não funciona — o navegador não abre arquivo local.
190
+
191
+ ```json
192
+ { "tipo": "clipe", "src": "/midia/gravacao.mp4", "de": 12.4, "ate": 19.8 }
193
+ ```
194
+
195
+ | campo | o que faz |
196
+ |---|---|
197
+ | `src` | a URL que `studio_midia` devolveu — obrigatório |
198
+ | `de` / `ate` | segundos **no arquivo original**. O trecho, não a cena |
199
+ | `mudo` | `true` deixa só a imagem (quando quem fala é a narração) |
200
+ | `volume` | 0 a 1, para misturar a voz da gravação com a trilha |
201
+ | `ajuste` | `"cobrir"` (padrão, enche o quadro) ou `"conter"` |
202
+ | `filtro` | `"cinza"`, `"sepia"`, `"contraste"`, `"desbotado"` |
203
+ | `x`/`y` | só se quiser quadro-dentro-do-quadro; sem eles ocupa a cena inteira |
204
+
205
+ Sem `x`/`y` o clipe é o CHÃO da cena: a imagem enche o quadro e o texto fica
206
+ por cima. É o que se quer quase sempre.
207
+
208
+ **Não escreva `duracao` numa cena com clipe.** A cena passa a durar o trecho
209
+ (`ate` − `de`) sozinha. Escrever `duracao` por cima é o que faz o corte não
210
+ cortar: o trecho de 1,2s fica congelado até completar os 4s.
211
+
212
+ ### Cortar as pausas
213
+
214
+ **Não adivinhe onde estão.** Chame `studio_analisar` com a URL do vídeo: ele
215
+ ouve o arquivo e devolve `trechos`, a lista de `[início, fim]` já sem os
216
+ silêncios. Cada trecho vira uma cena.
217
+
218
+ ```
219
+ studio_analisar arquivo: "/midia/gravacao.mp4"
220
+ → { trechos: [[0.8, 6.2], [9.5, 17.1], [19.0, 24.3]], cortado: 4.6 }
221
+ ```
222
+
223
+ `pausa` (padrão 0,6s) é a partir de quantos segundos de silêncio conta como
224
+ pausa. Suba para 1.0 se a pessoa fala pausado e o corte ficou ofegante.
225
+
226
+ A análise leva alguns segundos e abre uma aba que se fecha sozinha — é o
227
+ navegador que sabe ler o áudio de um .mp4. Se ela não responder, siga com o
228
+ vídeo inteiro num clipe só; não invente tempos.
229
+
230
+ Cortar as pausas é escrever VÁRIOS clipes do mesmo `src`, com os silêncios de
231
+ fora. Uma cena por trecho aproveitado:
232
+
233
+ ```json
234
+ "cenas": [
235
+ { "layout": "capa", "transicao": "fade",
236
+ "elementos": [{ "tipo": "clipe", "src": "/midia/gravacao.mp4", "de": 0.8, "ate": 6.2 },
237
+ { "tipo": "texto", "papel": "titulo", "texto": "O que ninguém te conta" }] },
238
+ { "layout": "capa", "transicao": "corte",
239
+ "elementos": [{ "tipo": "clipe", "src": "/midia/gravacao.mp4", "de": 9.5, "ate": 17.1 }] }
240
+ ]
241
+ ```
242
+
243
+ Entre 6.2 e 9.5 havia uma pausa: ela simplesmente não entra. Use `"transicao":
244
+ "corte"` entre trechos da mesma fala — fade entre dois pedaços da mesma frase
245
+ parece defeito.
246
+
247
+ ### Legendar
248
+
249
+ A legenda é um `texto` com `"papel": "fala"` na mesma cena do clipe:
250
+
251
+ ```json
252
+ { "tipo": "texto", "papel": "fala", "texto": "isso mudou tudo pra mim" }
253
+ ```
254
+
255
+ Ela já vai sozinha para o terço de baixo, branca, com chapa escura atrás —
256
+ legível sobre qualquer imagem. Não use `papel: "legenda"` para isso: aquele é
257
+ o rodapé de um slide, com 18px, ilegível num vídeo.
258
+
259
+ Uma frase curta por cena, no ritmo da fala — nunca o parágrafo inteiro. Se o
260
+ trecho é longo, quebre em mais cenas do mesmo `src` em vez de encher a tela.
261
+
262
+ ### Só a voz dele
263
+
264
+ Para deixar apenas a voz da gravação: `"mudo": false` no clipe e trilha em
265
+ volume baixo (`"volume": 0.15`) ou `"trilha": {"tipo": "nenhuma"}`. Para o
266
+ contrário — a imagem dele com a sua narração por cima — `"mudo": true` e
267
+ `narracao` na cena.
268
+
269
+ ### A música que combina
270
+
271
+ Não repita a mesma trilha em todo vídeo do usuário. Depoimento e história
272
+ pessoal pedem `lofi` ou `ambiente`; anúncio e lançamento pedem `pulso` ou
273
+ `epico`; algo leve pede `alegre`. A tabela de estilos está acima.
274
+
275
+ ---
276
+
130
277
  ## Narração
131
278
 
132
279
  A voz que fala por cima do vídeo. Vai **na cena**, e o estúdio narra sozinho