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 += '