forked from Ninjalama/streamyfin_mirror
Co-authored-by: lostb1t <coding-mosses0z@icloud.com> Co-authored-by: Fredrik Burmester <fredrik.burmester@gmail.com> Co-authored-by: Gauvain <68083474+Gauvino@users.noreply.github.com> Co-authored-by: Gauvino <uruknarb20@gmail.com> Co-authored-by: storm1er <le.storm1er@gmail.com> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Chris <182387676+whoopsi-daisy@users.noreply.github.com> Co-authored-by: arch-fan <55891793+arch-fan@users.noreply.github.com> Co-authored-by: Alex Kim <alexkim@Alexs-MacBook-Pro.local>
98 lines
2.6 KiB
TypeScript
98 lines
2.6 KiB
TypeScript
// utils/getDefaultPlaySettings.ts
|
|
|
|
import type {
|
|
BaseItemDto,
|
|
MediaSourceInfo,
|
|
} from "@jellyfin/sdk/lib/generated-client";
|
|
import { BITRATES } from "@/components/BitrateSelector";
|
|
import { type Settings } from "../atoms/settings";
|
|
import {
|
|
AudioStreamRanker,
|
|
StreamRanker,
|
|
SubtitleStreamRanker,
|
|
} from "../streamRanker";
|
|
|
|
interface PlaySettings {
|
|
item: BaseItemDto;
|
|
bitrate: (typeof BITRATES)[0];
|
|
mediaSource?: MediaSourceInfo | null;
|
|
audioIndex?: number | undefined;
|
|
subtitleIndex?: number | undefined;
|
|
}
|
|
|
|
export interface previousIndexes {
|
|
audioIndex?: number;
|
|
subtitleIndex?: number;
|
|
}
|
|
|
|
interface TrackOptions {
|
|
DefaultAudioStreamIndex: number | undefined;
|
|
DefaultSubtitleStreamIndex: number | undefined;
|
|
}
|
|
|
|
// Used getting default values for the next player.
|
|
export function getDefaultPlaySettings(
|
|
item: BaseItemDto,
|
|
settings: Settings,
|
|
previousIndexes?: previousIndexes,
|
|
previousSource?: MediaSourceInfo,
|
|
): PlaySettings {
|
|
if (item.Type === "Program") {
|
|
return {
|
|
item,
|
|
bitrate: BITRATES[0],
|
|
mediaSource: undefined,
|
|
audioIndex: undefined,
|
|
subtitleIndex: undefined,
|
|
};
|
|
}
|
|
|
|
// 1. Get first media source
|
|
|
|
const mediaSource = item.MediaSources?.[0];
|
|
|
|
// We prefer the previous track over the default track.
|
|
const trackOptions: TrackOptions = {
|
|
DefaultAudioStreamIndex: mediaSource?.DefaultAudioStreamIndex ?? -1,
|
|
DefaultSubtitleStreamIndex: mediaSource?.DefaultSubtitleStreamIndex ?? -1,
|
|
};
|
|
|
|
const mediaStreams = mediaSource?.MediaStreams ?? [];
|
|
if (settings?.rememberSubtitleSelections && previousIndexes) {
|
|
if (previousIndexes.subtitleIndex !== undefined && previousSource) {
|
|
const subtitleRanker = new SubtitleStreamRanker();
|
|
const ranker = new StreamRanker(subtitleRanker);
|
|
ranker.rankStream(
|
|
previousIndexes.subtitleIndex,
|
|
previousSource,
|
|
mediaStreams,
|
|
trackOptions,
|
|
);
|
|
}
|
|
}
|
|
|
|
if (settings?.rememberAudioSelections && previousIndexes) {
|
|
if (previousIndexes.audioIndex !== undefined && previousSource) {
|
|
const audioRanker = new AudioStreamRanker();
|
|
const ranker = new StreamRanker(audioRanker);
|
|
ranker.rankStream(
|
|
previousIndexes.audioIndex,
|
|
previousSource,
|
|
mediaStreams,
|
|
trackOptions,
|
|
);
|
|
}
|
|
}
|
|
|
|
// 4. Get default bitrate from settings or fallback to max
|
|
const bitrate = settings.defaultBitrate ?? BITRATES[0];
|
|
|
|
return {
|
|
item,
|
|
bitrate,
|
|
mediaSource,
|
|
audioIndex: trackOptions.DefaultAudioStreamIndex,
|
|
subtitleIndex: trackOptions.DefaultSubtitleStreamIndex,
|
|
};
|
|
}
|