MCPcopy Create free account
hub / github.com/heygen-com/hyperframes / lintDuplicateAudioTracks

Function lintDuplicateAudioTracks

packages/lint/src/project.ts:464–513  ·  view source on GitHub ↗
(htmlSources: HtmlSource[])

Source from the content-addressed store, hash-verified

462}
463
464function lintDuplicateAudioTracks(htmlSources: HtmlSource[]): HyperframeLintFinding[] {
465 const findings: HyperframeLintFinding[] = [];
466 function extractAttr(tag: string, name: string): string | null {
467 const re = new RegExp(`\\b${name}\\s*=\\s*["']([^"']+)["']`, "i");
468 const m = tag.match(re);
469 return m?.[1] ?? null;
470 }
471
472 const tracks: Array<{ trackIndex: number; start: number; end: number; src: string }> = [];
473 const seen = new Set<string>();
474
475 for (const { html } of htmlSources) {
476 const audioTagRe = /<audio\b[^>]*>/gi;
477 let match: RegExpExecArray | null;
478 while ((match = audioTagRe.exec(html)) !== null) {
479 const tag = match[0];
480 const trackStr = extractAttr(tag, "data-track-index");
481 const startStr = extractAttr(tag, "data-start");
482 const durStr = extractAttr(tag, "data-duration");
483 const src = extractAttr(tag, "src") ?? "unknown";
484 if (!trackStr || !startStr) continue;
485
486 const trackIndex = parseInt(trackStr, 10);
487 const start = parseFloat(startStr);
488 const duration = durStr ? parseFloat(durStr) : Infinity;
489 const key = `${src}:${start}:${duration}:${trackIndex}`;
490 if (seen.has(key)) continue;
491 seen.add(key);
492
493 tracks.push({ trackIndex, start, end: start + duration, src });
494 }
495 }
496
497 for (let i = 0; i < tracks.length; i++) {
498 for (let j = i + 1; j < tracks.length; j++) {
499 const a = tracks[i]!;
500 const b = tracks[j]!;
501 if (a.trackIndex !== b.trackIndex) continue;
502 if (a.start < b.end && b.start < a.end) {
503 findings.push({
504 code: "duplicate_audio_track",
505 severity: "warning",
506 message: `Multiple <audio> elements on track ${a.trackIndex} overlap (${a.src} at ${a.start}-${Number.isFinite(a.end) ? a.end.toFixed(1) : "end"}s, ${b.src} at ${b.start}-${Number.isFinite(b.end) ? b.end.toFixed(1) : "end"}s). This causes layered audio playback.`,
507 fixHint: "Use non-overlapping time windows or different track indices.",
508 });
509 }
510 }
511 }
512 return findings;
513}
514
515/**
516 * Error if a `data-composition-src` reference points at a file that is

Callers 1

lintProjectFunction · 0.85

Calls 2

addMethod · 0.80
extractAttrFunction · 0.70

Tested by

no test coverage detected