1
0
Fork 0
mirror of https://github.com/jellyfin/jellyfin-web synced 2025-03-30 19:56:21 +00:00

resolve conflicts

This commit is contained in:
nyanmisaka 2020-07-31 00:30:05 +08:00
commit bd2fdf4c70
340 changed files with 8623 additions and 10472 deletions

View file

@ -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,

View file

@ -220,7 +220,7 @@ export class BookPlayer {
let apiClient = connectionManager.getApiClient(serverId);
return new Promise((resolve, reject) => {
require(['epubjs'], (epubjs) => {
import('epubjs').then(({default: epubjs}) => {
let downloadHref = apiClient.getItemDownloadUrl(item.Id);
let book = epubjs.default(downloadHref, {openAs: 'epub'});
let rendition = book.renderTo(elem, {width: '100%', height: '97%'});

View file

@ -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) {

View file

@ -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;
@ -150,7 +148,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
function alertText(text, title) {
require(['alert'], function (alert) {
alert({
alert.default({
text: text,
title: title
});
@ -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() || {};
};

View file

@ -1,14 +1,7 @@
define(['connectionManager', 'globalize', 'userSettings', 'apphost'], function (connectionManager, globalize, userSettings, appHost) {
'use strict';
function getRequirePromise(deps) {
return new Promise(function (resolve, reject) {
require(deps, resolve);
});
}
// TODO: Replace with date-fns
// https://stackoverflow.com/questions/6117814/get-week-of-year-in-javascript-like-in-php
function getWeek(date) {
var d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));
@ -19,13 +12,13 @@ define(['connectionManager', 'globalize', 'userSettings', 'apphost'], function (
}
function showMessage(text, userSettingsKey, appHostFeature) {
if (appHost.supports(appHostFeature)) {
return Promise.resolve();
}
var now = new Date();
// TODO: Use date-fns
userSettingsKey += now.getFullYear() + '-w' + getWeek(now);
if (userSettings.get(userSettingsKey, false) === '1') {
@ -33,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);
});
});
@ -56,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();

View file

@ -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,17 +128,13 @@ 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,
xhrSetup: function(xhr, url) {
xhr.withCredentials = true;
}
//appendErrorMaxRetry: 6,
//debug: true
});
hls.loadSource(val);
hls.attachMedia(elem);
@ -153,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);
@ -191,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);
@ -214,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;
@ -233,7 +219,6 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
};
function createMediaElement() {
var elem = self._mediaElement;
if (elem) {
@ -258,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;
@ -275,7 +258,6 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
}
function onVolumeChange() {
if (!self._isFadingOut) {
htmlMediaHelper.saveVolume(this.volume);
events.trigger(self, 'volumechange');
@ -283,7 +265,6 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
}
function onPlaying(e) {
if (!self._started) {
self._started = true;
this.removeAttribute('controls');
@ -294,7 +275,6 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
}
function onPlay(e) {
events.trigger(self, 'unpause');
}
@ -307,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);
@ -351,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);
}
@ -366,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) {
@ -384,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;
@ -399,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);
@ -423,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);
}
@ -453,7 +425,6 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
};
HtmlAudioPlayer.prototype.paused = function () {
var mediaElement = this._mediaElement;
if (mediaElement) {
return mediaElement.paused;
@ -487,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);
}
};
@ -501,7 +471,6 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
};
HtmlAudioPlayer.prototype.setMute = function (mute) {
var mediaElement = this._mediaElement;
if (mediaElement) {
mediaElement.muted = mute;

File diff suppressed because it is too large Load diff

View file

@ -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,
@ -59,23 +56,6 @@ define(['pluginManager'], function (pluginManager) {
return elem.animate(keyframes, timing);
}
function shake(elem, iterations) {
var keyframes = [
{ transform: 'translate3d(0, 0, 0)', offset: 0 },
{ transform: 'translate3d(-10px, 0, 0)', offset: 0.1 },
{ transform: 'translate3d(10px, 0, 0)', offset: 0.2 },
{ transform: 'translate3d(-10px, 0, 0)', offset: 0.3 },
{ transform: 'translate3d(10px, 0, 0)', offset: 0.4 },
{ transform: 'translate3d(-10px, 0, 0)', offset: 0.5 },
{ transform: 'translate3d(10px, 0, 0)', offset: 0.6 },
{ transform: 'translate3d(-10px, 0, 0)', offset: 0.7 },
{ transform: 'translate3d(10px, 0, 0)', offset: 0.8 },
{ transform: 'translate3d(-10px, 0, 0)', offset: 0.9 },
{ transform: 'translate3d(0, 0, 0)', offset: 1 }];
var timing = { duration: 900, iterations: iterations };
return elem.animate(keyframes, timing);
}
function swing(elem, iterations) {
var keyframes = [
{ transform: 'translate(0%)', offset: 0 },
@ -118,7 +98,6 @@ define(['pluginManager'], function (pluginManager) {
}
function rotateIn(elem, iterations) {
var transformOrigin = elem.style['transform-origin'];
var keyframes = [{ transform: 'rotate3d(0, 0, 1, -200deg)', opacity: '0', transformOrigin: 'center', offset: 0 },
{ transform: 'none', opacity: '1', transformOrigin: 'center', offset: 1 }];
var timing = { duration: 900, iterations: iterations };
@ -126,12 +105,10 @@ define(['pluginManager'], function (pluginManager) {
}
function rotateOut(elem, iterations) {
var transformOrigin = elem.style['transform-origin'];
var keyframes = [{ transform: 'none', opacity: '1', transformOrigin: 'center', offset: 0 },
{ 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) {
@ -150,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) {
@ -169,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);
};

View file

@ -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();
};

View file

@ -1,200 +1,186 @@
define(['require', 'events', 'browser', 'appRouter', 'loading'], function (require, events, browser, appRouter, loading) {
'use strict';
/* globals YT */
import events from 'events';
import browser from 'browser';
import appRouter from 'appRouter';
import loading from 'loading';
function zoomIn(elem, iterations) {
var keyframes = [
{ transform: 'scale3d(.2, .2, .2) ', opacity: '.6', offset: 0 },
{ transform: 'none', opacity: '1', offset: 1 }
];
/* globals YT */
var timing = { duration: 240, iterations: iterations };
return elem.animate(keyframes, timing);
}
function zoomIn(elem, iterations) {
const keyframes = [
{ transform: 'scale3d(.2, .2, .2) ', opacity: '.6', offset: 0 },
{ transform: 'none', opacity: '1', offset: 1 }
];
function createMediaElement(instance, options) {
const timing = { duration: 240, iterations: iterations };
return elem.animate(keyframes, timing);
}
return new Promise(function (resolve, reject) {
function createMediaElement(instance, options) {
return new Promise(function (resolve, reject) {
const dlg = document.querySelector('.youtubePlayerContainer');
var dlg = document.querySelector('.youtubePlayerContainer');
if (!dlg) {
import('css!./style').then(() => {
loading.show();
if (!dlg) {
const dlg = document.createElement('div');
require(['css!./style'], function () {
dlg.classList.add('youtubePlayerContainer');
loading.show();
if (options.fullscreen) {
dlg.classList.add('onTop');
}
var dlg = document.createElement('div');
dlg.innerHTML = '<div id="player"></div>';
const videoElement = dlg.querySelector('#player');
dlg.classList.add('youtubePlayerContainer');
document.body.insertBefore(dlg, document.body.firstChild);
instance.videoDialog = dlg;
if (options.fullscreen) {
dlg.classList.add('onTop');
}
dlg.innerHTML = '<div id="player"></div>';
var videoElement = dlg.querySelector('#player');
document.body.insertBefore(dlg, document.body.firstChild);
instance.videoDialog = dlg;
if (options.fullscreen && dlg.animate && !browser.slow) {
zoomIn(dlg, 1).onfinish = function () {
resolve(videoElement);
};
} else {
if (options.fullscreen && dlg.animate && !browser.slow) {
zoomIn(dlg, 1).onfinish = function () {
resolve(videoElement);
}
});
} else {
resolve(dlg.querySelector('#player'));
}
});
}
function onVideoResize() {
var instance = this;
var player = instance.currentYoutubePlayer;
var dlg = instance.videoDialog;
if (player && dlg) {
player.setSize(dlg.offsetWidth, dlg.offsetHeight);
}
}
function clearTimeUpdateInterval(instance) {
if (instance.timeUpdateInterval) {
clearInterval(instance.timeUpdateInterval);
}
instance.timeUpdateInterval = null;
}
function onEndedInternal(instance) {
clearTimeUpdateInterval(instance);
var resizeListener = instance.resizeListener;
if (resizeListener) {
window.removeEventListener('resize', resizeListener);
window.removeEventListener('orientationChange', resizeListener);
instance.resizeListener = null;
}
var stopInfo = {
src: instance._currentSrc
};
events.trigger(instance, 'stopped', [stopInfo]);
instance._currentSrc = null;
if (instance.currentYoutubePlayer) {
instance.currentYoutubePlayer.destroy();
}
instance.currentYoutubePlayer = null;
}
// 4. The API will call this function when the video player is ready.
function onPlayerReady(event) {
event.target.playVideo();
}
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');
}
require(['loading'], function (loading) {
loading.hide();
});
}
}
function setCurrentSrc(instance, elem, options) {
return new Promise(function (resolve, reject) {
require(['queryString'], function (queryString) {
instance._currentSrc = options.url;
var params = queryString.parse(options.url.split('?')[1]);
// 3. This function creates an <iframe> (and YouTube player)
// after the API code downloads.
window.onYouTubeIframeAPIReady = function () {
instance.currentYoutubePlayer = new YT.Player('player', {
height: instance.videoDialog.offsetHeight,
width: instance.videoDialog.offsetWidth,
videoId: params.v,
events: {
'onReady': onPlayerReady,
'onStateChange': function (event) {
if (event.data === YT.PlayerState.PLAYING) {
onPlaying(instance, options, resolve);
} else if (event.data === YT.PlayerState.ENDED) {
onEndedInternal(instance);
} else if (event.data === YT.PlayerState.PAUSED) {
events.trigger(instance, 'pause');
}
}
},
playerVars: {
controls: 0,
enablejsapi: 1,
modestbranding: 1,
rel: 0,
showinfo: 0,
fs: 0,
playsinline: 1
}
});
var resizeListener = instance.resizeListener;
if (resizeListener) {
window.removeEventListener('resize', resizeListener);
window.addEventListener('resize', resizeListener);
} else {
resizeListener = instance.resizeListener = onVideoResize.bind(instance);
window.addEventListener('resize', resizeListener);
}
window.removeEventListener('orientationChange', resizeListener);
window.addEventListener('orientationChange', resizeListener);
};
if (!window.YT) {
var tag = document.createElement('script');
tag.src = 'https://www.youtube.com/iframe_api';
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
};
} else {
window.onYouTubeIframeAPIReady();
resolve(videoElement);
}
});
} else {
resolve(dlg.querySelector('#player'));
}
});
}
});
function onVideoResize() {
const instance = this;
const player = instance.currentYoutubePlayer;
const dlg = instance.videoDialog;
if (player && dlg) {
player.setSize(dlg.offsetWidth, dlg.offsetHeight);
}
}
function clearTimeUpdateInterval(instance) {
if (instance.timeUpdateInterval) {
clearInterval(instance.timeUpdateInterval);
}
instance.timeUpdateInterval = null;
}
function onEndedInternal(instance) {
clearTimeUpdateInterval(instance);
const resizeListener = instance.resizeListener;
if (resizeListener) {
window.removeEventListener('resize', resizeListener);
window.removeEventListener('orientationChange', resizeListener);
instance.resizeListener = null;
}
function YoutubePlayer() {
const stopInfo = {
src: instance._currentSrc
};
events.trigger(instance, 'stopped', [stopInfo]);
instance._currentSrc = null;
if (instance.currentYoutubePlayer) {
instance.currentYoutubePlayer.destroy();
}
instance.currentYoutubePlayer = null;
}
// 4. The API will call this function when the video player is ready.
function onPlayerReady(event) {
event.target.playVideo();
}
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)
// after the API code downloads.
window.onYouTubeIframeAPIReady = function () {
instance.currentYoutubePlayer = new YT.Player('player', {
height: instance.videoDialog.offsetHeight,
width: instance.videoDialog.offsetWidth,
videoId: params.v,
events: {
'onReady': onPlayerReady,
'onStateChange': function (event) {
if (event.data === YT.PlayerState.PLAYING) {
onPlaying(instance, options, resolve);
} else if (event.data === YT.PlayerState.ENDED) {
onEndedInternal(instance);
} else if (event.data === YT.PlayerState.PAUSED) {
events.trigger(instance, 'pause');
}
}
},
playerVars: {
controls: 0,
enablejsapi: 1,
modestbranding: 1,
rel: 0,
showinfo: 0,
fs: 0,
playsinline: 1
}
});
let resizeListener = instance.resizeListener;
if (resizeListener) {
window.removeEventListener('resize', resizeListener);
window.addEventListener('resize', resizeListener);
} else {
resizeListener = instance.resizeListener = onVideoResize.bind(instance);
window.addEventListener('resize', resizeListener);
}
window.removeEventListener('orientationChange', resizeListener);
window.addEventListener('orientationChange', resizeListener);
};
if (!window.YT) {
const tag = document.createElement('script');
tag.src = 'https://www.youtube.com/iframe_api';
const firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
} else {
window.onYouTubeIframeAPIReady();
}
});
});
}
class YoutubePlayer {
constructor() {
this.name = 'Youtube Player';
this.type = 'mediaplayer';
this.id = 'youtubeplayer';
@ -202,24 +188,18 @@ define(['require', 'events', 'browser', 'appRouter', 'loading'], function (requi
// Let any players created by plugins take priority
this.priority = 1;
}
YoutubePlayer.prototype.play = function (options) {
play(options) {
this.started = false;
var instance = this;
const instance = this;
return createMediaElement(this, options).then(function (elem) {
return setCurrentSrc(instance, elem, options);
});
};
YoutubePlayer.prototype.stop = function (destroyPlayer) {
var src = this._currentSrc;
}
stop(destroyPlayer) {
const src = this._currentSrc;
if (src) {
if (this.currentYoutubePlayer) {
this.currentYoutubePlayer.stopVideo();
}
@ -231,63 +211,45 @@ define(['require', 'events', 'browser', 'appRouter', 'loading'], function (requi
}
return Promise.resolve();
};
YoutubePlayer.prototype.destroy = function () {
}
destroy() {
appRouter.setTransparency('none');
var dlg = this.videoDialog;
const dlg = this.videoDialog;
if (dlg) {
this.videoDialog = null;
dlg.parentNode.removeChild(dlg);
}
};
YoutubePlayer.prototype.canPlayMediaType = function (mediaType) {
}
canPlayMediaType(mediaType) {
mediaType = (mediaType || '').toLowerCase();
return mediaType === 'audio' || mediaType === 'video';
};
YoutubePlayer.prototype.canPlayItem = function (item) {
}
canPlayItem(item) {
// Does not play server items
return false;
};
YoutubePlayer.prototype.canPlayUrl = function (url) {
}
canPlayUrl(url) {
return url.toLowerCase().indexOf('youtube.com') !== -1;
};
YoutubePlayer.prototype.getDeviceProfile = function () {
}
getDeviceProfile() {
return Promise.resolve({});
};
YoutubePlayer.prototype.currentSrc = function () {
}
currentSrc() {
return this._currentSrc;
};
YoutubePlayer.prototype.setSubtitleStreamIndex = function (index) {
};
YoutubePlayer.prototype.canSetAudioStreamIndex = function () {
}
setSubtitleStreamIndex(index) {
}
canSetAudioStreamIndex() {
return false;
};
YoutubePlayer.prototype.setAudioStreamIndex = function (index) {
};
}
setAudioStreamIndex(index) {
}
// Save this for when playback stops, because querying the time at that point might return 0
YoutubePlayer.prototype.currentTime = function (val) {
var currentYoutubePlayer = this.currentYoutubePlayer;
currentTime(val) {
const currentYoutubePlayer = this.currentYoutubePlayer;
if (currentYoutubePlayer) {
if (val != null) {
@ -297,113 +259,95 @@ define(['require', 'events', 'browser', 'appRouter', 'loading'], function (requi
return currentYoutubePlayer.getCurrentTime() * 1000;
}
};
YoutubePlayer.prototype.duration = function (val) {
var currentYoutubePlayer = this.currentYoutubePlayer;
}
duration(val) {
const currentYoutubePlayer = this.currentYoutubePlayer;
if (currentYoutubePlayer) {
return currentYoutubePlayer.getDuration() * 1000;
}
return null;
};
YoutubePlayer.prototype.pause = function () {
var currentYoutubePlayer = this.currentYoutubePlayer;
}
pause() {
const currentYoutubePlayer = this.currentYoutubePlayer;
if (currentYoutubePlayer) {
currentYoutubePlayer.pauseVideo();
var instance = this;
const instance = this;
// This needs a delay before the youtube player will report the correct player state
setTimeout(function () {
events.trigger(instance, 'pause');
}, 200);
}
};
YoutubePlayer.prototype.unpause = function () {
var currentYoutubePlayer = this.currentYoutubePlayer;
}
unpause() {
const currentYoutubePlayer = this.currentYoutubePlayer;
if (currentYoutubePlayer) {
currentYoutubePlayer.playVideo();
var instance = this;
const instance = this;
// This needs a delay before the youtube player will report the correct player state
setTimeout(function () {
events.trigger(instance, 'unpause');
}, 200);
}
};
YoutubePlayer.prototype.paused = function () {
var currentYoutubePlayer = this.currentYoutubePlayer;
}
paused() {
const currentYoutubePlayer = this.currentYoutubePlayer;
if (currentYoutubePlayer) {
return currentYoutubePlayer.getPlayerState() === 2;
}
return false;
};
YoutubePlayer.prototype.volume = function (val) {
}
volume(val) {
if (val != null) {
return this.setVolume(val);
}
return this.getVolume();
};
YoutubePlayer.prototype.setVolume = function (val) {
var currentYoutubePlayer = this.currentYoutubePlayer;
}
setVolume(val) {
const currentYoutubePlayer = this.currentYoutubePlayer;
if (currentYoutubePlayer) {
if (val != null) {
currentYoutubePlayer.setVolume(val);
}
}
};
YoutubePlayer.prototype.getVolume = function () {
var currentYoutubePlayer = this.currentYoutubePlayer;
}
getVolume() {
const currentYoutubePlayer = this.currentYoutubePlayer;
if (currentYoutubePlayer) {
return currentYoutubePlayer.getVolume();
}
};
YoutubePlayer.prototype.setMute = function (mute) {
var currentYoutubePlayer = this.currentYoutubePlayer;
}
setMute(mute) {
const currentYoutubePlayer = this.currentYoutubePlayer;
if (mute) {
if (currentYoutubePlayer) {
currentYoutubePlayer.mute();
}
} else {
if (currentYoutubePlayer) {
currentYoutubePlayer.unMute();
}
}
};
YoutubePlayer.prototype.isMuted = function () {
var currentYoutubePlayer = this.currentYoutubePlayer;
}
isMuted() {
const currentYoutubePlayer = this.currentYoutubePlayer;
if (currentYoutubePlayer) {
return currentYoutubePlayer.isMuted();
}
};
}
}
return YoutubePlayer;
});
export default YoutubePlayer;