';
- var language = null;
-
- if (stream.Language && stream.Language != "und") {
-
- var culture = cultures.filter(function (current) {
- return current.ThreeLetterISOLanguageName.toLowerCase() == stream.Language.toLowerCase();
- });
-
- if (culture.length) {
- language = culture[0].DisplayName;
- }
- }
-
- html += '
';
var options = [];
@@ -469,10 +442,10 @@
return html;
};
- function getSubtitleTracksHtml(item, cultures) {
+ function getSubtitleTracksHtml() {
- var streams = item.MediaStreams.filter(function (i) {
- return i.Type == "Subtitle";
+ var streams = currentMediaVersion.MediaStreams.filter(function (currentStream) {
+ return currentStream.Type == "Subtitle";
});
var currentIndex = getParameterByName('SubtitleStreamIndex', video.currentSrc) || -1;
@@ -502,25 +475,13 @@
html += '
';
- var language = null;
var options = [];
if (stream.Language == "Off") {
- language = "Off";
options.push(' ');
}
- else if (stream.Language && stream.Language != "und") {
- var culture = cultures.filter(function (current) {
- return current.ThreeLetterISOLanguageName.toLowerCase() == stream.Language.toLowerCase();
- });
-
- if (culture.length) {
- language = culture[0].DisplayName;
- }
- }
-
- html += '
' + (language || 'Unknown language') + '
';
+ html += '
' + (stream.Language || 'Unknown language') + '
';
if (stream.Codec) {
options.push(stream.Codec);
@@ -556,7 +517,7 @@
return html;
};
- function getQualityFlyoutHtml(item) {
+ function getQualityFlyoutHtml() {
var html = '';
@@ -567,7 +528,7 @@
var currentAudioStreamIndex = getParameterByName('AudioStreamIndex', video.currentSrc);
- var options = getVideoQualityOptions(item, currentAudioStreamIndex, transcodingExtension);
+ var options = getVideoQualityOptions(currentMediaVersion.MediaStreams, currentAudioStreamIndex, transcodingExtension);
if (isStatic) {
options[0].name = "Direct";
@@ -659,9 +620,9 @@
return audioStreams.length ? audioStreams[0].Index : null;
};
- function getVideoQualityOptions(item) {
+ function getVideoQualityOptions(mediaStreams) {
- var videoStream = (item.MediaStreams || []).filter(function (stream) {
+ var videoStream = mediaStreams.filter(function (stream) {
return stream.Type == "Video";
})[0];
@@ -735,9 +696,9 @@
return options;
};
- function playVideo(item, startPosition, user) {
+ function playVideo(item, mediaVersion, startPosition, user) {
- var mediaStreams = item.MediaStreams || [];
+ var mediaStreams = mediaVersion.MediaStreams || [];
var baseParams = {
audioChannels: 2,
@@ -748,20 +709,20 @@
Static: false
};
- var mp4Quality = getVideoQualityOptions(item).filter(function (opt) {
+ var mp4Quality = getVideoQualityOptions(mediaStreams).filter(function (opt) {
return opt.selected;
})[0];
- mp4Quality = $.extend(mp4Quality, self.getFinalVideoParams(item, mp4Quality.maxWidth, mp4Quality.bitrate, baseParams.AudioStreamIndex, baseParams.SubtitleStreamIndex, '.mp4'));
+ mp4Quality = $.extend(mp4Quality, self.getFinalVideoParams(mediaVersion, mp4Quality.maxWidth, mp4Quality.bitrate, baseParams.AudioStreamIndex, baseParams.SubtitleStreamIndex, '.mp4'));
- var webmQuality = getVideoQualityOptions(item).filter(function (opt) {
+ var webmQuality = getVideoQualityOptions(mediaStreams).filter(function (opt) {
return opt.selected;
})[0];
- webmQuality = $.extend(webmQuality, self.getFinalVideoParams(item, webmQuality.maxWidth, webmQuality.bitrate, baseParams.AudioStreamIndex, baseParams.SubtitleStreamIndex, '.webm'));
+ webmQuality = $.extend(webmQuality, self.getFinalVideoParams(mediaVersion, webmQuality.maxWidth, webmQuality.bitrate, baseParams.AudioStreamIndex, baseParams.SubtitleStreamIndex, '.webm'));
- var m3U8Quality = getVideoQualityOptions(item).filter(function (opt) {
+ var m3U8Quality = getVideoQualityOptions(mediaStreams).filter(function (opt) {
return opt.selected;
})[0];
- m3U8Quality = $.extend(m3U8Quality, self.getFinalVideoParams(item, mp4Quality.maxWidth, mp4Quality.bitrate, baseParams.AudioStreamIndex, baseParams.SubtitleStreamIndex, '.mp4'));
+ m3U8Quality = $.extend(m3U8Quality, self.getFinalVideoParams(mediaVersion, mp4Quality.maxWidth, mp4Quality.bitrate, baseParams.AudioStreamIndex, baseParams.SubtitleStreamIndex, '.mp4'));
// Webm must be ahead of mp4 due to the issue of mp4 playing too fast in chrome
var prioritizeWebmOverH264 = $.browser.chrome || $.browser.msie;
@@ -772,7 +733,7 @@
var seekParam = isStatic && startPosition ? '#t=' + (startPosition / 10000000) : '';
- var mp4VideoUrl = ApiClient.getUrl('Videos/' + item.Id + '/stream.mp4', $.extend({}, baseParams, {
+ var mp4VideoUrl = ApiClient.getUrl('Videos/' + mediaVersion.ItemId + '/stream.mp4', $.extend({}, baseParams, {
profile: 'baseline',
level: 3,
Static: isStatic,
@@ -784,7 +745,7 @@
})) + seekParam;
- var webmVideoUrl = ApiClient.getUrl('Videos/' + item.Id + '/stream.webm', $.extend({}, baseParams, {
+ var webmVideoUrl = ApiClient.getUrl('Videos/' + mediaVersion.ItemId + '/stream.webm', $.extend({}, baseParams, {
VideoCodec: 'vpx',
AudioCodec: 'Vorbis',
@@ -794,7 +755,7 @@
})) + seekParam;
- var hlsVideoUrl = ApiClient.getUrl('Videos/' + item.Id + '/stream.m3u8', $.extend({}, baseParams, {
+ var hlsVideoUrl = ApiClient.getUrl('Videos/' + mediaVersion.ItemId + '/stream.m3u8', $.extend({}, baseParams, {
profile: 'baseline',
level: 3,
timeStampOffsetMs: 0,
@@ -874,7 +835,7 @@
$('#video-subtitleButton', videoControls).hide();
}
- if (item.Chapters && item.Chapters.length) {
+ if (mediaVersion.Chapters && mediaVersion.Chapters.length) {
$('#video-chaptersButton', videoControls).show();
} else {
$('#video-chaptersButton', videoControls).hide();
@@ -921,9 +882,9 @@
videoElement.off("playing.once");
- ApiClient.reportPlaybackStart(Dashboard.getCurrentUserId(), item.Id, true, item.MediaType);
+ ApiClient.reportPlaybackStart(Dashboard.getCurrentUserId(), mediaVersion.ItemId, true, item.MediaType);
- self.startProgressInterval(item.Id);
+ self.startProgressInterval(mediaVersion.ItemId);
}).on("pause", function (e) {
@@ -1039,6 +1000,7 @@
fullscreenExited = false;
currentItem = item;
+ currentMediaVersion = mediaVersion;
return videoElement[0];
};
diff --git a/dashboard-ui/scripts/mediaplayer.js b/dashboard-ui/scripts/mediaplayer.js
index 487e57c141..1df64ae481 100644
--- a/dashboard-ui/scripts/mediaplayer.js
+++ b/dashboard-ui/scripts/mediaplayer.js
@@ -8,6 +8,7 @@
var currentMediaElement;
var currentProgressInterval;
var currentItem;
+ var currentMediaVersion;
var curentDurationTicks;
var canClientSeek;
var currentPlaylistIndex = 0;
@@ -53,7 +54,7 @@
var position = Math.floor(10000000 * endTime) + self.startTimeTicksOffset;
- ApiClient.reportPlaybackStopped(Dashboard.getCurrentUserId(), currentItem.Id, position);
+ ApiClient.reportPlaybackStopped(Dashboard.getCurrentUserId(), currentMediaVersion.ItemId, position);
if (currentItem.MediaType == "Video") {
ApiClient.stopActiveEncodings();
@@ -135,7 +136,7 @@
var transcodingExtension = self.getTranscodingExtension();
- var finalParams = self.getFinalVideoParams(currentItem, maxWidth, bitrate, audioStreamIndex, subtitleStreamIndex, transcodingExtension);
+ var finalParams = self.getFinalVideoParams(currentMediaVersion, maxWidth, bitrate, audioStreamIndex, subtitleStreamIndex, transcodingExtension);
currentSrc = replaceQueryString(currentSrc, 'MaxWidth', finalParams.maxWidth);
currentSrc = replaceQueryString(currentSrc, 'VideoBitrate', finalParams.videoBitrate);
currentSrc = replaceQueryString(currentSrc, 'AudioBitrate', finalParams.audioBitrate);
@@ -155,8 +156,8 @@
$(this).off('play.onceafterseek').on('ended.playbackstopped', self.onPlaybackStopped).on('ended.playnext', self.playNextAfterEnded);
- self.startProgressInterval(currentItem.Id);
- sendProgressUpdate(currentItem.Id);
+ self.startProgressInterval(currentMediaVersion.ItemId);
+ sendProgressUpdate(currentMediaVersion.ItemId);
});
@@ -193,9 +194,9 @@
self.currentTimeElement.html(timeText);
};
- self.canPlayVideoDirect = function (item, videoStream, audioStream, subtitleStream, maxWidth, bitrate) {
+ self.canPlayVideoDirect = function (mediaVersion, videoStream, audioStream, subtitleStream, maxWidth, bitrate) {
- if (item.VideoType != "VideoFile" || item.LocationType != "FileSystem") {
+ if (mediaVersion.VideoType != "VideoFile" || mediaVersion.LocationType != "FileSystem") {
console.log('Transcoding because the content is not a video file');
return false;
}
@@ -228,7 +229,7 @@
return false;
}
- var extension = item.Path.substring(item.Path.lastIndexOf('.') + 1).toLowerCase();
+ var extension = mediaVersion.Path.substring(mediaVersion.Path.lastIndexOf('.') + 1).toLowerCase();
if (extension == 'm4v') {
return $.browser.chrome;
@@ -237,28 +238,29 @@
return extension.toLowerCase() == 'mp4';
};
- self.getFinalVideoParams = function (item, maxWidth, bitrate, audioStreamIndex, subtitleStreamIndex, transcodingExtension) {
+ self.getFinalVideoParams = function (mediaVersion, maxWidth, bitrate, audioStreamIndex, subtitleStreamIndex, transcodingExtension) {
- var videoStream = (item.MediaStreams || []).filter(function (stream) {
+ var mediaStreams = mediaVersion.MediaStreams;
+
+ var videoStream = mediaStreams.filter(function (stream) {
return stream.Type === "Video";
})[0];
- var audioStream = (item.MediaStreams || []).filter(function (stream) {
+ var audioStream = mediaStreams.filter(function (stream) {
return stream.Index === audioStreamIndex;
})[0];
- var subtitleStream = (item.MediaStreams || []).filter(function (stream) {
+ var subtitleStream = mediaStreams.filter(function (stream) {
return stream.Index === subtitleStreamIndex;
})[0];
- var canPlayDirect = self.canPlayVideoDirect(item, videoStream, audioStream, subtitleStream, maxWidth, bitrate);
+ var canPlayDirect = self.canPlayVideoDirect(mediaVersion, videoStream, audioStream, subtitleStream, maxWidth, bitrate);
var audioBitrate = bitrate >= 700000 ? 128000 : 64000;
var videoBitrate = bitrate - audioBitrate;
return {
-
isStatic: canPlayDirect,
maxWidth: maxWidth,
audioCodec: transcodingExtension == '.webm' ? 'vorbis' : 'aac',
@@ -266,7 +268,7 @@
audioBitrate: audioBitrate,
videoBitrate: videoBitrate
};
- }
+ };
self.canPlay = function (item, user) {
@@ -397,6 +399,13 @@
self.playlist = items;
currentPlaylistIndex = 0;
};
+
+ function getOptimalMediaVersion(versions) {
+
+ // TODO: Implement
+
+ return versions[0];
+ }
self.playInternal = function (item, startPosition, user) {
@@ -414,17 +423,25 @@
if (item.MediaType === "Video") {
- videoPlayer(self, item, startPosition, user);
- mediaElement = self.initVideoPlayer();
currentItem = item;
- curentDurationTicks = item.RunTimeTicks;
+ currentMediaVersion = getOptimalMediaVersion(item.MediaVersions);
+
+ videoPlayer(self, item, currentMediaVersion, startPosition, user);
+ mediaElement = self.initVideoPlayer();
+ curentDurationTicks = currentMediaVersion.RunTimeTicks;
+
mediaControls = $("#videoControls");
} else if (item.MediaType === "Audio") {
- mediaElement = playAudio(item, startPosition);
+ currentItem = item;
+ currentMediaVersion = getOptimalMediaVersion(item.MediaVersions);
+
+ mediaElement = playAudio(item, currentMediaVersion, startPosition);
mediaControls.show();
+ curentDurationTicks = currentMediaVersion.RunTimeTicks;
+
} else {
throw new Error("Unrecognized media type");
}
@@ -915,7 +932,7 @@
var position = Math.floor(10000000 * endTime) + self.startTimeTicksOffset;
- ApiClient.reportPlaybackStopped(Dashboard.getCurrentUserId(), currentItem.Id, position);
+ ApiClient.reportPlaybackStopped(Dashboard.getCurrentUserId(), currentMediaVersion.ItemId, position);
}
});
@@ -966,7 +983,7 @@
var newPercent = parseInt(this.value);
- var newPositionTicks = (newPercent / 100) * currentItem.RunTimeTicks;
+ var newPositionTicks = (newPercent / 100) * currentMediaVersion.RunTimeTicks;
self.changeStream(Math.floor(newPositionTicks));
};
@@ -980,7 +997,7 @@
return d >= 0 && text.lastIndexOf(pattern) === d;
};
- function playAudio(item, startPositionTicks) {
+ function playAudio(item, mediaVersion, startPositionTicks) {
startPositionTicks = startPositionTicks || 0;
@@ -990,19 +1007,19 @@
StartTimeTicks: startPositionTicks
};
- var mp3Url = ApiClient.getUrl('Audio/' + item.Id + '/stream.mp3', $.extend({}, baseParams, {
+ var mp3Url = ApiClient.getUrl('Audio/' + mediaVersion.ItemId + '/stream.mp3', $.extend({}, baseParams, {
audioCodec: 'mp3'
}));
- var aacUrl = ApiClient.getUrl('Audio/' + item.Id + '/stream.aac', $.extend({}, baseParams, {
+ var aacUrl = ApiClient.getUrl('Audio/' + mediaVersion.ItemId + '/stream.aac', $.extend({}, baseParams, {
audioCodec: 'aac'
}));
- var webmUrl = ApiClient.getUrl('Audio/' + item.Id + '/stream.webm', $.extend({}, baseParams, {
+ var webmUrl = ApiClient.getUrl('Audio/' + mediaVersion.ItemId + '/stream.webm', $.extend({}, baseParams, {
audioCodec: 'Vorbis'
}));
- var mediaStreams = item.MediaStreams || [];
+ var mediaStreams = mediaVersion.MediaStreams;
var isStatic = false;
var seekParam = isStatic && startPositionTicks ? '#t=' + (startPositionTicks / 10000000) : '';
@@ -1089,9 +1106,9 @@
audioElement.off("play.once");
- ApiClient.reportPlaybackStart(Dashboard.getCurrentUserId(), item.Id, true, item.MediaType);
+ ApiClient.reportPlaybackStart(Dashboard.getCurrentUserId(), mediaVersion.ItemId, true, item.MediaType);
- self.startProgressInterval(item.Id);
+ self.startProgressInterval(mediaVersion.ItemId);
}).on("pause", function () {
@@ -1112,9 +1129,6 @@
}).on("ended.playbackstopped", self.onPlaybackStopped).on('ended.playnext', self.playNextAfterEnded);
- currentItem = item;
- curentDurationTicks = item.RunTimeTicks;
-
return audioElement[0];
};
diff --git a/dashboard-ui/scripts/remotecontrol.js b/dashboard-ui/scripts/remotecontrol.js
index 86e721876c..24e33bc0ac 100644
--- a/dashboard-ui/scripts/remotecontrol.js
+++ b/dashboard-ui/scripts/remotecontrol.js
@@ -299,18 +299,6 @@
resumeButtonContainer.show();
}
}
- else if (value == "PlayFromChapter" && item.Chapters && item.Chapters.length) {
-
- playFromMenu.show();
- playButtonContainer.show();
-
- if (!playFromRendered) {
- playFromRendered = true;
- renderPlayFromOptions(playFromMenu, item);
- }
-
- popup.popup("reposition", { tolerance: 0 });
- }
else if (value == "Trailer") {
trailersElem.show();
@@ -384,65 +372,6 @@
});
}
- function renderPlayFromOptions(elem, item) {
-
- var html = '';
-
- html += '
Play from scene
';
-
- html += '';
-
- elem.html(html);
-
- $('.tdSelectPlayTime', elem).html('
');
-
- $('.chkSelectPlayTime:first', elem).checked(true);
- }
-
function renderSessionsInPlayMenu(sessions, options, elem, popup) {
if (!sessions.length) {
@@ -476,10 +405,6 @@
html += '