mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
Refactor playbackmanager to follow max-params rule
This commit is contained in:
parent
e9369e40bd
commit
6544b7c698
1 changed files with 102 additions and 64 deletions
|
@ -299,20 +299,20 @@ function getAudioMaxValues(deviceProfile) {
|
||||||
}
|
}
|
||||||
|
|
||||||
let startingPlaySession = new Date().getTime();
|
let startingPlaySession = new Date().getTime();
|
||||||
function getAudioStreamUrl(item, transcodingProfile, directPlayContainers, maxBitrate, apiClient, maxAudioSampleRate, maxAudioBitDepth, maxAudioBitrate, startPosition) {
|
function getAudioStreamUrl(item, transcodingProfile, directPlayContainers, apiClient, startPosition, maxValues) {
|
||||||
const url = 'Audio/' + item.Id + '/universal';
|
const url = 'Audio/' + item.Id + '/universal';
|
||||||
|
|
||||||
startingPlaySession++;
|
startingPlaySession++;
|
||||||
return apiClient.getUrl(url, {
|
return apiClient.getUrl(url, {
|
||||||
UserId: apiClient.getCurrentUserId(),
|
UserId: apiClient.getCurrentUserId(),
|
||||||
DeviceId: apiClient.deviceId(),
|
DeviceId: apiClient.deviceId(),
|
||||||
MaxStreamingBitrate: maxAudioBitrate || maxBitrate,
|
MaxStreamingBitrate: maxValues.maxAudioBitrate || maxValues.maxBitrate,
|
||||||
Container: directPlayContainers,
|
Container: directPlayContainers,
|
||||||
TranscodingContainer: transcodingProfile.Container || null,
|
TranscodingContainer: transcodingProfile.Container || null,
|
||||||
TranscodingProtocol: transcodingProfile.Protocol || null,
|
TranscodingProtocol: transcodingProfile.Protocol || null,
|
||||||
AudioCodec: transcodingProfile.AudioCodec,
|
AudioCodec: transcodingProfile.AudioCodec,
|
||||||
MaxAudioSampleRate: maxAudioSampleRate,
|
MaxAudioSampleRate: maxValues.maxAudioSampleRate,
|
||||||
MaxAudioBitDepth: maxAudioBitDepth,
|
MaxAudioBitDepth: maxValues.maxAudioBitDepth,
|
||||||
api_key: apiClient.accessToken(),
|
api_key: apiClient.accessToken(),
|
||||||
PlaySessionId: startingPlaySession,
|
PlaySessionId: startingPlaySession,
|
||||||
StartTimeTicks: startPosition || 0,
|
StartTimeTicks: startPosition || 0,
|
||||||
|
@ -344,7 +344,7 @@ function getAudioStreamUrlFromDeviceProfile(item, deviceProfile, maxBitrate, api
|
||||||
|
|
||||||
const maxValues = getAudioMaxValues(deviceProfile);
|
const maxValues = getAudioMaxValues(deviceProfile);
|
||||||
|
|
||||||
return getAudioStreamUrl(item, transcodingProfile, directPlayContainers, maxBitrate, apiClient, maxValues.maxAudioSampleRate, maxValues.maxAudioBitDepth, maxValues.maxAudioBitrate, startPosition);
|
return getAudioStreamUrl(item, transcodingProfile, directPlayContainers, apiClient, startPosition, { maxBitrate: maxBitrate, ...maxValues });
|
||||||
}
|
}
|
||||||
|
|
||||||
function getStreamUrls(items, deviceProfile, maxBitrate, apiClient, startPosition) {
|
function getStreamUrls(items, deviceProfile, maxBitrate, apiClient, startPosition) {
|
||||||
|
@ -377,7 +377,7 @@ function getStreamUrls(items, deviceProfile, maxBitrate, apiClient, startPositio
|
||||||
let streamUrl;
|
let streamUrl;
|
||||||
|
|
||||||
if (item.MediaType === 'Audio' && !itemHelper.isLocalItem(item)) {
|
if (item.MediaType === 'Audio' && !itemHelper.isLocalItem(item)) {
|
||||||
streamUrl = getAudioStreamUrl(item, audioTranscodingProfile, audioDirectPlayContainers, maxBitrate, apiClient, maxValues.maxAudioSampleRate, maxValues.maxAudioBitDepth, maxValues.maxAudioBitrate, startPosition);
|
streamUrl = getAudioStreamUrl(item, audioTranscodingProfile, audioDirectPlayContainers, apiClient, startPosition, { maxBitrate: maxBitrate, ...maxValues });
|
||||||
}
|
}
|
||||||
|
|
||||||
streamUrls.push(streamUrl || '');
|
streamUrls.push(streamUrl || '');
|
||||||
|
@ -408,27 +408,12 @@ function setStreamUrls(items, deviceProfile, maxBitrate, apiClient, startPositio
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function getPlaybackInfo(player,
|
function getPlaybackInfo(player, apiClient, item, deviceProfile, mediaSourceId, liveStreamId, options) {
|
||||||
apiClient,
|
|
||||||
item,
|
|
||||||
deviceProfile,
|
|
||||||
maxBitrate,
|
|
||||||
startPosition,
|
|
||||||
isPlayback,
|
|
||||||
mediaSourceId,
|
|
||||||
audioStreamIndex,
|
|
||||||
subtitleStreamIndex,
|
|
||||||
liveStreamId,
|
|
||||||
enableDirectPlay,
|
|
||||||
enableDirectStream,
|
|
||||||
allowVideoStreamCopy,
|
|
||||||
allowAudioStreamCopy,
|
|
||||||
secondarySubtitleStreamIndex) {
|
|
||||||
if (!itemHelper.isLocalItem(item) && item.MediaType === 'Audio' && !player.useServerPlaybackInfoForAudio) {
|
if (!itemHelper.isLocalItem(item) && item.MediaType === 'Audio' && !player.useServerPlaybackInfoForAudio) {
|
||||||
return Promise.resolve({
|
return Promise.resolve({
|
||||||
MediaSources: [
|
MediaSources: [
|
||||||
{
|
{
|
||||||
StreamUrl: getAudioStreamUrlFromDeviceProfile(item, deviceProfile, maxBitrate, apiClient, startPosition),
|
StreamUrl: getAudioStreamUrlFromDeviceProfile(item, deviceProfile, options.maxBitrate, apiClient, options.startPosition),
|
||||||
Id: item.Id,
|
Id: item.Id,
|
||||||
MediaStreams: [],
|
MediaStreams: [],
|
||||||
RunTimeTicks: item.RunTimeTicks
|
RunTimeTicks: item.RunTimeTicks
|
||||||
|
@ -446,10 +431,10 @@ function getPlaybackInfo(player,
|
||||||
|
|
||||||
const query = {
|
const query = {
|
||||||
UserId: apiClient.getCurrentUserId(),
|
UserId: apiClient.getCurrentUserId(),
|
||||||
StartTimeTicks: startPosition || 0
|
StartTimeTicks: options.startPosition || 0
|
||||||
};
|
};
|
||||||
|
|
||||||
if (isPlayback) {
|
if (options.isPlayback) {
|
||||||
query.IsPlayback = true;
|
query.IsPlayback = true;
|
||||||
query.AutoOpenLiveStream = true;
|
query.AutoOpenLiveStream = true;
|
||||||
} else {
|
} else {
|
||||||
|
@ -457,27 +442,26 @@ function getPlaybackInfo(player,
|
||||||
query.AutoOpenLiveStream = false;
|
query.AutoOpenLiveStream = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (audioStreamIndex != null) {
|
if (options.audioStreamIndex != null) {
|
||||||
query.AudioStreamIndex = audioStreamIndex;
|
query.AudioStreamIndex = options.audioStreamIndex;
|
||||||
}
|
}
|
||||||
if (subtitleStreamIndex != null) {
|
if (options.subtitleStreamIndex != null) {
|
||||||
query.SubtitleStreamIndex = subtitleStreamIndex;
|
query.SubtitleStreamIndex = options.subtitleStreamIndex;
|
||||||
}
|
}
|
||||||
if (secondarySubtitleStreamIndex != null) {
|
if (options.secondarySubtitleStreamIndex != null) {
|
||||||
query.SecondarySubtitleStreamIndex = secondarySubtitleStreamIndex;
|
query.SecondarySubtitleStreamIndex = options.secondarySubtitleStreamIndex;
|
||||||
}
|
}
|
||||||
if (enableDirectPlay != null) {
|
if (options.enableDirectPlay != null) {
|
||||||
query.EnableDirectPlay = enableDirectPlay;
|
query.EnableDirectPlay = options.enableDirectPlay;
|
||||||
}
|
}
|
||||||
|
if (options.enableDirectStream != null) {
|
||||||
if (enableDirectStream != null) {
|
query.EnableDirectStream = options.enableDirectStream;
|
||||||
query.EnableDirectStream = enableDirectStream;
|
|
||||||
}
|
}
|
||||||
if (allowVideoStreamCopy != null) {
|
if (options.allowVideoStreamCopy != null) {
|
||||||
query.AllowVideoStreamCopy = allowVideoStreamCopy;
|
query.AllowVideoStreamCopy = options.allowVideoStreamCopy;
|
||||||
}
|
}
|
||||||
if (allowAudioStreamCopy != null) {
|
if (options.allowAudioStreamCopy != null) {
|
||||||
query.AllowAudioStreamCopy = allowAudioStreamCopy;
|
query.AllowAudioStreamCopy = options.allowAudioStreamCopy;
|
||||||
}
|
}
|
||||||
if (mediaSourceId) {
|
if (mediaSourceId) {
|
||||||
query.MediaSourceId = mediaSourceId;
|
query.MediaSourceId = mediaSourceId;
|
||||||
|
@ -485,8 +469,8 @@ function getPlaybackInfo(player,
|
||||||
if (liveStreamId) {
|
if (liveStreamId) {
|
||||||
query.LiveStreamId = liveStreamId;
|
query.LiveStreamId = liveStreamId;
|
||||||
}
|
}
|
||||||
if (maxBitrate) {
|
if (options.maxBitrate) {
|
||||||
query.MaxStreamingBitrate = maxBitrate;
|
query.MaxStreamingBitrate = options.maxBitrate;
|
||||||
}
|
}
|
||||||
if (player.enableMediaProbe && !player.enableMediaProbe(item)) {
|
if (player.enableMediaProbe && !player.enableMediaProbe(item)) {
|
||||||
query.EnableMediaProbe = false;
|
query.EnableMediaProbe = false;
|
||||||
|
@ -537,7 +521,7 @@ function getOptimalMediaSource(apiClient, item, versions) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function getLiveStream(player, apiClient, item, playSessionId, deviceProfile, maxBitrate, startPosition, mediaSource, audioStreamIndex, subtitleStreamIndex) {
|
function getLiveStream(player, apiClient, item, playSessionId, deviceProfile, mediaSource, options) {
|
||||||
const postData = {
|
const postData = {
|
||||||
DeviceProfile: deviceProfile,
|
DeviceProfile: deviceProfile,
|
||||||
OpenToken: mediaSource.OpenToken
|
OpenToken: mediaSource.OpenToken
|
||||||
|
@ -545,19 +529,19 @@ function getLiveStream(player, apiClient, item, playSessionId, deviceProfile, ma
|
||||||
|
|
||||||
const query = {
|
const query = {
|
||||||
UserId: apiClient.getCurrentUserId(),
|
UserId: apiClient.getCurrentUserId(),
|
||||||
StartTimeTicks: startPosition || 0,
|
StartTimeTicks: options.startPosition || 0,
|
||||||
ItemId: item.Id,
|
ItemId: item.Id,
|
||||||
PlaySessionId: playSessionId
|
PlaySessionId: playSessionId
|
||||||
};
|
};
|
||||||
|
|
||||||
if (maxBitrate) {
|
if (options.maxBitrate) {
|
||||||
query.MaxStreamingBitrate = maxBitrate;
|
query.MaxStreamingBitrate = options.maxBitrate;
|
||||||
}
|
}
|
||||||
if (audioStreamIndex != null) {
|
if (options.audioStreamIndex != null) {
|
||||||
query.AudioStreamIndex = audioStreamIndex;
|
query.AudioStreamIndex = options.audioStreamIndex;
|
||||||
}
|
}
|
||||||
if (subtitleStreamIndex != null) {
|
if (options.subtitleStreamIndex != null) {
|
||||||
query.SubtitleStreamIndex = subtitleStreamIndex;
|
query.SubtitleStreamIndex = options.subtitleStreamIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
// lastly, enforce player overrides for special situations
|
// lastly, enforce player overrides for special situations
|
||||||
|
@ -1737,7 +1721,19 @@ class PlaybackManager {
|
||||||
|
|
||||||
const currentPlayOptions = currentItem.playOptions || getDefaultPlayOptions();
|
const currentPlayOptions = currentItem.playOptions || getDefaultPlayOptions();
|
||||||
|
|
||||||
getPlaybackInfo(player, apiClient, currentItem, deviceProfile, maxBitrate, ticks, true, currentMediaSource.Id, audioStreamIndex, subtitleStreamIndex, liveStreamId, params.EnableDirectPlay, params.EnableDirectStream, params.AllowVideoStreamCopy, params.AllowAudioStreamCopy).then(function (result) {
|
const options = {
|
||||||
|
maxBitrate: maxBitrate,
|
||||||
|
startPosition: ticks,
|
||||||
|
isPlayback: true,
|
||||||
|
audioStreamIndex: audioStreamIndex,
|
||||||
|
subtitleStreamIndex: subtitleStreamIndex,
|
||||||
|
enableDirectPlay: params.EnableDirectPlay,
|
||||||
|
enableDirectStream: params.EnableDirectStream,
|
||||||
|
allowVideoStreamCopy: params.AllowVideoStreamCopy,
|
||||||
|
allowAudioStreamCopy: params.AllowAudioStreamCopy
|
||||||
|
};
|
||||||
|
|
||||||
|
getPlaybackInfo(player, apiClient, currentItem, deviceProfile, currentMediaSource.Id, liveStreamId, options).then(function (result) {
|
||||||
if (validatePlaybackInfoResult(self, result)) {
|
if (validatePlaybackInfoResult(self, result)) {
|
||||||
currentMediaSource = result.MediaSources[0];
|
currentMediaSource = result.MediaSources[0];
|
||||||
|
|
||||||
|
@ -2303,17 +2299,17 @@ class PlaybackManager {
|
||||||
}, reject);
|
}, reject);
|
||||||
}
|
}
|
||||||
|
|
||||||
function sendPlaybackListToPlayer(player, items, deviceProfile, maxBitrate, apiClient, startPositionTicks, mediaSourceId, audioStreamIndex, subtitleStreamIndex, startIndex) {
|
function sendPlaybackListToPlayer(player, items, deviceProfile, apiClient, mediaSourceId, options) {
|
||||||
return setStreamUrls(items, deviceProfile, maxBitrate, apiClient, startPositionTicks).then(function () {
|
return setStreamUrls(items, deviceProfile, options.maxBitrate, apiClient, options.startPosition).then(function () {
|
||||||
loading.hide();
|
loading.hide();
|
||||||
|
|
||||||
return player.play({
|
return player.play({
|
||||||
items: items,
|
items: items,
|
||||||
startPositionTicks: startPositionTicks || 0,
|
startPositionTicks: options.startPosition || 0,
|
||||||
mediaSourceId: mediaSourceId,
|
mediaSourceId: mediaSourceId,
|
||||||
audioStreamIndex: audioStreamIndex,
|
audioStreamIndex: options.audioStreamIndex,
|
||||||
subtitleStreamIndex: subtitleStreamIndex,
|
subtitleStreamIndex: options.subtitleStreamIndex,
|
||||||
startIndex: startIndex
|
startIndex: options.startIndex
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -2474,15 +2470,27 @@ class PlaybackManager {
|
||||||
const mediaSourceId = playOptions.mediaSourceId;
|
const mediaSourceId = playOptions.mediaSourceId;
|
||||||
const audioStreamIndex = playOptions.audioStreamIndex;
|
const audioStreamIndex = playOptions.audioStreamIndex;
|
||||||
const subtitleStreamIndex = playOptions.subtitleStreamIndex;
|
const subtitleStreamIndex = playOptions.subtitleStreamIndex;
|
||||||
|
const options = {
|
||||||
|
maxBitrate: maxBitrate,
|
||||||
|
startPosition: startPosition,
|
||||||
|
isPlayback: null,
|
||||||
|
audioStreamIndex: audioStreamIndex,
|
||||||
|
subtitleStreamIndex: subtitleStreamIndex,
|
||||||
|
startIndex: playOptions.startIndex,
|
||||||
|
enableDirectPlay: null,
|
||||||
|
enableDirectStream: null,
|
||||||
|
allowVideoStreamCopy: null,
|
||||||
|
allowAudioStreamCopy: null
|
||||||
|
};
|
||||||
|
|
||||||
if (player && !enableLocalPlaylistManagement(player)) {
|
if (player && !enableLocalPlaylistManagement(player)) {
|
||||||
return sendPlaybackListToPlayer(player, playOptions.items, deviceProfile, maxBitrate, apiClient, startPosition, mediaSourceId, audioStreamIndex, subtitleStreamIndex, playOptions.startIndex);
|
return sendPlaybackListToPlayer(player, playOptions.items, deviceProfile, apiClient, mediaSourceId, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
// this reference was only needed by sendPlaybackListToPlayer
|
// this reference was only needed by sendPlaybackListToPlayer
|
||||||
playOptions.items = null;
|
playOptions.items = null;
|
||||||
|
|
||||||
return getPlaybackMediaSource(player, apiClient, deviceProfile, maxBitrate, item, startPosition, mediaSourceId, audioStreamIndex, subtitleStreamIndex).then(async (mediaSource) => {
|
return getPlaybackMediaSource(player, apiClient, deviceProfile, item, mediaSourceId, options).then(async (mediaSource) => {
|
||||||
const user = await apiClient.getCurrentUser();
|
const user = await apiClient.getCurrentUser();
|
||||||
autoSetNextTracks(prevSource, mediaSource, user.Configuration.RememberAudioSelections, user.Configuration.RememberSubtitleSelections);
|
autoSetNextTracks(prevSource, mediaSource, user.Configuration.RememberAudioSelections, user.Configuration.RememberSubtitleSelections);
|
||||||
|
|
||||||
|
@ -2540,7 +2548,20 @@ class PlaybackManager {
|
||||||
const maxBitrate = getSavedMaxStreamingBitrate(ServerConnections.getApiClient(item.ServerId), mediaType);
|
const maxBitrate = getSavedMaxStreamingBitrate(ServerConnections.getApiClient(item.ServerId), mediaType);
|
||||||
|
|
||||||
return player.getDeviceProfile(item).then(function (deviceProfile) {
|
return player.getDeviceProfile(item).then(function (deviceProfile) {
|
||||||
return getPlaybackMediaSource(player, apiClient, deviceProfile, maxBitrate, item, startPosition, options.mediaSourceId, options.audioStreamIndex, options.subtitleStreamIndex).then(function (mediaSource) {
|
const mediaOptions = {
|
||||||
|
maxBitrate: maxBitrate,
|
||||||
|
startPosition: startPosition,
|
||||||
|
isPlayback: null,
|
||||||
|
audioStreamIndex: options.audioStreamIndex,
|
||||||
|
subtitleStreamIndex: options.subtitleStreamIndex,
|
||||||
|
startIndex: null,
|
||||||
|
enableDirectPlay: null,
|
||||||
|
enableDirectStream: null,
|
||||||
|
allowVideoStreamCopy: null,
|
||||||
|
allowAudioStreamCopy: null
|
||||||
|
};
|
||||||
|
|
||||||
|
return getPlaybackMediaSource(player, apiClient, deviceProfile, item, options.mediaSourceId, mediaOptions).then(function (mediaSource) {
|
||||||
return createStreamInfo(apiClient, item.MediaType, item, mediaSource, startPosition, player);
|
return createStreamInfo(apiClient, item.MediaType, item, mediaSource, startPosition, player);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -2560,7 +2581,19 @@ class PlaybackManager {
|
||||||
const maxBitrate = getSavedMaxStreamingBitrate(ServerConnections.getApiClient(item.ServerId), mediaType);
|
const maxBitrate = getSavedMaxStreamingBitrate(ServerConnections.getApiClient(item.ServerId), mediaType);
|
||||||
|
|
||||||
return player.getDeviceProfile(item).then(function (deviceProfile) {
|
return player.getDeviceProfile(item).then(function (deviceProfile) {
|
||||||
return getPlaybackInfo(player, apiClient, item, deviceProfile, maxBitrate, startPosition, false, null, null, null, null).then(function (playbackInfoResult) {
|
const mediaOptions = {
|
||||||
|
maxBitrate: maxBitrate,
|
||||||
|
startPosition: startPosition,
|
||||||
|
isPlayback: true,
|
||||||
|
audioStreamIndex: null,
|
||||||
|
subtitleStreamIndex: null,
|
||||||
|
enableDirectPlay: null,
|
||||||
|
enableDirectStream: null,
|
||||||
|
allowVideoStreamCopy: null,
|
||||||
|
allowAudioStreamCopy: null
|
||||||
|
};
|
||||||
|
|
||||||
|
return getPlaybackInfo(player, apiClient, item, deviceProfile, null, null, mediaOptions).then(function (playbackInfoResult) {
|
||||||
return playbackInfoResult.MediaSources;
|
return playbackInfoResult.MediaSources;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -2701,13 +2734,18 @@ class PlaybackManager {
|
||||||
return tracks;
|
return tracks;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getPlaybackMediaSource(player, apiClient, deviceProfile, maxBitrate, item, startPosition, mediaSourceId, audioStreamIndex, subtitleStreamIndex) {
|
function getPlaybackMediaSource(player, apiClient, deviceProfile, item, mediaSourceId, options) {
|
||||||
return getPlaybackInfo(player, apiClient, item, deviceProfile, maxBitrate, startPosition, true, mediaSourceId, audioStreamIndex, subtitleStreamIndex, null).then(function (playbackInfoResult) {
|
options.isPlayback = true;
|
||||||
|
|
||||||
|
return getPlaybackInfo(player, apiClient, item, deviceProfile, mediaSourceId, null, options).then(function (playbackInfoResult) {
|
||||||
if (validatePlaybackInfoResult(self, playbackInfoResult)) {
|
if (validatePlaybackInfoResult(self, playbackInfoResult)) {
|
||||||
return getOptimalMediaSource(apiClient, item, playbackInfoResult.MediaSources).then(function (mediaSource) {
|
return getOptimalMediaSource(apiClient, item, playbackInfoResult.MediaSources).then(function (mediaSource) {
|
||||||
if (mediaSource) {
|
if (mediaSource) {
|
||||||
if (mediaSource.RequiresOpening && !mediaSource.LiveStreamId) {
|
if (mediaSource.RequiresOpening && !mediaSource.LiveStreamId) {
|
||||||
return getLiveStream(player, apiClient, item, playbackInfoResult.PlaySessionId, deviceProfile, maxBitrate, startPosition, mediaSource, null, null).then(function (openLiveStreamResult) {
|
options.audioStreamIndex = null;
|
||||||
|
options.subtitleStreamIndex = null;
|
||||||
|
|
||||||
|
return getLiveStream(player, apiClient, item, playbackInfoResult.PlaySessionId, deviceProfile, mediaSource, options).then(function (openLiveStreamResult) {
|
||||||
return supportsDirectPlay(apiClient, item, openLiveStreamResult.MediaSource).then(function (result) {
|
return supportsDirectPlay(apiClient, item, openLiveStreamResult.MediaSource).then(function (result) {
|
||||||
openLiveStreamResult.MediaSource.enableDirectPlay = result;
|
openLiveStreamResult.MediaSource.enableDirectPlay = result;
|
||||||
return openLiveStreamResult.MediaSource;
|
return openLiveStreamResult.MediaSource;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue