hyperframes 0.7.84 → 0.7.86

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/dist/cli.js CHANGED
@@ -50,7 +50,7 @@ var VERSION;
50
50
  var init_version = __esm({
51
51
  "src/version.ts"() {
52
52
  "use strict";
53
- VERSION = true ? "0.7.84" : "0.0.0-dev";
53
+ VERSION = true ? "0.7.86" : "0.0.0-dev";
54
54
  }
55
55
  });
56
56
 
@@ -68784,7 +68784,7 @@ function sanitizeFfprobeDiagnostic(stderr, filePath) {
68784
68784
  }
68785
68785
  async function runFfprobe(filePath, argsWithoutInput, signal) {
68786
68786
  const command2 = getFfprobeBinary();
68787
- const proc = spawn3(command2, ["-v", "error", ...argsWithoutInput, filePath]);
68787
+ const proc = spawn3(command2, ["-v", "error", ...argsWithoutInput, "--", filePath]);
68788
68788
  trackChildProcess(proc);
68789
68789
  let stdout2 = "";
68790
68790
  proc.stdout.on("data", (data2) => {
@@ -68840,6 +68840,7 @@ function extractPngMetadataFromBuffer(buf) {
68840
68840
  let width = 0;
68841
68841
  let height = 0;
68842
68842
  let seenIdat = false;
68843
+ let colorSpaceFromCicp = null;
68843
68844
  let pos = 8;
68844
68845
  while (pos + 12 <= buf.length) {
68845
68846
  const chunkLen = buf.readUInt32BE(pos);
@@ -68860,20 +68861,16 @@ function extractPngMetadataFromBuffer(buf) {
68860
68861
  const primariesCode = chunkData[0] ?? 0;
68861
68862
  const transferCode = chunkData[1] ?? 0;
68862
68863
  const matrixCode = chunkData[2] ?? 0;
68863
- return {
68864
- width,
68865
- height,
68866
- colorSpace: {
68867
- colorPrimaries: primariesCode === 9 ? "bt2020" : primariesCode === 1 ? "bt709" : `unknown-${primariesCode}`,
68868
- colorTransfer: transferCode === 16 ? "smpte2084" : transferCode === 18 ? "arib-std-b67" : transferCode === 1 ? "bt709" : `unknown-${transferCode}`,
68869
- colorSpace: matrixCode === 9 ? "bt2020nc" : matrixCode === 0 ? "gbr" : `unknown-${matrixCode}`
68870
- }
68864
+ colorSpaceFromCicp = {
68865
+ colorPrimaries: primariesCode === 9 ? "bt2020" : primariesCode === 1 ? "bt709" : `unknown-${primariesCode}`,
68866
+ colorTransfer: transferCode === 16 ? "smpte2084" : transferCode === 18 ? "arib-std-b67" : transferCode === 1 ? "bt709" : `unknown-${transferCode}`,
68867
+ colorSpace: matrixCode === 9 ? "bt2020nc" : matrixCode === 0 ? "gbr" : `unknown-${matrixCode}`
68871
68868
  };
68872
68869
  }
68873
68870
  if (chunkType === "IEND") break;
68874
68871
  pos += 12 + chunkLen;
68875
68872
  }
68876
- return width > 0 && height > 0 ? { width, height, colorSpace: null } : null;
68873
+ return width > 0 && height > 0 ? { width, height, colorSpace: colorSpaceFromCicp } : null;
68877
68874
  }
68878
68875
  function extractStillImageMetadata(filePath) {
68879
68876
  if (extname(filePath).toLowerCase() !== ".png") return null;
@@ -68897,9 +68894,13 @@ function parseFrameRate(frameRateStr) {
68897
68894
  if (parts.length === 2) {
68898
68895
  const num2 = parseFloat(parts[0] ?? "");
68899
68896
  const den = parseFloat(parts[1] ?? "");
68900
- if (den !== 0) return Math.round(num2 / den * 100) / 100;
68897
+ if (Number.isFinite(num2) && Number.isFinite(den) && den !== 0) {
68898
+ return Math.round(num2 / den * 100) / 100;
68899
+ }
68900
+ return 0;
68901
68901
  }
68902
- return parseFloat(frameRateStr) || 0;
68902
+ const parsed = parseFloat(frameRateStr);
68903
+ return Number.isFinite(parsed) ? parsed : 0;
68903
68904
  }
68904
68905
  async function extractMediaMetadata(filePath) {
68905
68906
  const cached2 = videoMetadataCache.get(filePath);
@@ -74701,6 +74702,9 @@ function decodeUrlPathVariants2(path2) {
74701
74702
  function isRemoteOrInlineUrl(url) {
74702
74703
  return /^(https?:|data:|blob:|\/\/|#)/i.test(url);
74703
74704
  }
74705
+ function hasUnresolvedTemplatingToken(url) {
74706
+ return /<<[^<>]+>>|\{\{[^{}]+\}\}|\$\{[^{}]+\}/.test(url);
74707
+ }
74704
74708
  function cleanAssetUrl(url) {
74705
74709
  return url.trim().split(/[?#]/, 1)[0] ?? "";
74706
74710
  }
@@ -78415,7 +78419,9 @@ function collectLocalVideoCandidates(projectDir, htmlSources) {
78415
78419
  const re2 = new RegExp(videoSrcRe.source, videoSrcRe.flags);
78416
78420
  let match;
78417
78421
  while ((match = re2.exec(scannable)) !== null) {
78418
- const src = cleanAssetUrl(match[1] ?? "");
78422
+ const rawSrc = match[1] ?? "";
78423
+ if (hasUnresolvedTemplatingToken(rawSrc)) continue;
78424
+ const src = cleanAssetUrl(rawSrc);
78419
78425
  if (!src) continue;
78420
78426
  if (isRemoteOrInlineUrl(src)) continue;
78421
78427
  if (/^__[A-Z_]+__$/.test(src)) continue;
@@ -78641,6 +78647,7 @@ function lintAudioSrcNotFound(projectDir, htmlSources) {
78641
78647
  const src = match[1];
78642
78648
  if (/^(https?:|data:|blob:)/i.test(src)) continue;
78643
78649
  if (/^__[A-Z_]+__$/.test(src)) continue;
78650
+ if (hasUnresolvedTemplatingToken(src)) continue;
78644
78651
  const rootRelative = compSrcPath ? rewriteAssetPath(compSrcPath, src) : src;
78645
78652
  if (!resolveLocalAssetCandidates(projectDir, rootRelative).some(existsSync11)) {
78646
78653
  missingSrcs.push(src);
@@ -78669,6 +78676,7 @@ function lintMissingLocalAsset(projectDir, htmlSources) {
78669
78676
  while ((match = re2.exec(scannable)) !== null) {
78670
78677
  const tagName19 = (match[1] ?? "").toLowerCase();
78671
78678
  const rawSrc = match[2] ?? "";
78679
+ if (hasUnresolvedTemplatingToken(rawSrc)) continue;
78672
78680
  const src = cleanAssetUrl(rawSrc);
78673
78681
  if (!src) continue;
78674
78682
  if (isRemoteOrInlineUrl(src)) continue;
@@ -78704,6 +78712,7 @@ function lintTextureMaskAssetNotFound(projectDir, htmlSources) {
78704
78712
  const pattern = new RegExp(MASK_IMAGE_URL_RE.source, MASK_IMAGE_URL_RE.flags);
78705
78713
  while ((match = pattern.exec(cssSource.content)) !== null) {
78706
78714
  const rawUrl = match[1] ?? match[2] ?? match[3] ?? "";
78715
+ if (hasUnresolvedTemplatingToken(rawUrl)) continue;
78707
78716
  const url = cleanAssetUrl(rawUrl);
78708
78717
  if (!url || isRemoteOrInlineUrl(url)) continue;
78709
78718
  if (/^__[A-Z_]+__$/.test(url)) continue;
@@ -78811,6 +78820,7 @@ function lintMissingOrEmptySubComposition(projectDir, rootHtml) {
78811
78820
  const srcPath = (match[1] ?? "").trim();
78812
78821
  if (!srcPath) continue;
78813
78822
  if (/^__[A-Z_]+__$/.test(srcPath)) continue;
78823
+ if (hasUnresolvedTemplatingToken(srcPath)) continue;
78814
78824
  const filePath = resolve8(projectDir, srcPath);
78815
78825
  if (visited.has(filePath)) continue;
78816
78826
  visited.add(filePath);
@@ -131167,7 +131177,7 @@ var init_init = __esm({
131167
131177
  console.log(
131168
131178
  ` ${c.dim('"Using /hyperframes, create a 15-second intro about [your topic]"')}`
131169
131179
  );
131170
- console.log(` ${c.dim("More patterns: hyperframes.heygen.com/guides/prompting")}`);
131180
+ console.log(` ${c.dim("More patterns: hyperframes.heygen.com/prompting/overview")}`);
131171
131181
  console.log();
131172
131182
  console.log(` ${c.accent("4.")} Preview in the browser:`);
131173
131183
  console.log(` ${c.accent(`cd ${name2}`)} && ${c.accent("npm run dev")}`);
@@ -190296,6 +190306,20 @@ function svgContentHashSlug(svgSource, isLogo) {
190296
190306
  const hash2 = createHash18("sha1").update(svgSource).digest("hex").slice(0, 8);
190297
190307
  return isLogo ? `logo-${hash2}` : `svg-${hash2}`;
190298
190308
  }
190309
+ function toStandaloneSvg(outerHTML) {
190310
+ const open3 = outerHTML.match(/<svg\b[^>]*>/i);
190311
+ if (!open3) return outerHTML;
190312
+ const original = open3[0];
190313
+ let tag = original;
190314
+ const add2 = [];
190315
+ if (!/\sxmlns\s*=/i.test(tag)) add2.push('xmlns="http://www.w3.org/2000/svg"');
190316
+ if (/\sxlink:[a-z-]+\s*=/i.test(outerHTML) && !/\sxmlns:xlink\s*=/i.test(tag)) {
190317
+ add2.push('xmlns:xlink="http://www.w3.org/1999/xlink"');
190318
+ }
190319
+ if (!add2.length) return outerHTML;
190320
+ tag = tag.replace(/^<svg\b/i, `<svg ${add2.join(" ")}`);
190321
+ return outerHTML.replace(original, tag);
190322
+ }
190299
190323
  async function downloadAssets(tokens, outputDir, catalogedAssets, faviconLinks) {
190300
190324
  const assetsDir = join109(outputDir, "assets");
190301
190325
  mkdirSync53(assetsDir, { recursive: true });
@@ -190306,7 +190330,8 @@ async function downloadAssets(tokens, outputDir, catalogedAssets, faviconLinks)
190306
190330
  for (let i2 = 0; i2 < tokens.svgs.length && i2 < 30; i2++) {
190307
190331
  const svg = tokens.svgs[i2];
190308
190332
  if (!svg.outerHTML || svg.outerHTML.length < 50) continue;
190309
- const slug = svgContentHashSlug(svg.outerHTML, !!svg.isLogo);
190333
+ const svgFile = toStandaloneSvg(svg.outerHTML);
190334
+ const slug = svgContentHashSlug(svgFile, !!svg.isLogo);
190310
190335
  let finalSlug = slug;
190311
190336
  let suffix = 2;
190312
190337
  while (usedSvgNames.has(finalSlug)) {
@@ -190317,7 +190342,7 @@ async function downloadAssets(tokens, outputDir, catalogedAssets, faviconLinks)
190317
190342
  const name = `${finalSlug}.svg`;
190318
190343
  const localPath = `assets/svgs/${name}`;
190319
190344
  try {
190320
- writeFileSync45(join109(outputDir, localPath), svg.outerHTML, "utf-8");
190345
+ writeFileSync45(join109(outputDir, localPath), svgFile, "utf-8");
190321
190346
  assets.push({ url: "", localPath, type: "svg" });
190322
190347
  } catch {
190323
190348
  }
@@ -193304,10 +193329,50 @@ var init_scaffolding = __esm({
193304
193329
  // src/capture/screenshotCapture.ts
193305
193330
  var screenshotCapture_exports = {};
193306
193331
  __export(screenshotCapture_exports, {
193307
- captureScrollScreenshots: () => captureScrollScreenshots
193332
+ MAX_PLATE_HEIGHT_PX: () => MAX_PLATE_HEIGHT_PX,
193333
+ captureFullPagePlate: () => captureFullPagePlate,
193334
+ captureScrollScreenshots: () => captureScrollScreenshots,
193335
+ pngHeight: () => pngHeight
193308
193336
  });
193309
193337
  import { writeFileSync as writeFileSync50, mkdirSync as mkdirSync56 } from "fs";
193310
193338
  import { join as join117 } from "path";
193339
+ function pngHeight(buf) {
193340
+ if (buf.length < 24) return null;
193341
+ if (buf[12] !== 73 || buf[13] !== 72 || buf[14] !== 68 || buf[15] !== 82) return null;
193342
+ return (buf[20] << 24 | buf[21] << 16 | buf[22] << 8 | buf[23]) >>> 0;
193343
+ }
193344
+ async function captureFullPagePlate(page, screenshotsDir) {
193345
+ await page.evaluate(
193346
+ `document.querySelectorAll('*').forEach((el) => {
193347
+ const p = getComputedStyle(el).position;
193348
+ if (p === 'fixed' || p === 'sticky') {
193349
+ el.setAttribute('data-hf-plate-position', el.style.position || '');
193350
+ el.style.position = 'static';
193351
+ }
193352
+ })`
193353
+ );
193354
+ try {
193355
+ const docHeight = await page.evaluate(
193356
+ `Math.max(document.body.scrollHeight, document.documentElement.scrollHeight)`
193357
+ );
193358
+ if (docHeight > MAX_PLATE_HEIGHT_PX) return null;
193359
+ const buffer = await page.screenshot({ type: "png", fullPage: true });
193360
+ const produced = pngHeight(buffer);
193361
+ if (produced != null && produced > MAX_PLATE_HEIGHT_PX) return null;
193362
+ writeFileSync50(join117(screenshotsDir, "full-page.png"), buffer);
193363
+ return "screenshots/full-page.png";
193364
+ } finally {
193365
+ try {
193366
+ await page.evaluate(
193367
+ `document.querySelectorAll('[data-hf-plate-position]').forEach((el) => {
193368
+ el.style.position = el.getAttribute('data-hf-plate-position');
193369
+ el.removeAttribute('data-hf-plate-position');
193370
+ })`
193371
+ );
193372
+ } catch {
193373
+ }
193374
+ }
193375
+ }
193311
193376
  async function captureScrollScreenshots(page, outputDir) {
193312
193377
  const screenshotsDir = join117(outputDir, "screenshots");
193313
193378
  mkdirSync56(screenshotsDir, { recursive: true });
@@ -193408,13 +193473,17 @@ async function captureScrollScreenshots(page, outputDir) {
193408
193473
  }
193409
193474
  await page.evaluate(`window.scrollTo(0, 0)`);
193410
193475
  await new Promise((r2) => setTimeout(r2, 200));
193476
+ const plate = await captureFullPagePlate(page, screenshotsDir);
193477
+ if (plate) filePaths.push(plate);
193411
193478
  } catch {
193412
193479
  }
193413
193480
  return filePaths;
193414
193481
  }
193482
+ var MAX_PLATE_HEIGHT_PX;
193415
193483
  var init_screenshotCapture = __esm({
193416
193484
  "src/capture/screenshotCapture.ts"() {
193417
193485
  "use strict";
193486
+ MAX_PLATE_HEIGHT_PX = 16384;
193418
193487
  }
193419
193488
  });
193420
193489
 
@@ -1,4 +1,4 @@
1
- "use strict";var HyperframesPlayer=(()=>{var J=Object.defineProperty;var Ge=Object.getOwnPropertyDescriptor;var qe=Object.getOwnPropertyNames;var Ye=Object.prototype.hasOwnProperty;var Xe=(i,e)=>{for(var t in e)J(i,t,{get:e[t],enumerable:!0})},Ze=(i,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of qe(e))!Ye.call(i,n)&&n!==t&&J(i,n,{get:()=>e[n],enumerable:!(r=Ge(e,n))||r.enumerable});return i};var Qe=i=>Ze(J({},"__esModule",{value:!0}),i);var Lt={};Xe(Lt,{HyperframesPlayer:()=>Q,SPEED_PRESETS:()=>te,formatSpeed:()=>N,formatTime:()=>$});function ye(i){return i.hasRuntime||i.runtimeInjected?!1:!!(i.hasNestedCompositions||i.hasTimelines&&i.attempts>=5)}function I(i){return typeof i=="object"&&i!==null}function Ee(i){return I(i)&&typeof i.getDuration=="function"}function Se(i){return I(i)&&typeof i.duration=="function"&&typeof i.time=="function"&&typeof i.seek=="function"&&typeof i.play=="function"&&typeof i.pause=="function"}var Je="https://cdn.jsdelivr.net/npm/@hyperframes/core@0.7.84/dist/hyperframe.runtime.iife.js";function D(i){if(i===null)return null;let e=Number.parseInt(i,10);return Number.isFinite(e)&&e>0?e:null}function Ke(i){let e=i?.querySelector("[data-composition-id][data-width][data-height]")??i?.querySelector("[data-width][data-height]");if(!e)return null;let t=D(e.getAttribute("data-width")),r=D(e.getAttribute("data-height"));return t!==null&&r!==null?{width:t,height:r}:null}var j=class{constructor(e,t){this._iframe=e;this._callbacks=t}_iframe;_callbacks;_interval=null;_runtimeInjected=!1;get runtimeInjected(){return this._runtimeInjected}start(){this.stop(),this._runtimeInjected=!1;let e=0;this._interval=setInterval(()=>{e++;try{let t=this._iframe.contentWindow;if(!t)return;let r=!!(t.__hf||t.__player),n=!!(t.__timelines&&Object.keys(t.__timelines).length>0),o=!!this._iframe.contentDocument?.querySelector("[data-composition-src]");if(ye({hasRuntime:r,hasTimelines:n,hasNestedCompositions:o,runtimeInjected:this._runtimeInjected,attempts:e})){this._injectRuntime();return}if(this._runtimeInjected&&!r)return;let s=this._resolvePlaybackDurationAdapter(t);if(s&&s.getDuration()>0){this.stop();let l=Ke(this._iframe.contentDocument);this._callbacks.onReady({duration:s.getDuration(),adapter:s,compositionSize:l});return}}catch{}e>=40&&(this.stop(),this._callbacks.onError("Composition timeline not found after 8s"))},200)}stop(){this._interval!==null&&(clearInterval(this._interval),this._interval=null)}resolveDirectTimelineAdapter(){try{let e=this._iframe.contentWindow;return e?this._resolveDirectTimelineAdapterFromWindow(e):null}catch{return null}}resolveDirectTimelineAdapterFromWindow(e){return this._resolveDirectTimelineAdapterFromWindow(e)}hasRuntimeBridge(e){return Reflect.get(e,"__hf")!==void 0||I(Reflect.get(e,"__player"))}_injectRuntime(){this._runtimeInjected=!0;try{let e=this._iframe.contentDocument;if(!e)return;let t=e.createElement("script");t.src=Je,(e.head||e.documentElement).appendChild(t),this._callbacks.onRuntimeInjected?.()}catch{}}_resolveDirectTimelineAdapterFromWindow(e){if(this.hasRuntimeBridge(e))return null;let t=Reflect.get(e,"__timelines");if(!I(t))return null;let r=Object.keys(t);if(r.length===0)return null;let n=this._iframe.contentDocument?.querySelector("[data-composition-id]")?.getAttribute("data-composition-id"),o=n&&n in t?n:r[r.length-1],s=t[o];return Se(s)?s:null}_resolvePlaybackDurationAdapter(e){let t=Reflect.get(e,"__player");if(Ee(t))return{kind:"runtime",getDuration:()=>t.getDuration()};let r=this._resolveDirectTimelineAdapterFromWindow(e);return r?{kind:"direct-timeline",timeline:r,getDuration:()=>r.duration()}:null}};var Te=`
1
+ "use strict";var HyperframesPlayer=(()=>{var J=Object.defineProperty;var Ge=Object.getOwnPropertyDescriptor;var qe=Object.getOwnPropertyNames;var Ye=Object.prototype.hasOwnProperty;var Xe=(i,e)=>{for(var t in e)J(i,t,{get:e[t],enumerable:!0})},Ze=(i,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of qe(e))!Ye.call(i,n)&&n!==t&&J(i,n,{get:()=>e[n],enumerable:!(r=Ge(e,n))||r.enumerable});return i};var Qe=i=>Ze(J({},"__esModule",{value:!0}),i);var Lt={};Xe(Lt,{HyperframesPlayer:()=>Q,SPEED_PRESETS:()=>te,formatSpeed:()=>N,formatTime:()=>$});function ye(i){return i.hasRuntime||i.runtimeInjected?!1:!!(i.hasNestedCompositions||i.hasTimelines&&i.attempts>=5)}function I(i){return typeof i=="object"&&i!==null}function Ee(i){return I(i)&&typeof i.getDuration=="function"}function Se(i){return I(i)&&typeof i.duration=="function"&&typeof i.time=="function"&&typeof i.seek=="function"&&typeof i.play=="function"&&typeof i.pause=="function"}var Je="https://cdn.jsdelivr.net/npm/@hyperframes/core@0.7.86/dist/hyperframe.runtime.iife.js";function D(i){if(i===null)return null;let e=Number.parseInt(i,10);return Number.isFinite(e)&&e>0?e:null}function Ke(i){let e=i?.querySelector("[data-composition-id][data-width][data-height]")??i?.querySelector("[data-width][data-height]");if(!e)return null;let t=D(e.getAttribute("data-width")),r=D(e.getAttribute("data-height"));return t!==null&&r!==null?{width:t,height:r}:null}var j=class{constructor(e,t){this._iframe=e;this._callbacks=t}_iframe;_callbacks;_interval=null;_runtimeInjected=!1;get runtimeInjected(){return this._runtimeInjected}start(){this.stop(),this._runtimeInjected=!1;let e=0;this._interval=setInterval(()=>{e++;try{let t=this._iframe.contentWindow;if(!t)return;let r=!!(t.__hf||t.__player),n=!!(t.__timelines&&Object.keys(t.__timelines).length>0),o=!!this._iframe.contentDocument?.querySelector("[data-composition-src]");if(ye({hasRuntime:r,hasTimelines:n,hasNestedCompositions:o,runtimeInjected:this._runtimeInjected,attempts:e})){this._injectRuntime();return}if(this._runtimeInjected&&!r)return;let s=this._resolvePlaybackDurationAdapter(t);if(s&&s.getDuration()>0){this.stop();let l=Ke(this._iframe.contentDocument);this._callbacks.onReady({duration:s.getDuration(),adapter:s,compositionSize:l});return}}catch{}e>=40&&(this.stop(),this._callbacks.onError("Composition timeline not found after 8s"))},200)}stop(){this._interval!==null&&(clearInterval(this._interval),this._interval=null)}resolveDirectTimelineAdapter(){try{let e=this._iframe.contentWindow;return e?this._resolveDirectTimelineAdapterFromWindow(e):null}catch{return null}}resolveDirectTimelineAdapterFromWindow(e){return this._resolveDirectTimelineAdapterFromWindow(e)}hasRuntimeBridge(e){return Reflect.get(e,"__hf")!==void 0||I(Reflect.get(e,"__player"))}_injectRuntime(){this._runtimeInjected=!0;try{let e=this._iframe.contentDocument;if(!e)return;let t=e.createElement("script");t.src=Je,(e.head||e.documentElement).appendChild(t),this._callbacks.onRuntimeInjected?.()}catch{}}_resolveDirectTimelineAdapterFromWindow(e){if(this.hasRuntimeBridge(e))return null;let t=Reflect.get(e,"__timelines");if(!I(t))return null;let r=Object.keys(t);if(r.length===0)return null;let n=this._iframe.contentDocument?.querySelector("[data-composition-id]")?.getAttribute("data-composition-id"),o=n&&n in t?n:r[r.length-1],s=t[o];return Se(s)?s:null}_resolvePlaybackDurationAdapter(e){let t=Reflect.get(e,"__player");if(Ee(t))return{kind:"runtime",getDuration:()=>t.getDuration()};let r=this._resolveDirectTimelineAdapterFromWindow(e);return r?{kind:"direct-timeline",timeline:r,getDuration:()=>r.duration()}:null}};var Te=`
2
2
  :host {
3
3
  display: block;
4
4
  position: relative;
@@ -1,6 +1,6 @@
1
1
  # Route: music-to-video
2
2
 
3
- - **Input:** A music track, or a video whose audio becomes the track, with no narration or website capture. User images or videos are optional.
3
+ - **Input:** A music track, a video whose audio becomes the track, or a track generated from a mood brief — with no narration or website capture. User images or videos are optional, so a complete video needs zero supplied assets.
4
4
  - **Output:** A beat-synced MP4 driven by a deterministic beat/energy map (`audiomap.json`). It may become a lyric video, slideshow, visualizer, or kinetic promo without changing pipelines.
5
5
  - **Triggers:** "make a video for this song", "beat-synced video", "lyric video", "music visualizer", "kinetic promo to this beat".
6
6
 
@@ -1,4 +1,4 @@
1
- var ce=Object.defineProperty;var pe=(r,t,e)=>t in r?ce(r,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):r[t]=e;var c=(r,t,e)=>pe(r,typeof t!="symbol"?t+"":t,e);import{r as ne,i as me,a as fe}from"./index-C3J3fmFc.js";function _e(r){return r.hasRuntime||r.runtimeInjected?!1:!!(r.hasNestedCompositions||r.hasTimelines&&r.attempts>=5)}function F(r){return typeof r=="object"&&r!==null}function ge(r){return F(r)&&typeof r.getDuration=="function"}function ye(r){return F(r)&&typeof r.duration=="function"&&typeof r.time=="function"&&typeof r.seek=="function"&&typeof r.play=="function"&&typeof r.pause=="function"}function ve(r){if(!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/.test(r))throw new Error(`Invalid HyperFrames runtime version: ${r}`);return`https://cdn.jsdelivr.net/npm/@hyperframes/core@${r}/dist/hyperframe.runtime.iife.js`}const be=typeof __HYPERFRAMES_RUNTIME_CDN_URL__=="string"?__HYPERFRAMES_RUNTIME_CDN_URL__:ve("0.0.0-dev");function H(r){if(r===null)return null;const t=Number.parseInt(r,10);return Number.isFinite(t)&&t>0?t:null}function we(r){const t=(r==null?void 0:r.querySelector("[data-composition-id][data-width][data-height]"))??(r==null?void 0:r.querySelector("[data-width][data-height]"));if(!t)return null;const e=H(t.getAttribute("data-width")),i=H(t.getAttribute("data-height"));return e!==null&&i!==null?{width:e,height:i}:null}class Ae{constructor(t,e){c(this,"_interval",null);c(this,"_runtimeInjected",!1);this._iframe=t,this._callbacks=e}get runtimeInjected(){return this._runtimeInjected}start(){this.stop(),this._runtimeInjected=!1;let t=0;this._interval=setInterval(()=>{var e;t++;try{const i=this._iframe.contentWindow;if(!i)return;const s=!!(i.__hf||i.__player),o=!!(i.__timelines&&Object.keys(i.__timelines).length>0),d=!!((e=this._iframe.contentDocument)!=null&&e.querySelector("[data-composition-src]"));if(_e({hasRuntime:s,hasTimelines:o,hasNestedCompositions:d,runtimeInjected:this._runtimeInjected,attempts:t})){this._injectRuntime();return}if(this._runtimeInjected&&!s)return;const a=this._resolvePlaybackDurationAdapter(i);if(a&&a.getDuration()>0){this.stop();const h=we(this._iframe.contentDocument);this._callbacks.onReady({duration:a.getDuration(),adapter:a,compositionSize:h});return}}catch{}t>=40&&(this.stop(),this._callbacks.onError("Composition timeline not found after 8s"))},200)}stop(){this._interval!==null&&(clearInterval(this._interval),this._interval=null)}resolveDirectTimelineAdapter(){try{const t=this._iframe.contentWindow;return t?this._resolveDirectTimelineAdapterFromWindow(t):null}catch{return null}}resolveDirectTimelineAdapterFromWindow(t){return this._resolveDirectTimelineAdapterFromWindow(t)}hasRuntimeBridge(t){return Reflect.get(t,"__hf")!==void 0||F(Reflect.get(t,"__player"))}_injectRuntime(){var t,e;this._runtimeInjected=!0;try{const i=this._iframe.contentDocument;if(!i)return;const s=i.createElement("script");s.src=be,(i.head||i.documentElement).appendChild(s),(e=(t=this._callbacks).onRuntimeInjected)==null||e.call(t)}catch{}}_resolveDirectTimelineAdapterFromWindow(t){var a,h;if(this.hasRuntimeBridge(t))return null;const e=Reflect.get(t,"__timelines");if(!F(e))return null;const i=Object.keys(e);if(i.length===0)return null;const s=(h=(a=this._iframe.contentDocument)==null?void 0:a.querySelector("[data-composition-id]"))==null?void 0:h.getAttribute("data-composition-id"),o=s&&s in e?s:i[i.length-1],d=e[o];return ye(d)?d:null}_resolvePlaybackDurationAdapter(t){const e=Reflect.get(t,"__player");if(ge(e))return{kind:"runtime",getDuration:()=>e.getDuration()};const i=this._resolveDirectTimelineAdapterFromWindow(t);return i?{kind:"direct-timeline",timeline:i,getDuration:()=>i.duration()}:null}}const Ee=`
1
+ var ce=Object.defineProperty;var pe=(r,t,e)=>t in r?ce(r,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):r[t]=e;var c=(r,t,e)=>pe(r,typeof t!="symbol"?t+"":t,e);import{r as ne,i as me,a as fe}from"./index-CISVI7UC.js";function _e(r){return r.hasRuntime||r.runtimeInjected?!1:!!(r.hasNestedCompositions||r.hasTimelines&&r.attempts>=5)}function F(r){return typeof r=="object"&&r!==null}function ge(r){return F(r)&&typeof r.getDuration=="function"}function ye(r){return F(r)&&typeof r.duration=="function"&&typeof r.time=="function"&&typeof r.seek=="function"&&typeof r.play=="function"&&typeof r.pause=="function"}function ve(r){if(!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/.test(r))throw new Error(`Invalid HyperFrames runtime version: ${r}`);return`https://cdn.jsdelivr.net/npm/@hyperframes/core@${r}/dist/hyperframe.runtime.iife.js`}const be=typeof __HYPERFRAMES_RUNTIME_CDN_URL__=="string"?__HYPERFRAMES_RUNTIME_CDN_URL__:ve("0.0.0-dev");function H(r){if(r===null)return null;const t=Number.parseInt(r,10);return Number.isFinite(t)&&t>0?t:null}function we(r){const t=(r==null?void 0:r.querySelector("[data-composition-id][data-width][data-height]"))??(r==null?void 0:r.querySelector("[data-width][data-height]"));if(!t)return null;const e=H(t.getAttribute("data-width")),i=H(t.getAttribute("data-height"));return e!==null&&i!==null?{width:e,height:i}:null}class Ae{constructor(t,e){c(this,"_interval",null);c(this,"_runtimeInjected",!1);this._iframe=t,this._callbacks=e}get runtimeInjected(){return this._runtimeInjected}start(){this.stop(),this._runtimeInjected=!1;let t=0;this._interval=setInterval(()=>{var e;t++;try{const i=this._iframe.contentWindow;if(!i)return;const s=!!(i.__hf||i.__player),o=!!(i.__timelines&&Object.keys(i.__timelines).length>0),d=!!((e=this._iframe.contentDocument)!=null&&e.querySelector("[data-composition-src]"));if(_e({hasRuntime:s,hasTimelines:o,hasNestedCompositions:d,runtimeInjected:this._runtimeInjected,attempts:t})){this._injectRuntime();return}if(this._runtimeInjected&&!s)return;const a=this._resolvePlaybackDurationAdapter(i);if(a&&a.getDuration()>0){this.stop();const h=we(this._iframe.contentDocument);this._callbacks.onReady({duration:a.getDuration(),adapter:a,compositionSize:h});return}}catch{}t>=40&&(this.stop(),this._callbacks.onError("Composition timeline not found after 8s"))},200)}stop(){this._interval!==null&&(clearInterval(this._interval),this._interval=null)}resolveDirectTimelineAdapter(){try{const t=this._iframe.contentWindow;return t?this._resolveDirectTimelineAdapterFromWindow(t):null}catch{return null}}resolveDirectTimelineAdapterFromWindow(t){return this._resolveDirectTimelineAdapterFromWindow(t)}hasRuntimeBridge(t){return Reflect.get(t,"__hf")!==void 0||F(Reflect.get(t,"__player"))}_injectRuntime(){var t,e;this._runtimeInjected=!0;try{const i=this._iframe.contentDocument;if(!i)return;const s=i.createElement("script");s.src=be,(i.head||i.documentElement).appendChild(s),(e=(t=this._callbacks).onRuntimeInjected)==null||e.call(t)}catch{}}_resolveDirectTimelineAdapterFromWindow(t){var a,h;if(this.hasRuntimeBridge(t))return null;const e=Reflect.get(t,"__timelines");if(!F(e))return null;const i=Object.keys(e);if(i.length===0)return null;const s=(h=(a=this._iframe.contentDocument)==null?void 0:a.querySelector("[data-composition-id]"))==null?void 0:h.getAttribute("data-composition-id"),o=s&&s in e?s:i[i.length-1],d=e[o];return ye(d)?d:null}_resolvePlaybackDurationAdapter(t){const e=Reflect.get(t,"__player");if(ge(e))return{kind:"runtime",getDuration:()=>e.getDuration()};const i=this._resolveDirectTimelineAdapterFromWindow(t);return i?{kind:"direct-timeline",timeline:i,getDuration:()=>i.duration()}:null}}const Ee=`
2
2
  :host {
3
3
  display: block;
4
4
  position: relative;
@@ -1 +1 @@
1
- import{g as P}from"./index-C3J3fmFc.js";function j(c,d){for(var s=0;s<d.length;s++){const a=d[s];if(typeof a!="string"&&!Array.isArray(a)){for(const i in a)if(i!=="default"&&!(i in c)){const l=Object.getOwnPropertyDescriptor(a,i);l&&Object.defineProperty(c,i,l.get?l:{enumerable:!0,get:()=>a[i]})}}}return Object.freeze(Object.defineProperty(c,Symbol.toStringTag,{value:"Module"}))}var v={},w;function k(){if(w)return v;w=1,Object.defineProperty(v,"__esModule",{value:!0}),v.default=d;var c=window.OfflineAudioContext||window.webkitOfflineAudioContext;function d(e){var r=a(e);return r.start(0),[i,y,O(e.sampleRate),s].reduce(function(t,o){return o(t)},r.buffer.getChannelData(0))}function s(e){return e.sort(function(r,t){return t.count-r.count}).splice(0,5)[0].tempo}function a(e){var r=e.length,t=e.numberOfChannels,o=e.sampleRate,n=new c(t,r,o),u=n.createBufferSource();u.buffer=e;var f=n.createBiquadFilter();return f.type="lowpass",u.connect(f),f.connect(n.destination),u}function i(e){for(var r=[],t=.9,o=.3,n=15;r.length<n&&t>=o;)r=l(e,t),t-=.05;if(r.length<n)throw new Error("Could not find enough samples for a reliable detection.");return r}function l(e,r){for(var t=[],o=0,n=e.length;o<n;o+=1)e[o]>r&&(t.push(o),o+=1e4);return t}function y(e){var r=[];return e.forEach(function(t,o){for(var n=function(x){var g=e[o+x]-t,_=r.some(function(h){if(h.interval===g)return h.count+=1});_||r.push({interval:g,count:1})},u=0;u<10;u+=1)n(u)}),r}function O(e){return function(r){var t=[];return r.forEach(function(o){if(o.interval!==0){for(var n=60/(o.interval/e);n<90;)n*=2;for(;n>180;)n/=2;n=Math.round(n);var u=t.some(function(f){if(f.tempo===n)return f.count+=o.count});u||t.push({tempo:n,count:o.count})}}),t}}return v}var p,b;function q(){return b||(b=1,p=k().default),p}var m=q();const A=P(m),D=j({__proto__:null,default:A},[m]);export{D as i};
1
+ import{g as P}from"./index-CISVI7UC.js";function j(c,d){for(var s=0;s<d.length;s++){const a=d[s];if(typeof a!="string"&&!Array.isArray(a)){for(const i in a)if(i!=="default"&&!(i in c)){const l=Object.getOwnPropertyDescriptor(a,i);l&&Object.defineProperty(c,i,l.get?l:{enumerable:!0,get:()=>a[i]})}}}return Object.freeze(Object.defineProperty(c,Symbol.toStringTag,{value:"Module"}))}var v={},w;function k(){if(w)return v;w=1,Object.defineProperty(v,"__esModule",{value:!0}),v.default=d;var c=window.OfflineAudioContext||window.webkitOfflineAudioContext;function d(e){var r=a(e);return r.start(0),[i,y,O(e.sampleRate),s].reduce(function(t,o){return o(t)},r.buffer.getChannelData(0))}function s(e){return e.sort(function(r,t){return t.count-r.count}).splice(0,5)[0].tempo}function a(e){var r=e.length,t=e.numberOfChannels,o=e.sampleRate,n=new c(t,r,o),u=n.createBufferSource();u.buffer=e;var f=n.createBiquadFilter();return f.type="lowpass",u.connect(f),f.connect(n.destination),u}function i(e){for(var r=[],t=.9,o=.3,n=15;r.length<n&&t>=o;)r=l(e,t),t-=.05;if(r.length<n)throw new Error("Could not find enough samples for a reliable detection.");return r}function l(e,r){for(var t=[],o=0,n=e.length;o<n;o+=1)e[o]>r&&(t.push(o),o+=1e4);return t}function y(e){var r=[];return e.forEach(function(t,o){for(var n=function(x){var g=e[o+x]-t,_=r.some(function(h){if(h.interval===g)return h.count+=1});_||r.push({interval:g,count:1})},u=0;u<10;u+=1)n(u)}),r}function O(e){return function(r){var t=[];return r.forEach(function(o){if(o.interval!==0){for(var n=60/(o.interval/e);n<90;)n*=2;for(;n>180;)n/=2;n=Math.round(n);var u=t.some(function(f){if(f.tempo===n)return f.count+=o.count});u||t.push({tempo:n,count:o.count})}}),t}}return v}var p,b;function q(){return b||(b=1,p=k().default),p}var m=q();const A=P(m),D=j({__proto__:null,default:A},[m]);export{D as i};
@@ -1,4 +1,4 @@
1
- import{n as Qi}from"./index-C3J3fmFc.js";/*!
1
+ import{n as Qi}from"./index-CISVI7UC.js";/*!
2
2
  * Copyright (c) 2026-present, Vanilagy and contributors
3
3
  *
4
4
  * This Source Code Form is subject to the terms of the Mozilla Public