Unified · Split
| @@ -8,8 +8,9 @@ · 7 unmodified lines | ||
| 8 | 8 | // the PR description. |
| 9 | 9 | // |
| 10 | 10 | // Usage: bun e2e/scripts/pr-media.ts <run-dir-or-artifact> [...more] |
| 11 | −// run dir e2e/runs/<target>/<scenario-slug> — picks session.mp4 or | |
| 12 | −// terminal.cast and labels the gif from result.json | |
| 11 | +// run dir e2e/runs/<target>/<scenario-slug> — picks film.mp4 (the | |
| 12 | +// whole session), else session.mp4, else terminal.cast; | |
| 13 | +// labels the gif from result.json | |
| 13 | 14 | // session.mp4 browser recording (ffmpeg -> gif) |
| 14 | 15 | // terminal.cast terminal recording (agg -> gif; brew install agg) |
| 15 | 16 | // *.png run screenshot, uploaded as-is |
| @@ -48,10 +49,13 @@ const resolveArtifact = (input: string): Artifact => { · 32 unmodified lines | ||
| 48 | 49 | slug: basename(path).replace(/\.[^.]+$/, ""), |
| 49 | 50 | }; |
| 50 | 51 | } |
| 51 | − const recording = ["session.mp4", "terminal.cast"] | |
| 52 | + // film.mp4 (scripts/film.ts) is the whole session — terminal chat AND the | |
| 53 | + // browser hop, cut in time order; the bare browser session.mp4 is only the | |
| 54 | + // hop, so it must never win when a film exists. | |
| 55 | + const recording = ["film.mp4", "session.mp4", "terminal.cast"] | |
| 52 | 56 | .map((name) => join(path, name)) |
| 53 | 57 | .find(existsSync); |
| 54 | − if (!recording) throw new Error(`${input} has no session.mp4 or terminal.cast`); | |
| 58 | + if (!recording) throw new Error(`${input} has no film.mp4, session.mp4, or terminal.cast`); | |
| 55 | 59 | let label = basename(path); |
| 56 | 60 | try { |
| 57 | 61 | const result = JSON.parse(readFileSync(join(path, "result.json"), "utf8")) as { |