mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
Merge branch 'master' into unavailable-yt-video-trailer-bug-fix
This commit is contained in:
commit
6f61bee9d4
324 changed files with 8038 additions and 6596 deletions
|
@ -1,9 +1,9 @@
|
|||
import events from 'events';
|
||||
import playbackManager from 'playbackManager';
|
||||
import dom from 'dom';
|
||||
import browser from 'browser';
|
||||
import 'css!./iconosd';
|
||||
import 'material-icons';
|
||||
import { Events } from 'jellyfin-apiclient';
|
||||
import { playbackManager } from './playbackmanager';
|
||||
import dom from '../../scripts/dom';
|
||||
import browser from '../../scripts/browser';
|
||||
import './iconosd.css';
|
||||
import 'material-design-icons-iconfont';
|
||||
|
||||
let currentPlayer;
|
||||
let osdElement;
|
||||
|
@ -121,8 +121,8 @@ function releaseCurrentPlayer() {
|
|||
const player = currentPlayer;
|
||||
|
||||
if (player) {
|
||||
events.off(player, 'brightnesschange', onBrightnessChanged);
|
||||
events.off(player, 'playbackstop', hideOsd);
|
||||
Events.off(player, 'brightnesschange', onBrightnessChanged);
|
||||
Events.off(player, 'playbackstop', hideOsd);
|
||||
currentPlayer = null;
|
||||
}
|
||||
}
|
||||
|
@ -151,11 +151,11 @@ function bindToPlayer(player) {
|
|||
}
|
||||
|
||||
hideOsd();
|
||||
events.on(player, 'brightnesschange', onBrightnessChanged);
|
||||
events.on(player, 'playbackstop', hideOsd);
|
||||
Events.on(player, 'brightnesschange', onBrightnessChanged);
|
||||
Events.on(player, 'playbackstop', hideOsd);
|
||||
}
|
||||
|
||||
events.on(playbackManager, 'playerchange', function () {
|
||||
Events.on(playbackManager, 'playerchange', function () {
|
||||
bindToPlayer(playbackManager.getCurrentPlayer());
|
||||
});
|
||||
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
import playbackManager from 'playbackManager';
|
||||
import nowPlayingHelper from 'nowPlayingHelper';
|
||||
import shell from 'shell';
|
||||
import events from 'events';
|
||||
import { playbackManager } from '../playback/playbackmanager';
|
||||
import nowPlayingHelper from '../playback/nowplayinghelper';
|
||||
import { Events } from 'jellyfin-apiclient';
|
||||
import ServerConnections from '../ServerConnections';
|
||||
import shell from '../../scripts/shell';
|
||||
|
||||
/* eslint-disable indent */
|
||||
|
||||
// Reports media playback to the device for lock screen control
|
||||
|
@ -16,16 +18,16 @@ import events from 'events';
|
|||
} else if (options.type === 'Primary' && item.SeriesPrimaryImageTag) {
|
||||
options.tag = item.SeriesPrimaryImageTag;
|
||||
|
||||
return window.connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options);
|
||||
return ServerConnections.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options);
|
||||
} else if (options.type === 'Thumb') {
|
||||
if (item.SeriesThumbImageTag) {
|
||||
options.tag = item.SeriesThumbImageTag;
|
||||
|
||||
return window.connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options);
|
||||
return ServerConnections.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options);
|
||||
} else if (item.ParentThumbImageTag) {
|
||||
options.tag = item.ParentThumbImageTag;
|
||||
|
||||
return window.connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.ParentThumbItemId, options);
|
||||
return ServerConnections.getApiClient(item.ServerId).getScaledImageUrl(item.ParentThumbItemId, options);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -38,11 +40,11 @@ import events from 'events';
|
|||
if (item.ImageTags && item.ImageTags[options.type]) {
|
||||
options.tag = item.ImageTags[options.type];
|
||||
|
||||
return window.connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.Id, options);
|
||||
return ServerConnections.getApiClient(item.ServerId).getScaledImageUrl(item.Id, options);
|
||||
} else if (item.AlbumId && item.AlbumPrimaryImageTag) {
|
||||
options.tag = item.AlbumPrimaryImageTag;
|
||||
|
||||
return window.connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.AlbumId, options);
|
||||
return ServerConnections.getApiClient(item.ServerId).getScaledImageUrl(item.AlbumId, options);
|
||||
}
|
||||
|
||||
return null;
|
||||
|
@ -164,12 +166,12 @@ import events from 'events';
|
|||
|
||||
function releaseCurrentPlayer() {
|
||||
if (currentPlayer) {
|
||||
events.off(currentPlayer, 'playbackstart', onPlaybackStart);
|
||||
events.off(currentPlayer, 'playbackstop', onPlaybackStopped);
|
||||
events.off(currentPlayer, 'unpause', onGeneralEvent);
|
||||
events.off(currentPlayer, 'pause', onGeneralEvent);
|
||||
events.off(currentPlayer, 'statechange', onStateChanged);
|
||||
events.off(currentPlayer, 'timeupdate', onGeneralEvent);
|
||||
Events.off(currentPlayer, 'playbackstart', onPlaybackStart);
|
||||
Events.off(currentPlayer, 'playbackstop', onPlaybackStopped);
|
||||
Events.off(currentPlayer, 'unpause', onGeneralEvent);
|
||||
Events.off(currentPlayer, 'pause', onGeneralEvent);
|
||||
Events.off(currentPlayer, 'statechange', onStateChanged);
|
||||
Events.off(currentPlayer, 'timeupdate', onGeneralEvent);
|
||||
|
||||
currentPlayer = null;
|
||||
|
||||
|
@ -198,12 +200,12 @@ import events from 'events';
|
|||
const state = playbackManager.getPlayerState(player);
|
||||
updatePlayerState(player, state, 'init');
|
||||
|
||||
events.on(currentPlayer, 'playbackstart', onPlaybackStart);
|
||||
events.on(currentPlayer, 'playbackstop', onPlaybackStopped);
|
||||
events.on(currentPlayer, 'unpause', onGeneralEvent);
|
||||
events.on(currentPlayer, 'pause', onGeneralEvent);
|
||||
events.on(currentPlayer, 'statechange', onStateChanged);
|
||||
events.on(currentPlayer, 'timeupdate', onGeneralEvent);
|
||||
Events.on(currentPlayer, 'playbackstart', onPlaybackStart);
|
||||
Events.on(currentPlayer, 'playbackstop', onPlaybackStopped);
|
||||
Events.on(currentPlayer, 'unpause', onGeneralEvent);
|
||||
Events.on(currentPlayer, 'pause', onGeneralEvent);
|
||||
Events.on(currentPlayer, 'statechange', onStateChanged);
|
||||
Events.on(currentPlayer, 'timeupdate', onGeneralEvent);
|
||||
}
|
||||
|
||||
function execute(name) {
|
||||
|
@ -251,7 +253,7 @@ import events from 'events';
|
|||
});
|
||||
}
|
||||
|
||||
events.on(playbackManager, 'playerchange', function () {
|
||||
Events.on(playbackManager, 'playerchange', function () {
|
||||
bindToPlayer(playbackManager.getCurrentPlayer());
|
||||
});
|
||||
|
||||
|
|
|
@ -1,14 +1,16 @@
|
|||
import events from 'events';
|
||||
import datetime from 'datetime';
|
||||
import appSettings from 'appSettings';
|
||||
import itemHelper from 'itemHelper';
|
||||
import pluginManager from 'pluginManager';
|
||||
import PlayQueueManager from 'playQueueManager';
|
||||
import * as userSettings from 'userSettings';
|
||||
import globalize from 'globalize';
|
||||
import loading from 'loading';
|
||||
import appHost from 'apphost';
|
||||
import screenfull from 'screenfull';
|
||||
import { Events } from 'jellyfin-apiclient';
|
||||
import datetime from '../../scripts/datetime';
|
||||
import appSettings from '../../scripts/settings/appSettings';
|
||||
import itemHelper from '../itemHelper';
|
||||
import { pluginManager } from '../pluginManager';
|
||||
import PlayQueueManager from './playqueuemanager';
|
||||
import * as userSettings from '../../scripts/settings/userSettings';
|
||||
import globalize from '../../scripts/globalize';
|
||||
import loading from '../loading/loading';
|
||||
import { appHost } from '../apphost';
|
||||
import * as Screenfull from 'screenfull';
|
||||
import ServerConnections from '../ServerConnections';
|
||||
import alert from '../alert';
|
||||
|
||||
function enableLocalPlaylistManagement(player) {
|
||||
if (player.getPlaylist) {
|
||||
|
@ -23,14 +25,14 @@ function enableLocalPlaylistManagement(player) {
|
|||
}
|
||||
|
||||
function bindToFullscreenChange(player) {
|
||||
if (screenfull.isEnabled) {
|
||||
screenfull.on('change', function () {
|
||||
events.trigger(player, 'fullscreenchange');
|
||||
if (Screenfull.isEnabled) {
|
||||
Screenfull.on('change', function () {
|
||||
Events.trigger(player, 'fullscreenchange');
|
||||
});
|
||||
} else {
|
||||
// iOS Safari
|
||||
document.addEventListener('webkitfullscreenchange', function () {
|
||||
events.trigger(player, 'fullscreenchange');
|
||||
Events.trigger(player, 'fullscreenchange');
|
||||
}, false);
|
||||
}
|
||||
}
|
||||
|
@ -46,14 +48,14 @@ function triggerPlayerChange(playbackManagerInstance, newPlayer, newTarget, prev
|
|||
}
|
||||
}
|
||||
|
||||
events.trigger(playbackManagerInstance, 'playerchange', [newPlayer, newTarget, previousPlayer]);
|
||||
Events.trigger(playbackManagerInstance, 'playerchange', [newPlayer, newTarget, previousPlayer]);
|
||||
}
|
||||
|
||||
function reportPlayback(playbackManagerInstance, state, player, reportPlaylist, serverId, method, progressEventName) {
|
||||
if (!serverId) {
|
||||
// Not a server item
|
||||
// We can expand on this later and possibly report them
|
||||
events.trigger(playbackManagerInstance, 'reportplayback', [false]);
|
||||
Events.trigger(playbackManagerInstance, 'reportplayback', [false]);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -68,11 +70,11 @@ function reportPlayback(playbackManagerInstance, state, player, reportPlaylist,
|
|||
addPlaylistToPlaybackReport(playbackManagerInstance, info, player, serverId);
|
||||
}
|
||||
|
||||
const apiClient = window.connectionManager.getApiClient(serverId);
|
||||
const apiClient = ServerConnections.getApiClient(serverId);
|
||||
const reportPlaybackPromise = apiClient[method](info);
|
||||
// Notify that report has been sent
|
||||
reportPlaybackPromise.then(() => {
|
||||
events.trigger(playbackManagerInstance, 'reportplayback', [true]);
|
||||
Events.trigger(playbackManagerInstance, 'reportplayback', [true]);
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -105,7 +107,7 @@ function normalizeName(t) {
|
|||
}
|
||||
|
||||
function getItemsForPlayback(serverId, query) {
|
||||
const apiClient = window.connectionManager.getApiClient(serverId);
|
||||
const apiClient = ServerConnections.getApiClient(serverId);
|
||||
|
||||
if (query.Ids && query.Ids.split(',').length === 1) {
|
||||
const itemId = query.Ids.split(',');
|
||||
|
@ -619,7 +621,7 @@ function supportsDirectPlay(apiClient, item, mediaSource) {
|
|||
} else if (mediaSource.Protocol === 'File') {
|
||||
return new Promise(function (resolve, reject) {
|
||||
// Determine if the file can be accessed directly
|
||||
import('filesystem').then((filesystem) => {
|
||||
import('../../scripts/filesystem').then((filesystem) => {
|
||||
const method = isFolderRip ?
|
||||
'directoryExists' :
|
||||
'fileExists';
|
||||
|
@ -647,11 +649,9 @@ function validatePlaybackInfoResult(instance, result) {
|
|||
}
|
||||
|
||||
function showPlaybackInfoErrorMessage(instance, errorCode) {
|
||||
import('alert').then(({ default: alert }) => {
|
||||
alert({
|
||||
text: globalize.translate(errorCode),
|
||||
title: globalize.translate('HeaderPlaybackError')
|
||||
});
|
||||
alert({
|
||||
text: globalize.translate(errorCode),
|
||||
title: globalize.translate('HeaderPlaybackError')
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -852,13 +852,13 @@ class PlaybackManager {
|
|||
player.tryPair(targetInfo) :
|
||||
Promise.resolve();
|
||||
|
||||
events.trigger(self, 'pairing');
|
||||
Events.trigger(self, 'pairing');
|
||||
|
||||
promise.then(function () {
|
||||
events.trigger(self, 'paired');
|
||||
Events.trigger(self, 'paired');
|
||||
setCurrentPlayerInternal(player, targetInfo);
|
||||
}, function () {
|
||||
events.trigger(self, 'pairerror');
|
||||
Events.trigger(self, 'pairerror');
|
||||
if (currentPairingId === targetInfo.id) {
|
||||
currentPairingId = null;
|
||||
}
|
||||
|
@ -869,7 +869,7 @@ class PlaybackManager {
|
|||
const promises = players.filter(displayPlayerIndividually).map(getPlayerTargets);
|
||||
|
||||
return Promise.all(promises).then(function (responses) {
|
||||
return window.connectionManager.currentApiClient().getCurrentUser().then(function (user) {
|
||||
return ServerConnections.currentApiClient().getCurrentUser().then(function (user) {
|
||||
const targets = [];
|
||||
|
||||
targets.push({
|
||||
|
@ -1161,7 +1161,7 @@ class PlaybackManager {
|
|||
if (!brightnessOsdLoaded) {
|
||||
brightnessOsdLoaded = true;
|
||||
// TODO: Have this trigger an event instead to get the osd out of here
|
||||
import('brightnessOsd').then();
|
||||
import('./brightnessosd').then();
|
||||
}
|
||||
player.setBrightness(val);
|
||||
}
|
||||
|
@ -1367,7 +1367,7 @@ class PlaybackManager {
|
|||
function getSavedMaxStreamingBitrate(apiClient, mediaType) {
|
||||
if (!apiClient) {
|
||||
// This should hopefully never happen
|
||||
apiClient = window.connectionManager.currentApiClient();
|
||||
apiClient = ServerConnections.currentApiClient();
|
||||
}
|
||||
|
||||
const endpointInfo = apiClient.getSavedEndpointInfo() || {};
|
||||
|
@ -1390,7 +1390,7 @@ class PlaybackManager {
|
|||
const mediaType = playerData.streamInfo ? playerData.streamInfo.mediaType : null;
|
||||
const currentItem = self.currentItem(player);
|
||||
|
||||
const apiClient = currentItem ? window.connectionManager.getApiClient(currentItem.ServerId) : window.connectionManager.currentApiClient();
|
||||
const apiClient = currentItem ? ServerConnections.getApiClient(currentItem.ServerId) : ServerConnections.currentApiClient();
|
||||
return getSavedMaxStreamingBitrate(apiClient, mediaType);
|
||||
};
|
||||
|
||||
|
@ -1404,7 +1404,7 @@ class PlaybackManager {
|
|||
const mediaType = playerData.streamInfo ? playerData.streamInfo.mediaType : null;
|
||||
const currentItem = self.currentItem(player);
|
||||
|
||||
const apiClient = currentItem ? window.connectionManager.getApiClient(currentItem.ServerId) : window.connectionManager.currentApiClient();
|
||||
const apiClient = currentItem ? ServerConnections.getApiClient(currentItem.ServerId) : ServerConnections.currentApiClient();
|
||||
const endpointInfo = apiClient.getSavedEndpointInfo() || {};
|
||||
|
||||
return appSettings.enableAutomaticBitrateDetection(endpointInfo.IsInNetwork, mediaType);
|
||||
|
@ -1416,7 +1416,7 @@ class PlaybackManager {
|
|||
return player.setMaxStreamingBitrate(options);
|
||||
}
|
||||
|
||||
const apiClient = window.connectionManager.getApiClient(self.currentItem(player).ServerId);
|
||||
const apiClient = ServerConnections.getApiClient(self.currentItem(player).ServerId);
|
||||
|
||||
apiClient.getEndpointInfo().then(function (endpointInfo) {
|
||||
const playerData = getPlayerData(player);
|
||||
|
@ -1447,12 +1447,12 @@ class PlaybackManager {
|
|||
return player.isFullscreen();
|
||||
}
|
||||
|
||||
if (!screenfull.isEnabled) {
|
||||
if (!Screenfull.isEnabled) {
|
||||
// iOS Safari
|
||||
return document.webkitIsFullScreen;
|
||||
}
|
||||
|
||||
return screenfull.isFullscreen;
|
||||
return Screenfull.isFullscreen;
|
||||
};
|
||||
|
||||
self.toggleFullscreen = function (player) {
|
||||
|
@ -1461,8 +1461,8 @@ class PlaybackManager {
|
|||
return player.toggleFullscreen();
|
||||
}
|
||||
|
||||
if (screenfull.isEnabled) {
|
||||
screenfull.toggle();
|
||||
if (Screenfull.isEnabled) {
|
||||
Screenfull.toggle();
|
||||
} else {
|
||||
// iOS Safari
|
||||
if (document.webkitIsFullScreen && document.webkitCancelFullscreen) {
|
||||
|
@ -1678,7 +1678,7 @@ class PlaybackManager {
|
|||
const subtitleStreamIndex = params.SubtitleStreamIndex == null ? getPlayerData(player).subtitleStreamIndex : params.SubtitleStreamIndex;
|
||||
|
||||
let currentMediaSource = self.currentMediaSource(player);
|
||||
const apiClient = window.connectionManager.getApiClient(currentItem.ServerId);
|
||||
const apiClient = ServerConnections.getApiClient(currentItem.ServerId);
|
||||
|
||||
if (ticks) {
|
||||
ticks = parseInt(ticks);
|
||||
|
@ -1834,7 +1834,7 @@ class PlaybackManager {
|
|||
}, queryOptions));
|
||||
} else if (firstItem.Type === 'Episode' && items.length === 1 && getPlayer(firstItem, options).supportsProgress !== false) {
|
||||
promise = new Promise(function (resolve, reject) {
|
||||
const apiClient = window.connectionManager.getApiClient(firstItem.ServerId);
|
||||
const apiClient = ServerConnections.getApiClient(firstItem.ServerId);
|
||||
|
||||
apiClient.getCurrentUser().then(function (user) {
|
||||
if (!user.Configuration.EnableNextEpisodeAutoPlay || !firstItem.SeriesId) {
|
||||
|
@ -2065,7 +2065,7 @@ class PlaybackManager {
|
|||
return playOther(items, options, user);
|
||||
}
|
||||
|
||||
const apiClient = window.connectionManager.getApiClient(firstItem.ServerId);
|
||||
const apiClient = ServerConnections.getApiClient(firstItem.ServerId);
|
||||
|
||||
return getIntros(firstItem, apiClient, options).then(function (introsResult) {
|
||||
const introItems = introsResult.Items;
|
||||
|
@ -2128,14 +2128,14 @@ class PlaybackManager {
|
|||
const mediaType = item.MediaType;
|
||||
|
||||
const onBitrateDetectionFailure = function () {
|
||||
return playAfterBitrateDetect(getSavedMaxStreamingBitrate(window.connectionManager.getApiClient(item.ServerId), mediaType), item, playOptions, onPlaybackStartedFn);
|
||||
return playAfterBitrateDetect(getSavedMaxStreamingBitrate(ServerConnections.getApiClient(item.ServerId), mediaType), item, playOptions, onPlaybackStartedFn);
|
||||
};
|
||||
|
||||
if (!isServerItem(item) || itemHelper.isLocalItem(item)) {
|
||||
return onBitrateDetectionFailure();
|
||||
}
|
||||
|
||||
const apiClient = window.connectionManager.getApiClient(item.ServerId);
|
||||
const apiClient = ServerConnections.getApiClient(item.ServerId);
|
||||
apiClient.getEndpointInfo().then(function (endpointInfo) {
|
||||
if ((mediaType === 'Video' || mediaType === 'Audio') && appSettings.enableAutomaticBitrateDetection(endpointInfo.IsInNetwork, mediaType)) {
|
||||
return apiClient.detectBitrate().then(function (bitrate) {
|
||||
|
@ -2158,7 +2158,7 @@ class PlaybackManager {
|
|||
removeCurrentPlayer(player);
|
||||
}
|
||||
|
||||
events.trigger(self, 'playbackcancelled');
|
||||
Events.trigger(self, 'playbackcancelled');
|
||||
|
||||
return Promise.reject();
|
||||
}
|
||||
|
@ -2255,7 +2255,7 @@ class PlaybackManager {
|
|||
return Promise.all([promise, player.getDeviceProfile(item)]).then(function (responses) {
|
||||
const deviceProfile = responses[1];
|
||||
|
||||
const apiClient = window.connectionManager.getApiClient(item.ServerId);
|
||||
const apiClient = ServerConnections.getApiClient(item.ServerId);
|
||||
|
||||
const mediaSourceId = playOptions.mediaSourceId;
|
||||
const audioStreamIndex = playOptions.audioStreamIndex;
|
||||
|
@ -2300,11 +2300,11 @@ class PlaybackManager {
|
|||
const startPosition = options.startPositionTicks || 0;
|
||||
const mediaType = options.mediaType || item.MediaType;
|
||||
const player = getPlayer(item, options);
|
||||
const apiClient = window.connectionManager.getApiClient(item.ServerId);
|
||||
const apiClient = ServerConnections.getApiClient(item.ServerId);
|
||||
|
||||
// Call this just to ensure the value is recorded, it is needed with getSavedMaxStreamingBitrate
|
||||
return apiClient.getEndpointInfo().then(function () {
|
||||
const maxBitrate = getSavedMaxStreamingBitrate(window.connectionManager.getApiClient(item.ServerId), mediaType);
|
||||
const maxBitrate = getSavedMaxStreamingBitrate(ServerConnections.getApiClient(item.ServerId), mediaType);
|
||||
|
||||
return player.getDeviceProfile(item).then(function (deviceProfile) {
|
||||
return getPlaybackMediaSource(player, apiClient, deviceProfile, maxBitrate, item, startPosition, options.mediaSourceId, options.audioStreamIndex, options.subtitleStreamIndex).then(function (mediaSource) {
|
||||
|
@ -2320,11 +2320,11 @@ class PlaybackManager {
|
|||
const mediaType = options.mediaType || item.MediaType;
|
||||
// TODO: Remove the true forceLocalPlayer hack
|
||||
const player = getPlayer(item, options, true);
|
||||
const apiClient = window.connectionManager.getApiClient(item.ServerId);
|
||||
const apiClient = ServerConnections.getApiClient(item.ServerId);
|
||||
|
||||
// Call this just to ensure the value is recorded, it is needed with getSavedMaxStreamingBitrate
|
||||
return apiClient.getEndpointInfo().then(function () {
|
||||
const maxBitrate = getSavedMaxStreamingBitrate(window.connectionManager.getApiClient(item.ServerId), mediaType);
|
||||
const maxBitrate = getSavedMaxStreamingBitrate(ServerConnections.getApiClient(item.ServerId), mediaType);
|
||||
|
||||
return player.getDeviceProfile(item).then(function (deviceProfile) {
|
||||
return getPlaybackInfo(player, apiClient, item, deviceProfile, maxBitrate, startPosition, false, null, null, null, null).then(function (playbackInfoResult) {
|
||||
|
@ -2549,7 +2549,7 @@ class PlaybackManager {
|
|||
|
||||
const isCurrentIndex = removeResult.isCurrentIndex;
|
||||
|
||||
events.trigger(player, 'playlistitemremove', [
|
||||
Events.trigger(player, 'playlistitemremove', [
|
||||
{
|
||||
playlistItemIds: playlistItemIds
|
||||
}
|
||||
|
@ -2574,7 +2574,7 @@ class PlaybackManager {
|
|||
return;
|
||||
}
|
||||
|
||||
events.trigger(player, 'playlistitemmove', [
|
||||
Events.trigger(player, 'playlistitemmove', [
|
||||
{
|
||||
playlistItemId: moveResult.playlistItemId,
|
||||
newIndex: moveResult.newIndex
|
||||
|
@ -2708,7 +2708,7 @@ class PlaybackManager {
|
|||
const queueDirectToPlayer = player && !enableLocalPlaylistManagement(player);
|
||||
|
||||
if (queueDirectToPlayer) {
|
||||
const apiClient = window.connectionManager.getApiClient(items[0].ServerId);
|
||||
const apiClient = ServerConnections.getApiClient(items[0].ServerId);
|
||||
|
||||
player.getDeviceProfile(items[0]).then(function (profile) {
|
||||
setStreamUrls(items, profile, self.getMaxStreamingBitrate(player), apiClient, 0).then(function () {
|
||||
|
@ -2728,7 +2728,7 @@ class PlaybackManager {
|
|||
} else {
|
||||
self._playQueueManager.queue(items);
|
||||
}
|
||||
events.trigger(player, 'playlistitemadd');
|
||||
Events.trigger(player, 'playlistitemadd');
|
||||
}
|
||||
|
||||
function onPlayerProgressInterval() {
|
||||
|
@ -2780,8 +2780,8 @@ class PlaybackManager {
|
|||
|
||||
state.IsFirstItem = isFirstItem;
|
||||
state.IsFullscreen = fullscreen;
|
||||
events.trigger(player, 'playbackstart', [state]);
|
||||
events.trigger(self, 'playbackstart', [player, state]);
|
||||
Events.trigger(player, 'playbackstart', [state]);
|
||||
Events.trigger(self, 'playbackstart', [player, state]);
|
||||
|
||||
// only used internally as a safeguard to avoid reporting other events to the server before playback start
|
||||
streamInfo.started = true;
|
||||
|
@ -2811,8 +2811,8 @@ class PlaybackManager {
|
|||
|
||||
state.IsFirstItem = isFirstItem;
|
||||
state.IsFullscreen = fullscreen;
|
||||
events.trigger(player, 'playbackstart', [state]);
|
||||
events.trigger(self, 'playbackstart', [player, state]);
|
||||
Events.trigger(player, 'playbackstart', [state]);
|
||||
Events.trigger(self, 'playbackstart', [player, state]);
|
||||
|
||||
// only used internally as a safeguard to avoid reporting other events to the server before playback start
|
||||
streamInfo.started = true;
|
||||
|
@ -2851,8 +2851,8 @@ class PlaybackManager {
|
|||
|
||||
state.NextItem = playbackStopInfo.nextItem;
|
||||
|
||||
events.trigger(player, 'playbackstop', [state]);
|
||||
events.trigger(self, 'playbackstop', [playbackStopInfo]);
|
||||
Events.trigger(player, 'playbackstop', [state]);
|
||||
Events.trigger(self, 'playbackstop', [playbackStopInfo]);
|
||||
|
||||
const nextItemPlayOptions = nextItem ? (nextItem.item.playOptions || getDefaultPlayOptions()) : getDefaultPlayOptions();
|
||||
const newPlayer = nextItem ? getPlayer(nextItem.item, nextItemPlayOptions) : null;
|
||||
|
@ -2953,8 +2953,8 @@ class PlaybackManager {
|
|||
self._playQueueManager.reset();
|
||||
}
|
||||
|
||||
events.trigger(player, 'playbackstop', [state]);
|
||||
events.trigger(self, 'playbackstop', [playbackStopInfo]);
|
||||
Events.trigger(player, 'playbackstop', [state]);
|
||||
Events.trigger(self, 'playbackstop', [playbackStopInfo]);
|
||||
|
||||
const nextItemPlayOptions = nextItem ? (nextItem.item.playOptions || getDefaultPlayOptions()) : getDefaultPlayOptions();
|
||||
const newPlayer = nextItem ? getPlayer(nextItem.item, nextItemPlayOptions) : null;
|
||||
|
@ -3000,7 +3000,7 @@ class PlaybackManager {
|
|||
reportPlayback(self, state, activePlayer, true, serverId, 'reportPlaybackStopped');
|
||||
}
|
||||
|
||||
events.trigger(self, 'playbackstop', [{
|
||||
Events.trigger(self, 'playbackstop', [{
|
||||
player: activePlayer,
|
||||
state: state,
|
||||
nextItem: newItem,
|
||||
|
@ -3011,8 +3011,8 @@ class PlaybackManager {
|
|||
|
||||
function bindStopped(player) {
|
||||
if (enableLocalPlaylistManagement(player)) {
|
||||
events.off(player, 'stopped', onPlaybackStopped);
|
||||
events.on(player, 'stopped', onPlaybackStopped);
|
||||
Events.off(player, 'stopped', onPlaybackStopped);
|
||||
Events.on(player, 'stopped', onPlaybackStopped);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3062,7 +3062,7 @@ class PlaybackManager {
|
|||
}
|
||||
|
||||
function unbindStopped(player) {
|
||||
events.off(player, 'stopped', onPlaybackStopped);
|
||||
Events.off(player, 'stopped', onPlaybackStopped);
|
||||
}
|
||||
|
||||
function initLegacyVolumeMethods(player) {
|
||||
|
@ -3091,28 +3091,28 @@ class PlaybackManager {
|
|||
}
|
||||
|
||||
if (enableLocalPlaylistManagement(player)) {
|
||||
events.on(player, 'error', onPlaybackError);
|
||||
events.on(player, 'timeupdate', onPlaybackTimeUpdate);
|
||||
events.on(player, 'pause', onPlaybackPause);
|
||||
events.on(player, 'unpause', onPlaybackUnpause);
|
||||
events.on(player, 'volumechange', onPlaybackVolumeChange);
|
||||
events.on(player, 'repeatmodechange', onRepeatModeChange);
|
||||
events.on(player, 'shufflequeuemodechange', onShuffleQueueModeChange);
|
||||
events.on(player, 'playlistitemmove', onPlaylistItemMove);
|
||||
events.on(player, 'playlistitemremove', onPlaylistItemRemove);
|
||||
events.on(player, 'playlistitemadd', onPlaylistItemAdd);
|
||||
Events.on(player, 'error', onPlaybackError);
|
||||
Events.on(player, 'timeupdate', onPlaybackTimeUpdate);
|
||||
Events.on(player, 'pause', onPlaybackPause);
|
||||
Events.on(player, 'unpause', onPlaybackUnpause);
|
||||
Events.on(player, 'volumechange', onPlaybackVolumeChange);
|
||||
Events.on(player, 'repeatmodechange', onRepeatModeChange);
|
||||
Events.on(player, 'shufflequeuemodechange', onShuffleQueueModeChange);
|
||||
Events.on(player, 'playlistitemmove', onPlaylistItemMove);
|
||||
Events.on(player, 'playlistitemremove', onPlaylistItemRemove);
|
||||
Events.on(player, 'playlistitemadd', onPlaylistItemAdd);
|
||||
} else if (player.isLocalPlayer) {
|
||||
events.on(player, 'itemstarted', onPlaybackStartedFromSelfManagingPlayer);
|
||||
events.on(player, 'itemstopped', onPlaybackStoppedFromSelfManagingPlayer);
|
||||
events.on(player, 'timeupdate', onPlaybackTimeUpdate);
|
||||
events.on(player, 'pause', onPlaybackPause);
|
||||
events.on(player, 'unpause', onPlaybackUnpause);
|
||||
events.on(player, 'volumechange', onPlaybackVolumeChange);
|
||||
events.on(player, 'repeatmodechange', onRepeatModeChange);
|
||||
events.on(player, 'shufflequeuemodechange', onShuffleQueueModeChange);
|
||||
events.on(player, 'playlistitemmove', onPlaylistItemMove);
|
||||
events.on(player, 'playlistitemremove', onPlaylistItemRemove);
|
||||
events.on(player, 'playlistitemadd', onPlaylistItemAdd);
|
||||
Events.on(player, 'itemstarted', onPlaybackStartedFromSelfManagingPlayer);
|
||||
Events.on(player, 'itemstopped', onPlaybackStoppedFromSelfManagingPlayer);
|
||||
Events.on(player, 'timeupdate', onPlaybackTimeUpdate);
|
||||
Events.on(player, 'pause', onPlaybackPause);
|
||||
Events.on(player, 'unpause', onPlaybackUnpause);
|
||||
Events.on(player, 'volumechange', onPlaybackVolumeChange);
|
||||
Events.on(player, 'repeatmodechange', onRepeatModeChange);
|
||||
Events.on(player, 'shufflequeuemodechange', onShuffleQueueModeChange);
|
||||
Events.on(player, 'playlistitemmove', onPlaylistItemMove);
|
||||
Events.on(player, 'playlistitemremove', onPlaylistItemRemove);
|
||||
Events.on(player, 'playlistitemadd', onPlaylistItemAdd);
|
||||
}
|
||||
|
||||
if (player.isLocalPlayer) {
|
||||
|
@ -3121,13 +3121,13 @@ class PlaybackManager {
|
|||
bindStopped(player);
|
||||
}
|
||||
|
||||
events.on(pluginManager, 'registered', function (e, plugin) {
|
||||
Events.on(pluginManager, 'registered', function (e, plugin) {
|
||||
if (plugin.type === 'mediaplayer') {
|
||||
initMediaPlayer(plugin);
|
||||
}
|
||||
});
|
||||
|
||||
pluginManager.ofType('mediaplayer').map(initMediaPlayer);
|
||||
pluginManager.ofType('mediaplayer').forEach(initMediaPlayer);
|
||||
|
||||
function sendProgressUpdate(player, progressEventName, reportPlaylist) {
|
||||
if (!player) {
|
||||
|
@ -3158,15 +3158,15 @@ class PlaybackManager {
|
|||
|
||||
streamInfo.lastMediaInfoQuery = new Date().getTime();
|
||||
|
||||
const apiClient = window.connectionManager.getApiClient(serverId);
|
||||
const apiClient = ServerConnections.getApiClient(serverId);
|
||||
|
||||
if (!apiClient.isMinServerVersion('3.2.70.7')) {
|
||||
return;
|
||||
}
|
||||
|
||||
window.connectionManager.getApiClient(serverId).getLiveStreamMediaInfo(liveStreamId).then(function (info) {
|
||||
ServerConnections.getApiClient(serverId).getLiveStreamMediaInfo(liveStreamId).then(function (info) {
|
||||
mediaSource.MediaStreams = info.MediaStreams;
|
||||
events.trigger(player, 'mediastreamschange');
|
||||
Events.trigger(player, 'mediastreamschange');
|
||||
}, function () {
|
||||
});
|
||||
}
|
||||
|
@ -3191,9 +3191,9 @@ class PlaybackManager {
|
|||
};
|
||||
|
||||
if (appHost.supports('remotecontrol')) {
|
||||
import('serverNotifications').then(({ default: serverNotifications }) => {
|
||||
events.on(serverNotifications, 'ServerShuttingDown', self.setDefaultPlayerActive.bind(self));
|
||||
events.on(serverNotifications, 'ServerRestarting', self.setDefaultPlayerActive.bind(self));
|
||||
import('../../scripts/serverNotifications').then(({ default: serverNotifications }) => {
|
||||
Events.on(serverNotifications, 'ServerShuttingDown', self.setDefaultPlayerActive.bind(self));
|
||||
Events.on(serverNotifications, 'ServerRestarting', self.setDefaultPlayerActive.bind(self));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -3221,7 +3221,7 @@ class PlaybackManager {
|
|||
return Promise.reject();
|
||||
}
|
||||
|
||||
const apiClient = window.connectionManager.getApiClient(nextItem.item.ServerId);
|
||||
const apiClient = ServerConnections.getApiClient(nextItem.item.ServerId);
|
||||
return apiClient.getItem(apiClient.getCurrentUserId(), nextItem.item.Id);
|
||||
}
|
||||
|
||||
|
@ -3362,7 +3362,7 @@ class PlaybackManager {
|
|||
return player.playTrailers(item);
|
||||
}
|
||||
|
||||
const apiClient = window.connectionManager.getApiClient(item.ServerId);
|
||||
const apiClient = ServerConnections.getApiClient(item.ServerId);
|
||||
|
||||
const instance = this;
|
||||
|
||||
|
@ -3394,7 +3394,7 @@ class PlaybackManager {
|
|||
}
|
||||
|
||||
getSubtitleUrl(textStream, serverId) {
|
||||
const apiClient = window.connectionManager.getApiClient(serverId);
|
||||
const apiClient = ServerConnections.getApiClient(serverId);
|
||||
|
||||
return !textStream.IsExternalUrl ? apiClient.getUrl(textStream.DeliveryUrl) : textStream.DeliveryUrl;
|
||||
}
|
||||
|
@ -3474,7 +3474,7 @@ class PlaybackManager {
|
|||
return player.instantMix(item);
|
||||
}
|
||||
|
||||
const apiClient = window.connectionManager.getApiClient(item.ServerId);
|
||||
const apiClient = ServerConnections.getApiClient(item.ServerId);
|
||||
|
||||
const options = {};
|
||||
options.UserId = apiClient.getCurrentUserId();
|
||||
|
@ -3589,7 +3589,7 @@ class PlaybackManager {
|
|||
}
|
||||
|
||||
this._playQueueManager.setRepeatMode(value);
|
||||
events.trigger(player, 'repeatmodechange');
|
||||
Events.trigger(player, 'repeatmodechange');
|
||||
}
|
||||
|
||||
getRepeatMode(player = this._currentPlayer) {
|
||||
|
@ -3606,7 +3606,7 @@ class PlaybackManager {
|
|||
}
|
||||
|
||||
this._playQueueManager.setShuffleMode(value);
|
||||
events.trigger(player, 'shufflequeuemodechange');
|
||||
Events.trigger(player, 'shufflequeuemodechange');
|
||||
}
|
||||
|
||||
getQueueShuffleMode(player = this._currentPlayer) {
|
||||
|
@ -3634,7 +3634,7 @@ class PlaybackManager {
|
|||
} else {
|
||||
this._playQueueManager.toggleShuffleMode();
|
||||
}
|
||||
events.trigger(player, 'shufflequeuemodechange');
|
||||
Events.trigger(player, 'shufflequeuemodechange');
|
||||
}
|
||||
|
||||
clearQueue(clearCurrentItem = false, player = this._currentPlayer) {
|
||||
|
@ -3643,7 +3643,7 @@ class PlaybackManager {
|
|||
}
|
||||
|
||||
this._playQueueManager.clearPlaylist(clearCurrentItem);
|
||||
events.trigger(player, 'playlistitemremove');
|
||||
Events.trigger(player, 'playlistitemremove');
|
||||
}
|
||||
|
||||
trySetActiveDeviceName(name) {
|
||||
|
@ -3758,4 +3758,12 @@ class PlaybackManager {
|
|||
}
|
||||
}
|
||||
|
||||
export default new PlaybackManager();
|
||||
export const playbackManager = new PlaybackManager();
|
||||
|
||||
window.addEventListener('beforeunload', function () {
|
||||
try {
|
||||
playbackManager.onAppClose();
|
||||
} catch (err) {
|
||||
console.error('error in onAppClose: ' + err);
|
||||
}
|
||||
});
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import playbackManager from 'playbackManager';
|
||||
import layoutManager from 'layoutManager';
|
||||
import events from 'events';
|
||||
|
||||
import { playbackManager } from './playbackmanager';
|
||||
import layoutManager from '../layoutManager';
|
||||
import { Events } from 'jellyfin-apiclient';
|
||||
|
||||
let orientationLocked;
|
||||
|
||||
|
@ -13,7 +14,7 @@ function onOrientationChangeError(err) {
|
|||
console.error('error locking orientation: ' + err);
|
||||
}
|
||||
|
||||
events.on(playbackManager, 'playbackstart', function (e, player, state) {
|
||||
Events.on(playbackManager, 'playbackstart', function (e, player, state) {
|
||||
const isLocalVideo = player.isLocalPlayer && !player.isExternalPlayer && playbackManager.isPlayingVideo(player);
|
||||
|
||||
if (isLocalVideo && layoutManager.mobile) {
|
||||
|
@ -36,7 +37,7 @@ events.on(playbackManager, 'playbackstart', function (e, player, state) {
|
|||
}
|
||||
});
|
||||
|
||||
events.on(playbackManager, 'playbackstop', function (e, playbackStopInfo) {
|
||||
Events.on(playbackManager, 'playbackstop', function (e, playbackStopInfo) {
|
||||
if (orientationLocked && !playbackStopInfo.nextMediaType) {
|
||||
/* eslint-disable-next-line compat/compat */
|
||||
const unlockOrientation = window.screen.unlockOrientation || window.screen.mozUnlockOrientation || window.screen.msUnlockOrientation || (window.screen.orientation && window.screen.orientation.unlock);
|
||||
|
|
|
@ -1,12 +1,16 @@
|
|||
import appSettings from 'appSettings';
|
||||
import events from 'events';
|
||||
import browser from 'browser';
|
||||
import loading from 'loading';
|
||||
import playbackManager from 'playbackManager';
|
||||
import appRouter from 'appRouter';
|
||||
import globalize from 'globalize';
|
||||
import appHost from 'apphost';
|
||||
import * as autocast from 'autocast';
|
||||
import appSettings from '../../scripts/settings/appSettings';
|
||||
import { Events } from 'jellyfin-apiclient';
|
||||
import browser from '../../scripts/browser';
|
||||
import loading from '../loading/loading';
|
||||
import { playbackManager } from '../playback/playbackmanager';
|
||||
import { appRouter } from '../appRouter';
|
||||
import globalize from '../../scripts/globalize';
|
||||
import { appHost } from '../apphost';
|
||||
import { enable, isEnabled, supported } from '../../scripts/autocast';
|
||||
import '../../elements/emby-checkbox/emby-checkbox';
|
||||
import '../../elements/emby-button/emby-button';
|
||||
import dialog from '../dialog/dialog';
|
||||
import dialogHelper from '../dialogHelper/dialogHelper';
|
||||
|
||||
function mirrorItem(info, player) {
|
||||
const item = info.item;
|
||||
|
@ -108,7 +112,7 @@ export function show(button) {
|
|||
};
|
||||
});
|
||||
|
||||
import('actionsheet').then(({default: actionsheet}) => {
|
||||
import('../actionSheet/actionSheet').then((actionsheet) => {
|
||||
loading.hide();
|
||||
|
||||
const menuOptions = {
|
||||
|
@ -140,54 +144,45 @@ export function show(button) {
|
|||
}
|
||||
|
||||
function showActivePlayerMenu(playerInfo) {
|
||||
Promise.all([
|
||||
import('dialogHelper'),
|
||||
import('dialog'),
|
||||
import('emby-checkbox'),
|
||||
import('emby-button')
|
||||
]).then(([dialogHelper]) => {
|
||||
showActivePlayerMenuInternal(dialogHelper, playerInfo);
|
||||
});
|
||||
showActivePlayerMenuInternal(playerInfo);
|
||||
}
|
||||
|
||||
function disconnectFromPlayer(currentDeviceName) {
|
||||
if (playbackManager.getSupportedCommands().indexOf('EndSession') !== -1) {
|
||||
import('dialog').then(({default: dialog}) => {
|
||||
const menuItems = [];
|
||||
const menuItems = [];
|
||||
|
||||
menuItems.push({
|
||||
name: globalize.translate('Yes'),
|
||||
id: 'yes'
|
||||
});
|
||||
menuItems.push({
|
||||
name: globalize.translate('No'),
|
||||
id: 'no'
|
||||
});
|
||||
menuItems.push({
|
||||
name: globalize.translate('Yes'),
|
||||
id: 'yes'
|
||||
});
|
||||
menuItems.push({
|
||||
name: globalize.translate('No'),
|
||||
id: 'no'
|
||||
});
|
||||
|
||||
dialog({
|
||||
buttons: menuItems,
|
||||
text: globalize.translate('ConfirmEndPlayerSession', currentDeviceName)
|
||||
dialog.show({
|
||||
buttons: menuItems,
|
||||
text: globalize.translate('ConfirmEndPlayerSession', currentDeviceName)
|
||||
|
||||
}).then(function (id) {
|
||||
switch (id) {
|
||||
case 'yes':
|
||||
playbackManager.getCurrentPlayer().endSession();
|
||||
playbackManager.setDefaultPlayerActive();
|
||||
break;
|
||||
case 'no':
|
||||
playbackManager.setDefaultPlayerActive();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
});
|
||||
}).then(function (id) {
|
||||
switch (id) {
|
||||
case 'yes':
|
||||
playbackManager.getCurrentPlayer().endSession();
|
||||
playbackManager.setDefaultPlayerActive();
|
||||
break;
|
||||
case 'no':
|
||||
playbackManager.setDefaultPlayerActive();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
});
|
||||
} else {
|
||||
playbackManager.setDefaultPlayerActive();
|
||||
}
|
||||
}
|
||||
|
||||
function showActivePlayerMenuInternal(dialogHelper, playerInfo) {
|
||||
function showActivePlayerMenuInternal(playerInfo) {
|
||||
let html = '';
|
||||
|
||||
const dialogOptions = {
|
||||
|
@ -222,9 +217,9 @@ function showActivePlayerMenuInternal(dialogHelper, playerInfo) {
|
|||
|
||||
html += '</div>';
|
||||
|
||||
if (autocast.supported()) {
|
||||
if (supported()) {
|
||||
html += '<div><label class="checkboxContainer">';
|
||||
const checkedHtmlAC = autocast.isEnabled() ? ' checked' : '';
|
||||
const checkedHtmlAC = isEnabled() ? ' checked' : '';
|
||||
html += '<input type="checkbox" is="emby-checkbox" class="chkAutoCast"' + checkedHtmlAC + '/>';
|
||||
html += '<span>' + globalize.translate('EnableAutoCast') + '</span>';
|
||||
html += '</label></div>';
|
||||
|
@ -285,7 +280,7 @@ function onMirrorChange() {
|
|||
}
|
||||
|
||||
function onAutoCastChange() {
|
||||
autocast.enable(this.checked);
|
||||
enable(this.checked);
|
||||
}
|
||||
|
||||
document.addEventListener('viewshow', function (e) {
|
||||
|
@ -300,21 +295,21 @@ document.addEventListener('viewshow', function (e) {
|
|||
}
|
||||
});
|
||||
|
||||
events.on(appSettings, 'change', function (e, name) {
|
||||
Events.on(appSettings, 'change', function (e, name) {
|
||||
if (name === 'displaymirror') {
|
||||
mirrorIfEnabled();
|
||||
}
|
||||
});
|
||||
|
||||
events.on(playbackManager, 'pairing', function (e) {
|
||||
Events.on(playbackManager, 'pairing', function (e) {
|
||||
loading.show();
|
||||
});
|
||||
|
||||
events.on(playbackManager, 'paired', function (e) {
|
||||
Events.on(playbackManager, 'paired', function (e) {
|
||||
loading.hide();
|
||||
});
|
||||
|
||||
events.on(playbackManager, 'pairerror', function (e) {
|
||||
Events.on(playbackManager, 'pairerror', function (e) {
|
||||
loading.hide();
|
||||
});
|
||||
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
import actionsheet from 'actionsheet';
|
||||
import playbackManager from 'playbackManager';
|
||||
import globalize from 'globalize';
|
||||
import qualityoptions from 'qualityoptions';
|
||||
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) {
|
||||
|
@ -32,18 +33,18 @@ function showQualityMenu(player, btn) {
|
|||
return opt;
|
||||
});
|
||||
|
||||
let selectedId = options.filter(function (o) {
|
||||
const selectedId = options.filter(function (o) {
|
||||
return o.selected;
|
||||
});
|
||||
|
||||
selectedId = selectedId.length ? selectedId[0].bitrate : null;
|
||||
const selectedBitrate = selectedId.length ? selectedId[0].bitrate : null;
|
||||
|
||||
return actionsheet.show({
|
||||
items: menuItems,
|
||||
positionTo: btn
|
||||
}).then(function (id) {
|
||||
const bitrate = parseInt(id);
|
||||
if (bitrate !== selectedId) {
|
||||
if (bitrate !== selectedBitrate) {
|
||||
playbackManager.setMaxStreamingBitrate({
|
||||
enableAutomaticBitrateDetection: bitrate ? false : true,
|
||||
maxBitrate: bitrate
|
||||
|
@ -250,7 +251,7 @@ export function show(options) {
|
|||
return showWithUser(options, player, null);
|
||||
}
|
||||
|
||||
const apiClient = window.connectionManager.getApiClient(currentItem.ServerId);
|
||||
const apiClient = ServerConnections.getApiClient(currentItem.ServerId);
|
||||
return apiClient.getCurrentUser().then(function (user) {
|
||||
return showWithUser(options, player, user);
|
||||
});
|
||||
|
|
|
@ -3,7 +3,9 @@ export function getDisplayPlayMethod(session) {
|
|||
return null;
|
||||
}
|
||||
|
||||
if (session.TranscodingInfo && session.TranscodingInfo.IsVideoDirect) {
|
||||
if (session.TranscodingInfo && session.TranscodingInfo.IsVideoDirect && session.TranscodingInfo.IsAudioDirect) {
|
||||
return 'Remux';
|
||||
} else if (session.TranscodingInfo && session.TranscodingInfo.IsVideoDirect) {
|
||||
return 'DirectStream';
|
||||
} else if (session.PlayState.PlayMethod === 'Transcode') {
|
||||
return 'Transcode';
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import events from 'events';
|
||||
import playbackManager from 'playbackManager';
|
||||
import { Events } from 'jellyfin-apiclient';
|
||||
import { playbackManager } from '../playback/playbackmanager';
|
||||
|
||||
function transferPlayback(oldPlayer, newPlayer) {
|
||||
const state = playbackManager.getPlayerState(oldPlayer);
|
||||
|
@ -26,7 +26,7 @@ function transferPlayback(oldPlayer, newPlayer) {
|
|||
});
|
||||
}
|
||||
|
||||
events.on(playbackManager, 'playerchange', (e, newPlayer, newTarget, oldPlayer) => {
|
||||
Events.on(playbackManager, 'playerchange', (e, newPlayer, newTarget, oldPlayer) => {
|
||||
if (!oldPlayer || !newPlayer) {
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
import events from 'events';
|
||||
import playbackManager from 'playbackManager';
|
||||
import dom from 'dom';
|
||||
import browser from 'browser';
|
||||
import 'css!./iconosd';
|
||||
import 'material-icons';
|
||||
|
||||
import { Events } from 'jellyfin-apiclient';
|
||||
import { playbackManager } from './playbackmanager';
|
||||
import dom from '../../scripts/dom';
|
||||
import browser from '../../scripts/browser';
|
||||
import './iconosd.css';
|
||||
import 'material-design-icons-iconfont';
|
||||
|
||||
let currentPlayer;
|
||||
let osdElement;
|
||||
|
@ -111,8 +112,8 @@ function releaseCurrentPlayer() {
|
|||
const player = currentPlayer;
|
||||
|
||||
if (player) {
|
||||
events.off(player, 'volumechange', onVolumeChanged);
|
||||
events.off(player, 'playbackstop', hideOsd);
|
||||
Events.off(player, 'volumechange', onVolumeChanged);
|
||||
Events.off(player, 'playbackstop', hideOsd);
|
||||
currentPlayer = null;
|
||||
}
|
||||
}
|
||||
|
@ -141,11 +142,11 @@ function bindToPlayer(player) {
|
|||
}
|
||||
|
||||
hideOsd();
|
||||
events.on(player, 'volumechange', onVolumeChanged);
|
||||
events.on(player, 'playbackstop', hideOsd);
|
||||
Events.on(player, 'volumechange', onVolumeChanged);
|
||||
Events.on(player, 'playbackstop', hideOsd);
|
||||
}
|
||||
|
||||
events.on(playbackManager, 'playerchange', function () {
|
||||
Events.on(playbackManager, 'playerchange', function () {
|
||||
bindToPlayer(playbackManager.getCurrentPlayer());
|
||||
});
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue