diff --git a/dashboard-ui/scripts/mediaplayer.js b/dashboard-ui/scripts/mediaplayer.js
index be635ac7fd..1ca7d2bff2 100644
--- a/dashboard-ui/scripts/mediaplayer.js
+++ b/dashboard-ui/scripts/mediaplayer.js
@@ -1,361 +1,365 @@
-var MediaPlayer = {
+var MediaPlayer = (function (document) {
- testableAudioElement: document.createElement('audio'),
- testableVideoElement: document.createElement('video'),
+ var testableAudioElement = document.createElement('audio');
+ var testableVideoElement = document.createElement('video');
+ var currentMediaElement;
+
+ return {
+
+ canPlay: function (item) {
- canPlay: function (item) {
+ if (item.MediaType === "Video") {
- if (item.MediaType === "Video") {
+ var media = testableVideoElement;
- var media = MediaPlayer.testableVideoElement;
+ if (media.canPlayType) {
- if (media.canPlayType) {
+ return media.canPlayType('video/mp4').replace(/no/, '') || media.canPlayType('video/mp2t').replace(/no/, '') || media.canPlayType('video/webm').replace(/no/, '') || media.canPlayType('application/x-mpegURL').replace(/no/, '') || media.canPlayType('video/ogv').replace(/no/, '');
+ }
- return media.canPlayType('video/mp4').replace(/no/, '') || media.canPlayType('video/mp2t').replace(/no/, '') || media.canPlayType('video/webm').replace(/no/, '') || media.canPlayType('application/x-mpegURL').replace(/no/, '') || media.canPlayType('video/ogv').replace(/no/, '');
- }
+ return false;
+ }
- return false;
- }
+ if (item.MediaType === "Audio") {
- if (item.MediaType === "Audio") {
+ var media = testableAudioElement;
- var media = MediaPlayer.testableAudioElement;
+ if (media.canPlayType) {
- if (media.canPlayType) {
+ return media.canPlayType('audio/mpeg').replace(/no/, '') || media.canPlayType('audio/webm').replace(/no/, '') || media.canPlayType('audio/aac').replace(/no/, '') || media.canPlayType('audio/ogg').replace(/no/, '');
+ }
- return media.canPlayType('audio/mpeg').replace(/no/, '') || media.canPlayType('audio/webm').replace(/no/, '') || media.canPlayType('audio/aac').replace(/no/, '') || media.canPlayType('audio/ogg').replace(/no/, '');
- }
+ return false;
+ }
- return false;
- }
+ return false;
+ },
- return false;
- },
+ play: function (items, startPosition) {
- play: function (items, startPosition) {
+ if (MediaPlayer.isPlaying()) {
+ MediaPlayer.stop();
+ }
- if (MediaPlayer.isPlaying()) {
- MediaPlayer.stop();
- }
+ var item = items[0];
- var item = items[0];
+ var mediaElement;
- var mediaElement;
+ if (item.MediaType === "Video") {
- if (item.MediaType === "Video") {
+ mediaElement = MediaPlayer.playVideo(items, startPosition);
+ }
- mediaElement = MediaPlayer.playVideo(items, startPosition);
- }
+ else if (item.MediaType === "Audio") {
- else if (item.MediaType === "Audio") {
+ mediaElement = MediaPlayer.playAudio(items);
+ }
- mediaElement = MediaPlayer.playAudio(items);
- }
+ if (!mediaElement) {
+ return;
+ }
- if (!mediaElement) {
- return;
- }
+ currentMediaElement = mediaElement;
- MediaPlayer.mediaElement = mediaElement;
+ var nowPlayingBar = $('#nowPlayingBar').show();
- var nowPlayingBar = $('#nowPlayingBar').show();
+ if (items.length > 1) {
+ $('#previousTrackButton', nowPlayingBar)[0].disabled = false;
+ $('#nextTrackButton', nowPlayingBar)[0].disabled = false;
+ } else {
+ $('#previousTrackButton', nowPlayingBar)[0].disabled = true;
+ $('#nextTrackButton', nowPlayingBar)[0].disabled = true;
+ }
- if (items.length > 1) {
- $('#previousTrackButton', nowPlayingBar)[0].disabled = false;
- $('#nextTrackButton', nowPlayingBar)[0].disabled = false;
- } else {
- $('#previousTrackButton', nowPlayingBar)[0].disabled = true;
- $('#nextTrackButton', nowPlayingBar)[0].disabled = true;
- }
+ //display image and title
+ var imageTags = item.ImageTags || {};
+ var html = '';
- //display image and title
- var imageTags = item.ImageTags || {};
- var html = '';
+ var url = "";
- var url = "";
+ if (item.BackdropImageTags && item.BackdropImageTags.length) {
- if (item.BackdropImageTags && item.BackdropImageTags.length) {
+ url = ApiClient.getImageUrl(item.Id, {
+ type: "Backdrop",
+ height: 36,
+ tag: item.BackdropImageTags[0]
+ });
+ }
+ else if (imageTags.Thumb) {
- url = ApiClient.getImageUrl(item.Id, {
- type: "Backdrop",
- height: 36,
- tag: item.BackdropImageTags[0]
- });
- }
- else if (imageTags.Thumb) {
+ url = ApiClient.getImageUrl(item.Id, {
+ type: "Thumb",
+ height: 36,
+ tag: item.ImageTags.Thumb
+ });
+ }
+ else if (imageTags.Primary) {
- url = ApiClient.getImageUrl(item.Id, {
- type: "Thumb",
- height: 36,
- tag: item.ImageTags.Thumb
- });
- }
- else if (imageTags.Primary) {
+ url = ApiClient.getImageUrl(item.Id, {
+ type: "Primary",
+ height: 36,
+ tag: item.ImageTags.Primary
+ });
+ } else {
+ url = "css/images/items/detail/video.png";
+ }
+
+ var name = item.Name;
+ var series_name = '';
+
+ if (item.IndexNumber != null) {
+ name = item.IndexNumber + " - " + name;
+ }
+ if (item.ParentIndexNumber != null) {
+ name = item.ParentIndexNumber + "." + name;
+ }
+ if (item.SeriesName || item.Album || item.ProductionYear) {
+ series_name = item.SeriesName || item.Album || item.ProductionYear;
+ }
+
+ html += "

";
+ if (item.Type == "Movie")
+ html += '' + name + '
' + series_name + '
';
+ else
+ html += '' + series_name + '
' + name + '
';
+
+ $('#mediaInfo', nowPlayingBar).html(html);
+ },
+
+ playAudio: function (items, params) {
+ var item = items[0];
+
+ var baseParams = {
+ audioChannels: 2,
+ audioBitrate: 128000
+ };
+
+ $.extend(baseParams, params);
+
+ var mp3Url = ApiClient.getUrl('Audio/' + item.Id + '/stream.mp3', $.extend({}, baseParams, {
+ audioCodec: 'mp3'
+ }));
+
+ var aacUrl = ApiClient.getUrl('Audio/' + item.Id + '/stream.aac', $.extend({}, baseParams, {
+ audioCodec: 'aac'
+ }));
+
+ var webmUrl = ApiClient.getUrl('Audio/' + item.Id + '/stream.webm', $.extend({}, baseParams, {
+ audioCodec: 'Vorbis'
+ }));
+
+ /* ffmpeg always says the ogg stream is corrupt after conversion
+ var oggUrl = ApiClient.getUrl('Audio/' + item.Id + '/stream.oga', $.extend({}, baseParams, {
+ audioCodec: 'Vorbis'
+ }));
+ */
+
+ var html = '';
+ html += '';
+
+ var nowPlayingBar = $('#nowPlayingBar');
+ //hide stop button
+ $('#stopButton', nowPlayingBar).hide();
+
+ $('#mediaElement', nowPlayingBar).addClass("video").html(html).show();
+
+ _V_("videoWindow", { 'controls': true, 'autoplay': true, 'preload': 'auto' }, function () {
+
+ var mp4VideoUrl = ApiClient.getUrl('Videos/' + item.Id + '/stream.mp4', $.extend({}, baseParams, {
+ videoCodec: 'h264',
+ audioCodec: 'aac'
+ }));
+
+ var tsVideoUrl = ApiClient.getUrl('Videos/' + item.Id + '/stream.ts', $.extend({}, baseParams, {
+ videoCodec: 'h264',
+ audioCodec: 'aac'
+ }));
+
+ var webmVideoUrl = ApiClient.getUrl('Videos/' + item.Id + '/stream.webm', $.extend({}, baseParams, {
+ videoCodec: 'vpx',
+ audioCodec: 'Vorbis'
+ }));
+
+ var hlsVideoUrl = ApiClient.getUrl('Videos/' + item.Id + '/stream.m3u8', $.extend({}, baseParams, {
+ videoCodec: 'h264',
+ audioCodec: 'aac'
+ }));
+
+ var ogvVideoUrl = ApiClient.getUrl('Videos/' + item.Id + '/stream.ogv', $.extend({}, baseParams, {
+ videoCodec: 'theora',
+ audioCodec: 'Vorbis'
+ }));
+
+ (this).src([
+ { type: "application/x-mpegURL", src: hlsVideoUrl },
+ { type: "video/webm", src: webmVideoUrl },
+ { type: "video/mp4", src: mp4VideoUrl },
+ { type: "video/mp2t; codecs='h264, aac'", src: tsVideoUrl },
+ { type: "video/ogg", src: ogvVideoUrl }]
+ ).volume(volume);
+
+ videoJSextension.setup_video($('#videoWindow'), item, defaults);
+
+ (this).addEvent("loadstart", function () {
+ $(".vjs-remaining-time-display").hide();
+ });
+
+ (this).addEvent("durationchange", function () {
+ if ((this).duration() != "Infinity")
+ $(".vjs-remaining-time-display").show();
+ });
+
+ (this).addEvent("volumechange", function () {
+ localStorage.setItem("volume", (this).volume());
+ });
+
+ (this).addEvent("play", MediaPlayer.updateProgress);
+
+ ApiClient.reportPlaybackStart(Dashboard.getCurrentUserId(), item.Id);
+ });
+
+ return $('video', nowPlayingBar)[0];
+ },
+
+ stop: function () {
+
+ var elem = currentMediaElement;
+
+ //check if it's a video using VideoJS
+ if ($(elem).hasClass("vjs-tech")) {
+ var player = _V_("videoWindow");
- url = ApiClient.getImageUrl(item.Id, {
- type: "Primary",
- height: 36,
- tag: item.ImageTags.Primary
- });
- } else {
- url = "css/images/items/detail/video.png";
- }
+ var startTimeTicks = player.tag.src.match(new RegExp("StartTimeTicks=[0-9]+", "g"));
+ var start_time = startTimeTicks[0].replace("StartTimeTicks=", "");
- var name = item.Name;
- var series_name = '';
-
- if (item.IndexNumber != null) {
- name = item.IndexNumber + " - " + name;
- }
- if (item.ParentIndexNumber != null) {
- name = item.ParentIndexNumber + "." + name;
- }
- if (item.SeriesName || item.Album || item.ProductionYear) {
- series_name = item.SeriesName || item.Album || item.ProductionYear;
- }
-
- html += "";
- if (item.Type == "Movie")
- html += '' + name + '
' + series_name + '
';
- else
- html += '' + series_name + '
' + name + '
';
-
- $('#mediaInfo', nowPlayingBar).html(html);
- },
-
- playAudio: function (items, params) {
- var item = items[0];
-
- var baseParams = {
- audioChannels: 2,
- audioBitrate: 128000
- };
-
- $.extend(baseParams, params);
-
- var mp3Url = ApiClient.getUrl('Audio/' + item.Id + '/stream.mp3', $.extend({}, baseParams, {
- audioCodec: 'mp3'
- }));
-
- var aacUrl = ApiClient.getUrl('Audio/' + item.Id + '/stream.aac', $.extend({}, baseParams, {
- audioCodec: 'aac'
- }));
-
- var webmUrl = ApiClient.getUrl('Audio/' + item.Id + '/stream.webm', $.extend({}, baseParams, {
- audioCodec: 'Vorbis'
- }));
-
- /* ffmpeg always says the ogg stream is corrupt after conversion
- var oggUrl = ApiClient.getUrl('Audio/' + item.Id + '/stream.oga', $.extend({}, baseParams, {
- audioCodec: 'Vorbis'
- }));
- */
-
- var html = '';
- html += '';
-
- var nowPlayingBar = $('#nowPlayingBar');
- //hide stop button
- $('#stopButton', nowPlayingBar).hide();
-
- $('#mediaElement', nowPlayingBar).addClass("video").html(html).show();
-
- _V_("videoWindow", { 'controls': true, 'autoplay': true, 'preload': 'auto' }, function () {
-
- var mp4VideoUrl = ApiClient.getUrl('Videos/' + item.Id + '/stream.mp4', $.extend({}, baseParams, {
- videoCodec: 'h264',
- audioCodec: 'aac'
- }));
-
- var tsVideoUrl = ApiClient.getUrl('Videos/' + item.Id + '/stream.ts', $.extend({}, baseParams, {
- videoCodec: 'h264',
- audioCodec: 'aac'
- }));
-
- var webmVideoUrl = ApiClient.getUrl('Videos/' + item.Id + '/stream.webm', $.extend({}, baseParams, {
- videoCodec: 'vpx',
- audioCodec: 'Vorbis'
- }));
-
- var hlsVideoUrl = ApiClient.getUrl('Videos/' + item.Id + '/stream.m3u8', $.extend({}, baseParams, {
- videoCodec: 'h264',
- audioCodec: 'aac'
- }));
-
- var ogvVideoUrl = ApiClient.getUrl('Videos/' + item.Id + '/stream.ogv', $.extend({}, baseParams, {
- videoCodec: 'theora',
- audioCodec: 'Vorbis'
- }));
-
- (this).src([
- { type: "application/x-mpegURL", src: hlsVideoUrl },
- { type: "video/webm", src: webmVideoUrl },
- { type: "video/mp4", src: mp4VideoUrl },
- { type: "video/mp2t; codecs='h264, aac'", src: tsVideoUrl },
- { type: "video/ogg", src: ogvVideoUrl }]
- ).volume(volume);
-
- videoJSextension.setup_video($('#videoWindow'), item, defaults);
-
- (this).addEvent("loadstart", function () {
- $(".vjs-remaining-time-display").hide();
- });
-
- (this).addEvent("durationchange", function () {
- if ((this).duration() != "Infinity")
- $(".vjs-remaining-time-display").show();
- });
-
- (this).addEvent("volumechange", function () {
- localStorage.setItem("volume", (this).volume());
- });
-
- (this).addEvent("play", MediaPlayer.updateProgress);
-
- ApiClient.reportPlaybackStart(Dashboard.getCurrentUserId(), item.Id);
- });
-
- return $('video', nowPlayingBar)[0];
- },
-
- stop: function () {
-
- var elem = MediaPlayer.mediaElement;
-
- //check if it's a video using VideoJS
- if ($(elem).hasClass("vjs-tech")) {
- var player = _V_("videoWindow");
+ var item_string = player.tag.src.match(new RegExp("Videos/[0-9a-z\-]+", "g"));
+ var item_id = item_string[0].replace("Videos/", "");
- var startTimeTicks = player.tag.src.match(new RegExp("StartTimeTicks=[0-9]+", "g"));
- var start_time = startTimeTicks[0].replace("StartTimeTicks=", "");
+ var positionTicks = parseInt(start_time) + Math.floor(10000000 * player.currentTime());
- var item_string = player.tag.src.match(new RegExp("Videos/[0-9a-z\-]+", "g"));
- var item_id = item_string[0].replace("Videos/", "");
+ ApiClient.reportPlaybackStopped(Dashboard.getCurrentUserId(), item_id, positionTicks);
- var positionTicks = parseInt(start_time) + Math.floor(10000000 * player.currentTime());
+ clearTimeout(MediaPlayer.progressInterval);
- ApiClient.reportPlaybackStopped(Dashboard.getCurrentUserId(), item_id, positionTicks);
+ if (player.techName == "html5") {
+ player.tag.src = "";
+ player.tech.removeTriggers();
+ player.load();
+ }
- clearTimeout(MediaPlayer.progressInterval);
+ //remove custom buttons
+ delete _V_.ControlBar.prototype.options.components.ResolutionSelectorButton;
+ delete _V_.ControlBar.prototype.options.components.SubtitleSelectorButton;
+ delete _V_.ControlBar.prototype.options.components.LanguageSelectorButton;
+ delete _V_.ControlBar.prototype.options.components.ChapterSelectorButton;
- if (player.techName == "html5") {
- player.tag.src = "";
- player.tech.removeTriggers();
- player.load();
- }
+ //player.tech.destroy();
+ player.destroy();
+ } else {
+ elem.pause();
+ elem.src = "";
+ }
- //remove custom buttons
- delete _V_.ControlBar.prototype.options.components.ResolutionSelectorButton;
- delete _V_.ControlBar.prototype.options.components.SubtitleSelectorButton;
- delete _V_.ControlBar.prototype.options.components.LanguageSelectorButton;
- delete _V_.ControlBar.prototype.options.components.ChapterSelectorButton;
+ $(elem).remove();
- //player.tech.destroy();
- player.destroy();
- } else {
- elem.pause();
- elem.src = "";
- }
+ $('#nowPlayingBar').hide();
- $(elem).remove();
+ currentMediaElement = null;
+ },
- $('#nowPlayingBar').hide();
+ isPlaying: function () {
+ return currentMediaElement;
+ },
- MediaPlayer.mediaElement = null;
- },
+ updateProgress: function () {
+ MediaPlayer.progressInterval = setInterval(function () {
+ var player = _V_("videoWindow");
- isPlaying: function () {
- return MediaPlayer.mediaElement;
- },
+ var startTimeTicks = player.tag.src.match(new RegExp("StartTimeTicks=[0-9]+", "g"));
+ var start_time = startTimeTicks[0].replace("StartTimeTicks=", "");
- updateProgress: function () {
- MediaPlayer.progressInterval = setInterval(function () {
- var player = _V_("videoWindow");
+ var item_string = player.tag.src.match(new RegExp("Videos/[0-9a-z\-]+", "g"));
+ var item_id = item_string[0].replace("Videos/", "");
- var startTimeTicks = player.tag.src.match(new RegExp("StartTimeTicks=[0-9]+", "g"));
- var start_time = startTimeTicks[0].replace("StartTimeTicks=", "");
+ var positionTicks = parseInt(start_time) + Math.floor(10000000 * player.currentTime());
- var item_string = player.tag.src.match(new RegExp("Videos/[0-9a-z\-]+", "g"));
- var item_id = item_string[0].replace("Videos/", "");
+ ApiClient.reportPlaybackProgress(Dashboard.getCurrentUserId(), item_id, positionTicks);
+ }, 30000);
+ }
+ };
- var positionTicks = parseInt(start_time) + Math.floor(10000000 * player.currentTime());
-
- ApiClient.reportPlaybackProgress(Dashboard.getCurrentUserId(), item_id, positionTicks);
- }, 30000);
- }
-
-};
+})(document);
\ No newline at end of file