@hugpy/video-intelligence-ui 0.3.0 → 0.3.1
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/README.md +43 -0
- package/index.html +2 -0
- package/package.json +1 -2
- package/src/config.ts +8 -0
- package/src/demo/fixtures.ts +24 -22
- package/src/demo/mediaBase.ts +62 -0
- package/src/demo/sampleData.ts +32 -31
- package/src/demo/sampleSets.ts +25 -24
- package/assets/sampels/images/bycycle/bd8603bad35d4f179f4d1134d8faf2ee.mp4 +0 -0
- package/assets/sampels/images/bycycle/frame_00000.png +0 -0
- package/assets/sampels/images/bycycle/frame_00001.png +0 -0
- package/assets/sampels/images/bycycle/frame_00002.png +0 -0
- package/assets/sampels/images/bycycle/frame_00003.png +0 -0
- package/assets/sampels/images/bycycle/frame_00004.png +0 -0
- package/assets/sampels/images/bycycle/frame_00005.png +0 -0
- package/assets/sampels/images/forrest/ff23090611b844a6b85c224f388bd542.mp4 +0 -0
- package/assets/sampels/images/forrest/frame_00000.png +0 -0
- package/assets/sampels/images/forrest/frame_00001.png +0 -0
- package/assets/sampels/images/forrest/frame_00002.png +0 -0
- package/assets/sampels/images/forrest/frame_00003.png +0 -0
- package/assets/sampels/images/forrest/frame_00004.png +0 -0
- package/assets/sampels/images/forrest/frame_00005.png +0 -0
- package/assets/sampels/images/shenzo/e1a4fcd623084ab4a986d11c8cd00db8.mp4 +0 -0
- package/assets/sampels/images/shenzo/frame_00000.png +0 -0
- package/assets/sampels/images/shenzo/frame_00001.png +0 -0
- package/assets/sampels/images/shenzo/frame_00002.png +0 -0
- package/assets/sampels/images/shenzo/frame_00003.png +0 -0
- package/assets/sampels/images/shenzo/frame_00004.png +0 -0
- package/assets/sampels/images/shenzo/frame_00005.png +0 -0
- package/assets/sampels/scenes/man.mp4 +0 -0
- package/assets/sampels/scenes/woman.mp4 +0 -0
- package/assets/sampels/studio_movies/caverns/_assembly/contrib_00.mp4 +0 -0
- package/assets/sampels/studio_movies/caverns/movie.json +0 -67
- package/assets/sampels/studio_movies/caverns/movie.mp4 +0 -0
- package/assets/sampels/studio_movies/caverns/segment_00/5eea7770a554fef0c3bdc38f8f38b925dcf75f13c015d423e8eadec47d41bf6b/clip.mp4 +0 -0
- package/assets/sampels/studio_movies/caverns/segment_00/5eea7770a554fef0c3bdc38f8f38b925dcf75f13c015d423e8eadec47d41bf6b/manifest.json +0 -87
- package/assets/sampels/studio_movies/caverns/segment_00/5eea7770a554fef0c3bdc38f8f38b925dcf75f13c015d423e8eadec47d41bf6b/provenance.json +0 -7
- package/assets/sampels/studio_movies/caverns/segment_01/branch.png +0 -0
- package/assets/sampels/studio_movies/keeper-matrix/_assembly/concat_list.txt +0 -2
- package/assets/sampels/studio_movies/keeper-matrix/_assembly/contrib_00.mp4 +0 -0
- package/assets/sampels/studio_movies/keeper-matrix/_assembly/contrib_01.mp4 +0 -0
- package/assets/sampels/studio_movies/keeper-matrix/movie.json +0 -81
- package/assets/sampels/studio_movies/keeper-matrix/movie.mp4 +0 -0
- package/assets/sampels/studio_movies/keeper-matrix/segment_00/64854c6a21d47ce10b23e884e12de448b25bfb0a375d33238dd0bec8056c076d/clip.mp4 +0 -0
- package/assets/sampels/studio_movies/keeper-matrix/segment_00/64854c6a21d47ce10b23e884e12de448b25bfb0a375d33238dd0bec8056c076d/manifest.json +0 -87
- package/assets/sampels/studio_movies/keeper-matrix/segment_00/64854c6a21d47ce10b23e884e12de448b25bfb0a375d33238dd0bec8056c076d/provenance.json +0 -7
- package/assets/sampels/studio_movies/keeper-matrix/segment_01/branch.png +0 -0
- package/assets/sampels/studio_movies/keeper-matrix/segment_01/cc926b44a42b90d7d291a4e50e3859458306c207a17c718086a3466e4049d6c6/clip.mp4 +0 -0
- package/assets/sampels/studio_movies/keeper-matrix/segment_01/cc926b44a42b90d7d291a4e50e3859458306c207a17c718086a3466e4049d6c6/manifest.json +0 -87
- package/assets/sampels/studio_movies/keeper-matrix/segment_01/cc926b44a42b90d7d291a4e50e3859458306c207a17c718086a3466e4049d6c6/provenance.json +0 -7
- package/assets/sampels/videos/a_red_paper_boat_drifting_on_a_calm_pond__gentle_ripples__mo_a62d6c28.mp4 +0 -0
- package/assets/sampels/videos/aurora.mp4 +0 -0
- package/assets/sampels/videos/dark_night.mp4 +0 -0
- package/assets/sampels/videos/fire_and_soul.mp4 +0 -0
- package/assets/sampels/videos/harsh_seas.mp4 +0 -0
- package/src/demo/assets/demo-audio.mp3 +0 -0
- package/src/demo/assets/demo-clip.mp4 +0 -0
- package/src/demo/assets/demo-crop.mp4 +0 -0
- package/src/demo/assets/demo-poster.jpg +0 -0
- package/src/demo/assets/frame-1.jpg +0 -0
- package/src/demo/assets/frame-2.jpg +0 -0
- package/src/demo/assets/frame-3.jpg +0 -0
- package/src/demo/assets/frame-4.jpg +0 -0
- package/src/demo/assets/frame-5.jpg +0 -0
- package/src/demo/assets/frame-6.jpg +0 -0
- package/src/demo/assets/gen-1.jpg +0 -0
- package/src/demo/assets/gen-2.jpg +0 -0
- package/src/demo/assets/generate/cinema-cavern/movie.mp4 +0 -0
- package/src/demo/assets/generate/cinema-cavern/seg_00.mp4 +0 -0
- package/src/demo/assets/generate/clips/cat-lounge.mp4 +0 -0
- package/src/demo/assets/generate/clips/drone-city.mp4 +0 -0
- package/src/demo/assets/generate/clips/paper-sails.mp4 +0 -0
- package/src/demo/assets/generate/movie-galaxy/movie.mp4 +0 -0
- package/src/demo/assets/generate/movie-galaxy/seg_00.mp4 +0 -0
- package/src/demo/assets/generate/movie-galaxy/seg_01.mp4 +0 -0
- package/src/demo/assets/generate/movie-galaxy/seg_02.mp4 +0 -0
- package/src/demo/assets/generate/movie-galaxy/seg_03.mp4 +0 -0
- package/src/demo/assets/generate/movie-medow/movie.mp4 +0 -0
- package/src/demo/assets/generate/movie-medow/seg_00.mp4 +0 -0
- package/src/demo/assets/generate/movie-medow/seg_01.mp4 +0 -0
- package/src/demo/assets/generate/scene-desert/frame_00000.png +0 -0
- package/src/demo/assets/generate/scene-desert/frame_00001.png +0 -0
- package/src/demo/assets/generate/scene-desert/frame_00002.png +0 -0
- package/src/demo/assets/generate/scene-desert/frame_00003.png +0 -0
- package/src/demo/assets/generate/scene-desert/frame_00004.png +0 -0
- package/src/demo/assets/generate/scene-desert/frame_00005.png +0 -0
- package/src/demo/assets/generate/scene-desert/scene.mp4 +0 -0
- package/src/demo/assets/generate/scene-vintage/frame_00000.png +0 -0
- package/src/demo/assets/generate/scene-vintage/frame_00001.png +0 -0
- package/src/demo/assets/generate/scene-vintage/frame_00002.png +0 -0
- package/src/demo/assets/generate/scene-vintage/frame_00003.png +0 -0
- package/src/demo/assets/generate/scene-vintage/frame_00004.png +0 -0
- package/src/demo/assets/generate/scene-vintage/frame_00005.png +0 -0
- package/src/demo/assets/generate/scene-vintage/scene.mp4 +0 -0
- package/src/demo/assets/generate2/s0.png +0 -0
- package/src/demo/assets/generate2/s1.png +0 -0
- package/src/demo/assets/generate2/s10.png +0 -0
- package/src/demo/assets/generate2/s11.png +0 -0
- package/src/demo/assets/generate2/s12.png +0 -0
- package/src/demo/assets/generate2/s13.png +0 -0
- package/src/demo/assets/generate2/s14.png +0 -0
- package/src/demo/assets/generate2/s15.png +0 -0
- package/src/demo/assets/generate2/s16.png +0 -0
- package/src/demo/assets/generate2/s17.png +0 -0
- package/src/demo/assets/generate2/s18.png +0 -0
- package/src/demo/assets/generate2/s19.png +0 -0
- package/src/demo/assets/generate2/s2.png +0 -0
- package/src/demo/assets/generate2/s20.png +0 -0
- package/src/demo/assets/generate2/s21.mp4 +0 -0
- package/src/demo/assets/generate2/s22.mp4 +0 -0
- package/src/demo/assets/generate2/s23.mp4 +0 -0
- package/src/demo/assets/generate2/s24.mp4 +0 -0
- package/src/demo/assets/generate2/s25.mp4 +0 -0
- package/src/demo/assets/generate2/s26.mp4 +0 -0
- package/src/demo/assets/generate2/s27.mp4 +0 -0
- package/src/demo/assets/generate2/s28.mp4 +0 -0
- package/src/demo/assets/generate2/s29.mp4 +0 -0
- package/src/demo/assets/generate2/s3.png +0 -0
- package/src/demo/assets/generate2/s30.mp4 +0 -0
- package/src/demo/assets/generate2/s4.png +0 -0
- package/src/demo/assets/generate2/s5.png +0 -0
- package/src/demo/assets/generate2/s6.png +0 -0
- package/src/demo/assets/generate2/s7.png +0 -0
- package/src/demo/assets/generate2/s8.png +0 -0
- package/src/demo/assets/generate2/s9.png +0 -0
- package/src/demo/assets.d.ts +0 -14
package/README.md
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# @hugpy/video-intelligence-ui
|
|
2
|
+
|
|
3
|
+
Video-intelligence console — sibling arm of `media_intelligence_ui` (Vite +
|
|
4
|
+
Tailwind v4), served at `/video`. Four stations (image crop, audio crop,
|
|
5
|
+
frames/models, generate) over the hugpy job bus.
|
|
6
|
+
|
|
7
|
+
## Demo media is hosted, not bundled
|
|
8
|
+
|
|
9
|
+
The canned demo (`?demo=1`) replays recorded job envelopes whose media
|
|
10
|
+
(~36 MB of sample mp4/png) is **not** shipped in this package or its build.
|
|
11
|
+
It loads from a hosted base, default `https://hugpy.ai/demo-media`.
|
|
12
|
+
|
|
13
|
+
Resolution order (see `src/demo/mediaBase.ts`, resolved once at load):
|
|
14
|
+
|
|
15
|
+
1. `?mediaBase=` query param (http(s) or path-absolute values only)
|
|
16
|
+
2. `window.__HUGPY_MEDIA_BASE__` — a non-empty string; `index.html` ships a
|
|
17
|
+
`window.__HUGPY_MEDIA_BASE__ = window.__HUGPY_MEDIA_BASE__ ?? null;`
|
|
18
|
+
marker that servers/self-hosters may rewrite (replace `null` with a
|
|
19
|
+
JSON string)
|
|
20
|
+
3. `VITE_HUGPY_DEMO_MEDIA_BASE` (build-time, read in `src/config.ts` — the
|
|
21
|
+
one module permitted to hold URL literals)
|
|
22
|
+
4. the default `https://hugpy.ai/demo-media`
|
|
23
|
+
|
|
24
|
+
## Self-hosting the demo media (`hugpy serve`)
|
|
25
|
+
|
|
26
|
+
The Python server (`abstract_hugpy_dev` / `hugpy`) reads two env vars
|
|
27
|
+
(env or `.env`) and rewrites the marker in the served `index.html`:
|
|
28
|
+
|
|
29
|
+
- `HUGPY_DEMO_MEDIA_BASE=<url>` — point the demo at any hosted copy of the
|
|
30
|
+
media tree.
|
|
31
|
+
- `HUGPY_DEMO_MEDIA_DIR=<path>` — serve a local copy of the tree yourself at
|
|
32
|
+
`/demo-media/` (wins over `HUGPY_DEMO_MEDIA_BASE`). Unset → the route does
|
|
33
|
+
not exist.
|
|
34
|
+
|
|
35
|
+
## Canonical media tree
|
|
36
|
+
|
|
37
|
+
The canonical copy lives at `/var/www/hugpy-media/` on the hugpy.ai VM,
|
|
38
|
+
served by an `location /demo-media/` block in the brochure nginx vhost —
|
|
39
|
+
deliberately OUTSIDE the brochure docroot (`/var/www/hugpy.ai`) so brochure
|
|
40
|
+
rebuilds (`stage.sh` rsync `--delete`) can never wipe it. Its layout mirrors
|
|
41
|
+
the `demoMedia("...")` specifiers: `generate/`, `generate2/`, top-level
|
|
42
|
+
`demo-*` files, and `sampels/` (that dir is intentionally spelled "sampels"
|
|
43
|
+
— do NOT rename it).
|
package/index.html
CHANGED
|
@@ -48,6 +48,8 @@
|
|
|
48
48
|
<p><a style="color:#8ab4ff" href="/">Hugpy — Inference You Own</a></p>
|
|
49
49
|
</main>
|
|
50
50
|
</noscript>
|
|
51
|
+
<!-- Self-hosters/servers: replace null with your demo-media base URL string. -->
|
|
52
|
+
<script>window.__HUGPY_MEDIA_BASE__ = window.__HUGPY_MEDIA_BASE__ ?? null;</script>
|
|
51
53
|
<script type="module" src="./entry.tsx"></script>
|
|
52
54
|
</body>
|
|
53
55
|
</html>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hugpy/video-intelligence-ui",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"license": "SEE LICENSE IN LICENSE",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Video-intelligence console \u2014 sibling arm of media_intelligence_ui (Vite + Tailwind v4), served at /video. Four stations (image crop, audio crop, frames/models, generate) over the hugpy job bus. Dials the same-origin current-hugpy API (/api).",
|
|
@@ -28,7 +28,6 @@
|
|
|
28
28
|
"src",
|
|
29
29
|
"entry.tsx",
|
|
30
30
|
"index.html",
|
|
31
|
-
"assets",
|
|
32
31
|
"vite.config.ts",
|
|
33
32
|
"tsconfig.json",
|
|
34
33
|
"LICENSE"
|
package/src/config.ts
CHANGED
|
@@ -39,6 +39,14 @@ export const hugpyConfig = {
|
|
|
39
39
|
apiBase,
|
|
40
40
|
/** Public hugpy site — CTA target. Override with VITE_HUGPY_SITE_URL. */
|
|
41
41
|
siteUrl: stripTrailingSlash(read("VITE_HUGPY_SITE_URL") ?? "https://hugpy.ai"),
|
|
42
|
+
/**
|
|
43
|
+
* Hosted demo media tree (canned-demo samples live OUT of the bundle).
|
|
44
|
+
* Build-time override: VITE_HUGPY_DEMO_MEDIA_BASE. Runtime overrides
|
|
45
|
+
* (?mediaBase= / window.__HUGPY_MEDIA_BASE__) are layered in demo/mediaBase.ts.
|
|
46
|
+
*/
|
|
47
|
+
demoMediaBase: stripTrailingSlash(
|
|
48
|
+
read("VITE_HUGPY_DEMO_MEDIA_BASE") ?? "https://hugpy.ai/demo-media",
|
|
49
|
+
),
|
|
42
50
|
/** Multipart file upload endpoint. */
|
|
43
51
|
uploadUrl: read("VITE_HUGPY_UPLOAD_URL") ?? `${apiBase}/uploads`,
|
|
44
52
|
/**
|
package/src/demo/fixtures.ts
CHANGED
|
@@ -1,35 +1,37 @@
|
|
|
1
1
|
// Canned fixtures for the video-intelligence demo (?demo=1).
|
|
2
2
|
//
|
|
3
|
-
// Every MediaRef here points its `uri` at a
|
|
3
|
+
// Every MediaRef here points its `uri` at a HOSTED demo-media URL rather than a
|
|
4
4
|
// server store key. That matters because <img>/<video> element loads do NOT go
|
|
5
5
|
// through window.fetch (the shim can't intercept them) — so in canned mode
|
|
6
|
-
// mediaBytesUrl() passes these absolute
|
|
7
|
-
//
|
|
6
|
+
// mediaBytesUrl() passes these absolute URLs straight through and the browser
|
|
7
|
+
// loads the hosted bytes directly. See config.ts and demo/mediaBase.ts.
|
|
8
8
|
import type { MediaRef } from "../video/contract";
|
|
9
9
|
import { takeSet, sectionFor, type SampleSet } from "./sampleSets";
|
|
10
10
|
import { SAMPLES2, type Sample2 } from "./sampleData";
|
|
11
11
|
|
|
12
|
-
// Real sample media dropped by the operator
|
|
13
|
-
//
|
|
14
|
-
//
|
|
15
|
-
|
|
16
|
-
import
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
12
|
+
// Real sample media dropped by the operator — the sampels/ tree now lives at
|
|
13
|
+
// the HOSTED media base (default https://hugpy.ai/demo-media/sampels/; canonical
|
|
14
|
+
// copy /var/www/hugpy-media/ on the hugpy.ai VM). Note: the dir is intentionally
|
|
15
|
+
// spelled "sampels" — do NOT rename it in the hosted tree.
|
|
16
|
+
import { demoMedia } from "./mediaBase";
|
|
17
|
+
const demoClipUrl = demoMedia("sampels/scenes/woman.mp4");
|
|
18
|
+
const demoCropUrl = demoMedia("sampels/scenes/man.mp4");
|
|
19
|
+
const demoAudioUrl = demoMedia("demo-audio.mp3"); // no audio sample provided — kept
|
|
20
|
+
const frame1 = demoMedia("sampels/images/forrest/frame_00000.png");
|
|
21
|
+
const frame2 = demoMedia("sampels/images/forrest/frame_00001.png");
|
|
22
|
+
const frame3 = demoMedia("sampels/images/forrest/frame_00002.png");
|
|
23
|
+
const frame4 = demoMedia("sampels/images/forrest/frame_00003.png");
|
|
24
|
+
const frame5 = demoMedia("sampels/images/forrest/frame_00004.png");
|
|
25
|
+
const frame6 = demoMedia("sampels/images/forrest/frame_00005.png");
|
|
26
|
+
const gen1 = demoMedia("sampels/images/shenzo/frame_00000.png");
|
|
27
|
+
const gen2 = demoMedia("sampels/images/bycycle/frame_00000.png");
|
|
26
28
|
// The forrest scene's assembled clip (single .mp4 in that folder — hashed name).
|
|
27
|
-
|
|
29
|
+
const forrestSceneUrl = demoMedia("sampels/images/forrest/ff23090611b844a6b85c224f388bd542.mp4");
|
|
28
30
|
// The real 2-segment "keeper-matrix" sailboat movie (see movie.json for numbers).
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
const movieUrl = demoMedia("sampels/studio_movies/keeper-matrix/movie.mp4");
|
|
32
|
+
const movieSeg0Url = demoMedia("sampels/studio_movies/keeper-matrix/segment_00/64854c6a21d47ce10b23e884e12de448b25bfb0a375d33238dd0bec8056c076d/clip.mp4");
|
|
33
|
+
const movieSeg1Url = demoMedia("sampels/studio_movies/keeper-matrix/segment_01/cc926b44a42b90d7d291a4e50e3859458306c207a17c718086a3466e4049d6c6/clip.mp4");
|
|
34
|
+
const movieSeg1BranchUrl = demoMedia("sampels/studio_movies/keeper-matrix/segment_01/branch.png");
|
|
33
35
|
|
|
34
36
|
// ── the worked example: one ingested clip + derived assets ──────────────────
|
|
35
37
|
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// Demo media base — where the canned-demo sample tree is served from.
|
|
2
|
+
//
|
|
3
|
+
// The demo media (~36M of mp4/png samples) is NOT bundled; it lives at a
|
|
4
|
+
// hosted base (default https://hugpy.ai/demo-media, see config.ts — the ONE
|
|
5
|
+
// module permitted to hold URL literals). Resolved ONCE at module load, same
|
|
6
|
+
// as demo/mode.ts. Precedence:
|
|
7
|
+
// 1. ?mediaBase= query param (http(s) or path-absolute only)
|
|
8
|
+
// 2. window.__HUGPY_MEDIA_BASE__ (non-empty string — servers/self-hosters
|
|
9
|
+
// set this by rewriting the index.html marker; see index.html)
|
|
10
|
+
// 3. VITE_HUGPY_DEMO_MEDIA_BASE (build-time, read in config.ts)
|
|
11
|
+
// 4. the config.ts default.
|
|
12
|
+
|
|
13
|
+
import { hugpyConfig } from "../config";
|
|
14
|
+
|
|
15
|
+
declare global {
|
|
16
|
+
interface Window {
|
|
17
|
+
__HUGPY_MEDIA_BASE__?: string | null;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function stripTrailingSlash(url: string): string {
|
|
22
|
+
return url.replace(/\/+$/, "");
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/** Accept only http(s) URLs or path-absolute ("/...") bases. */
|
|
26
|
+
function acceptable(raw: string): boolean {
|
|
27
|
+
return /^(https?:\/\/|\/)/i.test(raw);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function resolve(): string {
|
|
31
|
+
// 1. ?mediaBase= — same query-param precedent as demo/mode.ts (?demo=).
|
|
32
|
+
try {
|
|
33
|
+
const params = new URLSearchParams(
|
|
34
|
+
typeof window !== "undefined" ? window.location.search : "",
|
|
35
|
+
);
|
|
36
|
+
const raw = (params.get("mediaBase") || "").trim();
|
|
37
|
+
if (raw && acceptable(raw)) return stripTrailingSlash(raw);
|
|
38
|
+
} catch {
|
|
39
|
+
/* fall through */
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// 2. window.__HUGPY_MEDIA_BASE__ — server-injected (index.html marker).
|
|
43
|
+
try {
|
|
44
|
+
const injected =
|
|
45
|
+
typeof window !== "undefined" ? window.__HUGPY_MEDIA_BASE__ : null;
|
|
46
|
+
if (typeof injected === "string" && injected.trim()) {
|
|
47
|
+
return stripTrailingSlash(injected.trim());
|
|
48
|
+
}
|
|
49
|
+
} catch {
|
|
50
|
+
/* fall through */
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// 3./4. Build-time env override or the config default (both in config.ts).
|
|
54
|
+
return hugpyConfig.demoMediaBase;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const base = resolve();
|
|
58
|
+
|
|
59
|
+
/** Absolute URL for a demo media file, e.g. demoMedia("generate2/s0.png"). */
|
|
60
|
+
export function demoMedia(relPath: string): string {
|
|
61
|
+
return `${base}/${relPath}`;
|
|
62
|
+
}
|
package/src/demo/sampleData.ts
CHANGED
|
@@ -3,37 +3,38 @@
|
|
|
3
3
|
// assets), so the canned wire shape is exactly what production returned.
|
|
4
4
|
// Regenerate with the script in the session notes; do not hand-edit results.
|
|
5
5
|
|
|
6
|
-
import
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
6
|
+
import { demoMedia } from "./mediaBase";
|
|
7
|
+
const A0 = demoMedia("generate2/s0.png");
|
|
8
|
+
const A1 = demoMedia("generate2/s1.png");
|
|
9
|
+
const A2 = demoMedia("generate2/s2.png");
|
|
10
|
+
const A3 = demoMedia("generate2/s3.png");
|
|
11
|
+
const A4 = demoMedia("generate2/s4.png");
|
|
12
|
+
const A5 = demoMedia("generate2/s5.png");
|
|
13
|
+
const A6 = demoMedia("generate2/s6.png");
|
|
14
|
+
const A7 = demoMedia("generate2/s7.png");
|
|
15
|
+
const A8 = demoMedia("generate2/s8.png");
|
|
16
|
+
const A9 = demoMedia("generate2/s9.png");
|
|
17
|
+
const A10 = demoMedia("generate2/s10.png");
|
|
18
|
+
const A11 = demoMedia("generate2/s11.png");
|
|
19
|
+
const A12 = demoMedia("generate2/s12.png");
|
|
20
|
+
const A13 = demoMedia("generate2/s13.png");
|
|
21
|
+
const A14 = demoMedia("generate2/s14.png");
|
|
22
|
+
const A15 = demoMedia("generate2/s15.png");
|
|
23
|
+
const A16 = demoMedia("generate2/s16.png");
|
|
24
|
+
const A17 = demoMedia("generate2/s17.png");
|
|
25
|
+
const A18 = demoMedia("generate2/s18.png");
|
|
26
|
+
const A19 = demoMedia("generate2/s19.png");
|
|
27
|
+
const A20 = demoMedia("generate2/s20.png");
|
|
28
|
+
const A21 = demoMedia("generate2/s21.mp4");
|
|
29
|
+
const A22 = demoMedia("generate2/s22.mp4");
|
|
30
|
+
const A23 = demoMedia("generate2/s23.mp4");
|
|
31
|
+
const A24 = demoMedia("generate2/s24.mp4");
|
|
32
|
+
const A25 = demoMedia("generate2/s25.mp4");
|
|
33
|
+
const A26 = demoMedia("generate2/s26.mp4");
|
|
34
|
+
const A27 = demoMedia("generate2/s27.mp4");
|
|
35
|
+
const A28 = demoMedia("generate2/s28.mp4");
|
|
36
|
+
const A29 = demoMedia("generate2/s29.mp4");
|
|
37
|
+
const A30 = demoMedia("generate2/s30.mp4");
|
|
37
38
|
|
|
38
39
|
export interface Sample2 { kind: string; prompts: string[]; result: Record<string, unknown>; }
|
|
39
40
|
export const SAMPLES2: Sample2[] = [
|
package/src/demo/sampleSets.ts
CHANGED
|
@@ -22,35 +22,36 @@
|
|
|
22
22
|
import type { MediaRef } from "../video/contract";
|
|
23
23
|
|
|
24
24
|
// scene: desert roads (job 187ac900…, sd-turbo, 6 frames @512)
|
|
25
|
-
import
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
25
|
+
import { demoMedia } from "./mediaBase";
|
|
26
|
+
const sdF0 = demoMedia("generate/scene-desert/frame_00000.png");
|
|
27
|
+
const sdF1 = demoMedia("generate/scene-desert/frame_00001.png");
|
|
28
|
+
const sdF2 = demoMedia("generate/scene-desert/frame_00002.png");
|
|
29
|
+
const sdF3 = demoMedia("generate/scene-desert/frame_00003.png");
|
|
30
|
+
const sdF4 = demoMedia("generate/scene-desert/frame_00004.png");
|
|
31
|
+
const sdF5 = demoMedia("generate/scene-desert/frame_00005.png");
|
|
32
|
+
const sdClip = demoMedia("generate/scene-desert/scene.mp4");
|
|
32
33
|
// scene: vintage frames (job 69a7bbcf…) — render showcased, prompt not
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
34
|
+
const svF0 = demoMedia("generate/scene-vintage/frame_00000.png");
|
|
35
|
+
const svF1 = demoMedia("generate/scene-vintage/frame_00001.png");
|
|
36
|
+
const svF2 = demoMedia("generate/scene-vintage/frame_00002.png");
|
|
37
|
+
const svClip = demoMedia("generate/scene-vintage/scene.mp4");
|
|
37
38
|
// movie: sunny meadow (job 5ca10b84…, 2 goals) + swirling galaxy (1eed0b95…, 4 goals)
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
39
|
+
const mmSeg0 = demoMedia("generate/movie-medow/seg_00.mp4");
|
|
40
|
+
const mmSeg1 = demoMedia("generate/movie-medow/seg_01.mp4");
|
|
41
|
+
const mmMovie = demoMedia("generate/movie-medow/movie.mp4");
|
|
42
|
+
const mgSeg0 = demoMedia("generate/movie-galaxy/seg_00.mp4");
|
|
43
|
+
const mgSeg1 = demoMedia("generate/movie-galaxy/seg_01.mp4");
|
|
44
|
+
const mgSeg2 = demoMedia("generate/movie-galaxy/seg_02.mp4");
|
|
45
|
+
const mgSeg3 = demoMedia("generate/movie-galaxy/seg_03.mp4");
|
|
46
|
+
const mgMovie = demoMedia("generate/movie-galaxy/movie.mp4");
|
|
46
47
|
// clips (studio i2v manifests carry the prompts)
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
48
|
+
const clCat = demoMedia("generate/clips/cat-lounge.mp4");
|
|
49
|
+
const clDrone = demoMedia("generate/clips/drone-city.mp4");
|
|
50
|
+
const clSails = demoMedia("generate/clips/paper-sails.mp4");
|
|
50
51
|
// cinema: dank cavern (movie.json segment prompts; seg_01 was a branch-only
|
|
51
52
|
// render, so the set is segment_00 + the assembled movie LAST)
|
|
52
|
-
|
|
53
|
-
|
|
53
|
+
const ccSeg0 = demoMedia("generate/cinema-cavern/seg_00.mp4");
|
|
54
|
+
const ccMovie = demoMedia("generate/cinema-cavern/movie.mp4");
|
|
54
55
|
|
|
55
56
|
function img(id: string, uri: string): MediaRef {
|
|
56
57
|
return { asset_id: id, kind: "image", uri, mime: "image/png",
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"kind": "studio_movie",
|
|
3
|
-
"drift": "still-mode splices condition each segment on ONE frame of its parent \u2014 motion is NOT carried across the splice. A joint's joint_mode='vace_extend' carries motion via VACE-extend (conditioning on the parent's trailing context_frames through the diffusers video+mask extend idiom) instead of a single still. A joint_mode='cut' is a HARD scene cut: no frame carry, the parent plays in full. With movie-level reference_images set (an identity movie) every segment renders id_lock so the subject carries across scene changes even though no pixels do \u2014 on the VACE path the references win the conditioning (an i2v branch still is accepted but unused; it governs only the parent trim).",
|
|
4
|
-
"fps": 24,
|
|
5
|
-
"width": 480,
|
|
6
|
-
"height": 480,
|
|
7
|
-
"vram_budget_gb": null,
|
|
8
|
-
"id_lock": false,
|
|
9
|
-
"reference_images": [],
|
|
10
|
-
"segments": [
|
|
11
|
-
{
|
|
12
|
-
"index": 0,
|
|
13
|
-
"segment_id": "seg_00",
|
|
14
|
-
"parent_segment_id": null,
|
|
15
|
-
"prompt": "In a subterranean cavern bathed in the harsh midday sun, a towering structure dwarfs its surroundings, casting short, sharp black shadows that dance across the cavern's walls. The cavern's natural beauty is accentuated by saturated primaries, creating an intimate and awe-inspiring mood. The shot begins with a sweeping establishing view, capturing the structure's majesty. As the camera slowly pushes in, the structure's intricate details come into focus, each element standing out against the cavern's stark, yet beautiful backdrop. The light, a hard midday sun, highlights the structure's grandeur, making it the focal point of the scene. The palette is saturated primaries, intensifying the cavern's natural colors and the structure's imposing presence. The shot starts from rest, maintaining the intimate mood as the viewer is drawn closer to the structure, experiencing its grandeur through the lens.",
|
|
16
|
-
"capability": "t2v",
|
|
17
|
-
"model_id": "wan2.1-t2v-1.3b",
|
|
18
|
-
"model_source": "movie",
|
|
19
|
-
"seed": 0,
|
|
20
|
-
"branch_frame": null,
|
|
21
|
-
"resolved_branch": null,
|
|
22
|
-
"joint_mode": "still",
|
|
23
|
-
"context_frames": 0,
|
|
24
|
-
"context_drop": 0,
|
|
25
|
-
"vram_budget_gb": 21.6,
|
|
26
|
-
"budget_source": "autofit:ae",
|
|
27
|
-
"clip_path": "/mnt/llm_storage/video_intel/studio_movies/a0a47af626bd471da3c06832f7e4f99d/segment_00/5eea7770a554fef0c3bdc38f8f38b925dcf75f13c015d423e8eadec47d41bf6b/clip.mp4",
|
|
28
|
-
"clip_uri": "/mnt/llm_storage/video_intel/studio_movies/a0a47af626bd471da3c06832f7e4f99d/segment_00/5eea7770a554fef0c3bdc38f8f38b925dcf75f13c015d423e8eadec47d41bf6b/clip.mp4",
|
|
29
|
-
"frames": 81,
|
|
30
|
-
"width": 480,
|
|
31
|
-
"height": 480,
|
|
32
|
-
"duration_s": 3.375,
|
|
33
|
-
"content_hash": "5eea7770a554fef0c3bdc38f8f38b925dcf75f13c015d423e8eadec47d41bf6b",
|
|
34
|
-
"resumed": false,
|
|
35
|
-
"status": "done"
|
|
36
|
-
},
|
|
37
|
-
{
|
|
38
|
-
"index": 1,
|
|
39
|
-
"segment_id": "seg_01",
|
|
40
|
-
"parent_segment_id": "seg_00",
|
|
41
|
-
"prompt": "In a flooded forest, a pair of exhausted hands, their skin slick with water and sweat, complete a delicate task under the unflattering, green fluorescent strip light. The cool teal and slate palette, cool and muted, highlights the hands' strained features. As the camera pulls back, revealing the hands' movements, a towering structure, bathed in harsh midday sun, casts sharp shadows across the flooded forest. The structure's intricate details stand out against the unflattering light, creating an intimate and awe-inspiring mood. The shot begins from rest, maintaining the exhausted and awe-inspiring mood as the viewer is drawn closer to the hands and the structure, experiencing their struggle and the cavern's natural beauty through the lens.",
|
|
42
|
-
"capability": "i2v",
|
|
43
|
-
"model_id": null,
|
|
44
|
-
"model_source": "capability_fallback",
|
|
45
|
-
"pinned_model_id": "wan2.1-t2v-1.3b",
|
|
46
|
-
"model_note": "movie-level pin 'wan2.1-t2v-1.3b' serves t2v, not 'i2v'; this segment resolved a capable model through the studio router instead (the pin still binds the segments it serves)",
|
|
47
|
-
"joint_mode": "still",
|
|
48
|
-
"context_frames": 0,
|
|
49
|
-
"resolved_branch": 80,
|
|
50
|
-
"vram_budget_gb": 21.6,
|
|
51
|
-
"budget_source": "autofit:ae",
|
|
52
|
-
"status": "failed",
|
|
53
|
-
"error": {
|
|
54
|
-
"code": "cancelled",
|
|
55
|
-
"message": "cancelled (render child killed after grace)"
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
],
|
|
59
|
-
"joints": [],
|
|
60
|
-
"assembly": {
|
|
61
|
-
"movie": "movie.mp4",
|
|
62
|
-
"total_frames": 81
|
|
63
|
-
},
|
|
64
|
-
"partial": true,
|
|
65
|
-
"segments_completed": 1,
|
|
66
|
-
"segments_total": 2
|
|
67
|
-
}
|
|
Binary file
|
|
Binary file
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"adapters": [],
|
|
3
|
-
"capability": "t2v",
|
|
4
|
-
"control_image": "",
|
|
5
|
-
"control_kind": "",
|
|
6
|
-
"controls": [],
|
|
7
|
-
"determinism_class": "seeded_approx",
|
|
8
|
-
"env_snapshot": [
|
|
9
|
-
[
|
|
10
|
-
"STUDIO_ALLOW_UNPINNED",
|
|
11
|
-
"1"
|
|
12
|
-
],
|
|
13
|
-
[
|
|
14
|
-
"STUDIO_LOUDNESS_LUFS",
|
|
15
|
-
"-14.0"
|
|
16
|
-
],
|
|
17
|
-
[
|
|
18
|
-
"STUDIO_MANIFEST_ROOT",
|
|
19
|
-
"/mnt/llm_storage/video_intel/studio/manifests"
|
|
20
|
-
],
|
|
21
|
-
[
|
|
22
|
-
"STUDIO_MASTER_COLORSPACE",
|
|
23
|
-
"rec709"
|
|
24
|
-
],
|
|
25
|
-
[
|
|
26
|
-
"STUDIO_MASTER_FPS",
|
|
27
|
-
"24"
|
|
28
|
-
],
|
|
29
|
-
[
|
|
30
|
-
"STUDIO_MAX_VRAM_GB",
|
|
31
|
-
"24.0"
|
|
32
|
-
],
|
|
33
|
-
[
|
|
34
|
-
"STUDIO_OUTPUT_ROOT",
|
|
35
|
-
"/mnt/llm_storage/video_intel/studio_movies/a0a47af626bd471da3c06832f7e4f99d/segment_00"
|
|
36
|
-
],
|
|
37
|
-
[
|
|
38
|
-
"STUDIO_WEIGHTS_ROOT",
|
|
39
|
-
"/mnt/llm_storage/video_intel/studio/weights"
|
|
40
|
-
]
|
|
41
|
-
],
|
|
42
|
-
"framework": "wan",
|
|
43
|
-
"identity_ids": [],
|
|
44
|
-
"identity_view_hashes": [],
|
|
45
|
-
"model_id": "wan2.1-t2v-1.3b",
|
|
46
|
-
"negative_prompt": "deformed hands, extra fingers, extra limbs, fused faces, warped anatomy, flicker, temporal instability, morphing, blur, low resolution, jpeg artifacts, watermark, text overlay, logo, oversaturation, banding, duplicate subject, changing wardrobe, identity drift, camera shake",
|
|
47
|
-
"precision": "fp16",
|
|
48
|
-
"prompt": "In a subterranean cavern bathed in the harsh midday sun, a towering structure dwarfs its surroundings, casting short, sharp black shadows that dance across the cavern's walls. The cavern's natural beauty is accentuated by saturated primaries, creating an intimate and awe-inspiring mood. The shot begins with a sweeping establishing view, capturing the structure's majesty. As the camera slowly pushes in, the structure's intricate details come into focus, each element standing out against the cavern's stark, yet beautiful backdrop. The light, a hard midday sun, highlights the structure's grandeur, making it the focal point of the scene. The palette is saturated primaries, intensifying the cavern's natural colors and the structure's imposing presence. The shot starts from rest, maintaining the intimate mood as the viewer is drawn closer to the structure, experiencing its grandeur through the lens.",
|
|
49
|
-
"provenance": {
|
|
50
|
-
"c2pa_pending": true,
|
|
51
|
-
"created_at": "2026-08-01T12:31:02.798001+00:00",
|
|
52
|
-
"operator": "hugpy-studio",
|
|
53
|
-
"tool": "hugpy-studio"
|
|
54
|
-
},
|
|
55
|
-
"reference_images": [],
|
|
56
|
-
"render_id": "76e36675e8a04266931c69cb49b41412",
|
|
57
|
-
"requested_frames": null,
|
|
58
|
-
"resolution_ladder": [
|
|
59
|
-
[
|
|
60
|
-
480,
|
|
61
|
-
480,
|
|
62
|
-
24
|
|
63
|
-
]
|
|
64
|
-
],
|
|
65
|
-
"sampler": {
|
|
66
|
-
"cfg": 5.0,
|
|
67
|
-
"sampler": "unipc",
|
|
68
|
-
"scheduler": "flow_match",
|
|
69
|
-
"shift": 3.0,
|
|
70
|
-
"sigmas": [],
|
|
71
|
-
"steps": 32
|
|
72
|
-
},
|
|
73
|
-
"seeds": {
|
|
74
|
-
"chunk_seed_base": null,
|
|
75
|
-
"global_seed": 0,
|
|
76
|
-
"stage_seeds": [
|
|
77
|
-
[
|
|
78
|
-
"base",
|
|
79
|
-
0
|
|
80
|
-
]
|
|
81
|
-
]
|
|
82
|
-
},
|
|
83
|
-
"source_video": "",
|
|
84
|
-
"task": "t2v",
|
|
85
|
-
"vace_context_frames": [],
|
|
86
|
-
"weight_hash": null
|
|
87
|
-
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|