Files
v10/dist/dev/media/utils/track-selection.js
T

47 lines
1.7 KiB
JavaScript

import { isResolvedTrack } from "../types/index.js";
//#region src/media/utils/track-selection.ts
/**
* Map track type to selected track ID property key in state.
*/
const SelectedTrackIdKeyByType = {
video: "selectedVideoTrackId",
audio: "selectedAudioTrackId",
text: "selectedTextTrackId"
};
/**
* Get selected track from state by type.
* Returns properly typed track (partially or fully resolved) or undefined.
* Type parameter T is inferred from the type argument.
*
* @example
* const videoTrack = getSelectedTrack(state, 'video');
* if (videoTrack && isResolvedTrack(videoTrack)) {
* // videoTrack is VideoTrack
* }
*/
function getSelectedTrack(state, type) {
const { presentation } = state;
if (!presentation?.selectionSets) return void 0;
const trackId = state[SelectedTrackIdKeyByType[type]];
return presentation.selectionSets.find(({ type: selectionSetType }) => selectionSetType === type)?.switchingSets[0]?.tracks.find(({ id }) => id === trackId);
}
/**
* Returns the duration of the first resolved selected track, preferring
* video over audio. A track is "resolved" once its media playlist has been
* parsed (per {@link isResolvedTrack}). Returns `undefined` if neither
* selected track is resolved.
*/
function getResolvedSelectedTrackDuration(state) {
if (state.selectedVideoTrackId) {
const video = getSelectedTrack(state, "video");
if (video && isResolvedTrack(video)) return video.duration;
}
if (state.selectedAudioTrackId) {
const audio = getSelectedTrack(state, "audio");
if (audio && isResolvedTrack(audio)) return audio.duration;
}
}
//#endregion
export { SelectedTrackIdKeyByType, getResolvedSelectedTrackDuration, getSelectedTrack };
//# sourceMappingURL=track-selection.js.map