diff --git a/dashboard-ui/scripts/htmlmediarenderer.js b/dashboard-ui/scripts/htmlmediarenderer.js index 5dbcd0b6cc..1efa2d785e 100644 --- a/dashboard-ui/scripts/htmlmediarenderer.js +++ b/dashboard-ui/scripts/htmlmediarenderer.js @@ -1,5 +1,7 @@ (function () { + var supportsTextTracks; + function htmlMediaRenderer(type) { var mediaElement; @@ -261,6 +263,86 @@ } }; + self.supportsTextTracks = function () { + + if (supportsTextTracks == null) { + supportsTextTracks = document.createElement('video').textTracks != null; + } + + // For now, until ready + return supportsTextTracks; + }; + + self.setCurrentTrackElement = function (trackIndex) { + + console.log('Setting new text track index to: ' + trackIndex); + + var allTracks = mediaElement.textTracks; // get list of tracks + + var modes = ['disabled', 'showing', 'hidden']; + + for (var i = 0; i < allTracks.length; i++) { + + var mode; + + if (trackIndex == i) { + mode = 1; // show this track + } else { + mode = 0; // hide all other tracks + } + + console.log('Setting track ' + i + ' mode to: ' + mode); + + // Safari uses integers for the mode property + // http://www.jwplayer.com/html5/scripting/ + var useNumericMode = false; + + if (!isNaN(allTracks[i].mode)) { + useNumericMode = true; + } + + if (useNumericMode) { + allTracks[i].mode = mode; + } else { + allTracks[i].mode = modes[mode]; + } + } + }; + + self.updateTextStreamUrls = function (startPositionTicks) { + + if (!self.supportsTextTracks()) { + return; + } + + var allTracks = mediaElement.textTracks; // get list of tracks + + for (var i = 0; i < allTracks.length; i++) { + + var track = allTracks[i]; + + // This throws an error in IE, but is fine in chrome + // In IE it's not necessary anyway because changing the src seems to be enough + try { + while (track.cues.length) { + track.removeCue(track.cues[0]); + } + } catch (e) { + console.log('Error removing cue from textTrack'); + } + } + + $('track', mediaElement).each(function () { + + var currentSrc = this.src; + + currentSrc = replaceQueryString(currentSrc, 'startPositionTicks', startPositionTicks); + + this.src = currentSrc; + + }); + }; + if (type == 'audio') { mediaElement = createAudioElement(); } diff --git a/dashboard-ui/scripts/mediaplayer-video.js b/dashboard-ui/scripts/mediaplayer-video.js index 8e77d4481e..10f9167e6e 100644 --- a/dashboard-ui/scripts/mediaplayer-video.js +++ b/dashboard-ui/scripts/mediaplayer-video.js @@ -129,7 +129,7 @@ self.setSubtitleStreamIndex = function (index) { - if (!self.supportsTextTracks()) { + if (!self.currentMediaRenderer.supportsTextTracks()) { self.changeStream(self.getCurrentTicks(), { SubtitleStreamIndex: index }); self.currentSubtitleStreamIndex = index; @@ -184,8 +184,6 @@ self.setCurrentTrackElement = function (index) { - var modes = ['disabled', 'showing', 'hidden']; - var textStreams = self.currentMediaSource.MediaStreams.filter(function (s) { return s.DeliveryMethod == 'External'; }); @@ -196,70 +194,12 @@ var trackIndex = newStream ? textStreams.indexOf(newStream) : -1; - console.log('Setting new text track index to: ' + trackIndex); - - var allTracks = self.currentMediaElement.textTracks; // get list of tracks - - for (var i = 0; i < allTracks.length; i++) { - - var mode; - - if (trackIndex == i) { - mode = 1; // show this track - } else { - mode = 0; // hide all other tracks - } - - console.log('Setting track ' + i + ' mode to: ' + mode); - - // Safari uses integers for the mode property - // http://www.jwplayer.com/html5/scripting/ - var useNumericMode = false; - - if (!isNaN(allTracks[i].mode)) { - useNumericMode = true; - } - - if (useNumericMode) { - allTracks[i].mode = mode; - } else { - allTracks[i].mode = modes[mode]; - } - } + self.currentMediaRenderer.setCurrentTrackElement(trackIndex); }; self.updateTextStreamUrls = function (startPositionTicks) { - if (!self.supportsTextTracks()) { - return; - } - - var allTracks = self.currentMediaElement.textTracks; // get list of tracks - - for (var i = 0; i < allTracks.length; i++) { - - var track = allTracks[i]; - - // This throws an error in IE, but is fine in chrome - // In IE it's not necessary anyway because changing the src seems to be enough - try { - while (track.cues.length) { - track.removeCue(track.cues[0]); - } - } catch (e) { - console.log('Error removing cue from textTrack'); - } - } - - $('track', self.currentMediaElement).each(function () { - - var currentSrc = this.src; - - currentSrc = replaceQueryString(currentSrc, 'startPositionTicks', startPositionTicks); - - this.src = currentSrc; - - }); + self.currentMediaRenderer.updateTextStreamUrls(startPositionTicks); }; self.updateNowPlayingInfo = function (item) { @@ -922,9 +862,9 @@ var videoStream = self.currentMediaSource.MediaStreams.filter(function (stream) { return stream.Type == "Video"; })[0]; - var videoWidth = videoStream ? videoStream.Width : null; + var videoHeight = videoStream ? videoStream.Height : null; - var options = self.getVideoQualityOptions(videoWidth); + var options = self.getVideoQualityOptions(videoHeight); if (isStatic) { options[0].name = "Direct"; diff --git a/dashboard-ui/scripts/mediaplayer.js b/dashboard-ui/scripts/mediaplayer.js index dd320234d7..08d5d65787 100644 --- a/dashboard-ui/scripts/mediaplayer.js +++ b/dashboard-ui/scripts/mediaplayer.js @@ -38,53 +38,56 @@ var canPlayAac = document.createElement('audio').canPlayType('audio/aac').replace(/no/, ''); - self.getVideoQualityOptions = function (videoWidth) { + self.getVideoQualityOptions = function (videoHeight) { var bitrateSetting = AppSettings.maxStreamingBitrate(); - var maxAllowedWidth = videoWidth || 4096; + var maxAllowedHeight = videoHeight || 2304; var options = []; // Some 1080- videos are reported as 1912? - if (maxAllowedWidth >= 1900) { - options.push({ name: '1080p - 30Mbps', maxWidth: 1920, bitrate: 30000000 }); - options.push({ name: '1080p - 25Mbps', maxWidth: 1920, bitrate: 25000000 }); - options.push({ name: '1080p - 20Mbps', maxWidth: 1920, bitrate: 20000000 }); - options.push({ name: '1080p - 15Mbps', maxWidth: 1920, bitrate: 15000000 }); - options.push({ name: '1080p - 10Mbps', maxWidth: 1920, bitrate: 10000000 }); - options.push({ name: '1080p - 8Mbps', maxWidth: 1920, bitrate: 8000000 }); - options.push({ name: '1080p - 6Mbps', maxWidth: 1920, bitrate: 6000000 }); - options.push({ name: '1080p - 5Mbps', maxWidth: 1920, bitrate: 5000000 }); - } else if (maxAllowedWidth >= 1260) { - options.push({ name: '720p - 10Mbps', maxWidth: 1280, bitrate: 10000000 }); - options.push({ name: '720p - 8Mbps', maxWidth: 1280, bitrate: 8000000 }); - options.push({ name: '720p - 6Mbps', maxWidth: 1280, bitrate: 6000000 }); - options.push({ name: '720p - 5Mbps', maxWidth: 1280, bitrate: 5000000 }); - } else if (maxAllowedWidth >= 460) { - options.push({ name: '480p - 4Mbps', maxWidth: 720, bitrate: 4000000 }); - options.push({ name: '480p - 3Mbps', maxWidth: 720, bitrate: 3000000 }); - options.push({ name: '480p - 2.5Mbps', maxWidth: 720, bitrate: 2500000 }); - options.push({ name: '480p - 2Mbps', maxWidth: 720, bitrate: 2000000 }); - options.push({ name: '480p - 1.5Mbps', maxWidth: 720, bitrate: 1500000 }); + if (maxAllowedHeight >= 1060) { + + options.push({ name: '1080p - 30Mbps', maxHeight: 1080, bitrate: 30000000 }); + options.push({ name: '1080p - 25Mbps', maxHeight: 1080, bitrate: 25000000 }); + options.push({ name: '1080p - 20Mbps', maxHeight: 1080, bitrate: 20000000 }); + options.push({ name: '1080p - 15Mbps', maxHeight: 1080, bitrate: 15000000 }); + options.push({ name: '1080p - 10Mbps', maxHeight: 1080, bitrate: 10000000 }); + options.push({ name: '1080p - 8Mbps', maxHeight: 1080, bitrate: 8000000 }); + options.push({ name: '1080p - 6Mbps', maxHeight: 1080, bitrate: 6000000 }); + options.push({ name: '1080p - 5Mbps', maxHeight: 1080, bitrate: 5000000 }); + + } else if (maxAllowedHeight >= 700) { + options.push({ name: '720p - 10Mbps', maxHeight: 720, bitrate: 10000000 }); + options.push({ name: '720p - 8Mbps', maxHeight: 720, bitrate: 8000000 }); + options.push({ name: '720p - 6Mbps', maxHeight: 720, bitrate: 6000000 }); + options.push({ name: '720p - 5Mbps', maxHeight: 720, bitrate: 5000000 }); + + } else if (maxAllowedHeight >= 460) { + options.push({ name: '480p - 4Mbps', maxHeight: 480, bitrate: 4000000 }); + options.push({ name: '480p - 3Mbps', maxHeight: 480, bitrate: 3000000 }); + options.push({ name: '480p - 2.5Mbps', maxHeight: 480, bitrate: 2500000 }); + options.push({ name: '480p - 2Mbps', maxHeight: 480, bitrate: 2000000 }); + options.push({ name: '480p - 1.5Mbps', maxHeight: 480, bitrate: 1500000 }); } - if (maxAllowedWidth >= 1260) { - options.push({ name: '720p - 4Mbps', maxWidth: 1280, bitrate: 4000000 }); - options.push({ name: '720p - 3Mbps', maxWidth: 1280, bitrate: 3000000 }); - options.push({ name: '720p - 2Mbps', maxWidth: 1280, bitrate: 2000000 }); + if (maxAllowedHeight >= 700) { + options.push({ name: '720p - 4Mbps', maxHeight: 720, bitrate: 4000000 }); + options.push({ name: '720p - 3Mbps', maxHeight: 720, bitrate: 3000000 }); + options.push({ name: '720p - 2Mbps', maxHeight: 720, bitrate: 2000000 }); // The extra 1 is because they're keyed off the bitrate value - options.push({ name: '720p - 1.5Mbps', maxWidth: 1280, bitrate: 1500001 }); - options.push({ name: '720p - 1Mbps', maxWidth: 1280, bitrate: 1000001 }); + options.push({ name: '720p - 1.5Mbps', maxHeight: 720, bitrate: 1500001 }); + options.push({ name: '720p - 1Mbps', maxHeight: 720, bitrate: 1000001 }); } - options.push({ name: '480p - 1.0Mbps', maxWidth: 720, bitrate: 1000000 }); - options.push({ name: '480p - 720kbps', maxWidth: 720, bitrate: 720000 }); - options.push({ name: '480p - 420kbps', maxWidth: 720, bitrate: 420000 }); - options.push({ name: '360p', maxWidth: 640, bitrate: 400000 }); - options.push({ name: '240p', maxWidth: 426, bitrate: 320000 }); - options.push({ name: '144p', maxWidth: 256, bitrate: 192000 }); + options.push({ name: '480p - 1.0Mbps', maxHeight: 480, bitrate: 1000000 }); + options.push({ name: '480p - 720kbps', maxHeight: 480, bitrate: 720000 }); + options.push({ name: '480p - 420kbps', maxHeight: 480, bitrate: 420000 }); + options.push({ name: '360p', maxHeight: 360, bitrate: 400000 }); + options.push({ name: '240p', maxHeight: 240, bitrate: 320000 }); + options.push({ name: '144p', maxHeight: 144, bitrate: 192000 }); var i, length, option; var selectedIndex = -1; @@ -107,12 +110,12 @@ return options; }; - self.getDeviceProfile = function (maxWidth) { + self.getDeviceProfile = function (maxHeight) { - if (!maxWidth) { - maxWidth = self.getVideoQualityOptions().filter(function (q) { + if (!maxHeight) { + maxHeight = self.getVideoQualityOptions().filter(function (q) { return q.selected; - })[0].maxWidth; + })[0].maxHeight; } var bitrateSetting = AppSettings.maxStreamingBitrate(); @@ -348,8 +351,8 @@ }, { Condition: 'LessThanEqual', - Property: 'Width', - Value: maxWidth + Property: 'Height', + Value: maxHeight }] }); @@ -365,8 +368,8 @@ }, { Condition: 'LessThanEqual', - Property: 'Width', - Value: maxWidth + Property: 'Height', + Value: maxHeight }] }); @@ -403,6 +406,17 @@ return profile; }; + var supportsTextTracks; + self.supportsTextTracks = function () { + + if (supportsTextTracks == null) { + supportsTextTracks = document.createElement('video').textTracks != null; + } + + // For now, until ready + return supportsTextTracks; + }; + self.updateCanClientSeek = function (mediaRenderer) { var duration = mediaRenderer.duration(); @@ -603,18 +617,6 @@ $(self).trigger('positionchange', [state]); }; - var supportsTextTracks; - - self.supportsTextTracks = function () { - - if (supportsTextTracks == null) { - supportsTextTracks = document.createElement('video').textTracks != null; - } - - // For now, until ready - return supportsTextTracks; - }; - self.canQueueMediaType = function (mediaType) { return self.currentItem && self.currentItem.MediaType == mediaType; diff --git a/dashboard-ui/scripts/site.js b/dashboard-ui/scripts/site.js index 9b28acad75..d5d4c280ec 100644 --- a/dashboard-ui/scripts/site.js +++ b/dashboard-ui/scripts/site.js @@ -1668,7 +1668,8 @@ var AppInfo = {}; //localStorage.clear(); function createConnectionManager(capabilities) { - var credentialProvider = new MediaBrowser.CredentialProvider(); + var credentialKey = Dashboard.isConnectMode() ? null : 'servercredentials4'; + var credentialProvider = new MediaBrowser.CredentialProvider(credentialKey); window.ConnectionManager = new MediaBrowser.ConnectionManager(Logger, credentialProvider, AppInfo.appName, AppInfo.appVersion, AppInfo.deviceName, AppInfo.deviceId, capabilities); diff --git a/dashboard-ui/thirdparty/apiclient/credentials.js b/dashboard-ui/thirdparty/apiclient/credentials.js index bdb96d6419..82a6688b81 100644 --- a/dashboard-ui/thirdparty/apiclient/credentials.js +++ b/dashboard-ui/thirdparty/apiclient/credentials.js @@ -4,11 +4,11 @@ globalScope.MediaBrowser = {}; } - globalScope.MediaBrowser.CredentialProvider = function () { + globalScope.MediaBrowser.CredentialProvider = function (key) { var self = this; var credentials = null; - var key = 'servercredentials3'; + key = key || 'servercredentials3'; function ensure() { diff --git a/dashboard-ui/thirdparty/cordova/android/mediasession.js b/dashboard-ui/thirdparty/cordova/android/mediasession.js index 14de10750b..e5a821298b 100644 --- a/dashboard-ui/thirdparty/cordova/android/mediasession.js +++ b/dashboard-ui/thirdparty/cordova/android/mediasession.js @@ -75,7 +75,9 @@ } } - MainActivity.updateMediaSession(eventName, itemId, title, artist, album, parseInt(duration), parseInt(position), url, canSeek, isPaused); + var isLocalPlayer = MediaController.getPlayerInfo().isLocalPlayer || false; + + MainActivity.updateMediaSession(eventName, isLocalPlayer, itemId, title, artist, album, parseInt(duration), parseInt(position), url, canSeek, isPaused); lastUpdateTime = new Date().getTime(); }