@ignix-social/editor 0.1.13 → 0.1.15

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ignix-social/editor",
3
- "version": "0.1.13",
3
+ "version": "0.1.15",
4
4
  "description": "Ignix Editor: render HTML video compositions (reels, edits, clips) on your own computer. Based on HyperFrames.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -147,4 +147,4 @@ Only if the app offers no way, give the user ONE line to paste into Terminal, e.
147
147
 
148
148
  1. `ignix-editor check` → 0 errors.
149
149
  2. `ignix-editor snapshot --at <every ~0.5 s and every cue>` and LOOK at the frames (or tile them: `ignix-editor ffmpeg -pattern_type glob -i 'snapshots/frame-*.png' -vf "scale=270:480,tile=8x2" sheet.jpg`). Check: hook readable at frame 0, nothing still for >1.5 s, every named thing pointed at on its word, captions never over what is pointed at, nothing outside the safe zone.
150
- 3. `ignix-editor render` → it reviews the MP4 by itself and prints `✓ Review: ready to show` or `✗ Review: NOT READY` with what to fix and where (stretches where nothing on the stage moves, a mostly empty frame, silences between voice lines, no change of scene, no sound effects). NOT READY means it is not finished: fix every ✗, render again, and only then show it. The `!` lines are worth fixing too when it is quick. (`ignix-editor review <mp4>` runs the same check on any video.) Then open the MP4's first frame and a few cues again, and deliver as the playbook says.
150
+ 3. `ignix-editor render` → it reviews the MP4 by itself and prints `✓ Review: ready to show` or `✗ Review: NOT READY` with what to fix and where (stretches where nothing on the stage moves, a mostly empty frame, silences between voice lines, no change of scene). NOT READY means it is not finished: fix every ✗, render again, and only then show it. The `!` lines are worth fixing too when it is quick. (`ignix-editor review <mp4>` runs the same check on any video.) Then open the MP4's first frame and a few cues again, and deliver as the playbook says.
@@ -13,7 +13,7 @@ import { measureVideo } from './style.mjs';
13
13
  // encenderse. Los subtítulos solos NO cuentan como movimiento.
14
14
  // lleno — qué parte de la zona segura ocupa algo distinto del fondo.
15
15
  // huecos — silencios entre frases de la voz.
16
- // cortes y efectos — los de `style measure` (cambios de escena, efectos oídos).
16
+ // cortes — los de `style measure` (cambios de escena).
17
17
 
18
18
  const FPS = 10;
19
19
  /** Fracción de píxeles que tiene que cambiar entre dos fotogramas para contar como movimiento. */
@@ -43,11 +43,13 @@ const SAFE = { x0: 0.12, x1: 0.88, y0: 0.13, y1: 0.765 };
43
43
  /**
44
44
  * Lo que cambia en un vídeo HORIZONTAL (YouTube, 2026-10-06): su manual pide un cambio cada
45
45
  * ~3-5 s (no 1-1,5), subtítulos abajo del todo y ~0,8 s de aire al cambiar de capítulo.
46
- * Sin calibrar con vídeos reales todavía: por eso más holgado.
46
+ * Calibrado con un youtuber que Fran da por bueno (36 min, 2026-10-06): plano al 89 %, quietud
47
+ * máxima 4,1 s, 8 cortes/min y ~26 pausas naturales de 1-2 s al hablar → los huecos avisan desde
48
+ * 2,5 s, y «sin efectos» no se dice (bajo una voz continua no se distinguen).
47
49
  */
48
50
  const WIDE = {
49
51
  stillFailSec: 6,
50
- gapWarnSec: 1,
52
+ gapWarnSec: 2.5,
51
53
  captionBand: { y0: 0.8, y1: 0.98 },
52
54
  safe: { x0: 0.05, x1: 0.95, y0: 0.06, y1: 0.92 },
53
55
  };
@@ -202,7 +204,7 @@ export async function reviewVideo({ ffmpeg, ffprobe, path, log = () => {} }) {
202
204
  level: 'warn',
203
205
  code: 'speech_gap',
204
206
  at: [r1(gp.start), r1(gp.end)],
205
- text: `${r1(gp.end - gp.start)} s of silence between two voice lines at ${r1(gp.start)} s. Lay the lines back to back (≤ 0.3 s${wide ? '; ~0.8 s only at a chapter change' : ''}).`,
207
+ text: `${r1(gp.end - gp.start)} s of silence between two voice lines at ${r1(gp.start)} s. ${wide ? 'Cut the pause, or keep it only where it lands a point or changes chapter.' : 'Lay the lines back to back (≤ 0.3 s).'}`,
206
208
  });
207
209
  }
208
210
  // Calibrado con los reels de Fran (2026-10-06): todos los buenos cortan 3,5-10 veces por
@@ -210,10 +212,10 @@ export async function reviewVideo({ ffmpeg, ffprobe, path, log = () => {} }) {
210
212
  if (m?.shots?.cutsPerMinute === 0 && info.duration > 10) {
211
213
  issues.push({ level: 'warn', code: 'no_cuts', text: 'No real change of scene anywhere: it plays as one slow sequence of fades. Change scene with cuts or quick whips, and move a camera inside each scene.' });
212
214
  }
213
- const sfx = m?.audio?.sound?.sfxPerMinute;
214
- if (sfx === 0 && info.duration > 8) {
215
- issues.push({ level: 'warn', code: 'no_sfx', text: 'No sound effect is heard. A 20 s reel usually needs 4-8, on the moments that matter (hook, scene change, the key click or reveal, the CTA).' });
216
- }
215
+ // Sin aviso de efectos de sonido (2026-10-07): bajo una voz continua no se
216
+ // distinguen. En un reel de Claude con 8 efectos dijo «no se oye ninguno»
217
+ // (estaban, a −18,6 dB en los huecos). Un aviso que falla en lo bueno enseña
218
+ // al agente a ignorar la revisión; los efectos siguen en el manual.
217
219
  return {
218
220
  path,
219
221
  durationSec: r1(info.duration),
@@ -223,7 +225,6 @@ export async function reviewVideo({ ffmpeg, ffprobe, path, log = () => {} }) {
223
225
  longestStillSec: r1(Math.max(0, ...stillRuns(steps, 0).map((s) => s.end - s.start))),
224
226
  fill: fill === null ? null : Math.round(fill * 100) / 100,
225
227
  textSize: m?.captions?.size ?? null,
226
- sfxPerMinute: sfx ?? null,
227
228
  cutsPerMinute: m?.shots?.cutsPerMinute ?? null,
228
229
  },
229
230
  issues,