@mux/ai 0.16.1 → 0.17.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.
@@ -1,3 +1,3 @@
1
- export { D as DEFAULT_STORYBOARD_WIDTH, H as HeatmapOptions, a as HeatmapResponse, T as ThumbnailOptions, b as TranscriptFetchOptions, c as TranscriptResult, V as VTTCue, d as VTTCueBudgetChunkingOptions, e as VTTDurationChunk, f as VTTDurationChunkingOptions, g as buildTranscriptUrl, h as buildVttFromCueBlocks, j as buildVttFromTranslatedCueBlocks, k as chunkByTokens, l as chunkText, m as chunkVTTCues, n as chunkVTTCuesByBudget, o as chunkVTTCuesByDuration, p as concatenateVttSegments, q as estimateTokenCount, r as extractTextFromVTT, s as extractTimestampedTranscript, t as fetchTranscriptForAsset, u as findCaptionTrack, v as getHeatmapForAsset, w as getHeatmapForPlaybackId, x as getHeatmapForVideo, y as getReadyTextTracks, z as getStoryboardUrl, A as getThumbnailUrls, B as parseVTTCues, C as replaceCueText, E as secondsToTimestamp, F as splitVttPreambleAndCueBlocks, G as vttTimestampToSeconds } from '../index-CuBu_u5-.js';
1
+ export { D as DEFAULT_STORYBOARD_WIDTH, H as HeatmapOptions, a as HeatmapResponse, L as LOW_CONFIDENCE_THRESHOLD, T as ThumbnailOptions, b as TranscriptFetchOptions, c as TranscriptResult, V as VTTCue, d as VTTCueBudgetChunkingOptions, e as VTTDurationChunk, f as VTTDurationChunkingOptions, g as buildTranscriptUrl, h as buildVttFromCueBlocks, j as buildVttFromTranslatedCueBlocks, k as chunkByTokens, l as chunkText, m as chunkVTTCues, n as chunkVTTCuesByBudget, o as chunkVTTCuesByDuration, p as concatenateVttSegments, q as estimateTokenCount, r as extractTextFromVTT, s as extractTimestampedTranscript, t as fetchTranscriptForAsset, u as findCaptionTrack, v as getHeatmapForAsset, w as getHeatmapForPlaybackId, x as getHeatmapForVideo, y as getReadyTextTracks, z as getReliableLanguageCode, A as getStoryboardUrl, B as getThumbnailUrls, C as parseVTTCues, E as replaceCueText, F as secondsToTimestamp, G as splitVttPreambleAndCueBlocks, I as vttTimestampToSeconds } from '../index-3G00N5QH.js';
2
2
  export { o as CompletedShotsResult, p as ErroredShotsResult, H as Hotspot, q as HotspotOptions, r as HotspotResponse, s as PendingShotsResult, t as Shot, u as ShotRequestOptions, v as ShotsResult, w as WaitForShotsOptions, x as getHotspotsForAsset, y as getHotspotsForPlaybackId, z as getHotspotsForVideo, B as getShotsForAsset, D as requestShotsForAsset, F as waitForShotsForAsset } from '../shots-BFYOfBgN.js';
3
3
  import '@mux/mux-node';
@@ -30,6 +30,10 @@ var EnvSchema = z.object({
30
30
  "Override for Mux image base URL (defaults to https://image.mux.com).",
31
31
  "Mux image URL override"
32
32
  ),
33
+ MUX_STREAM_URL_OVERRIDE: optionalString(
34
+ "Override for Mux stream base URL (defaults to https://stream.mux.com).",
35
+ "Mux stream URL override"
36
+ ),
33
37
  // Test-only helpers (used by this repo's integration tests)
34
38
  MUX_TEST_ASSET_ID: optionalString("Mux asset ID used by integration tests.", "Mux test asset id"),
35
39
  MUX_TEST_ASSET_ID_CHAPTERS: optionalString("Mux asset ID used by integration tests for chapters.", "Mux test asset id for chapters"),
@@ -749,22 +753,24 @@ async function waitForShotsForAsset(assetId, options = {}) {
749
753
  );
750
754
  }
751
755
 
752
- // src/lib/mux-image-url.ts
756
+ // src/lib/mux-url.ts
753
757
  var DEFAULT_MUX_IMAGE_ORIGIN = "https://image.mux.com";
754
- function normalizeMuxImageOrigin(value) {
758
+ var DEFAULT_MUX_STREAM_ORIGIN = "https://stream.mux.com";
759
+ function normalizeOrigin(value, envVarName) {
755
760
  const trimmed = value.trim();
756
761
  const candidate = trimmed.includes("://") ? trimmed : `https://${trimmed}`;
762
+ const exampleHostname = envVarName === "MUX_IMAGE_URL_OVERRIDE" ? "image.example.mux.com" : "stream.example.mux.com";
757
763
  let parsed;
758
764
  try {
759
765
  parsed = new URL(candidate);
760
766
  } catch {
761
767
  throw new Error(
762
- `Invalid MUX_IMAGE_URL_OVERRIDE. Provide a hostname like "image.example.mux.com" (or a URL origin such as "https://image.example.mux.com").`
768
+ `Invalid ${envVarName}. Provide a hostname (e.g. "${exampleHostname}") or a URL origin (e.g. "https://${exampleHostname}").`
763
769
  );
764
770
  }
765
771
  if (parsed.username || parsed.password || parsed.search || parsed.hash || parsed.pathname && parsed.pathname !== "/") {
766
772
  throw new Error(
767
- "Invalid MUX_IMAGE_URL_OVERRIDE. Only a hostname/origin is allowed (no credentials, query params, hash fragments, or path)."
773
+ `Invalid ${envVarName}. Only a hostname/origin is allowed (no credentials, query params, hash fragments, or path).`
768
774
  );
769
775
  }
770
776
  return parsed.origin;
@@ -774,7 +780,14 @@ function getMuxImageOrigin() {
774
780
  if (!override) {
775
781
  return DEFAULT_MUX_IMAGE_ORIGIN;
776
782
  }
777
- return normalizeMuxImageOrigin(override);
783
+ return normalizeOrigin(override, "MUX_IMAGE_URL_OVERRIDE");
784
+ }
785
+ function getMuxStreamOrigin() {
786
+ const override = env_default.MUX_STREAM_URL_OVERRIDE;
787
+ if (!override) {
788
+ return DEFAULT_MUX_STREAM_ORIGIN;
789
+ }
790
+ return normalizeOrigin(override, "MUX_STREAM_URL_OVERRIDE");
778
791
  }
779
792
  function getMuxImageBaseUrl(playbackId, assetType) {
780
793
  const origin = getMuxImageOrigin();
@@ -1108,6 +1121,127 @@ async function getThumbnailUrls(playbackId, duration, options = {}) {
1108
1121
  return Promise.all(urlPromises);
1109
1122
  }
1110
1123
 
1124
+ // src/lib/language-codes.ts
1125
+ var ISO639_1_TO_3 = {
1126
+ // Major world languages
1127
+ en: "eng",
1128
+ // English
1129
+ es: "spa",
1130
+ // Spanish
1131
+ fr: "fra",
1132
+ // French
1133
+ de: "deu",
1134
+ // German
1135
+ it: "ita",
1136
+ // Italian
1137
+ pt: "por",
1138
+ // Portuguese
1139
+ ru: "rus",
1140
+ // Russian
1141
+ zh: "zho",
1142
+ // Chinese
1143
+ ja: "jpn",
1144
+ // Japanese
1145
+ ko: "kor",
1146
+ // Korean
1147
+ ar: "ara",
1148
+ // Arabic
1149
+ hi: "hin",
1150
+ // Hindi
1151
+ // European languages
1152
+ nl: "nld",
1153
+ // Dutch
1154
+ pl: "pol",
1155
+ // Polish
1156
+ sv: "swe",
1157
+ // Swedish
1158
+ da: "dan",
1159
+ // Danish
1160
+ no: "nor",
1161
+ // Norwegian
1162
+ fi: "fin",
1163
+ // Finnish
1164
+ el: "ell",
1165
+ // Greek
1166
+ cs: "ces",
1167
+ // Czech
1168
+ hu: "hun",
1169
+ // Hungarian
1170
+ ro: "ron",
1171
+ // Romanian
1172
+ bg: "bul",
1173
+ // Bulgarian
1174
+ hr: "hrv",
1175
+ // Croatian
1176
+ sk: "slk",
1177
+ // Slovak
1178
+ sl: "slv",
1179
+ // Slovenian
1180
+ uk: "ukr",
1181
+ // Ukrainian
1182
+ tr: "tur",
1183
+ // Turkish
1184
+ // Asian languages
1185
+ th: "tha",
1186
+ // Thai
1187
+ vi: "vie",
1188
+ // Vietnamese
1189
+ id: "ind",
1190
+ // Indonesian
1191
+ ms: "msa",
1192
+ // Malay
1193
+ tl: "tgl",
1194
+ // Tagalog/Filipino
1195
+ // Other languages
1196
+ he: "heb",
1197
+ // Hebrew
1198
+ fa: "fas",
1199
+ // Persian/Farsi
1200
+ bn: "ben",
1201
+ // Bengali
1202
+ ta: "tam",
1203
+ // Tamil
1204
+ te: "tel",
1205
+ // Telugu
1206
+ mr: "mar",
1207
+ // Marathi
1208
+ gu: "guj",
1209
+ // Gujarati
1210
+ kn: "kan",
1211
+ // Kannada
1212
+ ml: "mal",
1213
+ // Malayalam
1214
+ pa: "pan",
1215
+ // Punjabi
1216
+ ur: "urd",
1217
+ // Urdu
1218
+ sw: "swa",
1219
+ // Swahili
1220
+ af: "afr",
1221
+ // Afrikaans
1222
+ ca: "cat",
1223
+ // Catalan
1224
+ eu: "eus",
1225
+ // Basque
1226
+ gl: "glg",
1227
+ // Galician
1228
+ is: "isl",
1229
+ // Icelandic
1230
+ et: "est",
1231
+ // Estonian
1232
+ lv: "lav",
1233
+ // Latvian
1234
+ lt: "lit"
1235
+ // Lithuanian
1236
+ };
1237
+ var ISO639_3_TO_1 = Object.fromEntries(
1238
+ Object.entries(ISO639_1_TO_3).map(([iso1, iso3]) => [iso3, iso1])
1239
+ );
1240
+ var UNDETERMINED_LANGUAGE_CODES = /* @__PURE__ */ new Set(["und", "mul", "mis", "zxx"]);
1241
+ function isUndeterminedLanguageCode(code) {
1242
+ return UNDETERMINED_LANGUAGE_CODES.has(code.toLowerCase().trim());
1243
+ }
1244
+
1111
1245
  // src/lib/mux-assets.ts
1112
1246
  function isAudioOnlyAsset(asset) {
1113
1247
  const hasAudioTrack = asset.tracks?.some((track) => track.type === "audio") ?? false;
@@ -1141,6 +1275,17 @@ function findCaptionTrack(asset, languageCode) {
1141
1275
  }
1142
1276
  return void 0;
1143
1277
  }
1278
+ var LOW_CONFIDENCE_THRESHOLD = 0.5;
1279
+ function getReliableLanguageCode(track, confidenceThreshold = LOW_CONFIDENCE_THRESHOLD) {
1280
+ if (!track?.language_code)
1281
+ return void 0;
1282
+ if (isUndeterminedLanguageCode(track.language_code))
1283
+ return void 0;
1284
+ if (track.auto_language_confidence !== void 0 && track.auto_language_confidence < confidenceThreshold) {
1285
+ return void 0;
1286
+ }
1287
+ return track.language_code;
1288
+ }
1144
1289
  function normalizeLineEndings(value) {
1145
1290
  return value.replace(/\r\n/g, "\n");
1146
1291
  }
@@ -1408,7 +1553,7 @@ function concatenateVttSegments(segments, preamble = "WEBVTT") {
1408
1553
  }
1409
1554
  async function buildTranscriptUrl(playbackId, trackId, shouldSign = false, credentials) {
1410
1555
  "use step";
1411
- const baseUrl = `https://stream.mux.com/${playbackId}/text/${trackId}.vtt`;
1556
+ const baseUrl = `${getMuxStreamOrigin()}/${playbackId}/text/${trackId}.vtt`;
1412
1557
  if (shouldSign) {
1413
1558
  return signUrl(baseUrl, playbackId, "video", void 0, credentials);
1414
1559
  }
@@ -1465,6 +1610,7 @@ async function fetchTranscriptForAsset(asset, playbackId, options = {}) {
1465
1610
  }
1466
1611
  export {
1467
1612
  DEFAULT_STORYBOARD_WIDTH,
1613
+ LOW_CONFIDENCE_THRESHOLD,
1468
1614
  buildTranscriptUrl,
1469
1615
  buildVttFromCueBlocks,
1470
1616
  buildVttFromTranslatedCueBlocks,
@@ -1486,6 +1632,7 @@ export {
1486
1632
  getHotspotsForPlaybackId,
1487
1633
  getHotspotsForVideo,
1488
1634
  getReadyTextTracks,
1635
+ getReliableLanguageCode,
1489
1636
  getShotsForAsset,
1490
1637
  getStoryboardUrl,
1491
1638
  getThumbnailUrls,