diff --git a/dashboard-ui/scripts/mediaplayer.js b/dashboard-ui/scripts/mediaplayer.js
index aa213e34ea..449cc92636 100644
--- a/dashboard-ui/scripts/mediaplayer.js
+++ b/dashboard-ui/scripts/mediaplayer.js
@@ -1,362 +1,364 @@
-var MediaPlayer = (function (document, clearTimeout, screen, localStorage, _V_, $, setInterval) {
+(function (document, clearTimeout, screen, localStorage, _V_, $, setInterval) {
- var self = this;
-
- var testableAudioElement = document.createElement('audio');
- var testableVideoElement = document.createElement('video');
- var currentMediaElement;
- var currentProgressInterval;
+ function mediaPlayer() {
+ var self = this;
- function playAudio(items, params) {
- var item = items[0];
+ var testableAudioElement = document.createElement('audio');
+ var testableVideoElement = document.createElement('video');
+ var currentMediaElement;
+ var currentProgressInterval;
- var baseParams = {
- audioChannels: 2,
- audioBitrate: 128000
- };
+ function playAudio(items, params) {
+ var item = items[0];
- $.extend(baseParams, params);
+ var baseParams = {
+ audioChannels: 2,
+ audioBitrate: 128000
+ };
- var mp3Url = ApiClient.getUrl('Audio/' + item.Id + '/stream.mp3', $.extend({}, baseParams, {
- audioCodec: 'mp3'
- }));
+ $.extend(baseParams, params);
- var aacUrl = ApiClient.getUrl('Audio/' + item.Id + '/stream.aac', $.extend({}, baseParams, {
- audioCodec: 'aac'
- }));
+ var mp3Url = ApiClient.getUrl('Audio/' + item.Id + '/stream.mp3', $.extend({}, baseParams, {
+ audioCodec: 'mp3'
+ }));
- var webmUrl = ApiClient.getUrl('Audio/' + item.Id + '/stream.webm', $.extend({}, baseParams, {
- audioCodec: 'Vorbis'
- }));
+ var aacUrl = ApiClient.getUrl('Audio/' + item.Id + '/stream.aac', $.extend({}, baseParams, {
+ audioCodec: 'aac'
+ }));
- /* ffmpeg always says the ogg stream is corrupt after conversion
- var oggUrl = ApiClient.getUrl('Audio/' + item.Id + '/stream.oga', $.extend({}, baseParams, {
- audioCodec: 'Vorbis'
- }));
- */
+ var webmUrl = ApiClient.getUrl('Audio/' + item.Id + '/stream.webm', $.extend({}, baseParams, {
+ audioCodec: 'Vorbis'
+ }));
- var html = '';
- html += '';
+ html += '';
+ html += '';
+ html += '';
+ //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", updateProgress);
+
+ ApiClient.reportPlaybackStart(Dashboard.getCurrentUserId(), item.Id);
+ });
+
+ return $('video', nowPlayingBar)[0];
+ }
+
+ function updateProgress() {
+ currentProgressInterval = setInterval(function () {
+ var player = _V_("videoWindow");
+
+ var startTimeTicks = player.tag.src.match(new RegExp("StartTimeTicks=[0-9]+", "g"));
+ var startTime = startTimeTicks[0].replace("StartTimeTicks=", "");
+
+ var itemString = player.tag.src.match(new RegExp("Videos/[0-9a-z\-]+", "g"));
+ var itemId = itemString[0].replace("Videos/", "");
+
+ var positionTicks = parseInt(startTime) + Math.floor(10000000 * player.currentTime());
+
+ ApiClient.reportPlaybackProgress(Dashboard.getCurrentUserId(), itemId, positionTicks);
+ }, 30000);
+ }
+
+ self.canPlay = function (item) {
+ var media;
+
+ if (item.MediaType === "Video") {
+ media = testableVideoElement;
+ 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/, '');
}
- });
- }
- var baseParams = {
- audioChannels: 2,
- audioBitrate: 128000,
- videoBitrate: 1500000,
- maxWidth: screenWidth,
- maxHeight: screenHeight,
- StartTimeTicks: 0,
- SubtitleStreamIndex: null,
- AudioStreamIndex: null
+ return false;
+ }
+
+ if (item.MediaType === "Audio") {
+ media = testableAudioElement;
+ 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 false;
+ }
+
+ return false;
};
- if (typeof (startPosition) != "undefined") {
- baseParams['StartTimeTicks'] = startPosition;
- }
+ self.play = function (items, startPosition) {
- var html = '';
+ if (self.isPlaying()) {
+ self.stop();
+ }
- var nowPlayingBar = $('#nowPlayingBar');
- //hide stop button
- $('#stopButton', nowPlayingBar).hide();
+ var item = items[0];
- $('#mediaElement', nowPlayingBar).addClass("video").html(html).show();
+ var mediaElement;
- _V_("videoWindow", { 'controls': true, 'autoplay': true, 'preload': 'auto' }, function () {
+ if (item.MediaType === "Video") {
- var mp4VideoUrl = ApiClient.getUrl('Videos/' + item.Id + '/stream.mp4', $.extend({}, baseParams, {
- videoCodec: 'h264',
- audioCodec: 'aac'
- }));
+ mediaElement = playVideo(items, startPosition);
+ } else if (item.MediaType === "Audio") {
- var tsVideoUrl = ApiClient.getUrl('Videos/' + item.Id + '/stream.ts', $.extend({}, baseParams, {
- videoCodec: 'h264',
- audioCodec: 'aac'
- }));
+ mediaElement = playAudio(items);
+ }
- var webmVideoUrl = ApiClient.getUrl('Videos/' + item.Id + '/stream.webm', $.extend({}, baseParams, {
- videoCodec: 'vpx',
- audioCodec: 'Vorbis'
- }));
+ if (!mediaElement) {
+ return;
+ }
- var hlsVideoUrl = ApiClient.getUrl('Videos/' + item.Id + '/stream.m3u8', $.extend({}, baseParams, {
- videoCodec: 'h264',
- audioCodec: 'aac'
- }));
+ currentMediaElement = mediaElement;
- var ogvVideoUrl = ApiClient.getUrl('Videos/' + item.Id + '/stream.ogv', $.extend({}, baseParams, {
- videoCodec: 'theora',
- audioCodec: 'Vorbis'
- }));
+ var nowPlayingBar = $('#nowPlayingBar').show();
- (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);
+ 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;
+ }
- videoJSextension.setup_video($('#videoWindow'), item, defaults);
+ //display image and title
+ var imageTags = item.ImageTags || {};
+ var html = '';
- (this).addEvent("loadstart", function () {
- $(".vjs-remaining-time-display").hide();
- });
+ var url = "";
- (this).addEvent("durationchange", function () {
- if ((this).duration() != "Infinity")
- $(".vjs-remaining-time-display").show();
- });
+ if (item.BackdropImageTags && item.BackdropImageTags.length) {
- (this).addEvent("volumechange", function () {
- localStorage.setItem("volume", (this).volume());
- });
+ url = ApiClient.getImageUrl(item.Id, {
+ type: "Backdrop",
+ height: 36,
+ tag: item.BackdropImageTags[0]
+ });
+ } else if (imageTags.Thumb) {
- (this).addEvent("play", updateProgress);
+ url = ApiClient.getImageUrl(item.Id, {
+ type: "Thumb",
+ height: 36,
+ tag: item.ImageTags.Thumb
+ });
+ } else if (imageTags.Primary) {
- ApiClient.reportPlaybackStart(Dashboard.getCurrentUserId(), item.Id);
- });
+ url = ApiClient.getImageUrl(item.Id, {
+ type: "Primary",
+ height: 36,
+ tag: item.ImageTags.Primary
+ });
+ } else {
+ url = "css/images/items/detail/video.png";
+ }
- return $('video', nowPlayingBar)[0];
+ var name = item.Name;
+ var seriesName = '';
+
+ if (item.IndexNumber != null) {
+ name = item.IndexNumber + " - " + name;
+ }
+ if (item.ParentIndexNumber != null) {
+ name = item.ParentIndexNumber + "." + name;
+ }
+ if (item.SeriesName || item.Album || item.ProductionYear) {
+ seriesName = item.SeriesName || item.Album || item.ProductionYear;
+ }
+
+ html += "

";
+ if (item.Type == "Movie")
+ html += '' + name + '
' + seriesName + '
';
+ else
+ html += '' + seriesName + '
' + name + '
';
+
+ $('#mediaInfo', nowPlayingBar).html(html);
+ };
+
+ self.stop = function () {
+
+ var elem = currentMediaElement;
+
+ //check if it's a video using VideoJS
+ if ($(elem).hasClass("vjs-tech")) {
+ var player = _V_("videoWindow");
+
+ var startTimeTicks = player.tag.src.match(new RegExp("StartTimeTicks=[0-9]+", "g"));
+ var startTime = startTimeTicks[0].replace("StartTimeTicks=", "");
+
+ var itemString = player.tag.src.match(new RegExp("Videos/[0-9a-z\-]+", "g"));
+ var itemId = itemString[0].replace("Videos/", "");
+
+ var positionTicks = parseInt(startTime) + Math.floor(10000000 * player.currentTime());
+
+ ApiClient.reportPlaybackStopped(Dashboard.getCurrentUserId(), itemId, positionTicks);
+
+ if (currentProgressInterval) {
+ clearTimeout(currentProgressInterval);
+ }
+
+ if (player.techName == "html5") {
+ player.tag.src = "";
+ player.tech.removeTriggers();
+ player.load();
+ }
+
+ //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;
+
+ //player.tech.destroy();
+ player.destroy();
+ } else {
+ elem.pause();
+ elem.src = "";
+ }
+
+ $(elem).remove();
+
+ $('#nowPlayingBar').hide();
+
+ currentMediaElement = null;
+ };
+
+ self.isPlaying = function () {
+ return currentMediaElement;
+ };
}
- function updateProgress() {
- currentProgressInterval = setInterval(function () {
- var player = _V_("videoWindow");
-
- var startTimeTicks = player.tag.src.match(new RegExp("StartTimeTicks=[0-9]+", "g"));
- var startTime = startTimeTicks[0].replace("StartTimeTicks=", "");
-
- var itemString = player.tag.src.match(new RegExp("Videos/[0-9a-z\-]+", "g"));
- var itemId = itemString[0].replace("Videos/", "");
-
- var positionTicks = parseInt(startTime) + Math.floor(10000000 * player.currentTime());
-
- ApiClient.reportPlaybackProgress(Dashboard.getCurrentUserId(), itemId, positionTicks);
- }, 30000);
- }
-
- self.canPlay = function (item) {
- var media;
-
- if (item.MediaType === "Video") {
- media = testableVideoElement;
- 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 false;
- }
-
- if (item.MediaType === "Audio") {
- media = testableAudioElement;
- 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 false;
- }
-
- return false;
- };
-
- self.play = function (items, startPosition) {
-
- if (self.isPlaying()) {
- self.stop();
- }
-
- var item = items[0];
-
- var mediaElement;
-
- if (item.MediaType === "Video") {
-
- mediaElement = playVideo(items, startPosition);
- } else if (item.MediaType === "Audio") {
-
- mediaElement = playAudio(items);
- }
-
- if (!mediaElement) {
- return;
- }
-
- currentMediaElement = mediaElement;
-
- 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;
- }
-
- //display image and title
- var imageTags = item.ImageTags || {};
- var html = '';
-
- var url = "";
-
- 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: "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 seriesName = '';
-
- if (item.IndexNumber != null) {
- name = item.IndexNumber + " - " + name;
- }
- if (item.ParentIndexNumber != null) {
- name = item.ParentIndexNumber + "." + name;
- }
- if (item.SeriesName || item.Album || item.ProductionYear) {
- seriesName = item.SeriesName || item.Album || item.ProductionYear;
- }
-
- html += "";
- if (item.Type == "Movie")
- html += '' + name + '
' + seriesName + '
';
- else
- html += '' + seriesName + '
' + name + '
';
-
- $('#mediaInfo', nowPlayingBar).html(html);
- };
-
- self.stop = function () {
-
- var elem = currentMediaElement;
-
- //check if it's a video using VideoJS
- if ($(elem).hasClass("vjs-tech")) {
- var player = _V_("videoWindow");
-
- var startTimeTicks = player.tag.src.match(new RegExp("StartTimeTicks=[0-9]+", "g"));
- var startTime = startTimeTicks[0].replace("StartTimeTicks=", "");
-
- var itemString = player.tag.src.match(new RegExp("Videos/[0-9a-z\-]+", "g"));
- var itemId = itemString[0].replace("Videos/", "");
-
- var positionTicks = parseInt(startTime) + Math.floor(10000000 * player.currentTime());
-
- ApiClient.reportPlaybackStopped(Dashboard.getCurrentUserId(), itemId, positionTicks);
-
- if (currentProgressInterval) {
- clearTimeout(currentProgressInterval);
- }
-
- if (player.techName == "html5") {
- player.tag.src = "";
- player.tech.removeTriggers();
- player.load();
- }
-
- //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;
-
- //player.tech.destroy();
- player.destroy();
- } else {
- elem.pause();
- elem.src = "";
- }
-
- $(elem).remove();
-
- $('#nowPlayingBar').hide();
-
- currentMediaElement = null;
- };
-
- self.isPlaying = function () {
- return currentMediaElement;
- };
-
- return self;
+ window.MediaPlayer = new mediaPlayer();
})(document, clearTimeout, screen, localStorage, _V_, $, setInterval);
\ No newline at end of file
diff --git a/dashboard-ui/scripts/playlist.js b/dashboard-ui/scripts/playlist.js
index 06dca09653..2b4046e816 100644
--- a/dashboard-ui/scripts/playlist.js
+++ b/dashboard-ui/scripts/playlist.js
@@ -1,25 +1,28 @@
-var Playlist = (function() {
+(function (window) {
- var self = this;
+ function playlist() {
+ var self = this;
- self.queue = [];
+ self.queue = [];
- self.add = function(item) {
+ self.add = function (item) {
- queue.push(item);
- };
+ queue.push(item);
+ };
- self.remove = function (index) {
+ self.remove = function (index) {
- queue.splice(index, 1);
- };
+ queue.splice(index, 1);
+ };
- self.play = function (index) {
-
- MediaPlayer.play(queue[index]);
- queue.shift();
- };
+ self.play = function (index) {
- return self;
+ MediaPlayer.play(queue[index]);
+ queue.shift();
+ };
-})();
\ No newline at end of file
+ return self;
+ }
+
+ window.Playlist = new playlist();
+})(window);
\ No newline at end of file