Files
pole-book/server/node_modules/media-chrome/dist/media-store/util.js

91 lines
3.3 KiB
JavaScript

import { TextTrackKinds, TextTrackModes } from "../constants.js";
import { getTextTracksList, updateTracksModeTo } from "../utils/captions.js";
const getSubtitleTracks = (stateOwners) => {
return getTextTracksList(stateOwners.media, (textTrack) => {
return [TextTrackKinds.SUBTITLES, TextTrackKinds.CAPTIONS].includes(
textTrack.kind
);
}).sort((a, b) => a.kind >= b.kind ? 1 : -1);
};
const getShowingSubtitleTracks = (stateOwners) => {
return getTextTracksList(stateOwners.media, (textTrack) => {
return textTrack.mode === TextTrackModes.SHOWING && [TextTrackKinds.SUBTITLES, TextTrackKinds.CAPTIONS].includes(
textTrack.kind
);
});
};
const toggleSubtitleTracks = (stateOwners, force) => {
const tracks = getSubtitleTracks(stateOwners);
const showingSubitleTracks = getShowingSubtitleTracks(stateOwners);
const subtitlesShowing = !!showingSubitleTracks.length;
if (!tracks.length)
return;
if (force === false || subtitlesShowing && force !== true) {
updateTracksModeTo(TextTrackModes.DISABLED, tracks, showingSubitleTracks);
} else if (force === true || !subtitlesShowing && force !== false) {
let subTrack = tracks[0];
const { options } = stateOwners;
if (!(options == null ? void 0 : options.noSubtitlesLangPref)) {
const subtitlesPref = globalThis.localStorage.getItem(
"media-chrome-pref-subtitles-lang"
);
const userLangPrefs = subtitlesPref ? [subtitlesPref, ...globalThis.navigator.languages] : globalThis.navigator.languages;
const preferredAvailableSubs = tracks.filter((textTrack) => {
return userLangPrefs.some(
(lang) => textTrack.language.toLowerCase().startsWith(lang.split("-")[0])
);
}).sort((textTrackA, textTrackB) => {
const idxA = userLangPrefs.findIndex(
(lang) => textTrackA.language.toLowerCase().startsWith(lang.split("-")[0])
);
const idxB = userLangPrefs.findIndex(
(lang) => textTrackB.language.toLowerCase().startsWith(lang.split("-")[0])
);
return idxA - idxB;
});
if (preferredAvailableSubs[0]) {
subTrack = preferredAvailableSubs[0];
}
}
const { language, label, kind } = subTrack;
updateTracksModeTo(TextTrackModes.DISABLED, tracks, showingSubitleTracks);
updateTracksModeTo(TextTrackModes.SHOWING, tracks, [
{ language, label, kind }
]);
}
};
const areValuesEq = (x, y) => {
if (x === y)
return true;
if (typeof x !== typeof y)
return false;
if (typeof x === "number" && Number.isNaN(x) && Number.isNaN(y))
return true;
if (typeof x !== "object")
return false;
if (Array.isArray(x))
return areArraysEq(x, y);
return Object.entries(x).every(
// NOTE: Checking key in y to disambiguate between between missing keys and keys whose value are undefined (CJP)
([key, value]) => key in y && areValuesEq(value, y[key])
);
};
const areArraysEq = (xs, ys) => {
const xIsArray = Array.isArray(xs);
const yIsArray = Array.isArray(ys);
if (xIsArray !== yIsArray)
return false;
if (!(xIsArray || yIsArray))
return true;
if (xs.length !== ys.length)
return false;
return xs.every((x, i) => areValuesEq(x, ys[i]));
};
export {
areArraysEq,
areValuesEq,
getShowingSubtitleTracks,
getSubtitleTracks,
toggleSubtitleTracks
};