91 lines
3.3 KiB
JavaScript
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
|
|
};
|