diff --git a/dashboard-ui/css/mediaplayer-video.css b/dashboard-ui/css/mediaplayer-video.css index 917de36a0e..8ad83120f7 100644 --- a/dashboard-ui/css/mediaplayer-video.css +++ b/dashboard-ui/css/mediaplayer-video.css @@ -106,7 +106,7 @@ #mediaPlayer .ui-slider-track, .nowPlayingBar .ui-slider-track { border-color: #2ad !important; - height: 8px!important; + height: 2px!important; } #mediaPlayer .ui-slider-handle, .nowPlayingBar .ui-slider-handle { diff --git a/dashboard-ui/css/mediaplayer.css b/dashboard-ui/css/mediaplayer.css index 911fbf333e..a6d05f8f65 100644 --- a/dashboard-ui/css/mediaplayer.css +++ b/dashboard-ui/css/mediaplayer.css @@ -1,6 +1,6 @@ /* Now playing bar */ .nowPlayingBar { - padding: 10px 0 14px 0; + padding: 6px 0 14px 0; border-top: 2px solid green; } @@ -30,7 +30,7 @@ } .nowPlayingDoubleText { - top: 0; + top: -3px; } .nowPlayingImage { @@ -57,7 +57,7 @@ } .nowPlayingBar .currentTime { - top: -12px; + top: -15px; } .mediaSlider { @@ -75,8 +75,8 @@ width: 130px; } -#nowPlayingBar .positionSliderContainer { - margin-top: 10px; +#nowPlayingBar .sliderContainer { + margin-top: 14px; } .volumeSliderContainer { diff --git a/dashboard-ui/scripts/chromecast.js b/dashboard-ui/scripts/chromecast.js index 2f75ed9e47..53a379f9e2 100644 --- a/dashboard-ui/scripts/chromecast.js +++ b/dashboard-ui/scripts/chromecast.js @@ -1267,6 +1267,10 @@ castPlayer.stopMedia(); }; + self.displayContent = function (options) { + + }; + self.mute = function () { castPlayer.mute(); }; @@ -1280,12 +1284,19 @@ }; self.getTargets = function () { + var targets = []; - targets.push(self.getCurrentTargetInfo()); + + if (castPlayer.hasReceivers) { + targets.push(self.getCurrentTargetInfo()); + } + return targets; + }; self.getCurrentTargetInfo = function () { + var appName = null; if (castPlayer.session && castPlayer.session.receiver && castPlayer.session.friendlyName) { appName = castPlayer.session.friendlyName; @@ -1297,7 +1308,8 @@ playerName: self.name, playableMediaTypes: ["Audio", "Video"], isLocalPlayer: false, - appName: appName + appName: appName, + supportedCommands: [] }; }; diff --git a/dashboard-ui/scripts/itembynamedetailpage.js b/dashboard-ui/scripts/itembynamedetailpage.js index 3ded84809f..f51044bf7c 100644 --- a/dashboard-ui/scripts/itembynamedetailpage.js +++ b/dashboard-ui/scripts/itembynamedetailpage.js @@ -66,18 +66,11 @@ renderDetails(page, item); renderTabs(page, item); - if (ApiClient.isWebSocketOpen()) { + $(page).trigger('displayingitem', [{ - var vals = [item.Type, item.Id, item.Name]; - - var context = getParameterByName('context'); - - if (context) { - vals.push(vals); - } - - ApiClient.sendWebSocketMessage("Context", vals.join('|')); - } + item: item, + context: getParameterByName('context') + }]); Dashboard.getCurrentUser().done(function (user) { @@ -403,7 +396,7 @@ }; query = $.extend(query, options || {}); - + if (query.IncludeItemTypes == "Audio") { query.SortBy = "Album,SortName"; } diff --git a/dashboard-ui/scripts/itemdetailpage.js b/dashboard-ui/scripts/itemdetailpage.js index 19c4e97ec3..d04719e6ee 100644 --- a/dashboard-ui/scripts/itemdetailpage.js +++ b/dashboard-ui/scripts/itemdetailpage.js @@ -75,11 +75,11 @@ } if (!item.LocalTrailerCount && item.RemoteTrailers.length && item.PlayAccess == 'Full') { - + $('.btnPlayExternalTrailer', page).removeClass('hide').attr('href', item.RemoteTrailers[0].Url); } else { - + $('.btnPlayExternalTrailer', page).addClass('hide').attr('href', '#'); } @@ -120,9 +120,11 @@ setPeopleHeader(page, item); - if (ApiClient.isWebSocketOpen()) { - ApiClient.sendWebSocketMessage("Context", [item.Type, item.Id, item.Name, context].join('|')); - } + $(page).trigger('displayingitem', [{ + + item: item, + context: context + }]); Dashboard.hideLoadingMsg(); }); diff --git a/dashboard-ui/scripts/itemlistpage.js b/dashboard-ui/scripts/itemlistpage.js index 39cbc0caca..1d0194d4ef 100644 --- a/dashboard-ui/scripts/itemlistpage.js +++ b/dashboard-ui/scripts/itemlistpage.js @@ -93,9 +93,10 @@ Dashboard.setPageTitle(name); - if (ApiClient.isWebSocketOpen()) { - ApiClient.sendWebSocketMessage("Context", [item.Type, item.Id, item.Name].join('|')); - } + $(page).trigger('displayingitem', [{ + + item: item + }]); }); @@ -203,7 +204,7 @@ }).on('pageshow', "#itemListPage", function () { var page = this; - + query.Limit = LibraryBrowser.getDefaultPageSize(); query.ParentId = getParameterByName('parentId'); query.Filters = ""; diff --git a/dashboard-ui/scripts/librarybrowser.js b/dashboard-ui/scripts/librarybrowser.js index a2fc2608ae..4b35cd709d 100644 --- a/dashboard-ui/scripts/librarybrowser.js +++ b/dashboard-ui/scripts/librarybrowser.js @@ -672,7 +672,7 @@ html += ''; var style = ""; - + options.lazy = false; if (imgUrl && !options.lazy) { style += 'background-image:url(\'' + imgUrl + '\');'; } diff --git a/dashboard-ui/scripts/livetvchannel.js b/dashboard-ui/scripts/livetvchannel.js index 12b93a7c9c..4ce429f77c 100644 --- a/dashboard-ui/scripts/livetvchannel.js +++ b/dashboard-ui/scripts/livetvchannel.js @@ -135,14 +135,11 @@ $('.userDataIcons', page).html(LibraryBrowser.getUserDataIconsHtml(item)); - if (ApiClient.isWebSocketOpen()) { + $(page).trigger('displayingitem', [{ - var vals = [item.Type, item.Id, item.Name]; - - vals.push('livetv'); - - ApiClient.sendWebSocketMessage("Context", vals.join('|')); - } + item: item, + context: 'livetv' + }]); Dashboard.getCurrentUser().done(function (user) { diff --git a/dashboard-ui/scripts/livetvprogram.js b/dashboard-ui/scripts/livetvprogram.js index 6c8e4f30bb..5e5e1070ac 100644 --- a/dashboard-ui/scripts/livetvprogram.js +++ b/dashboard-ui/scripts/livetvprogram.js @@ -50,14 +50,11 @@ LiveTvHelpers.renderMiscProgramInfo($('.miscTvProgramInfo', page), item); - if (ApiClient.isWebSocketOpen()) { + $(page).trigger('displayingitem', [{ - var vals = [item.Type, item.Id, item.Name]; - - vals.push('livetv'); - - ApiClient.sendWebSocketMessage("Context", vals.join('|')); - } + item: item, + context: 'livetv' + }]); if (item.TimerId) { $('#cancelRecordingButtonContainer', page).show(); diff --git a/dashboard-ui/scripts/livetvrecording.js b/dashboard-ui/scripts/livetvrecording.js index 6ecf639520..23ba53e22a 100644 --- a/dashboard-ui/scripts/livetvrecording.js +++ b/dashboard-ui/scripts/livetvrecording.js @@ -55,14 +55,11 @@ LiveTvHelpers.renderMiscProgramInfo($('.miscTvProgramInfo', page), item); - if (ApiClient.isWebSocketOpen()) { + $(page).trigger('displayingitem', [{ - var vals = [item.Type, item.Id, item.Name]; - - vals.push('livetv'); - - ApiClient.sendWebSocketMessage("Context", vals.join('|')); - } + item: item, + context: 'livetv' + }]); $('.recordingStatus', page).html('Status:   ' + item.Status); diff --git a/dashboard-ui/scripts/mediacontroller.js b/dashboard-ui/scripts/mediacontroller.js index da61ab2c46..0cd0de6dbf 100644 --- a/dashboard-ui/scripts/mediacontroller.js +++ b/dashboard-ui/scripts/mediacontroller.js @@ -1,11 +1,26 @@ (function ($, window) { + var enableMirrorMode; + var currentDisplayInfo; + + function mirrorItem(info) { + + var item = info.item; + + MediaController.getCurrentPlayer().displayContent({ + + itemName: item.Name, + itemId: item.Id, + itemType: item.Type, + context: info.context + }); + } + function mediaController() { var self = this; var currentPlayer; var currentTargetInfo; - var players = []; self.registerPlayer = function (player) { @@ -308,11 +323,11 @@ else if (cmd.Name === 'ToggleMute') { localPlayer.toggleMute(); } - else if (msg.Data.Command === 'Fullscreen') { + else if (cmd.Name === 'Fullscreen') { localPlayer.remoteFullscreen(); } - else if (msg.Data.Command === 'SetVolume') { - localPlayer.setVolume(cmd.Arguments.Volume); + else if (cmd.Name === 'SetVolume') { + localPlayer.setVolume(parseFloat(cmd.Arguments.Volume)); } } } @@ -324,7 +339,9 @@ var playerInfo = MediaController.getPlayerInfo(); var html = ''; - html += '

Select Player:

'; + html += '
'; + + html += '

Select Player:

'; html += '
'; for (var i = 0, length = targets.length; i < length; i++) { @@ -336,7 +353,9 @@ var isChecked = target.id == playerInfo.id; var checkedHtml = isChecked ? ' checked="checked"' : ''; - html += ''; + var mirror = (!target.isLocalPlayer && target.supportedCommands.indexOf('DisplayContent') != -1) ? 'true' : 'false'; + + html += ''; html += '

- Help ensure the continued development of this product by donating a minimum of $10 (greater amounts greatly appreciated). A portion of all donations will be contributed to other free tools we depend on. + Help ensure the continued development of this project by donating. A portion of all donations will be contributed to other free tools we depend on.

-
diff --git a/dashboard-ui/thirdparty/mediabrowser.apiclient.js b/dashboard-ui/thirdparty/mediabrowser.apiclient.js index 71c59924a6..9c9aebcbe5 100644 --- a/dashboard-ui/thirdparty/mediabrowser.apiclient.js +++ b/dashboard-ui/thirdparty/mediabrowser.apiclient.js @@ -1728,6 +1728,16 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout, wi }); }; + self.reportCapabilities = function (options) { + + var url = self.getUrl("Sessions/Capabilities", options); + + return self.ajax({ + type: "POST", + url: url + }); + }; + self.updateItemImageIndex = function (itemId, itemType, itemName, imageType, imageIndex, newIndex) { if (!imageType) { @@ -3758,24 +3768,6 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout, wi }); }; - self.sendBrowseCommand = function (sessionId, options) { - - if (!sessionId) { - throw new Error("null sessionId"); - } - - if (!options) { - throw new Error("null options"); - } - - var url = self.getUrl("Sessions/" + sessionId + "/Viewing", options); - - return self.ajax({ - type: "POST", - url: url - }); - }; - self.sendPlayCommand = function (sessionId, options) { if (!sessionId) {