@geekapps/silo-elements-nextjs 0.3.22 → 0.3.23

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.
@@ -872,12 +872,22 @@ function Video({
872
872
  const Hls = HlsModule.default;
873
873
  console.debug("[Silo/hls] Hls.isSupported()=", Hls.isSupported());
874
874
  if (Hls.isSupported()) {
875
- let audioCodecPriority2 = function(codec) {
876
- const c = codec.toLowerCase();
877
- const idx = AUDIO_CODEC_PRIORITY.findIndex((k) => c.includes(k));
878
- return idx === -1 ? 0 : idx;
875
+ let tryNextAudioTrack2 = function() {
876
+ const next = mappedAudioTracks.find((t) => t.supported && !failedAudioTracks.has(t.id));
877
+ if (next) {
878
+ console.debug("[Silo/hls] trying audio track", next.id, next.codec || "(unknown codec)");
879
+ hls.audioTrack = next.id;
880
+ if (pinnedAudio === -1) setSelectedAudio(next.id);
881
+ } else {
882
+ console.warn("[Silo/hls] all audio tracks failed \u2014 disabling demuxed audio");
883
+ setAudioTracks([]);
884
+ try {
885
+ hls.audioTrack = -1;
886
+ } catch {
887
+ }
888
+ }
879
889
  };
880
- var audioCodecPriority = audioCodecPriority2;
890
+ var tryNextAudioTrack = tryNextAudioTrack2;
881
891
  const hls = new Hls({
882
892
  enableWorker: true,
883
893
  // Buffer ~20s ahead (≈1/6 of a 2min video). maxMaxBufferLength caps the
@@ -939,9 +949,8 @@ function Video({
939
949
  if (pinnedAudio >= 0) hls.audioTrack = pinnedAudio;
940
950
  setIsLoading(false);
941
951
  });
942
- const AUDIO_CODEC_PRIORITY = ["opus", "mp4a", "aac", "ac-3", "ac3", "dts", "ec-3", "eac3", "dts-hd", "dtshd", "truehd"];
943
- let audioUpgradeDone = false;
944
952
  let mappedAudioTracks = [];
953
+ const failedAudioTracks = /* @__PURE__ */ new Set();
945
954
  hls.on(Hls.Events.AUDIO_TRACKS_UPDATED, (_, data) => {
946
955
  const tracks = data.audioTracks ?? [];
947
956
  console.debug("[Silo/hls] AUDIO_TRACKS_UPDATED", tracks.length);
@@ -953,19 +962,11 @@ function Video({
953
962
  return { id: i, label, supported, codec };
954
963
  });
955
964
  if (pinnedAudio === -1) {
956
- const opusTrack = mappedAudioTracks.find((t) => t.supported && /opus/i.test(t.codec));
957
- const fallback = mappedAudioTracks.find((t) => t.supported);
958
- const startTrack = opusTrack ?? fallback;
959
- if (startTrack) {
960
- hls.audioTrack = startTrack.id;
961
- setSelectedAudio(startTrack.id);
962
- console.debug("[Silo/hls] starting with audio track", startTrack.id, startTrack.codec);
963
- } else {
964
- console.warn("[Silo/hls] no supported audio track found \u2014 disabling");
965
- try {
966
- hls.audioTrack = -1;
967
- } catch {
968
- }
965
+ const first = mappedAudioTracks.find((t) => t.supported) ?? mappedAudioTracks[0];
966
+ if (first) {
967
+ hls.audioTrack = first.id;
968
+ setSelectedAudio(first.id);
969
+ console.debug("[Silo/hls] starting with audio track", first.id, first.codec || "(unknown codec)");
969
970
  }
970
971
  }
971
972
  if (mappedAudioTracks.length > 1) setAudioTracks(mappedAudioTracks.map(({ id, label, supported }) => ({ id, label, supported })));
@@ -1000,19 +1001,8 @@ function Video({
1000
1001
  });
1001
1002
  hls.on(Hls.Events.FRAG_LOADED, (_, data) => {
1002
1003
  console.debug("[Silo/hls] FRAG_LOADED", data.frag?.type, data.frag?.sn);
1003
- if (!audioUpgradeDone && data.frag?.type === "audio" && data.frag?.sn === 0 && pinnedAudio === -1 && mappedAudioTracks.length > 1) {
1004
- audioUpgradeDone = true;
1005
- const supported = mappedAudioTracks.filter((t) => t.supported);
1006
- const best = supported.reduce((a, b) => audioCodecPriority2(b.codec) > audioCodecPriority2(a.codec) ? b : a, supported[0]);
1007
- if (best && best.id !== hls.audioTrack) {
1008
- console.debug("[Silo/hls] upgrading audio track", hls.audioTrack, "\u2192", best.id, best.codec);
1009
- hls.audioTrack = best.id;
1010
- setSelectedAudio(best.id);
1011
- }
1012
- }
1013
1004
  });
1014
1005
  let mediaErrorAttempts = 0;
1015
- let audioAppendErrors = 0;
1016
1006
  let stalledOnPinnedLevel = 0;
1017
1007
  hls.on(Hls.Events.ERROR, (_, data) => {
1018
1008
  const fragUrl = (data.frag?.url ?? data.url ?? "").slice(-80);
@@ -1021,18 +1011,12 @@ function Video({
1021
1011
  if (!data.fatal) {
1022
1012
  const isAudioBufError = fragType === "audio" && (data.details === Hls.ErrorDetails.BUFFER_APPEND_ERROR || data.details === Hls.ErrorDetails.BUFFER_APPENDING_ERROR);
1023
1013
  if (isAudioBufError) {
1024
- audioAppendErrors += 1;
1025
- if (audioAppendErrors >= 1) {
1026
- console.warn("[Silo/hls] audio buffer append error \u2014 disabling separate audio tracks");
1027
- setAudioTracks([]);
1028
- try {
1029
- hls.audioTrack = -1;
1030
- } catch {
1031
- }
1032
- audioAppendErrors = 0;
1014
+ const failedTrack = hls.audioTrack;
1015
+ if (failedTrack >= 0 && pinnedAudio === -1) {
1016
+ failedAudioTracks.add(failedTrack);
1017
+ console.warn("[Silo/hls] audio track", failedTrack, "failed \u2014 trying next");
1018
+ tryNextAudioTrack2();
1033
1019
  }
1034
- } else {
1035
- audioAppendErrors = 0;
1036
1020
  }
1037
1021
  if (data.details === Hls.ErrorDetails.BUFFER_STALLED_ERROR && pinnedLevel >= 0) {
1038
1022
  stalledOnPinnedLevel += 1;