diff --git a/dashboard-ui/apiclient/localassetmanager.js b/dashboard-ui/apiclient/localassetmanager.js index 7a86823624..acb4e05502 100644 --- a/dashboard-ui/apiclient/localassetmanager.js +++ b/dashboard-ui/apiclient/localassetmanager.js @@ -1,7 +1,9 @@ (function () { function getLocalMediaSource(serverId, itemId) { - return null; + var deferred = DeferredBuilder.Deferred(); + deferred.resolveWith(null, [null]); + return deferred.promise(); } function saveOfflineUser(user) { diff --git a/dashboard-ui/bower_components/iron-meta/.bower.json b/dashboard-ui/bower_components/iron-meta/.bower.json index 9e650790be..8119ebcf41 100644 --- a/dashboard-ui/bower_components/iron-meta/.bower.json +++ b/dashboard-ui/bower_components/iron-meta/.bower.json @@ -25,14 +25,14 @@ "web-component-tester": "*", "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" }, - "homepage": "https://github.com/PolymerElements/iron-meta", + "homepage": "https://github.com/polymerelements/iron-meta", "_release": "1.0.3", "_resolution": { "type": "version", "tag": "v1.0.3", "commit": "91529259262b0d8f33fed44bc3fd47aedf35cb04" }, - "_source": "git://github.com/PolymerElements/iron-meta.git", + "_source": "git://github.com/polymerelements/iron-meta.git", "_target": "^1.0.0", - "_originalSource": "PolymerElements/iron-meta" + "_originalSource": "polymerelements/iron-meta" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/paper-behaviors/.bower.json b/dashboard-ui/bower_components/paper-behaviors/.bower.json index 321be71437..26486f6c6d 100644 --- a/dashboard-ui/bower_components/paper-behaviors/.bower.json +++ b/dashboard-ui/bower_components/paper-behaviors/.bower.json @@ -42,7 +42,7 @@ "tag": "v1.0.3", "commit": "90b54de14264c19693601b9fc16af6b68a9d48e4" }, - "_source": "git://github.com/polymerelements/paper-behaviors.git", + "_source": "git://github.com/PolymerElements/paper-behaviors.git", "_target": "^1.0.0", - "_originalSource": "polymerelements/paper-behaviors" + "_originalSource": "PolymerElements/paper-behaviors" } \ No newline at end of file diff --git a/dashboard-ui/cordova/android/vlcplayer.js b/dashboard-ui/cordova/android/vlcplayer.js index 1864f26c12..6ec5afb6ba 100644 --- a/dashboard-ui/cordova/android/vlcplayer.js +++ b/dashboard-ui/cordova/android/vlcplayer.js @@ -90,7 +90,7 @@ } }; - function getPlaybackStartInfoForVideoActivity(videoUrl, mediaSource, item) { + function getPlaybackStartInfoForVideoActivity(streamInfo, mediaSource, item) { var playbackStartInfo = { QueueableMediaTypes: item.MediaType, @@ -103,20 +103,21 @@ playbackStartInfo.NowPlayingItem.RunTimeTicks = mediaSource.RunTimeTicks; } + var videoUrl = streamInfo.url; var audioStreamIndex = getParameterByName('AudioStreamIndex', videoUrl); if (audioStreamIndex) { playbackStartInfo.AudioStreamIndex = parseInt(audioStreamIndex); } - if (self.currentSubtitleStreamIndex != null) { - playbackStartInfo.SubtitleStreamIndex = self.currentSubtitleStreamIndex; + + // TODO: This should be passed in rather than going out to get it + if (MediaPlayer.currentSubtitleStreamIndex != null) { + playbackStartInfo.SubtitleStreamIndex = MediaPlayer.currentSubtitleStreamIndex; } - playbackStartInfo.PlayMethod = getParameterByName('static', videoUrl) == 'true' ? - 'DirectStream' : - 'Transcode'; + playbackStartInfo.PlayMethod = streamInfo.playMethod; - playbackStartInfo.LiveStreamId = getParameterByName('LiveStreamId', videoUrl); + playbackStartInfo.LiveStreamId = mediaSource.LiveStreamId; playbackStartInfo.PlaySessionId = getParameterByName('PlaySessionId', videoUrl); // Seeing some deserialization errors around this property @@ -127,13 +128,14 @@ return playbackStartInfo; } - self.setCurrentSrc = function (val, item, mediaSource, tracks) { + self.setCurrentSrc = function (streamInfo, item, mediaSource, tracks) { - if (!val) { + if (!streamInfo) { self.destroy(); return; } + var val = streamInfo.url; var tIndex = val.indexOf('#t='); var startPosMs = 0; @@ -148,7 +150,7 @@ AndroidVlcPlayer.playAudioVlc(val, JSON.stringify(item), JSON.stringify(mediaSource), options.poster); } else { - var playbackStartInfo = getPlaybackStartInfoForVideoActivity(val, mediaSource, item); + var playbackStartInfo = getPlaybackStartInfoForVideoActivity(streamInfo, mediaSource, item); var serverUrl = ApiClient.serverAddress(); diff --git a/dashboard-ui/cordova/localassetmanager.js b/dashboard-ui/cordova/localassetmanager.js index d8aae523be..b12424f939 100644 --- a/dashboard-ui/cordova/localassetmanager.js +++ b/dashboard-ui/cordova/localassetmanager.js @@ -2,16 +2,21 @@ function getLocalMediaSource(serverId, itemId) { + var deferred = DeferredBuilder.Deferred(); + // android if (window.ApiClientBridge) { var json = ApiClientBridge.getLocalMediaSource(serverId, itemId); if (json) { - return JSON.parse(json); + deferred.resolveWith(null, [JSON.parse(json)]); } + else { + deferred.resolveWith(null, [null]); + } + return deferred.promise(); } - var deferred = DeferredBuilder.Deferred(); getLocalItem(itemId, serverId).done(function (localItem) { if (localItem && localItem.MediaSources.length) { diff --git a/dashboard-ui/scripts/htmlmediarenderer.js b/dashboard-ui/scripts/htmlmediarenderer.js index 0ed9d215af..161e39c139 100644 --- a/dashboard-ui/scripts/htmlmediarenderer.js +++ b/dashboard-ui/scripts/htmlmediarenderer.js @@ -331,7 +331,7 @@ }; var currentSrc; - self.setCurrentSrc = function (val, item, mediaSource, tracks) { + self.setCurrentSrc = function (streamInfo, item, mediaSource, tracks) { var elem = mediaElement; @@ -340,7 +340,7 @@ return; } - if (!val) { + if (!streamInfo) { currentSrc = null; elem.src = null; elem.src = ""; @@ -354,6 +354,7 @@ return; } + var val = streamInfo.url; requiresSettingStartTimeOnStart = false; var startTime = getStartTime(val); var playNow = false; diff --git a/dashboard-ui/scripts/mediacontroller.js b/dashboard-ui/scripts/mediacontroller.js index 1f90b16dc2..0fc2d3104e 100644 --- a/dashboard-ui/scripts/mediacontroller.js +++ b/dashboard-ui/scripts/mediacontroller.js @@ -755,28 +755,35 @@ var serverInfo = ApiClient.serverInfo(); if (serverInfo.Id) { - var localMediaSource = window.LocalAssetManager.getLocalMediaSource(serverInfo.Id, itemId); + LocalAssetManager.getLocalMediaSource(serverInfo.Id, itemId).done(function (localMediaSource) { + // Use the local media source if a specific one wasn't requested, or the smae one was requested + if (localMediaSource && (!mediaSource || mediaSource.Id == localMediaSource.Id)) { - // Use the local media source if a specific one wasn't requested, or the smae one was requested - if (localMediaSource && (!mediaSource || mediaSource.Id == localMediaSource.Id)) { + var playbackInfo = getPlaybackInfoFromLocalMediaSource(itemId, deviceProfile, startPosition, localMediaSource); - var playbackInfo = getPlaybackInfoFromLocalMediaSource(itemId, deviceProfile, startPosition, localMediaSource); + deferred.resolveWith(null, [playbackInfo]); + return; + } - deferred.resolveWith(null, [playbackInfo]); - return; - } + getPlaybackInfoWithoutLocalMediaSource(itemId, deviceProfile, startPosition, mediaSource, audioStreamIndex, subtitleStreamIndex, liveStreamId, deferred); + }); + return; } - self.getPlaybackInfoInternal(itemId, deviceProfile, startPosition, mediaSource, audioStreamIndex, subtitleStreamIndex, liveStreamId).done(function (result) { - deferred.resolveWith(null, [result]); - }).fail(function () { - deferred.reject(); - }); + getPlaybackInfoWithoutLocalMediaSource(itemId, deviceProfile, startPosition, mediaSource, audioStreamIndex, subtitleStreamIndex, liveStreamId, deferred); }); return deferred.promise(); } + function getPlaybackInfoWithoutLocalMediaSource(itemId, deviceProfile, startPosition, mediaSource, audioStreamIndex, subtitleStreamIndex, liveStreamId, deferred) { + self.getPlaybackInfoInternal(itemId, deviceProfile, startPosition, mediaSource, audioStreamIndex, subtitleStreamIndex, liveStreamId).done(function (result) { + deferred.resolveWith(null, [result]); + }).fail(function () { + deferred.reject(); + }); + } + self.getPlaybackInfoInternal = function (itemId, deviceProfile, startPosition, mediaSource, audioStreamIndex, subtitleStreamIndex, liveStreamId) { var postData = { @@ -859,7 +866,9 @@ if (mediaSource.Protocol == 'File') { - return FileSystemBridge.fileExists(mediaSource.Path); + var exists = FileSystemBridge.fileExists(mediaSource.Path); + Logger.log('FileSystemBridge.fileExists: path: ' + mediaSource.Path + ' result: ' + exists); + return exists; } } diff --git a/dashboard-ui/scripts/mediaplayer-video.js b/dashboard-ui/scripts/mediaplayer-video.js index df01115705..1ab492aaf0 100644 --- a/dashboard-ui/scripts/mediaplayer-video.js +++ b/dashboard-ui/scripts/mediaplayer-video.js @@ -918,8 +918,6 @@ self.playVideoInternal = function (item, mediaSource, startPosition, streamInfo, callback) { - var videoUrl = streamInfo.url; - self.startTimeTicksOffset = streamInfo.startTimeTicksOffset; var mediaStreams = mediaSource.MediaStreams || []; @@ -928,8 +926,8 @@ }); // Reports of stuttering with h264 stream copy in IE - if (streamInfo.playMethod == 'Transcode' && videoUrl.indexOf('.m3u8') == -1) { - videoUrl += '&EnableAutoStreamCopy=false'; + if (streamInfo.playMethod == 'Transcode' && streamInfo.url.indexOf('.m3u8') == -1) { + streamInfo.url += '&EnableAutoStreamCopy=false'; } // Create video player @@ -1079,7 +1077,8 @@ mediaRenderer.init().done(function () { - self.setSrcIntoRenderer(mediaRenderer, videoUrl, item, self.currentMediaSource); + self.setSrcIntoRenderer(mediaRenderer, streamInfo, item, self.currentMediaSource); + self.streamInfo = streamInfo; if (callback) { callback(); diff --git a/dashboard-ui/scripts/mediaplayer.js b/dashboard-ui/scripts/mediaplayer.js index b797d90b84..3854dead47 100644 --- a/dashboard-ui/scripts/mediaplayer.js +++ b/dashboard-ui/scripts/mediaplayer.js @@ -19,6 +19,7 @@ self.isLocalPlayer = true; self.isDefaultPlayer = true; + self.streamInfo = {}; self.name = 'Html5 Player'; @@ -649,13 +650,12 @@ self.currentSubtitleStreamIndex = subtitleStreamIndex; - currentSrc = streamInfo.url; - changeStreamToUrl(mediaRenderer, playSessionId, currentSrc, streamInfo.startTimeTicksOffset || 0); + changeStreamToUrl(mediaRenderer, playSessionId, streamInfo, streamInfo.startTimeTicksOffset || 0); } }); }; - function changeStreamToUrl(mediaRenderer, playSessionId, url, newPositionTicks) { + function changeStreamToUrl(mediaRenderer, playSessionId, streamInfo, newPositionTicks) { clearProgressInterval(); @@ -679,7 +679,7 @@ ApiClient.stopActiveEncodings(playSessionId).done(function () { //self.startTimeTicksOffset = newPositionTicks; - self.setSrcIntoRenderer(mediaRenderer, url, self.currentItem, self.currentMediaSource); + self.setSrcIntoRenderer(mediaRenderer, streamInfo, self.currentItem, self.currentMediaSource); }); @@ -687,11 +687,11 @@ self.updateTextStreamUrls(newPositionTicks || 0); } else { self.startTimeTicksOffset = newPositionTicks || 0; - self.setSrcIntoRenderer(mediaRenderer, url, self.currentItem, self.currentMediaSource); + self.setSrcIntoRenderer(mediaRenderer, streamInfo, self.currentItem, self.currentMediaSource); } } - self.setSrcIntoRenderer = function (mediaRenderer, url, item, mediaSource) { + self.setSrcIntoRenderer = function (mediaRenderer, streamInfo, item, mediaSource) { var subtitleStreams = mediaSource.MediaStreams.filter(function (s) { return s.Type == 'Subtitle'; @@ -715,7 +715,8 @@ }); } - mediaRenderer.setCurrentSrc(url, item, mediaSource, tracks); + mediaRenderer.setCurrentSrc(streamInfo, item, mediaSource, tracks); + self.streamInfo = streamInfo; }; self.setCurrentTime = function (ticks, positionSlider, currentTimeElement) { @@ -1523,6 +1524,8 @@ self.currentMediaRenderer = null; self.currentItem = null; self.currentMediaSource = null; + self.currentSubtitleStreamIndex = null; + self.streamInfo = {}; }); @@ -1532,6 +1535,8 @@ self.currentMediaRenderer = null; self.currentItem = null; self.currentMediaSource = null; + self.currentSubtitleStreamIndex = null; + self.streamInfo = {}; } if (self.isFullScreen()) { @@ -1561,8 +1566,6 @@ PlayState: {} }; - var currentSrc = mediaRenderer ? mediaRenderer.currentSrc() : null; - if (mediaRenderer) { state.PlayState.VolumeLevel = mediaRenderer.volume() * 100; @@ -1571,6 +1574,8 @@ state.PlayState.PositionTicks = self.getCurrentTicks(mediaRenderer); state.PlayState.RepeatMode = self.getRepeatMode(); + var currentSrc = mediaRenderer.currentSrc(); + if (currentSrc) { var audioStreamIndex = getParameterByName('AudioStreamIndex', currentSrc); @@ -1580,11 +1585,9 @@ } state.PlayState.SubtitleStreamIndex = self.currentSubtitleStreamIndex; - state.PlayState.PlayMethod = getParameterByName('static', currentSrc) == 'true' ? - 'DirectStream' : - 'Transcode'; + state.PlayState.PlayMethod = self.streamInfo.playMethod; - state.PlayState.LiveStreamId = getParameterByName('LiveStreamId', currentSrc); + state.PlayState.LiveStreamId = mediaSource.LiveStreamId; state.PlayState.PlaySessionId = getParameterByName('PlaySessionId', currentSrc); } } @@ -1911,7 +1914,8 @@ // Set volume first to avoid an audible change mediaRenderer.volume(initialVolume); - mediaRenderer.setCurrentSrc(audioUrl, item, mediaSource); + mediaRenderer.setCurrentSrc(streamInfo, item, mediaSource); + self.streamInfo = streamInfo; }); } diff --git a/dashboard-ui/scripts/mypreferenceshome.js b/dashboard-ui/scripts/mypreferenceshome.js index 7cd5bf20fb..3ad2d3346f 100644 --- a/dashboard-ui/scripts/mypreferenceshome.js +++ b/dashboard-ui/scripts/mypreferenceshome.js @@ -5,7 +5,7 @@ var folderHtml = ''; folderHtml += '