5071aedcea
new module ServerConnections for ConnectionManager all code adapted to this new module removed Events and ConnectionManager from eslintrc
290 lines
8.5 KiB
JavaScript
290 lines
8.5 KiB
JavaScript
import actionsheet from '../actionSheet/actionSheet';
|
|
import { playbackManager } from '../playback/playbackmanager';
|
|
import globalize from '../../scripts/globalize';
|
|
import qualityoptions from '../qualityOptions';
|
|
import ServerConnections from '../ServerConnections';
|
|
|
|
function showQualityMenu(player, btn) {
|
|
const videoStream = playbackManager.currentMediaSource(player).MediaStreams.filter(function (stream) {
|
|
return stream.Type === 'Video';
|
|
})[0];
|
|
const videoWidth = videoStream ? videoStream.Width : null;
|
|
const videoHeight = videoStream ? videoStream.Height : null;
|
|
|
|
const options = qualityoptions.getVideoQualityOptions({
|
|
currentMaxBitrate: playbackManager.getMaxStreamingBitrate(player),
|
|
isAutomaticBitrateEnabled: playbackManager.enableAutomaticBitrateDetection(player),
|
|
videoWidth: videoWidth,
|
|
videoHeight: videoHeight,
|
|
enableAuto: true
|
|
});
|
|
|
|
const menuItems = options.map(function (o) {
|
|
const opt = {
|
|
name: o.name,
|
|
id: o.bitrate,
|
|
asideText: o.secondaryText
|
|
};
|
|
|
|
if (o.selected) {
|
|
opt.selected = true;
|
|
}
|
|
|
|
return opt;
|
|
});
|
|
|
|
let selectedId = options.filter(function (o) {
|
|
return o.selected;
|
|
});
|
|
|
|
selectedId = selectedId.length ? selectedId[0].bitrate : null;
|
|
|
|
return actionsheet.show({
|
|
items: menuItems,
|
|
positionTo: btn
|
|
}).then(function (id) {
|
|
const bitrate = parseInt(id);
|
|
if (bitrate !== selectedId) {
|
|
playbackManager.setMaxStreamingBitrate({
|
|
enableAutomaticBitrateDetection: bitrate ? false : true,
|
|
maxBitrate: bitrate
|
|
}, player);
|
|
}
|
|
});
|
|
}
|
|
|
|
function showRepeatModeMenu(player, btn) {
|
|
const menuItems = [];
|
|
const currentValue = playbackManager.getRepeatMode(player);
|
|
|
|
menuItems.push({
|
|
name: globalize.translate('RepeatAll'),
|
|
id: 'RepeatAll',
|
|
selected: currentValue === 'RepeatAll'
|
|
});
|
|
|
|
menuItems.push({
|
|
name: globalize.translate('RepeatOne'),
|
|
id: 'RepeatOne',
|
|
selected: currentValue === 'RepeatOne'
|
|
});
|
|
|
|
menuItems.push({
|
|
name: globalize.translate('None'),
|
|
id: 'RepeatNone',
|
|
selected: currentValue === 'RepeatNone'
|
|
});
|
|
|
|
return actionsheet.show({
|
|
items: menuItems,
|
|
positionTo: btn
|
|
}).then(function (mode) {
|
|
if (mode) {
|
|
playbackManager.setRepeatMode(mode, player);
|
|
}
|
|
});
|
|
}
|
|
|
|
function getQualitySecondaryText(player) {
|
|
const state = playbackManager.getPlayerState(player);
|
|
|
|
const videoStream = playbackManager.currentMediaSource(player).MediaStreams.filter(function (stream) {
|
|
return stream.Type === 'Video';
|
|
})[0];
|
|
|
|
const videoWidth = videoStream ? videoStream.Width : null;
|
|
const videoHeight = videoStream ? videoStream.Height : null;
|
|
|
|
const options = qualityoptions.getVideoQualityOptions({
|
|
currentMaxBitrate: playbackManager.getMaxStreamingBitrate(player),
|
|
isAutomaticBitrateEnabled: playbackManager.enableAutomaticBitrateDetection(player),
|
|
videoWidth: videoWidth,
|
|
videoHeight: videoHeight,
|
|
enableAuto: true
|
|
});
|
|
|
|
let selectedOption = options.filter(function (o) {
|
|
return o.selected;
|
|
});
|
|
|
|
if (!selectedOption.length) {
|
|
return null;
|
|
}
|
|
|
|
selectedOption = selectedOption[0];
|
|
let text = selectedOption.name;
|
|
|
|
if (selectedOption.autoText) {
|
|
if (state.PlayState && state.PlayState.PlayMethod !== 'Transcode') {
|
|
text += ' - Direct';
|
|
} else {
|
|
text += ' ' + selectedOption.autoText;
|
|
}
|
|
}
|
|
|
|
return text;
|
|
}
|
|
|
|
function showAspectRatioMenu(player, btn) {
|
|
// each has a name and id
|
|
const currentId = playbackManager.getAspectRatio(player);
|
|
const menuItems = playbackManager.getSupportedAspectRatios(player).map(function (i) {
|
|
return {
|
|
id: i.id,
|
|
name: i.name,
|
|
selected: i.id === currentId
|
|
};
|
|
});
|
|
|
|
return actionsheet.show({
|
|
items: menuItems,
|
|
positionTo: btn
|
|
}).then(function (id) {
|
|
if (id) {
|
|
playbackManager.setAspectRatio(id, player);
|
|
return Promise.resolve();
|
|
}
|
|
|
|
return Promise.reject();
|
|
});
|
|
}
|
|
|
|
function showPlaybackRateMenu(player, btn) {
|
|
// each has a name and id
|
|
const currentId = playbackManager.getPlaybackRate(player);
|
|
const menuItems = playbackManager.getSupportedPlaybackRates(player).map(i => ({
|
|
id: i.id,
|
|
name: i.name,
|
|
selected: i.id === currentId
|
|
}));
|
|
|
|
return actionsheet.show({
|
|
items: menuItems,
|
|
positionTo: btn
|
|
}).then(function (id) {
|
|
if (id) {
|
|
playbackManager.setPlaybackRate(id, player);
|
|
return Promise.resolve();
|
|
}
|
|
|
|
return Promise.reject();
|
|
});
|
|
}
|
|
|
|
function showWithUser(options, player, user) {
|
|
const supportedCommands = playbackManager.getSupportedCommands(player);
|
|
|
|
const menuItems = [];
|
|
if (supportedCommands.indexOf('SetAspectRatio') !== -1) {
|
|
const currentAspectRatioId = playbackManager.getAspectRatio(player);
|
|
const currentAspectRatio = playbackManager.getSupportedAspectRatios(player).filter(function (i) {
|
|
return i.id === currentAspectRatioId;
|
|
})[0];
|
|
|
|
menuItems.push({
|
|
name: globalize.translate('AspectRatio'),
|
|
id: 'aspectratio',
|
|
asideText: currentAspectRatio ? currentAspectRatio.name : null
|
|
});
|
|
}
|
|
|
|
if (supportedCommands.indexOf('PlaybackRate') !== -1) {
|
|
const currentPlaybackRateId = playbackManager.getPlaybackRate(player);
|
|
const currentPlaybackRate = playbackManager.getSupportedPlaybackRates(player).filter(i => i.id === currentPlaybackRateId)[0];
|
|
|
|
menuItems.push({
|
|
name: globalize.translate('PlaybackRate'),
|
|
id: 'playbackrate',
|
|
asideText: currentPlaybackRate ? currentPlaybackRate.name : null
|
|
});
|
|
}
|
|
|
|
if (user && user.Policy.EnableVideoPlaybackTranscoding) {
|
|
const secondaryQualityText = getQualitySecondaryText(player);
|
|
|
|
menuItems.push({
|
|
name: globalize.translate('Quality'),
|
|
id: 'quality',
|
|
asideText: secondaryQualityText
|
|
});
|
|
}
|
|
|
|
const repeatMode = playbackManager.getRepeatMode(player);
|
|
|
|
if (supportedCommands.indexOf('SetRepeatMode') !== -1 && playbackManager.currentMediaSource(player).RunTimeTicks) {
|
|
menuItems.push({
|
|
name: globalize.translate('RepeatMode'),
|
|
id: 'repeatmode',
|
|
asideText: repeatMode === 'RepeatNone' ? globalize.translate('None') : globalize.translate('' + repeatMode)
|
|
});
|
|
}
|
|
|
|
if (options.suboffset) {
|
|
menuItems.push({
|
|
name: globalize.translate('SubtitleOffset'),
|
|
id: 'suboffset',
|
|
asideText: null
|
|
});
|
|
}
|
|
|
|
if (options.stats) {
|
|
menuItems.push({
|
|
name: globalize.translate('PlaybackData'),
|
|
id: 'stats',
|
|
asideText: null
|
|
});
|
|
}
|
|
|
|
return actionsheet.show({
|
|
items: menuItems,
|
|
positionTo: options.positionTo
|
|
}).then(function (id) {
|
|
return handleSelectedOption(id, options, player);
|
|
});
|
|
}
|
|
|
|
export function show(options) {
|
|
const player = options.player;
|
|
const currentItem = playbackManager.currentItem(player);
|
|
|
|
if (!currentItem || !currentItem.ServerId) {
|
|
return showWithUser(options, player, null);
|
|
}
|
|
|
|
var apiClient = ServerConnections.getApiClient(currentItem.ServerId);
|
|
return apiClient.getCurrentUser().then(function (user) {
|
|
return showWithUser(options, player, user);
|
|
});
|
|
}
|
|
|
|
function handleSelectedOption(id, options, player) {
|
|
switch (id) {
|
|
case 'quality':
|
|
return showQualityMenu(player, options.positionTo);
|
|
case 'aspectratio':
|
|
return showAspectRatioMenu(player, options.positionTo);
|
|
case 'playbackrate':
|
|
return showPlaybackRateMenu(player, options.positionTo);
|
|
case 'repeatmode':
|
|
return showRepeatModeMenu(player, options.positionTo);
|
|
case 'stats':
|
|
if (options.onOption) {
|
|
options.onOption('stats');
|
|
}
|
|
return Promise.resolve();
|
|
case 'suboffset':
|
|
if (options.onOption) {
|
|
options.onOption('suboffset');
|
|
}
|
|
return Promise.resolve();
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return Promise.reject();
|
|
}
|
|
|
|
export default {
|
|
show: show
|
|
};
|