diff --git a/dashboard-ui/bower_components/emby-webcomponents/.bower.json b/dashboard-ui/bower_components/emby-webcomponents/.bower.json index 97107bed5f..0f2433c2be 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/.bower.json +++ b/dashboard-ui/bower_components/emby-webcomponents/.bower.json @@ -14,12 +14,12 @@ }, "devDependencies": {}, "ignore": [], - "version": "1.4.411", - "_release": "1.4.411", + "version": "1.4.412", + "_release": "1.4.412", "_resolution": { "type": "version", - "tag": "1.4.411", - "commit": "50fdd44728ec2a1faa1aaf44ccb16df821b8295f" + "tag": "1.4.412", + "commit": "a3f1a92bdff2edcffb16833836c60613fba0e889" }, "_source": "https://github.com/MediaBrowser/emby-webcomponents.git", "_target": "^1.2.1", diff --git a/dashboard-ui/bower_components/emby-webcomponents/packagemanager.js b/dashboard-ui/bower_components/emby-webcomponents/packagemanager.js new file mode 100644 index 0000000000..fc59392f9d --- /dev/null +++ b/dashboard-ui/bower_components/emby-webcomponents/packagemanager.js @@ -0,0 +1,148 @@ +define(['appSettings', 'pluginManager'], function (appSettings, pluginManager) { + 'use strict'; + + function packageManager() { + + var self = this; + var settingsKey = 'installedpackages1'; + + var packages = []; + + self.packages = function () { + return packages.slice(0); + }; + + function addPackage(pkg) { + + packages = packages.filter(function (p) { + + return p.name !== pkg.name; + }); + + packages.push(pkg); + } + + self.install = function (url) { + + return loadPackage(url, true).then(function (pkg) { + + var manifestUrls = JSON.parse(appSettings.get(settingsKey) || '[]'); + + if (manifestUrls.indexOf(url) === -1) { + manifestUrls.push(url); + appSettings.set(settingsKey, JSON.stringify(manifestUrls)); + } + + return pkg; + }); + }; + + self.uninstall = function (name) { + + var pkg = packages.filter(function (p) { + + return p.name === name; + })[0]; + + if (pkg) { + + packages = packages.filter(function (p) { + + return p.name !== name; + }); + + removeUrl(pkg.url); + } + + return Promise.resolve(); + }; + + function removeUrl(url) { + + var manifestUrls = JSON.parse(appSettings.get(settingsKey) || '[]'); + + manifestUrls = manifestUrls.filter(function (i) { + return i !== url; + }); + + appSettings.set(settingsKey, JSON.stringify(manifestUrls)); + } + + self.init = function () { + var manifestUrls = JSON.parse(appSettings.get(settingsKey) || '[]'); + + return Promise.all(manifestUrls.map(loadPackage)).then(function () { + return Promise.resolve(); + }, function () { + return Promise.resolve(); + }); + }; + + function loadPackage(url, throwError) { + + return new Promise(function (resolve, reject) { + + var xhr = new XMLHttpRequest(); + var originalUrl = url; + url += url.indexOf('?') === -1 ? '?' : '&'; + url += 't=' + new Date().getTime(); + + xhr.open('GET', url, true); + + var onError = function () { + + if (throwError === true) { + reject(); + } else { + removeUrl(originalUrl); + resolve(); + } + }; + + xhr.onload = function (e) { + if (this.status < 400) { + + var pkg = JSON.parse(this.response); + pkg.url = originalUrl; + + addPackage(pkg); + + var plugins = pkg.plugins || []; + if (pkg.plugin) { + plugins.push(pkg.plugin); + } + var promises = plugins.map(function (pluginUrl) { + return pluginManager.loadPlugin(self.mapPath(pkg, pluginUrl)); + }); + Promise.all(promises).then(resolve, resolve); + + } else { + onError(); + } + }; + + xhr.onerror = onError; + + xhr.send(); + }); + } + + self.mapPath = function (pkg, pluginUrl) { + + var urlLower = pluginUrl.toLowerCase(); + if (urlLower.indexOf('http:') === 0 || urlLower.indexOf('https:') === 0 || urlLower.indexOf('file:') === 0) { + return pluginUrl; + } + + var packageUrl = pkg.url; + packageUrl = packageUrl.substring(0, packageUrl.lastIndexOf('/')); + + packageUrl += '/'; + packageUrl += pluginUrl; + + return packageUrl; + }; + } + + return new packageManager(); +}); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/playbackmanager.js b/dashboard-ui/bower_components/emby-webcomponents/playbackmanager.js index 9026edc766..8e2a50caea 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/playbackmanager.js +++ b/dashboard-ui/bower_components/emby-webcomponents/playbackmanager.js @@ -1,6 +1,16 @@ define(['events', 'datetime', 'appSettings', 'pluginManager', 'userSettings', 'globalize', 'connectionManager', 'loading', 'serverNotifications'], function (events, datetime, appSettings, pluginManager, userSettings, globalize, connectionManager, loading, serverNotifications) { 'use strict'; + function enableLocalPlaylistManagement(player) { + + if (player.isLocalPlayer) { + + return true; + } + + return false; + } + function playbackManager() { var self = this; @@ -95,7 +105,11 @@ define(['events', 'datetime', 'appSettings', 'pluginManager', 'userSettings', 'g currentPairingId = targetInfo.id; - player.tryPair(targetInfo).then(function () { + var promise = player.tryPair ? + player.tryPair(targetInfo) : + Promise.resolve(); + + promise.then(function () { var previousPlayer = currentPlayer; @@ -134,11 +148,36 @@ define(['events', 'datetime', 'appSettings', 'pluginManager', 'userSettings', 'g }); }; + function getSupportedCommands(player) { + + if (player.isLocalPlayer) { + return Dashboard.getSupportedRemoteCommands(); + } + + throw new Error('player must define supported commands'); + } + + function getPlayerTargets(player) { + if (player.getTargets) { + return player.getTargets(); + } + + return Promise.resolve([{ + + name: player.name, + id: player.id, + playerName: player.name, + playableMediaTypes: ['Audio', 'Video', 'Game'].map(player.canPlayMediaType), + isLocalPlayer: player.isLocalPlayer, + supportedCommands: getSupportedCommands(player) + }]); + } + self.setDefaultPlayerActive = function () { var player = self.getDefaultPlayer(); - player.getTargets().then(function (targets) { + getPlayerTargets(player).then(function (targets) { self.setActivePlayer(player, targets[0]); }); @@ -209,9 +248,7 @@ define(['events', 'datetime', 'appSettings', 'pluginManager', 'userSettings', 'g self.getTargets = function () { - var promises = players.map(function (p) { - return p.getTargets(); - }); + var promises = players.map(getPlayerTargets); return Promise.all(promises).then(function (responses) { @@ -2161,7 +2198,7 @@ define(['events', 'datetime', 'appSettings', 'pluginManager', 'userSettings', 'g }); } - function initMediaPlayer(plugin) { + function initMediaPlayer(player) { players.push(player); players.sort(function (a, b) { @@ -2173,10 +2210,12 @@ define(['events', 'datetime', 'appSettings', 'pluginManager', 'userSettings', 'g player.isLocalPlayer = true; } - plugin.currentState = {}; + player.currentState = {}; - events.on(plugin, 'error', onPlaybackError); - events.on(plugin, 'stopped', onPlaybackStopped); + if (enableLocalPlaylistManagement(player)) { + events.on(player, 'error', onPlaybackError); + events.on(player, 'stopped', onPlaybackStopped); + } } events.on(pluginManager, 'registered', function (e, plugin) { diff --git a/dashboard-ui/bower_components/emby-webcomponents/pluginmanager.js b/dashboard-ui/bower_components/emby-webcomponents/pluginmanager.js index 57344ae0ea..bb07c27c8f 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/pluginmanager.js +++ b/dashboard-ui/bower_components/emby-webcomponents/pluginmanager.js @@ -1,4 +1,4 @@ -define(['events'], function (Events) { +define(['events'], function (events) { 'use strict'; function pluginManager() { @@ -13,7 +13,7 @@ define(['events'], function (Events) { self.register = function (obj) { plugins.push(obj); - Events.trigger(self, 'registered', [obj]); + events.trigger(self, 'registered', [obj]); }; self.ofType = function (type) { @@ -87,7 +87,7 @@ define(['events'], function (Events) { return new Promise(function (resolve, reject) { - require([url, 'globalize'], function (pluginFactory, globalize) { + require([url, 'globalize', 'embyRouter'], function (pluginFactory, globalize, embyRouter) { var plugin = new pluginFactory(); @@ -105,9 +105,9 @@ define(['events'], function (Events) { var urlLower = url.toLowerCase(); if (urlLower.indexOf('http:') === -1 && urlLower.indexOf('https:') === -1 && urlLower.indexOf('file:') === -1) { - if (url.indexOf(Emby.Page.baseUrl()) !== 0) { + if (url.indexOf(embyRouter.baseUrl()) !== 0) { - url = Emby.Page.baseUrl() + '/' + url; + url = embyRouter.baseUrl() + '/' + url; } }