From 93ce8f975b160c5bd5a6fb34604ec9d782392a51 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Wed, 25 Jan 2017 01:14:35 -0500 Subject: [PATCH] update components --- .../emby-webcomponents/.bower.json | 8 +- .../htmlvideoplayer/plugin.js | 47 --------- .../htmlvideoplayer/style.css | 38 ++------ .../playback/playbackmanager.js | 66 ++++++++++++- .../playback/playersettingsmenu.js | 95 +++++++++++++++++++ .../resourcelocks/nullresourcelock.js | 20 ++++ .../resourcelocks/resourcelockmanager.js | 37 ++++++++ .../emby-webcomponents/strings/en-us.json | 3 +- 8 files changed, 232 insertions(+), 82 deletions(-) create mode 100644 dashboard-ui/bower_components/emby-webcomponents/playback/playersettingsmenu.js create mode 100644 dashboard-ui/bower_components/emby-webcomponents/resourcelocks/nullresourcelock.js create mode 100644 dashboard-ui/bower_components/emby-webcomponents/resourcelocks/resourcelockmanager.js diff --git a/dashboard-ui/bower_components/emby-webcomponents/.bower.json b/dashboard-ui/bower_components/emby-webcomponents/.bower.json index 342b2519e..b5d83fb2b 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.489", - "_release": "1.4.489", + "version": "1.4.490", + "_release": "1.4.490", "_resolution": { "type": "version", - "tag": "1.4.489", - "commit": "4b7b914b55dba588627036dee142a3358cb1c282" + "tag": "1.4.490", + "commit": "d0ee6da0b7661ff97d3501ea7633d113d3cb5a99" }, "_source": "https://github.com/MediaBrowser/emby-webcomponents.git", "_target": "^1.2.1", diff --git a/dashboard-ui/bower_components/emby-webcomponents/htmlvideoplayer/plugin.js b/dashboard-ui/bower_components/emby-webcomponents/htmlvideoplayer/plugin.js index 9bb14f308..819fddd68 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/htmlvideoplayer/plugin.js +++ b/dashboard-ui/bower_components/emby-webcomponents/htmlvideoplayer/plugin.js @@ -23,8 +23,6 @@ define(['browser', 'pluginManager', 'events', 'apphost', 'loading', 'playbackMan var subtitleTrackIndexToSetOnPlaying; - var currentSubtitlesElement; - var currentTrackEvents; var lastCustomTrackMs = 0; var currentClock; var currentAssRenderer; @@ -923,11 +921,6 @@ define(['browser', 'pluginManager', 'events', 'apphost', 'loading', 'playbackMan window.removeEventListener('resize', onVideoResize); window.removeEventListener('orientationchange', onVideoResize); - var videoSubtitlesElem = document.querySelector('.videoSubtitles'); - if (videoSubtitlesElem) { - videoSubtitlesElem.parentNode.removeChild(videoSubtitlesElem); - } - if (isPlaying) { var allTracks = mediaElement.textTracks; // get list of tracks @@ -942,8 +935,6 @@ define(['browser', 'pluginManager', 'events', 'apphost', 'loading', 'playbackMan } customTrackIndex = -1; - currentSubtitlesElement = null; - currentTrackEvents = null; currentClock = null; var renderer = currentAssRenderer; @@ -1084,44 +1075,6 @@ define(['browser', 'pluginManager', 'events', 'apphost', 'loading', 'playbackMan if (clock) { clock.seek(timeMs / 1000); } - - var trackEvents = currentTrackEvents; - if (!trackEvents) { - return; - } - - if (!currentSubtitlesElement) { - var videoSubtitlesElem = document.querySelector('.videoSubtitles'); - if (!videoSubtitlesElem) { - videoSubtitlesElem = document.createElement('div'); - videoSubtitlesElem.classList.add('videoSubtitles'); - videoSubtitlesElem.innerHTML = '
'; - videoDialog.appendChild(videoSubtitlesElem); - } - currentSubtitlesElement = videoSubtitlesElem.querySelector('.videoSubtitlesInner'); - } - - if (lastCustomTrackMs > 0) { - if (Math.abs(lastCustomTrackMs - timeMs) < 500) { - return; - } - } - - lastCustomTrackMs = new Date().getTime(); - - var positionTicks = timeMs * 10000; - for (var i = 0, length = trackEvents.length; i < length; i++) { - - var caption = trackEvents[i]; - if (positionTicks >= caption.StartPositionTicks && positionTicks <= caption.EndPositionTicks) { - currentSubtitlesElement.innerHTML = caption.Text; - currentSubtitlesElement.classList.remove('hide'); - return; - } - } - - currentSubtitlesElement.innerHTML = ''; - currentSubtitlesElement.classList.add('hide'); } function getMediaStreamAudioTracks(mediaSource) { diff --git a/dashboard-ui/bower_components/emby-webcomponents/htmlvideoplayer/style.css b/dashboard-ui/bower_components/emby-webcomponents/htmlvideoplayer/style.css index 82e787d40..fd3861c25 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/htmlvideoplayer/style.css +++ b/dashboard-ui/bower_components/emby-webcomponents/htmlvideoplayer/style.css @@ -31,32 +31,14 @@ height: 100%; } -.videoSubtitles { - position: fixed; - bottom: 10%; - text-align: center; - left: 0; - right: 0; - color: #fff; - font-size: 150%; -} + .htmlvideoplayer::-webkit-media-text-track-display { + /*Style the text itself*/ + margin-top: -2.5em; + } -.videoSubtitlesInner { - max-width: 70%; - background-color: rgba(0,0,0,.8); - padding: .25em; - margin: auto; - display: inline-block; -} - -.htmlvideoplayer::-webkit-media-text-track-display { - /*Style the text itself*/ - margin-top: -2.5em; -} - -::cue { - background-color: transparent; - text-shadow: 2px 2px 2px rgba(0, 0, 0, 1); - -webkit-font-smoothing: antialiased; - font-family: inherit; -} + .htmlvideoplayer::cue { + background-color: transparent; + text-shadow: 2px 2px 2px rgba(0, 0, 0, 1); + -webkit-font-smoothing: antialiased; + font-family: inherit; + } diff --git a/dashboard-ui/bower_components/emby-webcomponents/playback/playbackmanager.js b/dashboard-ui/bower_components/emby-webcomponents/playback/playbackmanager.js index bc9a164f3..b5a2338ed 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/playback/playbackmanager.js +++ b/dashboard-ui/bower_components/emby-webcomponents/playback/playbackmanager.js @@ -1594,7 +1594,7 @@ define(['events', 'datetime', 'appSettings', 'pluginManager', 'userSettings', 'g var player = currentPlayer; if (player) { - player.destroy(); + destroyPlayer(player); } setCurrentPlayerInternal(null); @@ -1604,6 +1604,11 @@ define(['events', 'datetime', 'appSettings', 'pluginManager', 'userSettings', 'g }); } + function destroyPlayer(player) { + player.destroy(); + releaseResourceLocks(player); + } + function runInterceptors(item, playOptions) { return new Promise(function (resolve, reject) { @@ -2567,9 +2572,66 @@ define(['events', 'datetime', 'appSettings', 'pluginManager', 'userSettings', 'g events.trigger(player, 'playbackstart', [state]); events.trigger(self, 'playbackstart', [player, state]); + + acquireResourceLocks(player, streamInfo.mediaType); }); } + function acquireResourceLocks(player, mediaType) { + + if (!player.isLocalPlayer) { + return; + } + + var playerData = getPlayerData(player); + playerData.resourceLocks = playerData.resourceLocks || {}; + var locks = playerData.resourceLocks; + + ensureLock(locks, 'network'); + ensureLock(locks, 'wake'); + + if (mediaType === 'Video') { + ensureLock(locks, 'screen'); + } + } + + function ensureLock(locks, resourceType) { + + var prop = resourceType + 'Lock'; + var existingLock = locks[prop]; + if (existingLock) { + existingLock.acquire(); + return; + } + + require(['resourceLockManager'], function (resourceLockManager) { + resourceLockManager.request(resourceType).then(function (resourceLock) { + locks[prop] = resourceLock; + resourceLock.acquire(); + }); + }); + } + + function releaseResourceLocks(player) { + + if (!player.isLocalPlayer) { + return; + } + + var playerData = getPlayerData(player); + var locks = playerData.resourceLocks || {}; + + if (locks.wakeLock) { + locks.wakeLock.release(); + } + if (locks.networkLock) { + locks.networkLock.release(); + } + if (locks.screenLock) { + locks.screenLock.release(); + } + } + function onPlaybackError(e, error) { var player = this; @@ -2666,7 +2728,7 @@ define(['events', 'datetime', 'appSettings', 'pluginManager', 'userSettings', 'g var newPlayer = nextItem ? getPlayer(nextItem.item, currentPlayOptions) : null; if (newPlayer !== player) { - player.destroy(); + destroyPlayer(player); setCurrentPlayerInternal(null); } diff --git a/dashboard-ui/bower_components/emby-webcomponents/playback/playersettingsmenu.js b/dashboard-ui/bower_components/emby-webcomponents/playback/playersettingsmenu.js new file mode 100644 index 000000000..1e0ed5f53 --- /dev/null +++ b/dashboard-ui/bower_components/emby-webcomponents/playback/playersettingsmenu.js @@ -0,0 +1,95 @@ +define(['actionsheet', 'datetime', 'playbackManager', 'globalize', 'appSettings', 'qualityoptions'], function (actionsheet, datetime, playbackManager, globalize, appSettings, qualityoptions) { + 'use strict'; + + function showQualityMenu(player, btn) { + + var videoStream = playbackManager.currentMediaSource(player).MediaStreams.filter(function (stream) { + return stream.Type === "Video"; + })[0]; + var videoWidth = videoStream ? videoStream.Width : null; + + var options = qualityoptions.getVideoQualityOptions(playbackManager.getMaxStreamingBitrate(player), videoWidth); + + //if (isStatic) { + // options[0].name = "Direct"; + //} + + var menuItems = options.map(function (o) { + + var opt = { + name: o.name, + id: o.bitrate + }; + + if (o.selected) { + opt.selected = true; + } + + return opt; + }); + + var selectedId = options.filter(function (o) { + return o.selected; + }); + + selectedId = selectedId.length ? selectedId[0].bitrate : null; + + return actionsheet.show({ + items: menuItems, + positionTo: btn + + }).then(function (id) { + var bitrate = parseInt(id); + if (bitrate !== selectedId) { + playbackManager.setMaxStreamingBitrate(bitrate, player); + } + }); + } + + function showSettingsMenu(player, btn) { + + } + + function show(options) { + + var player = options.player; + var mediaType = options.mediaType; + return showQualityMenu(player, options.positionTo); + + //var menuItems = []; + + //menuItems.push({ + // name: globalize.translate('sharedcomponents#Quality'), + // id: 'quality' + //}); + + //menuItems.push({ + // name: globalize.translate('sharedcomponents#Settings'), + // id: 'settings' + //}); + + //return actionsheet.show({ + + // items: menuItems, + // positionTo: options.positionTo + + //}).then(function (id) { + + // switch (id) { + + // case 'quality': + // return showQualityMenu(player, options.positionTo); + // case 'settings': + // return showSettingsMenu(player, options.positionTo); + // default: + // break; + // } + + // return Promise.reject(); + //}); + } + + return { + show: show + }; +}); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/resourcelocks/nullresourcelock.js b/dashboard-ui/bower_components/emby-webcomponents/resourcelocks/nullresourcelock.js new file mode 100644 index 000000000..b55e1f8ec --- /dev/null +++ b/dashboard-ui/bower_components/emby-webcomponents/resourcelocks/nullresourcelock.js @@ -0,0 +1,20 @@ +define([], function () { + 'use strict'; + + function ResourceLockInstance() { + } + + ResourceLockInstance.prototype.acquire = function () { + this._isHeld = true; + }; + + ResourceLockInstance.prototype.isHeld = function () { + return this._isHeld === true; + }; + + ResourceLockInstance.prototype.release = function () { + this._isHeld = false; + }; + + return ResourceLockInstance; +}); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/resourcelocks/resourcelockmanager.js b/dashboard-ui/bower_components/emby-webcomponents/resourcelocks/resourcelockmanager.js new file mode 100644 index 000000000..f70d14f6e --- /dev/null +++ b/dashboard-ui/bower_components/emby-webcomponents/resourcelocks/resourcelockmanager.js @@ -0,0 +1,37 @@ +define([], function () { + 'use strict'; + + function getRequirePromise(deps) { + + return new Promise(function (resolve, reject) { + + require(deps, resolve); + }); + } + + function requestResourceLock(resource) { + return getRequirePromise([resource]).then(function (factory) { + return new factory(); + }); + } + + function request(type) { + + switch (type) { + + case 'wake': + return requestResourceLock('wakeLock'); + case 'screen': + return requestResourceLock('screenLock'); + case 'network': + return requestResourceLock('networkLock'); + default: + return Promise.reject(); + } + return Promise.resolve(new ResourceLockInstance(type)); + } + + return { + request: request + }; +}); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/en-us.json b/dashboard-ui/bower_components/emby-webcomponents/strings/en-us.json index acf4d3c95..b45fec28e 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/en-us.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/en-us.json @@ -383,5 +383,6 @@ "HeaderRemoteControl": "Remote Control", "Disconnect": "Disconnect", "EnableDisplayMirroring": "Enable display mirroring", - "HeaderSelectPlayer": "Select Player" + "HeaderSelectPlayer": "Select Player", + "Quality": "Quality" } \ No newline at end of file