2016-05-05 20:09:36 -07:00
define ( [ 'datetime' , 'jQuery' ] , function ( datetime , $ ) {
2014-04-11 08:36:25 -07:00
var currentPlayer ;
var currentTimeElement ;
var nowPlayingImageElement ;
var nowPlayingTextElement ;
2015-06-13 08:52:46 -07:00
var nowPlayingUserData ;
2014-04-11 08:36:25 -07:00
var unmuteButton ;
var muteButton ;
var volumeSlider ;
var unpauseButton ;
var pauseButton ;
var positionSlider ;
2015-07-26 14:02:23 -07:00
var toggleRepeatButton ;
2014-04-11 08:36:25 -07:00
var lastPlayerState ;
function getNowPlayingBarHtml ( ) {
var html = '' ;
2015-12-14 08:43:03 -07:00
html += '<div class="nowPlayingBar hide">' ;
2014-06-21 22:52:31 -07:00
2015-06-27 12:53:36 -07:00
html += '<div class="nowPlayingBarPositionContainer">' ;
html += '<paper-slider pin step=".1" min="0" max="100" value="0" class="nowPlayingBarPositionSlider"></paper-slider>' ;
html += '</div>' ;
html += '<div class="nowPlayingBarInfoContainer">' ;
2015-05-01 11:37:01 -07:00
html += '<div class="nowPlayingImage"></div>' ;
2015-06-27 12:53:36 -07:00
html += '<div class="nowPlayingBarText"></div>' ;
html += '</div>' ;
2015-05-01 11:37:01 -07:00
2015-06-17 18:41:22 -07:00
// The onclicks are needed due to the return false above
2015-06-27 12:53:36 -07:00
html += '<div class="nowPlayingBarCenter">' ;
2015-05-01 11:37:01 -07:00
2015-06-23 21:38:46 -07:00
html += '<paper-icon-button icon="skip-previous" class="previousTrackButton mediaButton"></paper-icon-button>' ;
2014-06-21 22:52:31 -07:00
2015-06-23 21:38:46 -07:00
html += '<paper-icon-button icon="play-arrow" class="mediaButton unpauseButton"></paper-icon-button>' ;
html += '<paper-icon-button icon="pause" class="mediaButton pauseButton"></paper-icon-button>' ;
2014-06-24 14:45:21 -07:00
2015-06-23 21:38:46 -07:00
html += '<paper-icon-button icon="stop" class="stopButton mediaButton"></paper-icon-button>' ;
2014-04-11 08:36:25 -07:00
2015-06-23 21:38:46 -07:00
html += '<paper-icon-button icon="skip-next" class="nextTrackButton mediaButton"></paper-icon-button>' ;
2014-04-11 08:36:25 -07:00
2015-06-27 12:53:36 -07:00
html += '<div class="nowPlayingBarCurrentTime"></div>' ;
2014-04-11 08:36:25 -07:00
html += '</div>' ;
2015-06-27 12:53:36 -07:00
html += '<div class="nowPlayingBarRight">' ;
2015-06-23 21:38:46 -07:00
html += '<paper-icon-button icon="volume-up" class="muteButton mediaButton"></paper-icon-button>' ;
html += '<paper-icon-button icon="volume-off" class="unmuteButton mediaButton"></paper-icon-button>' ;
2014-04-11 08:36:25 -07:00
2015-12-14 08:43:03 -07:00
html += '<paper-slider pin step="1" min="0" max="100" value="0" class="nowPlayingBarVolumeSlider" style="width:100px;vertical-align:middle;display:inline-block;"></paper-slider>' ;
2014-04-11 08:36:25 -07:00
2015-07-26 14:02:23 -07:00
html += '<paper-icon-button icon="repeat" class="mediaButton toggleRepeatButton"></paper-icon-button>' ;
2015-06-13 08:52:46 -07:00
html += '<div class="nowPlayingBarUserDataButtons">' ;
html += '</div>' ;
2015-06-27 12:53:36 -07:00
html += '<paper-icon-button icon="play-arrow" class="mediaButton unpauseButton"></paper-icon-button>' ;
html += '<paper-icon-button icon="pause" class="mediaButton pauseButton"></paper-icon-button>' ;
2016-02-05 19:47:06 -07:00
html += '<paper-icon-button icon="tablet-android" class="mediaButton remoteControlButton"></paper-icon-button>' ;
2015-07-03 04:51:45 -07:00
html += '<paper-icon-button icon="queue-music" class="mediaButton playlistButton"></paper-icon-button>' ;
2015-06-27 12:53:36 -07:00
html += '</div>' ;
2014-04-11 08:36:25 -07:00
html += '</div>' ;
return html ;
}
2015-12-14 08:43:03 -07:00
var height ;
function getHeight ( elem ) {
if ( ! height ) {
height = elem . offsetHeight ;
}
return height + 'px' ;
}
function slideDown ( elem ) {
if ( elem . classList . contains ( 'hide' ) ) {
return ;
}
var onfinish = function ( ) {
elem . classList . add ( 'hide' ) ;
} ;
2015-12-27 11:47:48 -07:00
if ( ! browserInfo . animate || browserInfo . mobile ) {
2015-12-14 08:43:03 -07:00
onfinish ( ) ;
return ;
2015-12-27 11:47:48 -07:00
}
2015-12-14 08:43:03 -07:00
requestAnimationFrame ( function ( ) {
var keyframes = [
{ height : getHeight ( elem ) , offset : 0 } ,
{ height : '0' , display : 'none' , offset : 1 } ] ;
var timing = { duration : 200 , iterations : 1 , fill : 'both' , easing : 'ease-out' } ;
elem . animate ( keyframes , timing ) . onfinish = onfinish ;
} ) ;
}
function slideUp ( elem ) {
if ( ! elem . classList . contains ( 'hide' ) ) {
return ;
}
elem . classList . remove ( 'hide' ) ;
2015-12-27 11:47:48 -07:00
if ( ! browserInfo . animate || browserInfo . mobile ) {
2015-12-14 08:43:03 -07:00
return ;
2015-12-27 11:47:48 -07:00
}
2015-12-14 08:43:03 -07:00
requestAnimationFrame ( function ( ) {
var keyframes = [
{ height : '0' , offset : 0 } ,
{ height : getHeight ( elem ) , offset : 1 } ] ;
var timing = { duration : 200 , iterations : 1 , fill : 'both' , easing : 'ease-out' } ;
elem . animate ( keyframes , timing ) ;
} ) ;
}
2014-04-11 08:36:25 -07:00
function bindEvents ( elem ) {
2016-02-06 14:11:30 -07:00
currentTimeElement = elem . querySelector ( '.nowPlayingBarCurrentTime' ) ;
2016-02-05 10:04:46 -07:00
nowPlayingImageElement = elem . querySelector ( '.nowPlayingImage' ) ;
2016-02-06 14:11:30 -07:00
nowPlayingTextElement = elem . querySelector ( '.nowPlayingBarText' ) ;
nowPlayingUserData = elem . querySelector ( '.nowPlayingBarUserDataButtons' ) ;
2014-04-11 08:36:25 -07:00
unmuteButton = $ ( '.unmuteButton' , elem ) . on ( 'click' , function ( ) {
if ( currentPlayer ) {
currentPlayer . unMute ( ) ;
}
} ) ;
muteButton = $ ( '.muteButton' , elem ) . on ( 'click' , function ( ) {
if ( currentPlayer ) {
currentPlayer . mute ( ) ;
}
} ) ;
$ ( '.stopButton' , elem ) . on ( 'click' , function ( ) {
if ( currentPlayer ) {
currentPlayer . stop ( ) ;
}
} ) ;
pauseButton = $ ( '.pauseButton' , elem ) . on ( 'click' , function ( ) {
if ( currentPlayer ) {
currentPlayer . pause ( ) ;
}
} ) ;
unpauseButton = $ ( '.unpauseButton' , elem ) . on ( 'click' , function ( ) {
if ( currentPlayer ) {
currentPlayer . unpause ( ) ;
}
} ) ;
$ ( '.nextTrackButton' , elem ) . on ( 'click' , function ( ) {
if ( currentPlayer ) {
currentPlayer . nextTrack ( ) ;
}
} ) ;
$ ( '.previousTrackButton' , elem ) . on ( 'click' , function ( ) {
if ( currentPlayer ) {
currentPlayer . previousTrack ( ) ;
}
} ) ;
2016-02-05 19:47:06 -07:00
elem . querySelector ( '.remoteControlButton' ) . addEventListener ( 'click' , function ( ) {
2015-07-03 04:51:45 -07:00
2016-02-05 19:47:06 -07:00
showRemoteControl ( ) ;
} ) ;
elem . querySelector ( '.playlistButton' ) . addEventListener ( 'click' , function ( ) {
showRemoteControl ( 'playlist' ) ;
2015-07-03 04:51:45 -07:00
} ) ;
2015-07-26 14:02:23 -07:00
toggleRepeatButton = $ ( '.toggleRepeatButton' , elem ) . on ( 'click' , function ( ) {
2015-07-30 07:34:46 -07:00
if ( currentPlayer ) {
var state = lastPlayerState || { } ;
2015-07-26 14:02:23 -07:00
switch ( ( state . PlayState || { } ) . RepeatMode ) {
case 'RepeatAll' :
currentPlayer . setRepeatMode ( 'RepeatOne' ) ;
break ;
case 'RepeatOne' :
currentPlayer . setRepeatMode ( 'RepeatNone' ) ;
break ;
2015-07-30 07:34:46 -07:00
default :
currentPlayer . setRepeatMode ( 'RepeatAll' ) ;
break ;
2015-07-26 14:02:23 -07:00
}
}
} ) [ 0 ] ;
2015-07-11 17:33:50 -07:00
// Unfortunately this is necessary because the polymer elements might not be ready immediately and there doesn't seem to be an event-driven way to find out when
2015-07-26 14:02:23 -07:00
setTimeout ( function ( ) {
2015-07-11 17:33:50 -07:00
volumeSlider = $ ( '.nowPlayingBarVolumeSlider' , elem ) . on ( 'change' , function ( ) {
2014-04-11 08:36:25 -07:00
2015-07-11 17:33:50 -07:00
if ( currentPlayer ) {
currentPlayer . setVolume ( this . value ) ;
}
2014-04-11 08:36:25 -07:00
2015-07-11 17:33:50 -07:00
} ) [ 0 ] ;
2014-04-11 08:36:25 -07:00
2015-07-11 17:33:50 -07:00
positionSlider = $ ( '.nowPlayingBarPositionSlider' , elem ) . on ( 'change' , function ( ) {
2014-04-11 08:36:25 -07:00
2015-07-11 17:33:50 -07:00
if ( currentPlayer && lastPlayerState ) {
2014-04-11 08:36:25 -07:00
2015-07-11 17:33:50 -07:00
var newPercent = parseFloat ( this . value ) ;
var newPositionTicks = ( newPercent / 100 ) * lastPlayerState . NowPlayingItem . RunTimeTicks ;
2014-04-22 10:25:54 -07:00
2015-07-11 17:33:50 -07:00
currentPlayer . seek ( Math . floor ( newPositionTicks ) ) ;
}
2015-06-27 12:53:36 -07:00
2015-07-11 17:33:50 -07:00
} ) [ 0 ] ;
2015-06-27 12:53:36 -07:00
2015-07-11 17:33:50 -07:00
positionSlider . _setPinValue = function ( value ) {
2015-06-27 12:53:36 -07:00
2015-07-11 17:33:50 -07:00
var state = lastPlayerState ;
2015-06-27 12:53:36 -07:00
2015-07-11 17:33:50 -07:00
if ( ! state || ! state . NowPlayingItem || ! state . NowPlayingItem . RunTimeTicks ) {
this . pinValue = '--:--' ;
return ;
}
2015-06-27 12:53:36 -07:00
2015-07-11 17:33:50 -07:00
var ticks = state . NowPlayingItem . RunTimeTicks ;
ticks /= 100 ;
ticks *= value ;
2015-06-27 12:53:36 -07:00
2016-05-05 20:09:36 -07:00
this . pinValue = datetime . getDisplayRunningTime ( ticks ) ;
2015-07-11 17:33:50 -07:00
} ;
} , 300 ) ;
2014-04-11 08:36:25 -07:00
}
2016-02-05 19:47:06 -07:00
function showRemoteControl ( tab ) {
if ( tab ) {
2016-03-24 12:45:24 -07:00
Dashboard . navigate ( 'nowplaying.html?tab=' + tab ) ;
2016-02-05 19:47:06 -07:00
} else {
Dashboard . navigate ( 'nowplaying.html' ) ;
}
}
2015-12-14 08:43:03 -07:00
var nowPlayingBarElement ;
2014-04-11 08:36:25 -07:00
function getNowPlayingBar ( ) {
2015-12-14 08:43:03 -07:00
return new Promise ( function ( resolve , reject ) {
2014-04-11 08:36:25 -07:00
2015-12-14 08:43:03 -07:00
if ( nowPlayingBarElement ) {
resolve ( nowPlayingBarElement ) ;
return ;
}
2014-04-11 08:36:25 -07:00
2016-03-16 13:38:01 -07:00
require ( [ 'jQuery' , 'css!css/nowplayingbar.css' , 'paper-slider' ] , function ( $ ) {
2014-04-11 08:36:25 -07:00
2015-12-14 08:43:03 -07:00
nowPlayingBarElement = document . querySelector ( '.nowPlayingBar' ) ;
if ( nowPlayingBarElement ) {
resolve ( nowPlayingBarElement ) ;
return ;
}
nowPlayingBarElement = $ ( getNowPlayingBarHtml ( ) ) . appendTo ( document . body ) [ 0 ] ;
2015-06-27 16:18:09 -07:00
2015-12-14 08:43:03 -07:00
if ( ( browserInfo . safari || ! AppInfo . isNativeApp ) && browserInfo . mobile ) {
// Not handled well here. The wrong elements receive events, bar doesn't update quickly enough, etc.
nowPlayingBarElement . classList . add ( 'noMediaProgress' ) ;
}
2014-04-11 08:36:25 -07:00
2015-12-14 08:43:03 -07:00
bindEvents ( nowPlayingBarElement ) ;
resolve ( nowPlayingBarElement ) ;
} ) ;
} ) ;
2014-04-11 08:36:25 -07:00
}
2015-03-17 21:09:31 -07:00
2014-04-19 10:43:12 -07:00
function showButton ( button ) {
button . removeClass ( 'hide' ) ;
}
2015-03-17 21:09:31 -07:00
2014-04-19 10:43:12 -07:00
function hideButton ( button ) {
button . addClass ( 'hide' ) ;
}
2014-04-11 08:36:25 -07:00
2015-07-08 17:20:01 -07:00
var lastUpdateTime = 0 ;
function updatePlayerState ( event , state ) {
2014-04-11 08:36:25 -07:00
2015-12-14 08:43:03 -07:00
if ( ! state . NowPlayingItem ) {
2014-04-12 10:27:53 -07:00
hideNowPlayingBar ( ) ;
return ;
}
2015-12-14 08:43:03 -07:00
if ( nowPlayingBarElement ) {
updatePlayerStateInternal ( event , state ) ;
return ;
}
getNowPlayingBar ( ) . then ( function ( ) {
updatePlayerStateInternal ( event , state ) ;
} ) ;
}
function updatePlayerStateInternal ( event , state ) {
showNowPlayingBar ( ) ;
2015-07-08 17:20:01 -07:00
if ( event . type == 'positionchange' ) {
// Try to avoid hammering the document with changes
var now = new Date ( ) . getTime ( ) ;
if ( ( now - lastUpdateTime ) < 700 ) {
return ;
}
lastUpdateTime = now ;
}
2014-04-11 08:36:25 -07:00
lastPlayerState = state ;
2014-04-14 20:54:52 -07:00
var playerInfo = MediaController . getPlayerInfo ( ) ;
2014-04-22 10:25:54 -07:00
var playState = state . PlayState || { } ;
2014-04-11 08:36:25 -07:00
2014-04-22 10:25:54 -07:00
if ( playState . IsPaused ) {
2014-04-11 08:36:25 -07:00
2014-04-19 10:43:12 -07:00
hideButton ( pauseButton ) ;
showButton ( unpauseButton ) ;
2014-04-11 08:36:25 -07:00
} else {
2014-04-19 10:43:12 -07:00
showButton ( pauseButton ) ;
hideButton ( unpauseButton ) ;
2014-04-11 08:36:25 -07:00
}
2015-05-21 13:53:14 -07:00
updatePlayerVolumeState ( state , playerInfo ) ;
2014-04-14 20:54:52 -07:00
2014-04-22 10:25:54 -07:00
var nowPlayingItem = state . NowPlayingItem || { } ;
2014-04-18 12:59:06 -07:00
2015-07-11 17:33:50 -07:00
// See bindEvents for why this is necessary
if ( positionSlider ) {
if ( ! positionSlider . dragging ) {
2014-04-11 08:36:25 -07:00
2015-07-11 17:33:50 -07:00
if ( nowPlayingItem . RunTimeTicks ) {
2014-04-11 08:36:25 -07:00
2015-07-11 17:33:50 -07:00
var pct = playState . PositionTicks / nowPlayingItem . RunTimeTicks ;
pct *= 100 ;
2014-04-11 08:36:25 -07:00
2015-07-11 17:33:50 -07:00
positionSlider . value = pct ;
2014-04-11 08:36:25 -07:00
2015-07-11 17:33:50 -07:00
} else {
2014-04-30 08:07:02 -07:00
2015-07-11 17:33:50 -07:00
positionSlider . value = 0 ;
}
positionSlider . disabled = ! playState . CanSeek ;
}
2014-04-11 08:36:25 -07:00
}
2016-05-05 20:09:36 -07:00
var timeText = datetime . getDisplayRunningTime ( playState . PositionTicks ) ;
2014-04-11 08:36:25 -07:00
2014-04-22 10:25:54 -07:00
if ( nowPlayingItem . RunTimeTicks ) {
2014-04-11 08:36:25 -07:00
2016-05-05 20:09:36 -07:00
timeText += " / " + datetime . getDisplayRunningTime ( nowPlayingItem . RunTimeTicks ) ;
2014-04-11 08:36:25 -07:00
}
2016-02-06 14:11:30 -07:00
currentTimeElement . innerHTML = timeText ;
2014-04-12 10:27:53 -07:00
updateNowPlayingInfo ( state ) ;
2014-04-11 08:36:25 -07:00
}
2015-05-21 13:53:14 -07:00
function updatePlayerVolumeState ( state , playerInfo ) {
playerInfo = playerInfo || MediaController . getPlayerInfo ( ) ;
2015-01-03 12:38:22 -07:00
var playState = state . PlayState || { } ;
2015-05-21 13:53:14 -07:00
var supportedCommands = playerInfo . supportedCommands ;
2015-01-03 12:38:22 -07:00
2015-05-21 13:53:14 -07:00
var showMuteButton = true ;
var showUnmuteButton = true ;
var showVolumeSlider = true ;
2015-01-03 12:38:22 -07:00
2015-05-21 13:53:14 -07:00
if ( supportedCommands . indexOf ( 'Mute' ) == - 1 ) {
showMuteButton = false ;
}
if ( supportedCommands . indexOf ( 'Unmute' ) == - 1 ) {
showUnmuteButton = false ;
}
if ( playState . IsMuted ) {
2015-01-03 12:38:22 -07:00
2015-05-21 13:53:14 -07:00
showMuteButton = false ;
2015-01-03 12:38:22 -07:00
} else {
2015-05-21 13:53:14 -07:00
showUnmuteButton = false ;
}
2015-07-26 14:02:23 -07:00
if ( supportedCommands . indexOf ( 'SetRepeatMode' ) == - 1 ) {
toggleRepeatButton . classList . add ( 'hide' ) ;
} else {
toggleRepeatButton . classList . remove ( 'hide' ) ;
}
if ( playState . RepeatMode == 'RepeatAll' ) {
toggleRepeatButton . icon = "repeat" ;
toggleRepeatButton . classList . add ( 'repeatActive' ) ;
}
else if ( playState . RepeatMode == 'RepeatOne' ) {
toggleRepeatButton . icon = "repeat-one" ;
toggleRepeatButton . classList . add ( 'repeatActive' ) ;
} else {
toggleRepeatButton . icon = "repeat" ;
toggleRepeatButton . classList . remove ( 'repeatActive' ) ;
}
2015-05-21 13:53:14 -07:00
if ( supportedCommands . indexOf ( 'SetVolume' ) == - 1 ) {
showVolumeSlider = false ;
}
if ( playerInfo . isLocalPlayer && AppInfo . hasPhysicalVolumeButtons ) {
showMuteButton = false ;
showUnmuteButton = false ;
showVolumeSlider = false ;
}
if ( showMuteButton ) {
2015-01-03 12:38:22 -07:00
showButton ( muteButton ) ;
2015-05-21 13:53:14 -07:00
} else {
hideButton ( muteButton ) ;
}
if ( showUnmuteButton ) {
showButton ( unmuteButton ) ;
} else {
2015-01-03 12:38:22 -07:00
hideButton ( unmuteButton ) ;
}
2015-07-11 17:33:50 -07:00
// See bindEvents for why this is necessary
if ( volumeSlider ) {
2015-12-14 08:43:03 -07:00
if ( showVolumeSlider ) {
volumeSlider . classList . remove ( 'hide' ) ;
} else {
volumeSlider . classList . add ( 'hide' ) ;
}
2015-05-21 13:53:14 -07:00
2015-07-11 17:33:50 -07:00
if ( ! volumeSlider . dragging ) {
volumeSlider . value = playState . VolumeLevel || 0 ;
}
2015-01-03 12:38:22 -07:00
}
}
2014-04-13 10:27:13 -07:00
var currentImgUrl ;
2014-04-11 08:36:25 -07:00
function updateNowPlayingInfo ( state ) {
2015-05-08 20:48:43 -07:00
var nameHtml = MediaController . getNowPlayingNameHtml ( state . NowPlayingItem ) || '' ;
2014-04-11 08:36:25 -07:00
2014-04-13 10:27:13 -07:00
if ( nameHtml . indexOf ( '<br/>' ) != - 1 ) {
2016-02-06 14:11:30 -07:00
nowPlayingTextElement . classList . add ( 'nowPlayingDoubleText' ) ;
2014-04-11 08:36:25 -07:00
} else {
2016-02-06 14:11:30 -07:00
nowPlayingTextElement . classList . remove ( 'nowPlayingDoubleText' ) ;
2014-04-11 08:36:25 -07:00
}
2015-06-26 20:27:38 -07:00
if ( state . NowPlayingItem . Id ) {
nameHtml = '<a style="color:inherit;text-decoration:none;" href="' + LibraryBrowser . getHref ( state . NowPlayingItem ) + '">' + nameHtml + '</a>' ;
}
2016-02-06 14:11:30 -07:00
nowPlayingTextElement . innerHTML = nameHtml ;
2014-04-11 08:36:25 -07:00
var url ;
2015-07-08 17:20:01 -07:00
var imgHeight = 80 ;
2015-03-17 21:09:31 -07:00
2014-04-22 10:25:54 -07:00
var nowPlayingItem = state . NowPlayingItem ;
2014-04-11 08:36:25 -07:00
2014-04-22 10:25:54 -07:00
if ( nowPlayingItem . PrimaryImageTag ) {
2014-04-11 08:36:25 -07:00
2014-05-23 16:58:28 -07:00
url = ApiClient . getScaledImageUrl ( nowPlayingItem . PrimaryImageItemId , {
2014-04-11 08:36:25 -07:00
type : "Primary" ,
2015-05-01 11:37:01 -07:00
height : imgHeight ,
2014-04-22 10:25:54 -07:00
tag : nowPlayingItem . PrimaryImageTag
2014-04-11 08:36:25 -07:00
} ) ;
}
2014-04-22 10:25:54 -07:00
else if ( nowPlayingItem . BackdropImageTag ) {
2014-04-11 08:36:25 -07:00
2014-05-23 16:58:28 -07:00
url = ApiClient . getScaledImageUrl ( nowPlayingItem . BackdropItemId , {
2014-04-11 08:36:25 -07:00
type : "Backdrop" ,
2015-05-01 11:37:01 -07:00
height : imgHeight ,
2014-04-22 10:25:54 -07:00
tag : nowPlayingItem . BackdropImageTag ,
2014-04-11 08:36:25 -07:00
index : 0
} ) ;
2014-04-22 10:25:54 -07:00
} else if ( nowPlayingItem . ThumbImageTag ) {
2014-04-11 08:36:25 -07:00
2014-05-23 16:58:28 -07:00
url = ApiClient . getScaledImageUrl ( nowPlayingItem . ThumbImageItemId , {
2014-04-11 08:36:25 -07:00
type : "Thumb" ,
2015-05-01 11:37:01 -07:00
height : imgHeight ,
2014-04-22 10:25:54 -07:00
tag : nowPlayingItem . ThumbImageTag
2014-04-11 08:36:25 -07:00
} ) ;
}
2014-04-22 10:25:54 -07:00
else if ( nowPlayingItem . Type == "TvChannel" || nowPlayingItem . Type == "Recording" ) {
2014-04-11 08:36:25 -07:00
url = "css/images/items/detail/tv.png" ;
}
2014-04-22 10:25:54 -07:00
else if ( nowPlayingItem . MediaType == "Audio" ) {
2014-04-11 08:36:25 -07:00
url = "css/images/items/detail/audio.png" ;
}
else {
url = "css/images/items/detail/video.png" ;
}
2014-04-13 10:27:13 -07:00
if ( url == currentImgUrl ) {
return ;
}
currentImgUrl = url ;
2015-03-17 21:09:31 -07:00
2016-02-05 10:04:46 -07:00
ImageLoader . lazyImage ( nowPlayingImageElement , url ) ;
2015-06-13 08:52:46 -07:00
if ( nowPlayingItem . Id ) {
2015-12-14 08:43:03 -07:00
ApiClient . getItem ( Dashboard . getCurrentUserId ( ) , nowPlayingItem . Id ) . then ( function ( item ) {
2016-02-06 14:11:30 -07:00
nowPlayingUserData . innerHTML = LibraryBrowser . getUserDataIconsHtml ( item , false ) ;
2015-06-13 08:52:46 -07:00
} ) ;
2015-06-27 16:18:09 -07:00
} else {
2016-02-06 14:11:30 -07:00
nowPlayingUserData . innerHTML = '' ;
2015-06-13 08:52:46 -07:00
}
2014-04-11 08:36:25 -07:00
}
function onPlaybackStart ( e , state ) {
2015-12-23 10:46:01 -07:00
console . log ( 'nowplaying event: ' + e . type ) ;
2014-04-19 10:43:12 -07:00
2014-04-11 08:36:25 -07:00
var player = this ;
2014-04-12 10:27:53 -07:00
player . beginPlayerUpdates ( ) ;
2014-04-11 08:36:25 -07:00
2014-04-12 10:27:53 -07:00
onStateChanged . call ( player , e , state ) ;
2014-04-11 08:36:25 -07:00
}
function showNowPlayingBar ( ) {
2015-12-14 08:43:03 -07:00
getNowPlayingBar ( ) . then ( slideUp ) ;
2014-04-11 08:36:25 -07:00
}
function hideNowPlayingBar ( ) {
// Use a timeout to prevent the bar from hiding and showing quickly
// in the event of a stop->play command
2015-06-13 08:52:46 -07:00
// Don't call getNowPlayingBar here because we don't want to end up creating it just to hide it
2015-06-28 07:45:21 -07:00
var elem = document . getElementsByClassName ( 'nowPlayingBar' ) [ 0 ] ;
if ( elem ) {
2015-12-14 08:43:03 -07:00
slideDown ( elem ) ;
2015-06-28 07:45:21 -07:00
}
2014-04-11 08:36:25 -07:00
}
function onPlaybackStopped ( e , state ) {
2015-12-23 10:46:01 -07:00
console . log ( 'nowplaying event: ' + e . type ) ;
2014-04-12 10:27:53 -07:00
var player = this ;
player . endPlayerUpdates ( ) ;
2014-04-11 08:36:25 -07:00
hideNowPlayingBar ( ) ;
}
2014-04-12 10:27:53 -07:00
function onStateChanged ( e , state ) {
2014-04-11 08:36:25 -07:00
2015-12-23 10:46:01 -07:00
//console.log('nowplaying event: ' + e.type);
2014-04-11 08:36:25 -07:00
var player = this ;
2014-04-22 10:25:54 -07:00
if ( player . isDefaultPlayer && state . NowPlayingItem && state . NowPlayingItem . MediaType == 'Video' ) {
2014-04-11 08:36:25 -07:00
return ;
}
2015-07-08 17:20:01 -07:00
updatePlayerState ( e , state ) ;
2014-04-11 08:36:25 -07:00
}
function releaseCurrentPlayer ( ) {
if ( currentPlayer ) {
2015-12-23 10:46:01 -07:00
Events . off ( currentPlayer , 'playbackstart' , onPlaybackStart ) ;
Events . off ( currentPlayer , 'playbackstop' , onPlaybackStopped ) ;
Events . off ( currentPlayer , 'volumechange' , onVolumeChanged ) ;
Events . off ( currentPlayer , 'playstatechange' , onStateChanged ) ;
Events . off ( currentPlayer , 'positionchange' , onStateChanged ) ;
2015-06-29 11:45:42 -07:00
2014-04-12 10:27:53 -07:00
currentPlayer . endPlayerUpdates ( ) ;
2014-04-11 08:36:25 -07:00
currentPlayer = null ;
2014-04-12 10:27:53 -07:00
hideNowPlayingBar ( ) ;
2014-04-11 08:36:25 -07:00
}
}
2015-01-03 12:38:22 -07:00
function onVolumeChanged ( e ) {
var player = this ;
2015-12-14 08:43:03 -07:00
Promise . all ( [ player . getPlayerState ( ) , getNowPlayingBar ( ) ] ) . then ( function ( responses ) {
var state = responses [ 0 ] ;
2015-03-17 21:09:31 -07:00
2015-01-03 12:38:22 -07:00
if ( player . isDefaultPlayer && state . NowPlayingItem && state . NowPlayingItem . MediaType == 'Video' ) {
return ;
}
updatePlayerVolumeState ( state ) ;
} ) ;
}
2014-04-11 08:36:25 -07:00
function bindToPlayer ( player ) {
releaseCurrentPlayer ( ) ;
currentPlayer = player ;
2015-12-14 08:43:03 -07:00
player . getPlayerState ( ) . then ( function ( state ) {
2014-04-12 10:27:53 -07:00
2014-04-28 20:56:20 -07:00
if ( state . NowPlayingItem ) {
2014-04-12 10:27:53 -07:00
player . beginPlayerUpdates ( ) ;
}
2015-03-17 21:09:31 -07:00
onStateChanged . call ( player , { type : 'init' } , state ) ;
2014-04-12 10:27:53 -07:00
} ) ;
2015-12-23 10:46:01 -07:00
Events . on ( player , 'playbackstart' , onPlaybackStart ) ;
Events . on ( player , 'playbackstop' , onPlaybackStopped ) ;
Events . on ( player , 'volumechange' , onVolumeChanged ) ;
Events . on ( player , 'playstatechange' , onStateChanged ) ;
Events . on ( player , 'positionchange' , onStateChanged ) ;
2014-04-11 08:36:25 -07:00
}
2015-12-14 08:43:03 -07:00
Events . on ( MediaController , 'playerchange' , function ( ) {
2014-04-11 08:36:25 -07:00
bindToPlayer ( MediaController . getCurrentPlayer ( ) ) ;
} ) ;
2015-12-14 08:43:03 -07:00
bindToPlayer ( MediaController . getCurrentPlayer ( ) ) ;
2016-02-05 19:47:06 -07:00
} ) ;