87 lines
2.9 KiB
JavaScript
87 lines
2.9 KiB
JavaScript
import { MediaUIAttributes, TextTrackKinds } from "../constants.js";
|
|
const splitTextTracksStr = (textTracksStr = "") => textTracksStr.split(/\s+/);
|
|
const parseTextTrackStr = (textTrackStr = "") => {
|
|
const [kind, language, encodedLabel] = textTrackStr.split(":");
|
|
const label = encodedLabel ? decodeURIComponent(encodedLabel) : void 0;
|
|
return {
|
|
kind: kind === "cc" ? TextTrackKinds.CAPTIONS : TextTrackKinds.SUBTITLES,
|
|
language,
|
|
label
|
|
};
|
|
};
|
|
const parseTextTracksStr = (textTracksStr = "", textTrackLikeObj = {}) => {
|
|
return splitTextTracksStr(textTracksStr).map((textTrackStr) => {
|
|
const textTrackObj = parseTextTrackStr(textTrackStr);
|
|
return {
|
|
...textTrackLikeObj,
|
|
...textTrackObj
|
|
};
|
|
});
|
|
};
|
|
const parseTracks = (trackOrTracks) => {
|
|
if (!trackOrTracks)
|
|
return [];
|
|
if (Array.isArray(trackOrTracks)) {
|
|
return trackOrTracks.map((trackObjOrStr) => {
|
|
if (typeof trackObjOrStr === "string") {
|
|
return parseTextTrackStr(trackObjOrStr);
|
|
}
|
|
return trackObjOrStr;
|
|
});
|
|
}
|
|
if (typeof trackOrTracks === "string") {
|
|
return parseTextTracksStr(trackOrTracks);
|
|
}
|
|
return [trackOrTracks];
|
|
};
|
|
const formatTextTrackObj = ({ kind, label, language } = { kind: "subtitles" }) => {
|
|
if (!label)
|
|
return language;
|
|
return `${kind === "captions" ? "cc" : "sb"}:${language}:${encodeURIComponent(
|
|
label
|
|
)}`;
|
|
};
|
|
const stringifyTextTrackList = (textTracks = []) => {
|
|
return Array.prototype.map.call(textTracks, formatTextTrackObj).join(" ");
|
|
};
|
|
const isMatchingPropOf = (key, value) => (obj) => obj[key] === value;
|
|
const textTrackObjAsPred = (filterObj) => {
|
|
const preds = Object.entries(filterObj).map(([key, value]) => {
|
|
return isMatchingPropOf(key, value);
|
|
});
|
|
return (textTrack) => preds.every((pred) => pred(textTrack));
|
|
};
|
|
const updateTracksModeTo = (mode, tracks = [], tracksToUpdate = []) => {
|
|
const preds = parseTracks(tracksToUpdate).map(textTrackObjAsPred);
|
|
const isTrackToUpdate = (textTrack) => {
|
|
return preds.some((pred) => pred(textTrack));
|
|
};
|
|
Array.from(tracks).filter(isTrackToUpdate).forEach((textTrack) => {
|
|
textTrack.mode = mode;
|
|
});
|
|
};
|
|
const getTextTracksList = (media, filterPredOrObj = () => true) => {
|
|
if (!(media == null ? void 0 : media.textTracks))
|
|
return [];
|
|
const filterPred = typeof filterPredOrObj === "function" ? filterPredOrObj : textTrackObjAsPred(filterPredOrObj);
|
|
return Array.from(media.textTracks).filter(filterPred);
|
|
};
|
|
const areSubsOn = (el) => {
|
|
var _a;
|
|
const showingSubtitles = !!((_a = el.mediaSubtitlesShowing) == null ? void 0 : _a.length) || el.hasAttribute(MediaUIAttributes.MEDIA_SUBTITLES_SHOWING);
|
|
return showingSubtitles;
|
|
};
|
|
export {
|
|
areSubsOn,
|
|
formatTextTrackObj,
|
|
getTextTracksList,
|
|
isMatchingPropOf,
|
|
parseTextTrackStr,
|
|
parseTextTracksStr,
|
|
parseTracks,
|
|
splitTextTracksStr,
|
|
stringifyTextTrackList,
|
|
textTrackObjAsPred,
|
|
updateTracksModeTo
|
|
};
|