feat(tracks): add track indexes

This commit is contained in:
2026-08-03 19:10:45 +02:00
parent 685d3beb2a
commit e80c382a25
8 changed files with 57 additions and 45 deletions
+19 -20
View File
@@ -49,32 +49,30 @@ const eventMapper: EventMapperConfig = {
);
}
}),
...createEventMapper("subtitleChange", selectTextTrack, (cb, value, prev) => {
if (value === prev) return;
const tracks = value?.textTrackList;
if (tracks?.length) {
for (let i = 0; i < tracks.length; i++) {
const track = tracks[i];
if (track?.mode === "showing") {
cb({
id: `text-${i}`,
label: track.label,
language: track.language,
selected: true,
});
return;
}
}
...createEventMapper("subtitleChange", selectTextTrack, (cb, value) => {
if (!value) return;
const track = value.textTrackList.find((x) => x.mode === "showing");
if (!track) {
cb(undefined);
return;
}
cb(undefined);
const idx = value.textTrackList.indexOf(track);
cb({
id: track.id ?? `text-${idx}`,
index: idx,
label: track.label,
language: track.language,
selected: true,
});
}),
...createEventMapper("audioTrackChange", selectAudioTrack, (cb, value) => {
if (!value) return;
const track = value.audioTrackList.find((t) => t.enabled);
if (!track) return;
const idx = value.audioTrackList.indexOf(track);
cb({
id: track.id!,
id: track.id ?? `audio-${idx}`,
index: idx,
label: track.label,
language: track.language,
selected: true,
@@ -206,6 +204,7 @@ export const stateMapper = {
if (!audio) return [];
return audio.audioTrackList.map((track, i) => ({
id: track.id ?? i.toString(),
index: i,
label: track.label,
language: track.language,
selected: track.enabled,
@@ -267,7 +266,7 @@ export function usePlayerState<Key extends keyof OmniPlayerState>(
return player.subtitles as OmniPlayerState[Key];
}
default: {
const config = stateMapper[key];
const config = stateMapper[key as keyof typeof stateMapper];
const ret = useStoreSelector(config?.selector as Selector<any, any>);
if (!config) throw new Error(`No mapper for ${key}`);
return config.mapper(ret) as OmniPlayerState[Key];
+2 -1
View File
@@ -218,8 +218,9 @@ export class WebOmniPlayer implements OmniPlayer {
const textTracks = selectTextTrack(this._store.state)?.textTrackList ?? [];
return textTracks
.filter((x) => x.kind === "subtitles" || x.kind === "captions")
.map((track) => ({
.map((track, i) => ({
id: track.id!,
index: i,
label: track.label,
language: track.language,
selected:
+2
View File
@@ -52,6 +52,8 @@ export type CastStatus =
export interface Track {
readonly id: string;
// -1 for external tracks
readonly index: number;
readonly label?: string;
readonly language?: string;
readonly selected: boolean;