diff --git a/dashboard-ui/apiclient/apiclient.js b/dashboard-ui/apiclient/apiclient.js index b8ff5c569..74a1debbe 100644 --- a/dashboard-ui/apiclient/apiclient.js +++ b/dashboard-ui/apiclient/apiclient.js @@ -482,6 +482,63 @@ }); }; + self.getDownloadSpeed = function (byteSize) { + + var url = self.getUrl('Playback/BitrateTest', { + + Size: byteSize + }); + + var now = new Date().getTime(); + + var deferred = DeferredBuilder.Deferred(); + + self.get(url).done(function () { + + var responseTime = new Date().getTime() - now; + responseTime /= 1000; + var bytesPerSecond = byteSize / responseTime; + + deferred.resolveWith(null, [bytesPerSecond]); + + }).fail(function () { + + deferred.reject(); + }); + + return deferred.promise(); + }; + + self.detectBitrate = function () { + + var deferred = DeferredBuilder.Deferred(); + + // First try a small amount so that we don't hang up their mobile connection + self.getDownloadSpeed(1000000).done(function (bitrate) { + + if (bitrate < 3000000) { + deferred.resolveWith(null, [Math.round(bitrate * .8)]); + } else { + + // If that produced a fairly high speed, try again with a larger size to get a more accurate result + self.getDownloadSpeed(2000000).done(function (bitrate) { + + deferred.resolveWith(null, [Math.round(bitrate * .8)]); + + }).fail(function () { + + deferred.reject(); + }); + } + + }).fail(function () { + + deferred.reject(); + }); + + return deferred.promise(); + }; + /** * Gets an item from the server * Omit itemId to get the root folder. @@ -492,7 +549,7 @@ throw new Error("null itemId"); } - var url = userId ? + var url = userId ? self.getUrl("Users/" + userId + "/Items/" + itemId) : self.getUrl("Items/" + itemId); diff --git a/dashboard-ui/cordova/android/immersive.js b/dashboard-ui/cordova/android/immersive.js index 705349884..5fd62e6dc 100644 --- a/dashboard-ui/cordova/android/immersive.js +++ b/dashboard-ui/cordova/android/immersive.js @@ -32,51 +32,6 @@ //// Hide system UI and keep it hidden (Android 4.4+ only) //AndroidFullScreen.immersiveMode(onSuccess, onError); - var currentPlayer; - - function onPlaybackStart(e, state) { - - var player = this; - - if (player.isLocalPlayer && state.NowPlayingItem && state.NowPlayingItem.MediaType == 'Video') { - AndroidFullScreen.immersiveMode(onSuccess, onError); - } - } - - function onPlaybackStopped(e, state) { - - var player = this; - - if (player.isLocalPlayer && state.NowPlayingItem && state.NowPlayingItem.MediaType == 'Video') { - - if (!AppSettings.enableFullScreen()) { - AndroidFullScreen.showSystemUI(onSuccess, onError); - } - } - } - - function bindToPlayer(player) { - - releaseCurrentPlayer(); - - currentPlayer = player; - - if (!player.isLocalPlayer) { - return; - } - - $(player).on('playbackstart', onPlaybackStart) - .on('playbackstop', onPlaybackStopped); - } - - function releaseCurrentPlayer() { - - if (currentPlayer) { - - $(currentPlayer).off('playbackstart', onPlaybackStart).off('playbackstop', onPlaybackStopped); - } - } - function updateFromSetting(leaveFullScreen) { if (AppSettings.enableFullScreen()) { @@ -91,13 +46,6 @@ Logger.log('binding fullscreen to MediaController'); - $(MediaController).on('playerchange', function () { - - bindToPlayer(MediaController.getCurrentPlayer()); - }); - - bindToPlayer(MediaController.getCurrentPlayer()); - updateFromSetting(false); $(AppSettings).on('settingupdated', function (e, key) { diff --git a/dashboard-ui/cordova/android/vlcplayer.js b/dashboard-ui/cordova/android/vlcplayer.js index 5c69051bb..a9e92ca01 100644 --- a/dashboard-ui/cordova/android/vlcplayer.js +++ b/dashboard-ui/cordova/android/vlcplayer.js @@ -95,11 +95,22 @@ return; } + var tIndex = val.indexOf('#t='); + var startPosMs = 0; + + if (tIndex != -1) { + startPosMs = val.substring(tIndex + 3); + startPosMs = parseFloat(startPosMs) * 1000; + } + if (options.type == 'audio') { AndroidVlcPlayer.playAudioVlc(val, JSON.stringify(item), JSON.stringify(mediaSource), posterUrl); } else { - AndroidVlcPlayer.playVideoVlc(val, JSON.stringify(item), JSON.stringify(mediaSource), posterUrl); + + var playbackStartInfo = {}; + + AndroidVlcPlayer.playVideoVlc(val, startPosMs, item.Name, JSON.stringify(mediaSource), JSON.stringify(playbackStartInfo)); } playerState.currentSrc = val; @@ -175,6 +186,17 @@ return deferred.promise(); }; + self.onActivityClosed = function (wasStopped, hasError, endPositionMs) { + + playerState.currentTime = endPositionMs; + + if (wasStopped) { + MediaPlayer.stop(false); + } + + self.report('playbackstop', playerState.duration, endPositionMs, false, 100); + }; + window.AudioRenderer.Current = self; window.VideoRenderer.Current = self; } diff --git a/dashboard-ui/cordova/imagestore.js b/dashboard-ui/cordova/imagestore.js index 838b2bafb..aab7b0092 100644 --- a/dashboard-ui/cordova/imagestore.js +++ b/dashboard-ui/cordova/imagestore.js @@ -57,7 +57,7 @@ // Use the embedded server for iOS8, and also if we don't know the iOS version, just to be safe //if ($.browser.iOSVersion == 8 || !$.browser.iOSVersion) { - //return url.replace('file://', ''); + return url.replace('file://', ''); } } return url; diff --git a/dashboard-ui/movietrailers.html b/dashboard-ui/movietrailers.html index 7c6f137fc..3416f1546 100644 --- a/dashboard-ui/movietrailers.html +++ b/dashboard-ui/movietrailers.html @@ -4,7 +4,7 @@