diff --git a/dashboard-ui/scripts/mediaplayer-video.js b/dashboard-ui/scripts/mediaplayer-video.js index c86aa8176..0c95c14dc 100644 --- a/dashboard-ui/scripts/mediaplayer-video.js +++ b/dashboard-ui/scripts/mediaplayer-video.js @@ -36,6 +36,16 @@ return video; }; + self.getCurrentSubtitleStream = function () { + return self.getSubtitleStream(self.currentSubtitleStreamIndex); + }; + + self.getSubtitleStream = function (index) { + return self.currentMediaSource.MediaStreams.filter(function (s) { + return s.Type == 'Subtitle' && s.Index == index; + })[0]; + }; + self.remoteFullscreen = function () { var videoControls = $("#videoControls"); @@ -151,7 +161,62 @@ }; self.setSubtitleStreamIndex = function (index) { - self.changeStream(self.getCurrentTicks(), { SubtitleStreamIndex: index }); + + if (!self.supportsTextTracks()) { + self.changeStream(self.getCurrentTicks(), { SubtitleStreamIndex: index }); + self.currentSubtitleStreamIndex = index; + return; + } + + var currentStream = self.getCurrentSubtitleStream(); + + var newStream = self.getSubtitleStream(index); + + if (!currentStream && !newStream) return; + + var selectedTrackElementIndex = -1; + + if (currentStream && !newStream) { + + if (!currentStream.IsTextSubtitleStream) { + + // Need to change the transcoded stream to remove subs + self.changeStream(self.getCurrentTicks(), { SubtitleStreamIndex: -1 }); + } + } + else if (!currentStream && newStream) { + + if (newStream.IsTextSubtitleStream) { + selectedTrackElementIndex = index; + } else { + + // Need to change the transcoded stream to add subs + self.changeStream(self.getCurrentTicks(), { SubtitleStreamIndex: index }); + } + } + + self.setCurrentTrackElement(selectedTrackElementIndex); + self.currentSubtitleStreamIndex = index; + }; + + self.setCurrentTrackElement = function (index) { + + var textStreams = self.currentMediaSource.MediaStreams.filter(function (s) { + return s.Type == 'Subtitle' && s.IsTextSubtitleStream; + }); + + var allTracks = video.textTracks; // get list of tracks + + for (var i = 0; i < allTracks.length; i++) { + + var trackIndex = textStreams[i].Index; + + if (trackIndex == index) { + allTracks[i].mode = "showing"; // show this track + } else { + allTracks[i].mode = "disabled"; // hide all other tracks + } + } }; $(document).on('webkitfullscreenchange mozfullscreenchange fullscreenchange', function (e) { @@ -532,7 +597,7 @@ return currentStream.Type == "Subtitle"; }); - var currentIndex = self.currentSubtitleStreamIndex; + var currentIndex = self.currentSubtitleStreamIndex || -1; var html = ''; @@ -742,7 +807,7 @@ mediaSourceId: mediaSource.Id }; - if (selectedSubtitleStream && !selectedSubtitleStream.IsTextSubtitleStream) { + if (selectedSubtitleStream && (!selectedSubtitleStream.IsTextSubtitleStream || !self.supportsTextTracks())) { baseParams.SubtitleStreamIndex = mediaSource.DefaultSubtitleStreamIndex; } @@ -842,19 +907,21 @@ html += ''; - var textStreams = subtitleStreams.filter(function (s) { - return s.IsTextSubtitleStream; - }); - - for (var i = 0, length = textStreams.length; i < length; i++) { - - var textStream = textStreams[i]; - var textStreamUrl = ApiClient.getUrl('Videos/' + item.Id + '/' + mediaSource.Id + '/Subtitles/' + textStream.Index + '/Stream.vtt', { + if (self.supportsTextTracks()) { + var textStreams = subtitleStreams.filter(function (s) { + return s.IsTextSubtitleStream; }); - var defaultAttribute = i.Index == mediaSource.DefaultSubtitleStreamIndex ? ' default' : ''; + for (var i = 0, length = textStreams.length; i < length; i++) { - html += ''; + var textStream = textStreams[i]; + var textStreamUrl = ApiClient.getUrl('Videos/' + item.Id + '/' + mediaSource.Id + '/Subtitles/' + textStream.Index + '/Stream.vtt', { + }); + + var defaultAttribute = i.Index == mediaSource.DefaultSubtitleStreamIndex ? ' default' : ''; + + html += ''; + } } html += ''; diff --git a/dashboard-ui/scripts/mediaplayer.js b/dashboard-ui/scripts/mediaplayer.js index 3d6d8a676..ad3c11863 100644 --- a/dashboard-ui/scripts/mediaplayer.js +++ b/dashboard-ui/scripts/mediaplayer.js @@ -218,6 +218,17 @@ $(self).trigger('positionchange', [state]); }; + self.supportsTextTracks = function () { + + // Does not support changing tracks via mode property + if ($.browser.mozilla) { + return false; + } + + // For now, until perfected + return false; + }; + self.canPlayVideoDirect = function (mediaSource, videoStream, audioStream, subtitleStream, maxWidth, bitrate) { if (!mediaSource) { @@ -243,7 +254,7 @@ return false; } - if (subtitleStream && subtitleStream.IsGraphicalSubtitleStream) { + if (subtitleStream && (subtitleStream.IsGraphicalSubtitleStream || !self.supportsTextTracks())) { console.log('Transcoding because subtitles are required'); return false; } @@ -257,7 +268,7 @@ console.log('Transcoding because bitrate is too high'); return false; } - + var extension = (mediaSource.Container || '').toLowerCase(); // m4v's with high profile failing in chrome @@ -1123,7 +1134,7 @@ function sendProgressUpdate() { var state = self.getPlayerStateInternal(currentMediaElement, self.currentItem, self.currentMediaSource); - + var info = { QueueableMediaTypes: state.NowPlayingItem.MediaType, ItemId: state.NowPlayingItem.Id,