diff --git a/dashboard-ui/css/mediaplayer-video.css b/dashboard-ui/css/mediaplayer-video.css index 6e470c85a9..3dec7de764 100644 --- a/dashboard-ui/css/mediaplayer-video.css +++ b/dashboard-ui/css/mediaplayer-video.css @@ -26,6 +26,15 @@ height: auto; } +.videoCanvas { + background-color: #000; + position: fixed; + top: 200px; + bottom: 200px; + left: 200px; + right: 200px; +} + .videoControls { padding: 0 .5em; background-color: rgba(0, 0, 0, .8); diff --git a/dashboard-ui/myprofile.html b/dashboard-ui/myprofile.html index 0483f52567..a06f00f6f1 100644 --- a/dashboard-ui/myprofile.html +++ b/dashboard-ui/myprofile.html @@ -53,8 +53,68 @@ +
+ + +
+
+

${HeaderLocalAccess}

+
+
+ +
    +
  • + + +
    ${LabelAllowLocalAccessWithoutPasswordHelp}
    +
  • +
  • + +
  • +
+ +
+
+
+ diff --git a/dashboard-ui/scripts/connectlogin.js b/dashboard-ui/scripts/connectlogin.js index 57d7305099..57913524f9 100644 --- a/dashboard-ui/scripts/connectlogin.js +++ b/dashboard-ui/scripts/connectlogin.js @@ -16,15 +16,29 @@ function connectToServerInstance(server) { - var url = server.Url; + connectToServerAtUrl(server, server.Url).fail(function () { + + if (server.LocalAddress) { + connectToServerAtUrl(server, server.LocalAddress).fail(showServerConnectionFailure); + + } else { + showServerConnectionFailure(); + } + }); + } + + function showServerConnectionFailure() { + alert('Unable to communicate with your server.'); + } + + function connectToServerAtUrl(server, url) { + var exchangeToken = server.AccessKey; - url += "/mediabrowser/Connect/Exchange?format=json&ConnectUserId=" + ConnectionManager.connectUserId(); - - $.ajax({ + return $.ajax({ type: "GET", - url: url, + url: url + "/mediabrowser/Connect/Exchange?format=json&ConnectUserId=" + ConnectionManager.connectUserId(), dataType: "json", error: function () { @@ -37,15 +51,11 @@ }).done(function (result) { - Dashboard.serverAddress(server.Url); + Dashboard.serverAddress(url); Dashboard.setCurrentUser(result.LocalUserId, result.AccessToken); window.location = 'index.html'; - }).fail(function (result) { - - alert('Error talking to MBS'); - }); } diff --git a/dashboard-ui/scripts/itemdetailpage.js b/dashboard-ui/scripts/itemdetailpage.js index a60b326dcc..58812d192b 100644 --- a/dashboard-ui/scripts/itemdetailpage.js +++ b/dashboard-ui/scripts/itemdetailpage.js @@ -1282,6 +1282,10 @@ attributes.push(createAttribute(Globalize.translate('MediaInfoTimestamp'), version.Timestamp)); } + if (stream.IsCabac != null) { + attributes.push(createAttribute(Globalize.translate('CABAC'), (stream.IsCabac ? 'Yes' : 'No'))); + } + html += attributes.join('
'); html += ''; diff --git a/dashboard-ui/scripts/livetvguide.js b/dashboard-ui/scripts/livetvguide.js index 6e2e21a8a7..f5aa84aee6 100644 --- a/dashboard-ui/scripts/livetvguide.js +++ b/dashboard-ui/scripts/livetvguide.js @@ -151,11 +151,7 @@ var localTime = program.StartDateLocal.getTime(); if ((localTime >= cellStart || cellIndex == 0) && localTime < cellEnd && program.EndDateLocal > cellStart) { - return { - - index: i, - program: program - }; + return program; } } @@ -198,7 +194,6 @@ html += '
'; - var programIndex = 0; var cellIndex = 0; while (date.getDate() == dateNumber) { @@ -206,12 +201,7 @@ // Add 30 mins var cellEndDate = new Date(date.getTime() + cellDurationMs); - var program = findProgramStartingInCell(programs, programIndex, date, cellEndDate, cellIndex); - - if (program) { - programIndex = program.index + 1; - program = program.program; - } + var program = findProgramStartingInCell(programs, 0, date, cellEndDate, cellIndex); html += '
'; diff --git a/dashboard-ui/scripts/mediaplayer-video.js b/dashboard-ui/scripts/mediaplayer-video.js index 8352b8561a..2fbc906115 100644 --- a/dashboard-ui/scripts/mediaplayer-video.js +++ b/dashboard-ui/scripts/mediaplayer-video.js @@ -633,7 +633,7 @@ return currentStream.Type == "Audio"; }); - var currentIndex = getParameterByName('AudioStreamIndex', self.currentMediaElement.currentSrc); + var currentIndex = getParameterByName('AudioStreamIndex', self.getCurrentSrc(self.currentMediaElement)); var html = ''; html += '
'; @@ -789,7 +789,7 @@ function getQualityFlyoutHtml() { - var currentSrc = self.currentMediaElement.currentSrc.toLowerCase(); + var currentSrc = self.getCurrentSrc(self.currentMediaElement).toLowerCase(); var isStatic = currentSrc.indexOf('static=true') != -1; var options = getVideoQualityOptions(self.currentMediaSource.MediaStreams); diff --git a/dashboard-ui/scripts/mediaplayer.js b/dashboard-ui/scripts/mediaplayer.js index f80118f953..61a84d38eb 100644 --- a/dashboard-ui/scripts/mediaplayer.js +++ b/dashboard-ui/scripts/mediaplayer.js @@ -44,6 +44,10 @@ canClientSeek = duration && !isNaN(duration) && duration != Number.POSITIVE_INFINITY && duration != Number.NEGATIVE_INFINITY; }; + self.getCurrentSrc = function (mediaElement) { + return mediaElement.currentSrc; + }; + self.getCurrentTicks = function (mediaElement) { var playerTime = Math.floor(10000000 * (mediaElement || self.currentMediaElement).currentTime); @@ -262,7 +266,7 @@ return false; } - if (mediaSource.Protocol.toLowerCase() == "rtmp") { + if (mediaSource.Protocol.toLowerCase() == "rtmp" || mediaSource.Protocol.toLowerCase() == "rtsp") { //console.log('Transcoding because the content is not a video file'); return false; } @@ -289,6 +293,11 @@ return false; } + if (videoStream.IsCabac != null && !videoStream.IsCabac) { + console.log('Video not CABAC'); + return false; + } + if (!videoStream.Width) { console.log('Transcoding because resolution is unknown'); return false; @@ -770,13 +779,17 @@ self.setVolume(self.getSavedVolume() * 100); }; + self.volume = function() { + return self.currentMediaElement.volume * 100; + }; + self.toggleMute = function () { if (self.currentMediaElement) { console.log('MediaPlayer toggling mute'); - if (self.currentMediaElement.volume) { + if (self.volume()) { self.mute(); } else { self.unMute(); @@ -787,14 +800,14 @@ self.volumeDown = function () { if (self.currentMediaElement) { - self.setVolume(Math.max(self.currentMediaElement.volume - .02, 0) * 100); + self.setVolume(Math.max(self.volume() - 2, 0)); } }; self.volumeUp = function () { if (self.currentMediaElement) { - self.setVolume(Math.min(self.currentMediaElement.volume + .02, 1) * 100); + self.setVolume(Math.min(self.volume() + 2, 100)); } }; diff --git a/dashboard-ui/scripts/myprofile.js b/dashboard-ui/scripts/myprofile.js index f72e607524..13e6041582 100644 --- a/dashboard-ui/scripts/myprofile.js +++ b/dashboard-ui/scripts/myprofile.js @@ -215,4 +215,166 @@ }); -})(jQuery, window, document, window.FileReader); \ No newline at end of file +})(jQuery, window, document, window.FileReader); + +(function ($, document, window) { + + function loadUser(page) { + + var userid = getParameterByName("userId"); + + ApiClient.getUser(userid).done(function (user) { + + Dashboard.setPageTitle(user.Name); + + if (user.ConnectLinkType == 'Guest') { + $('.localAccessSection', page).hide(); + $('.passwordSection', page).hide(); + } + else if (user.HasConfiguredPassword) { + $('#btnResetPassword', page).show(); + $('#fldCurrentPassword', page).show(); + $('.localAccessSection', page).show(); + $('.passwordSection', page).show(); + } else { + $('#btnResetPassword', page).hide(); + $('#fldCurrentPassword', page).hide(); + $('.localAccessSection', page).hide(); + $('.passwordSection', page).show(); + } + + $('#chkEnableLocalAccessWithoutPassword', page).checked(user.Configuration.EnableLocalPassword).checkboxradio('refresh'); + }); + + $('#txtCurrentPassword', page).val(''); + $('#txtNewPassword', page).val(''); + $('#txtNewPasswordConfirm', page).val(''); + } + + function save(page) { + + var userId = getParameterByName("userId"); + + ApiClient.getUser(userId).done(function (user) { + + user.Configuration.EnableLocalPassword = $('#chkEnableLocalAccessWithoutPassword', page).checked(); + + ApiClient.updateUser(user).done(function () { + + Dashboard.hideLoadingMsg(); + + Dashboard.alert(Globalize.translate('MessageSettingsSaved')); + loadUser(page); + }); + }); + } + + function savePassword(page) { + + var userId = getParameterByName("userId"); + + var currentPassword = $('#txtCurrentPassword', page).val(); + var newPassword = $('#txtNewPassword', page).val(); + + ApiClient.updateUserPassword(userId, currentPassword, newPassword).done(function () { + + Dashboard.hideLoadingMsg(); + + Dashboard.alert(Globalize.translate('PasswordSaved')); + loadUser(page); + + }); + + } + + function updatePasswordPage() { + + var self = this; + + self.onSubmit = function () { + + var page = $.mobile.activePage; + + if ($('#txtNewPassword', page).val() != $('#txtNewPasswordConfirm', page).val()) { + + Dashboard.showError(Globalize.translate('PasswordMatchError')); + return false; + } + + Dashboard.showLoadingMsg(); + + savePassword(page); + + // Disable default form submission + return false; + + }; + + self.onLocalAccessSubmit = function () { + + var page = $.mobile.activePage; + + Dashboard.showLoadingMsg(); + + save(page); + + // Disable default form submission + return false; + + }; + + self.resetPassword = function () { + + var msg = Globalize.translate('PasswordResetConfirmation'); + + var page = $.mobile.activePage; + + Dashboard.confirm(msg, Globalize.translate('PasswordResetHeader'), function (result) { + + if (result) { + var userId = getParameterByName("userId"); + + Dashboard.showLoadingMsg(); + + ApiClient.resetUserPassword(userId).done(function () { + + Dashboard.hideLoadingMsg(); + + Dashboard.alert({ + message: Globalize.translate('PasswordResetComplete'), + title: Globalize.translate('PasswordResetHeader') + }); + + loadUser(page); + + }); + } + }); + + }; + } + + window.UpdatePasswordPage = new updatePasswordPage(); + + $(document).on('pagebeforeshow', "#userImagePage", function () { + + var page = this; + + Dashboard.getCurrentUser().done(function (loggedInUser) { + + if (loggedInUser.Configuration.IsAdministrator) { + $('#lnkParentalControl', page).show(); + } else { + $('#lnkParentalControl', page).hide(); + } + }); + + }).on('pageshow', "#userImagePage", function () { + + var page = this; + + loadUser(page); + + }); + +})(jQuery, document, window); \ No newline at end of file diff --git a/dashboard-ui/scripts/userpassword.js b/dashboard-ui/scripts/userpassword.js deleted file mode 100644 index 406789b928..0000000000 --- a/dashboard-ui/scripts/userpassword.js +++ /dev/null @@ -1,163 +0,0 @@ -(function ($, document, window) { - - function loadUser(page) { - - var userid = getParameterByName("userId"); - - ApiClient.getUser(userid).done(function (user) { - - Dashboard.setPageTitle(user.Name); - - if (user.ConnectLinkType == 'Guest') { - $('.localAccessSection', page).show().collapsible("option", "collapsed", false); - $('.passwordSection', page).hide(); - } - else if (user.HasConfiguredPassword) { - $('#btnResetPassword', page).show(); - $('#fldCurrentPassword', page).show(); - $('.formheader', page).hide(); - $('.localAccessSection', page).show(); - $('.passwordSection', page).show(); - } else { - $('#btnResetPassword', page).hide(); - $('#fldCurrentPassword', page).hide(); - $('.formheader', page).show(); - $('.localAccessSection', page).hide(); - $('.passwordSection', page).show(); - } - - $('#chkEnableLocalAccessWithoutPassword', page).checked(user.Configuration.EnableLocalPassword).checkboxradio('refresh'); - }); - - $('#txtCurrentPassword', page).val(''); - $('#txtNewPassword', page).val(''); - $('#txtNewPasswordConfirm', page).val(''); - } - - function save(page) { - - var userId = getParameterByName("userId"); - - ApiClient.getUser(userId).done(function (user) { - - user.Configuration.EnableLocalPassword = $('#chkEnableLocalAccessWithoutPassword', page).checked(); - - ApiClient.updateUser(user).done(function() { - - Dashboard.hideLoadingMsg(); - - Dashboard.alert(Globalize.translate('MessageSettingsSaved')); - loadUser(page); - }); - }); - } - - function savePassword(page) { - - var userId = getParameterByName("userId"); - - var currentPassword = $('#txtCurrentPassword', page).val(); - var newPassword = $('#txtNewPassword', page).val(); - - ApiClient.updateUserPassword(userId, currentPassword, newPassword).done(function () { - - Dashboard.hideLoadingMsg(); - - Dashboard.alert(Globalize.translate('PasswordSaved')); - loadUser(page); - - }); - - } - - function updatePasswordPage() { - - var self = this; - - self.onSubmit = function () { - - var page = $.mobile.activePage; - - if ($('#txtNewPassword', page).val() != $('#txtNewPasswordConfirm', page).val()) { - - Dashboard.showError(Globalize.translate('PasswordMatchError')); - return false; - } - - Dashboard.showLoadingMsg(); - - savePassword(page); - - // Disable default form submission - return false; - - }; - - self.onLocalAccessSubmit = function () { - - var page = $.mobile.activePage; - - Dashboard.showLoadingMsg(); - - save(page); - - // Disable default form submission - return false; - - }; - - self.resetPassword = function () { - - var msg = Globalize.translate('PasswordResetConfirmation'); - - var page = $.mobile.activePage; - - Dashboard.confirm(msg, Globalize.translate('PasswordResetHeader'), function (result) { - - if (result) { - var userId = getParameterByName("userId"); - - Dashboard.showLoadingMsg(); - - ApiClient.resetUserPassword(userId).done(function () { - - Dashboard.hideLoadingMsg(); - - Dashboard.alert({ - message: Globalize.translate('PasswordResetComplete'), - title: Globalize.translate('PasswordResetHeader') - }); - - loadUser(page); - - }); - } - }); - - }; - } - - window.UpdatePasswordPage = new updatePasswordPage(); - - $(document).on('pagebeforeshow', "#updatePasswordPage", function () { - - var page = this; - - Dashboard.getCurrentUser().done(function (loggedInUser) { - - if (loggedInUser.Configuration.IsAdministrator) { - $('#lnkParentalControl', page).show(); - } else { - $('#lnkParentalControl', page).hide(); - } - }); - - }).on('pageshow', "#updatePasswordPage", function () { - - var page = this; - - loadUser(page); - - }); - -})(jQuery, document, window); \ No newline at end of file diff --git a/dashboard-ui/scripts/userprofilespage.js b/dashboard-ui/scripts/userprofilespage.js index 9dd5fb4c73..df1fa637c4 100644 --- a/dashboard-ui/scripts/userprofilespage.js +++ b/dashboard-ui/scripts/userprofilespage.js @@ -322,12 +322,42 @@ }).done(function (result) { $('#popupInvite').popup('close'); - loadData(page); + + Dashboard.hideLoadingMsg(); + + showNewUserInviteMessage(page, result); }); } + function showNewUserInviteMessage(page, result) { + + if (!result.IsNewUserInvitation && !result.IsPending) { + + // It was immediately approved + loadData(page); + return; + } + + var message = result.IsNewUserInvitation ? + Globalize.translate('MessageInvitationSentToNewUser', result.GuestDisplayName) : + Globalize.translate('MessageInvitationSentToUser', result.GuestDisplayName); + + // Need a timeout because jquery mobile will not show a popup while a previous one is in the act of closing + setTimeout(function () { + + Dashboard.alert({ + message: message, + title: Globalize.translate('HeaderInvitationSent'), + callback: function () { + loadData(page); + } + }); + + }, 300); + } + function showInvitePopup(page) { $('#popupInvite', page).popup('open'); diff --git a/dashboard-ui/useredit.html b/dashboard-ui/useredit.html index de73ed6e20..2ca83afb8c 100644 --- a/dashboard-ui/useredit.html +++ b/dashboard-ui/useredit.html @@ -13,7 +13,6 @@ ${TabProfile} ${TabParentalControl} - ${TabPassword}

${ButtonEditOtherUserPreferences} diff --git a/dashboard-ui/userlibraryaccess.html b/dashboard-ui/userlibraryaccess.html index 1701237f1f..a4c92163d9 100644 --- a/dashboard-ui/userlibraryaccess.html +++ b/dashboard-ui/userlibraryaccess.html @@ -12,7 +12,6 @@ ${TabProfile} ${TabLibraryAccess} ${TabParentalControl} - ${TabPassword}

diff --git a/dashboard-ui/userparentalcontrol.html b/dashboard-ui/userparentalcontrol.html index b74ac91ea2..621d629c90 100644 --- a/dashboard-ui/userparentalcontrol.html +++ b/dashboard-ui/userparentalcontrol.html @@ -12,7 +12,6 @@ ${TabProfile} ${TabLibraryAccess} ${TabParentalControl} - ${TabPassword}
diff --git a/dashboard-ui/userpassword.html b/dashboard-ui/userpassword.html deleted file mode 100644 index 3a01c75b05..0000000000 --- a/dashboard-ui/userpassword.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - -
- -
-
- - -
- -
-

${HeaderLocalAccess}

-
-
-
-
    -
  • - - -
    ${LabelAllowLocalAccessWithoutPasswordHelp}
    -
  • -
  • - -
  • -
-
-
-
-
-
-
- -
- - diff --git a/dashboard-ui/userprofiles.html b/dashboard-ui/userprofiles.html index 17efa4b91d..d7f7bd4116 100644 --- a/dashboard-ui/userprofiles.html +++ b/dashboard-ui/userprofiles.html @@ -52,10 +52,10 @@

${HeaderInviteUserHelp}

- +
-
${LabelConnectInviteUserHelp}
+
${LabelConnectGuestUserNameHelp}
${ButtonLearnMoreAboutMediaBrowserConnect}