mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
Disallow block padding
This commit is contained in:
parent
454b81a037
commit
5e1b6acffe
126 changed files with 2 additions and 2127 deletions
|
@ -23,9 +23,7 @@ class BackdropScreensaver {
|
|||
|
||||
const apiClient = connectionManager.currentApiClient();
|
||||
apiClient.getItems(apiClient.getCurrentUserId(), query).then((result) => {
|
||||
|
||||
if (result.Items.length) {
|
||||
|
||||
import('slideshow').then(({default: Slideshow}) => {
|
||||
const newSlideShow = new Slideshow({
|
||||
showTitle: true,
|
||||
|
|
|
@ -11,7 +11,6 @@ define(['events'], function (events) {
|
|||
// This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.
|
||||
// http://creativecommons.org/licenses/by-sa/4.0/
|
||||
(function () {
|
||||
|
||||
// Original URL regex from the Android android.text.util.Linkify function, found here:
|
||||
// http://stackoverflow.com/a/19696443
|
||||
//
|
||||
|
@ -152,14 +151,12 @@ define(['events'], function (events) {
|
|||
var cache = {};
|
||||
|
||||
function isValidIpAddress(address) {
|
||||
|
||||
var links = LinkParser.parse(address);
|
||||
|
||||
return links.length == 1;
|
||||
}
|
||||
|
||||
function isLocalIpAddress(address) {
|
||||
|
||||
address = address.toLowerCase();
|
||||
|
||||
if (address.indexOf('127.0.0.1') !== -1) {
|
||||
|
@ -173,7 +170,6 @@ define(['events'], function (events) {
|
|||
}
|
||||
|
||||
function getServerAddress(apiClient) {
|
||||
|
||||
var serverAddress = apiClient.serverAddress();
|
||||
|
||||
if (isValidIpAddress(serverAddress) && !isLocalIpAddress(serverAddress)) {
|
||||
|
@ -215,7 +211,6 @@ define(['events'], function (events) {
|
|||
}
|
||||
|
||||
function getCachedValue(key) {
|
||||
|
||||
var obj = cache[key];
|
||||
|
||||
if (obj && (new Date().getTime() - obj.time) < 180000) {
|
||||
|
|
|
@ -8,7 +8,6 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
|
|||
var PlayerName = 'Google Cast';
|
||||
|
||||
function sendConnectionResult(isOk) {
|
||||
|
||||
var resolve = currentResolve;
|
||||
var reject = currentReject;
|
||||
|
||||
|
@ -60,7 +59,6 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
|
|||
var messageNamespace = 'urn:x-cast:com.connectsdk';
|
||||
|
||||
var CastPlayer = function () {
|
||||
|
||||
/* device variables */
|
||||
// @type {DEVICE_STATE} A state for device
|
||||
this.deviceState = DEVICE_STATE.IDLE;
|
||||
|
@ -325,7 +323,6 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
|
|||
};
|
||||
|
||||
CastPlayer.prototype.sendMessage = function (message) {
|
||||
|
||||
var player = this;
|
||||
|
||||
var receiverName = null;
|
||||
|
@ -391,7 +388,6 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
|
|||
* @param {Object} mediaSession A new media object.
|
||||
*/
|
||||
CastPlayer.prototype.onMediaDiscovered = function (how, mediaSession) {
|
||||
|
||||
console.debug('chromecast new media session ID:' + mediaSession.mediaSessionId + ' (' + how + ')');
|
||||
this.currentMediaSession = mediaSession;
|
||||
|
||||
|
@ -453,9 +449,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
|
|||
};
|
||||
|
||||
function normalizeImages(state) {
|
||||
|
||||
if (state && state.NowPlayingItem) {
|
||||
|
||||
var item = state.NowPlayingItem;
|
||||
|
||||
if (!item.ImageTags || !item.ImageTags.Primary) {
|
||||
|
@ -475,7 +469,6 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
|
|||
}
|
||||
|
||||
function getItemsForPlayback(apiClient, query) {
|
||||
|
||||
var userId = apiClient.getCurrentUserId();
|
||||
|
||||
if (query.Ids && query.Ids.split(',').length === 1) {
|
||||
|
@ -486,7 +479,6 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
|
|||
};
|
||||
});
|
||||
} else {
|
||||
|
||||
query.Limit = query.Limit || 100;
|
||||
query.ExcludeLocationTypes = 'Virtual';
|
||||
query.EnableTotalRecordCount = false;
|
||||
|
@ -496,9 +488,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
|
|||
}
|
||||
|
||||
function bindEventForRelay(instance, eventName) {
|
||||
|
||||
events.on(instance._castPlayer, eventName, function (e, data) {
|
||||
|
||||
console.debug('cc: ' + eventName);
|
||||
var state = instance.getPlayerStateInternal(data);
|
||||
|
||||
|
@ -507,7 +497,6 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
|
|||
}
|
||||
|
||||
function initializeChromecast() {
|
||||
|
||||
var instance = this;
|
||||
instance._castPlayer = new CastPlayer();
|
||||
|
||||
|
@ -519,7 +508,6 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
|
|||
}));
|
||||
|
||||
events.on(instance._castPlayer, 'connect', function (e) {
|
||||
|
||||
if (currentResolve) {
|
||||
sendConnectionResult(true);
|
||||
} else {
|
||||
|
@ -532,7 +520,6 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
|
|||
});
|
||||
|
||||
events.on(instance._castPlayer, 'playbackstart', function (e, data) {
|
||||
|
||||
console.debug('cc: playbackstart');
|
||||
|
||||
instance._castPlayer.initializeCastPlayer();
|
||||
|
@ -542,7 +529,6 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
|
|||
});
|
||||
|
||||
events.on(instance._castPlayer, 'playbackstop', function (e, data) {
|
||||
|
||||
console.debug('cc: playbackstop');
|
||||
var state = instance.getPlayerStateInternal(data);
|
||||
|
||||
|
@ -560,7 +546,6 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
|
|||
});
|
||||
|
||||
events.on(instance._castPlayer, 'playbackprogress', function (e, data) {
|
||||
|
||||
console.debug('cc: positionchange');
|
||||
var state = instance.getPlayerStateInternal(data);
|
||||
|
||||
|
@ -575,7 +560,6 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
|
|||
bindEventForRelay(instance, 'shufflequeuemodechange');
|
||||
|
||||
events.on(instance._castPlayer, 'playstatechange', function (e, data) {
|
||||
|
||||
console.debug('cc: playstatechange');
|
||||
var state = instance.getPlayerStateInternal(data);
|
||||
|
||||
|
@ -584,7 +568,6 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
|
|||
}
|
||||
|
||||
function ChromecastPlayer() {
|
||||
|
||||
// playbackManager needs this
|
||||
this.name = PlayerName;
|
||||
this.type = 'mediaplayer';
|
||||
|
@ -624,7 +607,6 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
|
|||
|
||||
// This is a privately used method
|
||||
ChromecastPlayer.prototype.getCurrentTargetInfo = function () {
|
||||
|
||||
var appName = null;
|
||||
|
||||
var castPlayer = this._castPlayer;
|
||||
|
@ -661,7 +643,6 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
|
|||
};
|
||||
|
||||
ChromecastPlayer.prototype.getPlayerStateInternal = function (data) {
|
||||
|
||||
var triggerStateChange = false;
|
||||
if (data && !this.lastPlayerData) {
|
||||
triggerStateChange = true;
|
||||
|
@ -682,13 +663,11 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
|
|||
};
|
||||
|
||||
ChromecastPlayer.prototype.playWithCommand = function (options, command) {
|
||||
|
||||
if (!options.items) {
|
||||
var apiClient = connectionManager.getApiClient(options.serverId);
|
||||
var instance = this;
|
||||
|
||||
return apiClient.getItem(apiClient.getCurrentUserId(), options.ids[0]).then(function (item) {
|
||||
|
||||
options.items = [item];
|
||||
return instance.playWithCommand(options, command);
|
||||
});
|
||||
|
@ -705,7 +684,6 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
|
|||
};
|
||||
|
||||
ChromecastPlayer.prototype.seek = function (position) {
|
||||
|
||||
position = parseInt(position);
|
||||
|
||||
position = position / 10000000;
|
||||
|
@ -737,7 +715,6 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
|
|||
};
|
||||
|
||||
ChromecastPlayer.prototype.setMaxStreamingBitrate = function (options) {
|
||||
|
||||
this._castPlayer.sendMessage({
|
||||
options: options,
|
||||
command: 'SetMaxStreamingBitrate'
|
||||
|
@ -773,11 +750,9 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
|
|||
vol = Math.max(vol, 0);
|
||||
|
||||
this._castPlayer.session.setReceiverVolumeLevel(vol);
|
||||
|
||||
};
|
||||
|
||||
ChromecastPlayer.prototype.endSession = function () {
|
||||
|
||||
var instance = this;
|
||||
|
||||
this.stop().then(function () {
|
||||
|
@ -799,7 +774,6 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
|
|||
};
|
||||
|
||||
ChromecastPlayer.prototype.setVolume = function (vol) {
|
||||
|
||||
vol = Math.min(vol, 100);
|
||||
vol = Math.max(vol, 0);
|
||||
vol = vol / 100;
|
||||
|
@ -836,7 +810,6 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
|
|||
};
|
||||
|
||||
ChromecastPlayer.prototype.displayContent = function (options) {
|
||||
|
||||
this._castPlayer.sendMessage({
|
||||
options: options,
|
||||
command: 'DisplayContent'
|
||||
|
@ -844,7 +817,6 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
|
|||
};
|
||||
|
||||
ChromecastPlayer.prototype.setMute = function (isMuted) {
|
||||
|
||||
var castPlayer = this._castPlayer;
|
||||
|
||||
if (isMuted) {
|
||||
|
@ -873,7 +845,6 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
|
|||
};
|
||||
|
||||
ChromecastPlayer.prototype.playTrailers = function (item) {
|
||||
|
||||
this._castPlayer.sendMessage({
|
||||
options: {
|
||||
ItemId: item.Id,
|
||||
|
@ -902,7 +873,6 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
|
|||
};
|
||||
|
||||
ChromecastPlayer.prototype.toggleMute = function () {
|
||||
|
||||
this._castPlayer.sendMessage({
|
||||
options: {},
|
||||
command: 'ToggleMute'
|
||||
|
@ -946,7 +916,6 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
|
|||
};
|
||||
|
||||
ChromecastPlayer.prototype.getVolume = function () {
|
||||
|
||||
var state = this.lastPlayerData || {};
|
||||
state = state.PlayState || {};
|
||||
|
||||
|
@ -971,7 +940,6 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
|
|||
};
|
||||
|
||||
ChromecastPlayer.prototype.currentTime = function (val) {
|
||||
|
||||
if (val != null) {
|
||||
return this.seek(val);
|
||||
}
|
||||
|
@ -1008,45 +976,36 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
|
|||
};
|
||||
|
||||
ChromecastPlayer.prototype.shuffle = function (item) {
|
||||
|
||||
var apiClient = connectionManager.getApiClient(item.ServerId);
|
||||
var userId = apiClient.getCurrentUserId();
|
||||
|
||||
var instance = this;
|
||||
|
||||
apiClient.getItem(userId, item.Id).then(function (item) {
|
||||
|
||||
instance.playWithCommand({
|
||||
|
||||
items: [item]
|
||||
|
||||
}, 'Shuffle');
|
||||
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
ChromecastPlayer.prototype.instantMix = function (item) {
|
||||
|
||||
var apiClient = connectionManager.getApiClient(item.ServerId);
|
||||
var userId = apiClient.getCurrentUserId();
|
||||
|
||||
var instance = this;
|
||||
|
||||
apiClient.getItem(userId, item.Id).then(function (item) {
|
||||
|
||||
instance.playWithCommand({
|
||||
|
||||
items: [item]
|
||||
|
||||
}, 'InstantMix');
|
||||
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
ChromecastPlayer.prototype.canPlayMediaType = function (mediaType) {
|
||||
|
||||
mediaType = (mediaType || '').toLowerCase();
|
||||
return mediaType === 'audio' || mediaType === 'video';
|
||||
};
|
||||
|
@ -1064,13 +1023,9 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
|
|||
};
|
||||
|
||||
ChromecastPlayer.prototype.play = function (options) {
|
||||
|
||||
if (options.items) {
|
||||
|
||||
return this.playWithCommand(options, 'PlayNow');
|
||||
|
||||
} else {
|
||||
|
||||
if (!options.serverId) {
|
||||
throw new Error('serverId required!');
|
||||
}
|
||||
|
@ -1083,10 +1038,8 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
|
|||
Ids: options.ids.join(',')
|
||||
|
||||
}).then(function (result) {
|
||||
|
||||
options.items = result.Items;
|
||||
return instance.playWithCommand(options, 'PlayNow');
|
||||
|
||||
});
|
||||
}
|
||||
};
|
||||
|
@ -1119,7 +1072,6 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
|
|||
};
|
||||
|
||||
ChromecastPlayer.prototype.getPlayerState = function () {
|
||||
|
||||
return this.getPlayerStateInternal() || {};
|
||||
};
|
||||
|
||||
|
|
|
@ -12,7 +12,6 @@ define(['connectionManager', 'globalize', 'userSettings', 'apphost'], function (
|
|||
}
|
||||
|
||||
function showMessage(text, userSettingsKey, appHostFeature) {
|
||||
|
||||
if (appHost.supports(appHostFeature)) {
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
@ -27,11 +26,9 @@ define(['connectionManager', 'globalize', 'userSettings', 'apphost'], function (
|
|||
}
|
||||
|
||||
return new Promise(function (resolve, reject) {
|
||||
|
||||
userSettings.set(userSettingsKey, '1', false);
|
||||
|
||||
require(['alert'], function (alert) {
|
||||
|
||||
return alert(text).then(resolve, resolve);
|
||||
});
|
||||
});
|
||||
|
@ -50,14 +47,12 @@ define(['connectionManager', 'globalize', 'userSettings', 'apphost'], function (
|
|||
}
|
||||
|
||||
function ExpirementalPlaybackWarnings() {
|
||||
|
||||
this.name = 'Experimental playback warnings';
|
||||
this.type = 'preplayintercept';
|
||||
this.id = 'expirementalplaybackwarnings';
|
||||
}
|
||||
|
||||
ExpirementalPlaybackWarnings.prototype.intercept = function (options) {
|
||||
|
||||
var item = options.item;
|
||||
if (!item) {
|
||||
return Promise.resolve();
|
||||
|
|
|
@ -68,7 +68,6 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
|
|||
|
||||
// issue head request to get content type
|
||||
return new Promise(function (resolve, reject) {
|
||||
|
||||
require(['fetchHelper'], function (fetchHelper) {
|
||||
fetchHelper.ajax({
|
||||
url: url,
|
||||
|
@ -96,7 +95,6 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
|
|||
self.priority = 1;
|
||||
|
||||
self.play = function (options) {
|
||||
|
||||
self._started = false;
|
||||
self._timeUpdated = false;
|
||||
self._currentTime = null;
|
||||
|
@ -106,7 +104,6 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
|
|||
};
|
||||
|
||||
function setCurrentSrc(elem, options) {
|
||||
|
||||
elem.removeEventListener('error', onError);
|
||||
|
||||
unBindEvents(elem);
|
||||
|
@ -131,9 +128,7 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
|
|||
}
|
||||
|
||||
return enableHlsPlayer(val, options.item, options.mediaSource, 'Audio').then(function () {
|
||||
|
||||
return new Promise(function (resolve, reject) {
|
||||
|
||||
requireHlsPlayer(function () {
|
||||
var hls = new Hls({
|
||||
manifestLoadingTimeOut: 20000,
|
||||
|
@ -151,16 +146,13 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
|
|||
self._currentSrc = val;
|
||||
});
|
||||
});
|
||||
|
||||
}, function () {
|
||||
|
||||
elem.autoplay = true;
|
||||
|
||||
// Safari will not send cookies without this
|
||||
elem.crossOrigin = 'use-credentials';
|
||||
|
||||
return htmlMediaHelper.applySrc(elem, val, options).then(function () {
|
||||
|
||||
self._currentSrc = val;
|
||||
|
||||
return htmlMediaHelper.playWithPromise(elem, onError);
|
||||
|
@ -189,16 +181,13 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
|
|||
}
|
||||
|
||||
self.stop = function (destroyPlayer) {
|
||||
|
||||
cancelFadeTimeout();
|
||||
|
||||
var elem = self._mediaElement;
|
||||
var src = self._currentSrc;
|
||||
|
||||
if (elem && src) {
|
||||
|
||||
if (!destroyPlayer || !supportsFade()) {
|
||||
|
||||
elem.pause();
|
||||
|
||||
htmlMediaHelper.onEndedInternal(self, elem, onError);
|
||||
|
@ -212,7 +201,6 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
|
|||
var originalVolume = elem.volume;
|
||||
|
||||
return fade(self, elem, elem.volume).then(function () {
|
||||
|
||||
elem.pause();
|
||||
elem.volume = originalVolume;
|
||||
|
||||
|
@ -231,7 +219,6 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
|
|||
};
|
||||
|
||||
function createMediaElement() {
|
||||
|
||||
var elem = self._mediaElement;
|
||||
|
||||
if (elem) {
|
||||
|
@ -256,12 +243,10 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
|
|||
}
|
||||
|
||||
function onEnded() {
|
||||
|
||||
htmlMediaHelper.onEndedInternal(self, this, onError);
|
||||
}
|
||||
|
||||
function onTimeUpdate() {
|
||||
|
||||
// Get the player position + the transcoding offset
|
||||
var time = this.currentTime;
|
||||
|
||||
|
@ -273,7 +258,6 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
|
|||
}
|
||||
|
||||
function onVolumeChange() {
|
||||
|
||||
if (!self._isFadingOut) {
|
||||
htmlMediaHelper.saveVolume(this.volume);
|
||||
events.trigger(self, 'volumechange');
|
||||
|
@ -281,7 +265,6 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
|
|||
}
|
||||
|
||||
function onPlaying(e) {
|
||||
|
||||
if (!self._started) {
|
||||
self._started = true;
|
||||
this.removeAttribute('controls');
|
||||
|
@ -292,7 +275,6 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
|
|||
}
|
||||
|
||||
function onPlay(e) {
|
||||
|
||||
events.trigger(self, 'unpause');
|
||||
}
|
||||
|
||||
|
@ -305,7 +287,6 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
|
|||
}
|
||||
|
||||
function onError() {
|
||||
|
||||
var errorCode = this.error ? (this.error.code || 0) : 0;
|
||||
var errorMessage = this.error ? (this.error.message || '') : '';
|
||||
console.error('media element error: ' + errorCode.toString() + ' ' + errorMessage);
|
||||
|
@ -349,12 +330,10 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
|
|||
};
|
||||
|
||||
HtmlAudioPlayer.prototype.canPlayMediaType = function (mediaType) {
|
||||
|
||||
return (mediaType || '').toLowerCase() === 'audio';
|
||||
};
|
||||
|
||||
HtmlAudioPlayer.prototype.getDeviceProfile = function (item) {
|
||||
|
||||
if (appHost.getDeviceProfile) {
|
||||
return appHost.getDeviceProfile(item);
|
||||
}
|
||||
|
@ -364,7 +343,6 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
|
|||
|
||||
// Save this for when playback stops, because querying the time at that point might return 0
|
||||
HtmlAudioPlayer.prototype.currentTime = function (val) {
|
||||
|
||||
var mediaElement = this._mediaElement;
|
||||
if (mediaElement) {
|
||||
if (val != null) {
|
||||
|
@ -382,7 +360,6 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
|
|||
};
|
||||
|
||||
HtmlAudioPlayer.prototype.duration = function (val) {
|
||||
|
||||
var mediaElement = this._mediaElement;
|
||||
if (mediaElement) {
|
||||
var duration = mediaElement.duration;
|
||||
|
@ -397,10 +374,8 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
|
|||
HtmlAudioPlayer.prototype.seekable = function () {
|
||||
var mediaElement = this._mediaElement;
|
||||
if (mediaElement) {
|
||||
|
||||
var seekable = mediaElement.seekable;
|
||||
if (seekable && seekable.length) {
|
||||
|
||||
var start = seekable.start(0);
|
||||
var end = seekable.end(0);
|
||||
|
||||
|
@ -421,7 +396,6 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
|
|||
HtmlAudioPlayer.prototype.getBufferedRanges = function () {
|
||||
var mediaElement = this._mediaElement;
|
||||
if (mediaElement) {
|
||||
|
||||
return htmlMediaHelper.getBufferedRanges(this, mediaElement);
|
||||
}
|
||||
|
||||
|
@ -451,7 +425,6 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
|
|||
};
|
||||
|
||||
HtmlAudioPlayer.prototype.paused = function () {
|
||||
|
||||
var mediaElement = this._mediaElement;
|
||||
if (mediaElement) {
|
||||
return mediaElement.paused;
|
||||
|
@ -485,7 +458,6 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
|
|||
HtmlAudioPlayer.prototype.getVolume = function () {
|
||||
var mediaElement = this._mediaElement;
|
||||
if (mediaElement) {
|
||||
|
||||
return Math.min(Math.round(mediaElement.volume * 100), 100);
|
||||
}
|
||||
};
|
||||
|
@ -499,7 +471,6 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
|
|||
};
|
||||
|
||||
HtmlAudioPlayer.prototype.setMute = function (mute) {
|
||||
|
||||
var mediaElement = this._mediaElement;
|
||||
if (mediaElement) {
|
||||
mediaElement.muted = mute;
|
||||
|
|
|
@ -5,7 +5,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
function tryRemoveElement(elem) {
|
||||
var parentNode = elem.parentNode;
|
||||
if (parentNode) {
|
||||
|
||||
// Seeing crashes in edge webview
|
||||
try {
|
||||
parentNode.removeChild(elem);
|
||||
|
@ -16,7 +15,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
}
|
||||
|
||||
function enableNativeTrackSupport(currentSrc, track) {
|
||||
|
||||
if (track) {
|
||||
if (track.DeliveryMethod === 'Embed') {
|
||||
return true;
|
||||
|
@ -102,7 +100,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
}
|
||||
|
||||
function getTextTrackUrl(track, item, format) {
|
||||
|
||||
if (itemHelper.isLocalItem(item) && track.Path) {
|
||||
return track.Path;
|
||||
}
|
||||
|
@ -116,18 +113,14 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
}
|
||||
|
||||
function getDefaultProfile() {
|
||||
|
||||
return new Promise(function (resolve, reject) {
|
||||
|
||||
require(['browserdeviceprofile'], function (profileBuilder) {
|
||||
|
||||
resolve(profileBuilder({}));
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function HtmlVideoPlayer() {
|
||||
|
||||
if (browser.edgeUwp) {
|
||||
this.name = 'Windows Video Player';
|
||||
} else {
|
||||
|
@ -184,7 +177,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
}
|
||||
|
||||
function updateVideoUrl(streamInfo) {
|
||||
|
||||
var isHls = streamInfo.url.toLowerCase().indexOf('.m3u8') !== -1;
|
||||
|
||||
var mediaSource = streamInfo.mediaSource;
|
||||
|
@ -194,7 +186,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
// This will start the transcoding process before actually feeding the video url into the player
|
||||
// Edit: Also seeing stalls from hls.js
|
||||
if (mediaSource && item && !mediaSource.RunTimeTicks && isHls && streamInfo.playMethod === 'Transcode' && (browser.iOS || browser.osx)) {
|
||||
|
||||
var hlsPlaylistUrl = streamInfo.url.replace('master.m3u8', 'live.m3u8');
|
||||
|
||||
loading.show();
|
||||
|
@ -207,22 +198,18 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
url: hlsPlaylistUrl
|
||||
|
||||
}).then(function () {
|
||||
|
||||
console.debug('completed prefetching hls playlist: ' + hlsPlaylistUrl);
|
||||
|
||||
loading.hide();
|
||||
streamInfo.url = hlsPlaylistUrl;
|
||||
|
||||
return Promise.resolve();
|
||||
|
||||
}, function () {
|
||||
|
||||
console.error('error prefetching hls playlist: ' + hlsPlaylistUrl);
|
||||
|
||||
loading.hide();
|
||||
return Promise.resolve();
|
||||
});
|
||||
|
||||
} else {
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
@ -237,7 +224,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
self.resetSubtitleOffset();
|
||||
|
||||
return createMediaElement(options).then(function (elem) {
|
||||
|
||||
return updateVideoUrl(options).then(function () {
|
||||
return setCurrentSrc(elem, options);
|
||||
});
|
||||
|
@ -245,11 +231,8 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
};
|
||||
|
||||
function setSrcWithFlvJs(instance, elem, options, url) {
|
||||
|
||||
return new Promise(function (resolve, reject) {
|
||||
|
||||
require(['flvjs'], function (flvjs) {
|
||||
|
||||
var flvPlayer = flvjs.createPlayer({
|
||||
type: 'flv',
|
||||
url: url
|
||||
|
@ -272,11 +255,8 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
}
|
||||
|
||||
function setSrcWithHlsJs(instance, elem, options, url) {
|
||||
|
||||
return new Promise(function (resolve, reject) {
|
||||
|
||||
requireHlsPlayer(function () {
|
||||
|
||||
var hls = new Hls({
|
||||
manifestLoadingTimeOut: 20000,
|
||||
xhrSetup: function(xhr, xhr_url) {
|
||||
|
@ -297,7 +277,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
}
|
||||
|
||||
function setCurrentSrc(elem, options) {
|
||||
|
||||
elem.removeEventListener('error', onError);
|
||||
|
||||
var val = options.url;
|
||||
|
@ -333,18 +312,14 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
if (htmlMediaHelper.enableHlsJsPlayer(options.mediaSource.RunTimeTicks, 'Video') && val.indexOf('.m3u8') !== -1) {
|
||||
return setSrcWithHlsJs(self, elem, options, val);
|
||||
} else if (options.playMethod !== 'Transcode' && options.mediaSource.Container === 'flv') {
|
||||
|
||||
return setSrcWithFlvJs(self, elem, options, val);
|
||||
|
||||
} else {
|
||||
|
||||
elem.autoplay = true;
|
||||
|
||||
// Safari will not send cookies without this
|
||||
elem.crossOrigin = 'use-credentials';
|
||||
|
||||
return htmlMediaHelper.applySrc(elem, val, options).then(function () {
|
||||
|
||||
self._currentSrc = val;
|
||||
|
||||
return htmlMediaHelper.playWithPromise(elem, onError);
|
||||
|
@ -353,7 +328,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
}
|
||||
|
||||
self.setSubtitleStreamIndex = function (index) {
|
||||
|
||||
setCurrentTrackElement(index);
|
||||
};
|
||||
|
||||
|
@ -388,7 +362,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
}
|
||||
|
||||
self.setSubtitleOffset = function(offset) {
|
||||
|
||||
var offsetValue = parseFloat(offset);
|
||||
|
||||
// if .ass currently rendering
|
||||
|
@ -409,7 +382,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
};
|
||||
|
||||
function updateCurrentTrackOffset(offsetValue) {
|
||||
|
||||
var relativeOffset = offsetValue;
|
||||
var newTrackOffset = offsetValue;
|
||||
if (currentTrackOffset) {
|
||||
|
@ -421,7 +393,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
}
|
||||
|
||||
function setTextTrackSubtitleOffset(currentTrack, offsetValue) {
|
||||
|
||||
if (currentTrack.cues) {
|
||||
offsetValue = updateCurrentTrackOffset(offsetValue);
|
||||
Array.from(currentTrack.cues)
|
||||
|
@ -433,7 +404,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
}
|
||||
|
||||
function setTrackEventsSubtitleOffset(trackEvents, offsetValue) {
|
||||
|
||||
if (Array.isArray(trackEvents)) {
|
||||
offsetValue = updateCurrentTrackOffset(offsetValue) * 1e7; // ticks
|
||||
trackEvents.forEach(function(trackEvent) {
|
||||
|
@ -448,7 +418,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
};
|
||||
|
||||
function isAudioStreamSupported(stream, deviceProfile) {
|
||||
|
||||
var codec = (stream.Codec || '').toLowerCase();
|
||||
|
||||
if (!codec) {
|
||||
|
@ -463,9 +432,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
var profiles = deviceProfile.DirectPlayProfiles || [];
|
||||
|
||||
return profiles.filter(function (p) {
|
||||
|
||||
if (p.Type === 'Video') {
|
||||
|
||||
if (!p.AudioCodec) {
|
||||
return true;
|
||||
}
|
||||
|
@ -474,7 +441,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
}
|
||||
|
||||
return false;
|
||||
|
||||
}).length > 0;
|
||||
}
|
||||
|
||||
|
@ -487,7 +453,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
}
|
||||
|
||||
self.setAudioStreamIndex = function (index) {
|
||||
|
||||
var streams = getSupportedAudioStreams();
|
||||
|
||||
if (streams.length < 2) {
|
||||
|
@ -525,7 +490,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
console.debug('found ' + elemAudioTracks.length + ' audio tracks');
|
||||
|
||||
for (i = 0, length = elemAudioTracks.length; i < length; i++) {
|
||||
|
||||
if (audioIndex === i) {
|
||||
console.debug('setting audio track ' + i + ' to enabled');
|
||||
elemAudioTracks[i].enabled = true;
|
||||
|
@ -594,7 +558,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
};
|
||||
|
||||
function onEnded() {
|
||||
|
||||
destroyCustomTrack(this);
|
||||
htmlMediaHelper.onEndedInternal(self, this, onError);
|
||||
}
|
||||
|
@ -660,9 +623,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
});
|
||||
|
||||
if (self._currentPlayOptions.fullscreen) {
|
||||
|
||||
appRouter.showVideoOsd().then(onNavigatedToOsd);
|
||||
|
||||
} else {
|
||||
appRouter.setTransparency('backdrop');
|
||||
videoDialog.classList.remove('videoPlayerContainer-onTop');
|
||||
|
@ -767,7 +728,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
if (videoElement) {
|
||||
var allTracks = videoElement.textTracks || []; // get list of tracks
|
||||
for (var i = 0; i < allTracks.length; i++) {
|
||||
|
||||
var currentTrack = allTracks[i];
|
||||
|
||||
if (currentTrack.label.indexOf('manualTrack') !== -1) {
|
||||
|
@ -831,7 +791,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
}
|
||||
|
||||
function setTrackForDisplay(videoElement, track) {
|
||||
|
||||
if (!track) {
|
||||
destroyCustomTrack(videoElement);
|
||||
return;
|
||||
|
@ -884,7 +843,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
}
|
||||
|
||||
function requiresCustomSubtitlesElement() {
|
||||
|
||||
// after a system update, ps4 isn't showing anything when creating a track element dynamically
|
||||
// going to have to do it ourselves
|
||||
if (browser.ps4) {
|
||||
|
@ -935,13 +893,10 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
}
|
||||
|
||||
function getCueCss(appearance, selector) {
|
||||
|
||||
var html = selector + '::cue {';
|
||||
|
||||
html += appearance.text.map(function (s) {
|
||||
|
||||
return s.name + ':' + s.value + '!important;';
|
||||
|
||||
}).join('');
|
||||
|
||||
html += '}';
|
||||
|
@ -950,9 +905,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
}
|
||||
|
||||
function setCueAppearance() {
|
||||
|
||||
require(['userSettings', 'subtitleAppearanceHelper'], function (userSettings, subtitleAppearanceHelper) {
|
||||
|
||||
var elementId = self.id + '-cuestyle';
|
||||
|
||||
var styleElem = document.querySelector('#' + elementId);
|
||||
|
@ -968,7 +921,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
}
|
||||
|
||||
function renderTracksEvents(videoElement, track, item) {
|
||||
|
||||
if (!itemHelper.isLocalItem(item) || track.IsExternal) {
|
||||
var format = (track.Codec || '').toLowerCase();
|
||||
if (format === 'ssa' || format === 'ass') {
|
||||
|
@ -1006,13 +958,11 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
|
||||
// download the track json
|
||||
fetchSubtitles(track, item).then(function (data) {
|
||||
|
||||
// show in ui
|
||||
console.debug('downloaded ' + data.TrackEvents.length + ' track events');
|
||||
// add some cues to show the text
|
||||
// in safari, the cues need to be added before setting the track mode to showing
|
||||
data.TrackEvents.forEach(function (trackEvent) {
|
||||
|
||||
var trackCueObject = window.VTTCue || window.TextTrackCue;
|
||||
var cue = new trackCueObject(trackEvent.StartPositionTicks / 10000000, trackEvent.EndPositionTicks / 10000000, normalizeTrackEventText(trackEvent.Text, false));
|
||||
|
||||
|
@ -1023,7 +973,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
}
|
||||
|
||||
function updateSubtitleText(timeMs) {
|
||||
|
||||
var clock = currentClock;
|
||||
if (clock) {
|
||||
try {
|
||||
|
@ -1041,7 +990,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
var ticks = timeMs * 10000;
|
||||
var selectedTrackEvent;
|
||||
for (var i = 0; i < trackEvents.length; i++) {
|
||||
|
||||
var currentTrackEvent = trackEvents[i];
|
||||
if (currentTrackEvent.StartPositionTicks <= ticks && currentTrackEvent.EndPositionTicks >= ticks) {
|
||||
selectedTrackEvent = currentTrackEvent;
|
||||
|
@ -1052,7 +1000,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
if (selectedTrackEvent && selectedTrackEvent.Text) {
|
||||
subtitleTextElement.innerHTML = normalizeTrackEventText(selectedTrackEvent.Text, true);
|
||||
subtitleTextElement.classList.remove('hide');
|
||||
|
||||
} else {
|
||||
subtitleTextElement.classList.add('hide');
|
||||
}
|
||||
|
@ -1060,7 +1007,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
}
|
||||
|
||||
function setCurrentTrackElement(streamIndex) {
|
||||
|
||||
console.debug('setting new text track index to: ' + streamIndex);
|
||||
|
||||
var mediaStreamTextTracks = getMediaStreamTextTracks(self._currentPlayOptions.mediaSource);
|
||||
|
@ -1074,7 +1020,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
if (streamIndex !== -1) {
|
||||
setCueAppearance();
|
||||
}
|
||||
|
||||
} else {
|
||||
// null these out to disable the player's native display (handled below)
|
||||
streamIndex = -1;
|
||||
|
@ -1083,15 +1028,11 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
}
|
||||
|
||||
function createMediaElement(options) {
|
||||
|
||||
return new Promise(function (resolve, reject) {
|
||||
|
||||
var dlg = document.querySelector('.videoPlayerContainer');
|
||||
|
||||
if (!dlg) {
|
||||
|
||||
require(['css!./style'], function () {
|
||||
|
||||
loading.show();
|
||||
|
||||
var dlg = document.createElement('div');
|
||||
|
@ -1184,7 +1125,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
var supportedFeatures;
|
||||
|
||||
function getSupportedFeatures() {
|
||||
|
||||
var list = [];
|
||||
|
||||
var video = document.createElement('video');
|
||||
|
@ -1220,7 +1160,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
|
||||
// Save this for when playback stops, because querying the time at that point might return 0
|
||||
HtmlVideoPlayer.prototype.currentTime = function (val) {
|
||||
|
||||
var mediaElement = this._mediaElement;
|
||||
if (mediaElement) {
|
||||
if (val != null) {
|
||||
|
@ -1238,7 +1177,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
};
|
||||
|
||||
HtmlVideoPlayer.prototype.duration = function (val) {
|
||||
|
||||
var mediaElement = this._mediaElement;
|
||||
if (mediaElement) {
|
||||
var duration = mediaElement.duration;
|
||||
|
@ -1270,7 +1208,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
}
|
||||
|
||||
HtmlVideoPlayer.prototype.setPictureInPictureEnabled = function (isEnabled) {
|
||||
|
||||
var video = this._mediaElement;
|
||||
|
||||
if (document.pictureInPictureEnabled) {
|
||||
|
@ -1282,7 +1219,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
}
|
||||
}
|
||||
} else if (window.Windows) {
|
||||
|
||||
this.isPip = isEnabled;
|
||||
if (isEnabled) {
|
||||
Windows.UI.ViewManagement.ApplicationView.getForCurrentView().tryEnterViewModeAsync(Windows.UI.ViewManagement.ApplicationViewMode.compactOverlay);
|
||||
|
@ -1297,7 +1233,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
};
|
||||
|
||||
HtmlVideoPlayer.prototype.isPictureInPictureEnabled = function () {
|
||||
|
||||
if (document.pictureInPictureEnabled) {
|
||||
return document.pictureInPictureElement ? true : false;
|
||||
} else if (window.Windows) {
|
||||
|
@ -1313,7 +1248,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
};
|
||||
|
||||
HtmlVideoPlayer.prototype.isAirPlayEnabled = function () {
|
||||
|
||||
if (document.AirPlayEnabled) {
|
||||
return document.AirplayElement ? true : false;
|
||||
}
|
||||
|
@ -1342,7 +1276,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
};
|
||||
|
||||
HtmlVideoPlayer.prototype.setBrightness = function (val) {
|
||||
|
||||
var elem = this._mediaElement;
|
||||
|
||||
if (elem) {
|
||||
|
@ -1371,10 +1304,8 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
HtmlVideoPlayer.prototype.seekable = function () {
|
||||
var mediaElement = this._mediaElement;
|
||||
if (mediaElement) {
|
||||
|
||||
var seekable = mediaElement.seekable;
|
||||
if (seekable && seekable.length) {
|
||||
|
||||
var start = seekable.start(0);
|
||||
var end = seekable.end(0);
|
||||
|
||||
|
@ -1415,7 +1346,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
};
|
||||
|
||||
HtmlVideoPlayer.prototype.paused = function () {
|
||||
|
||||
var mediaElement = this._mediaElement;
|
||||
if (mediaElement) {
|
||||
return mediaElement.paused;
|
||||
|
@ -1523,7 +1453,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
};
|
||||
|
||||
HtmlVideoPlayer.prototype.getStats = function () {
|
||||
|
||||
var mediaElement = this._mediaElement;
|
||||
var playOptions = this._currentPlayOptions || [];
|
||||
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
define(['pluginManager'], function (pluginManager) {
|
||||
|
||||
return function () {
|
||||
|
||||
var self = this;
|
||||
|
||||
self.name = 'Logo ScreenSaver';
|
||||
|
@ -12,7 +10,6 @@ define(['pluginManager'], function (pluginManager) {
|
|||
var interval;
|
||||
|
||||
function animate() {
|
||||
|
||||
var animations = [
|
||||
|
||||
bounceInLeft,
|
||||
|
@ -112,7 +109,6 @@ define(['pluginManager'], function (pluginManager) {
|
|||
{ transform: 'rotate3d(0, 0, 1, 200deg)', opacity: '0', transformOrigin: 'center', offset: 1 }];
|
||||
var timing = { duration: 900, iterations: iterations };
|
||||
return elem.animate(keyframes, timing);
|
||||
|
||||
}
|
||||
|
||||
function fadeOut(elem, iterations) {
|
||||
|
@ -131,9 +127,7 @@ define(['pluginManager'], function (pluginManager) {
|
|||
}
|
||||
|
||||
self.show = function () {
|
||||
|
||||
require(['css!' + pluginManager.mapPath(self, 'style.css')], function () {
|
||||
|
||||
var elem = document.querySelector('.logoScreenSaver');
|
||||
|
||||
if (!elem) {
|
||||
|
@ -150,13 +144,11 @@ define(['pluginManager'], function (pluginManager) {
|
|||
};
|
||||
|
||||
self.hide = function () {
|
||||
|
||||
stopInterval();
|
||||
|
||||
var elem = document.querySelector('.logoScreenSaver');
|
||||
|
||||
if (elem) {
|
||||
|
||||
var onAnimationFinish = function () {
|
||||
elem.parentNode.removeChild(elem);
|
||||
};
|
||||
|
|
|
@ -7,7 +7,6 @@ define(['playbackManager', 'events', 'serverNotifications', 'connectionManager']
|
|||
}
|
||||
|
||||
function sendPlayCommand(apiClient, options, playType) {
|
||||
|
||||
var sessionId = getActivePlayerId();
|
||||
|
||||
var ids = options.ids || options.items.map(function (i) {
|
||||
|
@ -44,14 +43,12 @@ define(['playbackManager', 'events', 'serverNotifications', 'connectionManager']
|
|||
}
|
||||
|
||||
function sendPlayStateCommand(apiClient, command, options) {
|
||||
|
||||
var sessionId = getActivePlayerId();
|
||||
|
||||
apiClient.sendPlayStateCommand(sessionId, command, options);
|
||||
}
|
||||
|
||||
function getCurrentApiClient(instance) {
|
||||
|
||||
var currentServerId = instance.currentServerId;
|
||||
|
||||
if (currentServerId) {
|
||||
|
@ -62,7 +59,6 @@ define(['playbackManager', 'events', 'serverNotifications', 'connectionManager']
|
|||
}
|
||||
|
||||
function sendCommandByName(instance, name, options) {
|
||||
|
||||
var command = {
|
||||
Name: name
|
||||
};
|
||||
|
@ -75,7 +71,6 @@ define(['playbackManager', 'events', 'serverNotifications', 'connectionManager']
|
|||
}
|
||||
|
||||
function unsubscribeFromPlayerUpdates(instance) {
|
||||
|
||||
instance.isUpdating = true;
|
||||
|
||||
var apiClient = getCurrentApiClient(instance);
|
||||
|
@ -87,7 +82,6 @@ define(['playbackManager', 'events', 'serverNotifications', 'connectionManager']
|
|||
}
|
||||
|
||||
function processUpdatedSessions(instance, sessions, apiClient) {
|
||||
|
||||
var serverId = apiClient.serverId();
|
||||
|
||||
sessions.map(function (s) {
|
||||
|
@ -103,7 +97,6 @@ define(['playbackManager', 'events', 'serverNotifications', 'connectionManager']
|
|||
})[0];
|
||||
|
||||
if (session) {
|
||||
|
||||
normalizeImages(session, apiClient);
|
||||
|
||||
var eventNames = getChangedEvents(instance.lastPlayerData, session);
|
||||
|
@ -112,9 +105,7 @@ define(['playbackManager', 'events', 'serverNotifications', 'connectionManager']
|
|||
for (var i = 0, length = eventNames.length; i < length; i++) {
|
||||
events.trigger(instance, eventNames[i], [session]);
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
instance.lastPlayerData = session;
|
||||
|
||||
playbackManager.setDefaultPlayerActive();
|
||||
|
@ -122,7 +113,6 @@ define(['playbackManager', 'events', 'serverNotifications', 'connectionManager']
|
|||
}
|
||||
|
||||
function getChangedEvents(state1, state2) {
|
||||
|
||||
var names = [];
|
||||
|
||||
if (!state1) {
|
||||
|
@ -142,11 +132,9 @@ define(['playbackManager', 'events', 'serverNotifications', 'connectionManager']
|
|||
}
|
||||
|
||||
function onPollIntervalFired() {
|
||||
|
||||
var instance = this;
|
||||
var apiClient = getCurrentApiClient(instance);
|
||||
if (!apiClient.isMessageChannelOpen()) {
|
||||
|
||||
apiClient.getSessions().then(function (sessions) {
|
||||
processUpdatedSessions(instance, sessions, apiClient);
|
||||
});
|
||||
|
@ -154,7 +142,6 @@ define(['playbackManager', 'events', 'serverNotifications', 'connectionManager']
|
|||
}
|
||||
|
||||
function subscribeToPlayerUpdates(instance) {
|
||||
|
||||
instance.isUpdating = true;
|
||||
|
||||
var apiClient = getCurrentApiClient(instance);
|
||||
|
@ -167,9 +154,7 @@ define(['playbackManager', 'events', 'serverNotifications', 'connectionManager']
|
|||
}
|
||||
|
||||
function normalizeImages(state, apiClient) {
|
||||
|
||||
if (state && state.NowPlayingItem) {
|
||||
|
||||
var item = state.NowPlayingItem;
|
||||
|
||||
if (!item.ImageTags || !item.ImageTags.Primary) {
|
||||
|
@ -192,7 +177,6 @@ define(['playbackManager', 'events', 'serverNotifications', 'connectionManager']
|
|||
}
|
||||
|
||||
function SessionPlayer() {
|
||||
|
||||
var self = this;
|
||||
|
||||
this.name = 'Remote Control';
|
||||
|
@ -206,11 +190,9 @@ define(['playbackManager', 'events', 'serverNotifications', 'connectionManager']
|
|||
}
|
||||
|
||||
SessionPlayer.prototype.beginPlayerUpdates = function () {
|
||||
|
||||
this.playerListenerCount = this.playerListenerCount || 0;
|
||||
|
||||
if (this.playerListenerCount <= 0) {
|
||||
|
||||
this.playerListenerCount = 0;
|
||||
|
||||
subscribeToPlayerUpdates(this);
|
||||
|
@ -220,24 +202,20 @@ define(['playbackManager', 'events', 'serverNotifications', 'connectionManager']
|
|||
};
|
||||
|
||||
SessionPlayer.prototype.endPlayerUpdates = function () {
|
||||
|
||||
this.playerListenerCount = this.playerListenerCount || 0;
|
||||
this.playerListenerCount--;
|
||||
|
||||
if (this.playerListenerCount <= 0) {
|
||||
|
||||
unsubscribeFromPlayerUpdates(this);
|
||||
this.playerListenerCount = 0;
|
||||
}
|
||||
};
|
||||
|
||||
SessionPlayer.prototype.getPlayerState = function () {
|
||||
|
||||
return this.lastPlayerData || {};
|
||||
};
|
||||
|
||||
SessionPlayer.prototype.getTargets = function () {
|
||||
|
||||
var apiClient = getCurrentApiClient(this);
|
||||
|
||||
var sessionQuery = {
|
||||
|
@ -245,14 +223,11 @@ define(['playbackManager', 'events', 'serverNotifications', 'connectionManager']
|
|||
};
|
||||
|
||||
if (apiClient) {
|
||||
|
||||
var name = this.name;
|
||||
|
||||
return apiClient.getSessions(sessionQuery).then(function (sessions) {
|
||||
|
||||
return sessions.filter(function (s) {
|
||||
return s.DeviceId !== apiClient.deviceId();
|
||||
|
||||
}).map(function (s) {
|
||||
return {
|
||||
name: s.DeviceName,
|
||||
|
@ -273,16 +248,13 @@ define(['playbackManager', 'events', 'serverNotifications', 'connectionManager']
|
|||
} : null
|
||||
};
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
} else {
|
||||
return Promise.resolve([]);
|
||||
}
|
||||
};
|
||||
|
||||
SessionPlayer.prototype.sendCommand = function (command) {
|
||||
|
||||
var sessionId = getActivePlayerId();
|
||||
|
||||
var apiClient = getCurrentApiClient(this);
|
||||
|
@ -290,7 +262,6 @@ define(['playbackManager', 'events', 'serverNotifications', 'connectionManager']
|
|||
};
|
||||
|
||||
SessionPlayer.prototype.play = function (options) {
|
||||
|
||||
options = Object.assign({}, options);
|
||||
|
||||
if (options.items) {
|
||||
|
@ -305,27 +276,22 @@ define(['playbackManager', 'events', 'serverNotifications', 'connectionManager']
|
|||
};
|
||||
|
||||
SessionPlayer.prototype.shuffle = function (item) {
|
||||
|
||||
sendPlayCommand(getCurrentApiClient(this), { ids: [item.Id] }, 'PlayShuffle');
|
||||
};
|
||||
|
||||
SessionPlayer.prototype.instantMix = function (item) {
|
||||
|
||||
sendPlayCommand(getCurrentApiClient(this), { ids: [item.Id] }, 'PlayInstantMix');
|
||||
};
|
||||
|
||||
SessionPlayer.prototype.queue = function (options) {
|
||||
|
||||
sendPlayCommand(getCurrentApiClient(this), options, 'PlayNext');
|
||||
};
|
||||
|
||||
SessionPlayer.prototype.queueNext = function (options) {
|
||||
|
||||
sendPlayCommand(getCurrentApiClient(this), options, 'PlayLast');
|
||||
};
|
||||
|
||||
SessionPlayer.prototype.canPlayMediaType = function (mediaType) {
|
||||
|
||||
mediaType = (mediaType || '').toLowerCase();
|
||||
return mediaType === 'audio' || mediaType === 'video';
|
||||
};
|
||||
|
@ -354,7 +320,6 @@ define(['playbackManager', 'events', 'serverNotifications', 'connectionManager']
|
|||
};
|
||||
|
||||
SessionPlayer.prototype.currentTime = function (val) {
|
||||
|
||||
if (val != null) {
|
||||
return this.seek(val);
|
||||
}
|
||||
|
@ -401,7 +366,6 @@ define(['playbackManager', 'events', 'serverNotifications', 'connectionManager']
|
|||
};
|
||||
|
||||
SessionPlayer.prototype.setMute = function (isMuted) {
|
||||
|
||||
if (isMuted) {
|
||||
sendCommandByName(this, 'Mute');
|
||||
} else {
|
||||
|
@ -500,14 +464,12 @@ define(['playbackManager', 'events', 'serverNotifications', 'connectionManager']
|
|||
};
|
||||
|
||||
SessionPlayer.prototype.setRepeatMode = function (mode) {
|
||||
|
||||
sendCommandByName(this, 'SetRepeatMode', {
|
||||
RepeatMode: mode
|
||||
});
|
||||
};
|
||||
|
||||
SessionPlayer.prototype.setQueueShuffleMode = function (mode) {
|
||||
|
||||
sendCommandByName(this, 'SetShuffleQueue', {
|
||||
ShuffleMode: mode
|
||||
});
|
||||
|
@ -518,7 +480,6 @@ define(['playbackManager', 'events', 'serverNotifications', 'connectionManager']
|
|||
};
|
||||
|
||||
SessionPlayer.prototype.displayContent = function (options) {
|
||||
|
||||
sendCommandByName(this, 'DisplayContent', options);
|
||||
};
|
||||
|
||||
|
@ -555,7 +516,6 @@ define(['playbackManager', 'events', 'serverNotifications', 'connectionManager']
|
|||
};
|
||||
|
||||
SessionPlayer.prototype.tryPair = function (target) {
|
||||
|
||||
return Promise.resolve();
|
||||
};
|
||||
|
||||
|
|
|
@ -16,15 +16,11 @@ function zoomIn(elem, iterations) {
|
|||
}
|
||||
|
||||
function createMediaElement(instance, options) {
|
||||
|
||||
return new Promise(function (resolve, reject) {
|
||||
|
||||
const dlg = document.querySelector('.youtubePlayerContainer');
|
||||
|
||||
if (!dlg) {
|
||||
|
||||
import('css!./style').then(() => {
|
||||
|
||||
loading.show();
|
||||
|
||||
const dlg = document.createElement('div');
|
||||
|
@ -48,9 +44,7 @@ function createMediaElement(instance, options) {
|
|||
} else {
|
||||
resolve(videoElement);
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
} else {
|
||||
resolve(dlg.querySelector('#player'));
|
||||
}
|
||||
|
@ -74,7 +68,6 @@ function clearTimeUpdateInterval(instance) {
|
|||
}
|
||||
|
||||
function onEndedInternal(instance) {
|
||||
|
||||
clearTimeUpdateInterval(instance);
|
||||
const resizeListener = instance.resizeListener;
|
||||
if (resizeListener) {
|
||||
|
@ -102,43 +95,34 @@ function onPlayerReady(event) {
|
|||
}
|
||||
|
||||
function onTimeUpdate(e) {
|
||||
|
||||
events.trigger(this, 'timeupdate');
|
||||
}
|
||||
|
||||
function onPlaying(instance, playOptions, resolve) {
|
||||
|
||||
if (!instance.started) {
|
||||
|
||||
instance.started = true;
|
||||
resolve();
|
||||
clearTimeUpdateInterval(instance);
|
||||
instance.timeUpdateInterval = setInterval(onTimeUpdate.bind(instance), 500);
|
||||
|
||||
if (playOptions.fullscreen) {
|
||||
|
||||
appRouter.showVideoOsd().then(function () {
|
||||
instance.videoDialog.classList.remove('onTop');
|
||||
});
|
||||
|
||||
} else {
|
||||
appRouter.setTransparency('backdrop');
|
||||
instance.videoDialog.classList.remove('onTop');
|
||||
}
|
||||
|
||||
import('loading').then(({default: loading}) => {
|
||||
|
||||
loading.hide();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function setCurrentSrc(instance, elem, options) {
|
||||
|
||||
return new Promise(function (resolve, reject) {
|
||||
|
||||
import('queryString').then(({default: queryString}) => {
|
||||
|
||||
instance._currentSrc = options.url;
|
||||
const params = queryString.parse(options.url.split('?')[1]);
|
||||
// 3. This function creates an <iframe> (and YouTube player)
|
||||
|
@ -192,13 +176,11 @@ function setCurrentSrc(instance, elem, options) {
|
|||
window.onYouTubeIframeAPIReady();
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
class YoutubePlayer {
|
||||
constructor() {
|
||||
|
||||
this.name = 'Youtube Player';
|
||||
this.type = 'mediaplayer';
|
||||
this.id = 'youtubeplayer';
|
||||
|
@ -207,21 +189,17 @@ class YoutubePlayer {
|
|||
this.priority = 1;
|
||||
}
|
||||
play(options) {
|
||||
|
||||
this.started = false;
|
||||
const instance = this;
|
||||
|
||||
return createMediaElement(this, options).then(function (elem) {
|
||||
|
||||
return setCurrentSrc(instance, elem, options);
|
||||
});
|
||||
}
|
||||
stop(destroyPlayer) {
|
||||
|
||||
const src = this._currentSrc;
|
||||
|
||||
if (src) {
|
||||
|
||||
if (this.currentYoutubePlayer) {
|
||||
this.currentYoutubePlayer.stopVideo();
|
||||
}
|
||||
|
@ -235,34 +213,28 @@ class YoutubePlayer {
|
|||
return Promise.resolve();
|
||||
}
|
||||
destroy() {
|
||||
|
||||
appRouter.setTransparency('none');
|
||||
|
||||
const dlg = this.videoDialog;
|
||||
if (dlg) {
|
||||
|
||||
this.videoDialog = null;
|
||||
|
||||
dlg.parentNode.removeChild(dlg);
|
||||
}
|
||||
}
|
||||
canPlayMediaType(mediaType) {
|
||||
|
||||
mediaType = (mediaType || '').toLowerCase();
|
||||
|
||||
return mediaType === 'audio' || mediaType === 'video';
|
||||
}
|
||||
canPlayItem(item) {
|
||||
|
||||
// Does not play server items
|
||||
return false;
|
||||
}
|
||||
canPlayUrl(url) {
|
||||
|
||||
return url.toLowerCase().indexOf('youtube.com') !== -1;
|
||||
}
|
||||
getDeviceProfile() {
|
||||
|
||||
return Promise.resolve({});
|
||||
}
|
||||
currentSrc() {
|
||||
|
@ -277,7 +249,6 @@ class YoutubePlayer {
|
|||
}
|
||||
// Save this for when playback stops, because querying the time at that point might return 0
|
||||
currentTime(val) {
|
||||
|
||||
const currentYoutubePlayer = this.currentYoutubePlayer;
|
||||
|
||||
if (currentYoutubePlayer) {
|
||||
|
@ -290,7 +261,6 @@ class YoutubePlayer {
|
|||
}
|
||||
}
|
||||
duration(val) {
|
||||
|
||||
const currentYoutubePlayer = this.currentYoutubePlayer;
|
||||
|
||||
if (currentYoutubePlayer) {
|
||||
|
@ -299,7 +269,6 @@ class YoutubePlayer {
|
|||
return null;
|
||||
}
|
||||
pause() {
|
||||
|
||||
const currentYoutubePlayer = this.currentYoutubePlayer;
|
||||
|
||||
if (currentYoutubePlayer) {
|
||||
|
@ -314,7 +283,6 @@ class YoutubePlayer {
|
|||
}
|
||||
}
|
||||
unpause() {
|
||||
|
||||
const currentYoutubePlayer = this.currentYoutubePlayer;
|
||||
|
||||
if (currentYoutubePlayer) {
|
||||
|
@ -329,7 +297,6 @@ class YoutubePlayer {
|
|||
}
|
||||
}
|
||||
paused() {
|
||||
|
||||
const currentYoutubePlayer = this.currentYoutubePlayer;
|
||||
|
||||
if (currentYoutubePlayer) {
|
||||
|
@ -346,7 +313,6 @@ class YoutubePlayer {
|
|||
return this.getVolume();
|
||||
}
|
||||
setVolume(val) {
|
||||
|
||||
const currentYoutubePlayer = this.currentYoutubePlayer;
|
||||
|
||||
if (currentYoutubePlayer) {
|
||||
|
@ -356,7 +322,6 @@ class YoutubePlayer {
|
|||
}
|
||||
}
|
||||
getVolume() {
|
||||
|
||||
const currentYoutubePlayer = this.currentYoutubePlayer;
|
||||
|
||||
if (currentYoutubePlayer) {
|
||||
|
@ -364,7 +329,6 @@ class YoutubePlayer {
|
|||
}
|
||||
}
|
||||
setMute(mute) {
|
||||
|
||||
const currentYoutubePlayer = this.currentYoutubePlayer;
|
||||
|
||||
if (mute) {
|
||||
|
@ -372,14 +336,12 @@ class YoutubePlayer {
|
|||
currentYoutubePlayer.mute();
|
||||
}
|
||||
} else {
|
||||
|
||||
if (currentYoutubePlayer) {
|
||||
currentYoutubePlayer.unMute();
|
||||
}
|
||||
}
|
||||
}
|
||||
isMuted() {
|
||||
|
||||
const currentYoutubePlayer = this.currentYoutubePlayer;
|
||||
|
||||
if (currentYoutubePlayer) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue