define(["require", "datetime", "itemHelper", "events", "browser", "imageLoader", "layoutManager", "playbackManager", "nowPlayingHelper", "apphost", "dom", "connectionManager", "paper-icon-button-light", "emby-ratingbutton"], function(require, datetime, itemHelper, events, browser, imageLoader, layoutManager, playbackManager, nowPlayingHelper, appHost, dom, connectionManager) { "use strict"; function getNowPlayingBarHtml() { var html = ""; return html += '
" } function onSlideDownComplete() { this.classList.add("hide") } function slideDown(elem) { elem.offsetWidth, elem.classList.add("nowPlayingBar-hidden"), dom.addEventListener(elem, dom.whichTransitionEvent(), onSlideDownComplete, { once: !0 }) } function slideUp(elem) { dom.removeEventListener(elem, dom.whichTransitionEvent(), onSlideDownComplete, { once: !0 }), elem.classList.remove("hide"), elem.offsetWidth, elem.classList.remove("nowPlayingBar-hidden") } function onPlayPauseClick() { playbackManager.playPause(currentPlayer) } function bindEvents(elem) { currentTimeElement = elem.querySelector(".nowPlayingBarCurrentTime"), nowPlayingImageElement = elem.querySelector(".nowPlayingImage"), nowPlayingTextElement = elem.querySelector(".nowPlayingBarText"), nowPlayingUserData = elem.querySelector(".nowPlayingBarUserDataButtons"), muteButton = elem.querySelector(".muteButton"), muteButton.addEventListener("click", function() { currentPlayer && playbackManager.toggleMute(currentPlayer) }), elem.querySelector(".stopButton").addEventListener("click", function() { currentPlayer && playbackManager.stop(currentPlayer) }); var i, length; for (playPauseButtons = elem.querySelectorAll(".playPauseButton"), i = 0, length = playPauseButtons.length; i < length; i++) playPauseButtons[i].addEventListener("click", onPlayPauseClick); elem.querySelector(".nextTrackButton").addEventListener("click", function() { currentPlayer && playbackManager.nextTrack(currentPlayer) }), elem.querySelector(".previousTrackButton").addEventListener("click", function() { currentPlayer && playbackManager.previousTrack(currentPlayer) }), elem.querySelector(".remoteControlButton").addEventListener("click", showRemoteControl), toggleRepeatButton = elem.querySelector(".toggleRepeatButton"), toggleRepeatButton.addEventListener("click", function() { if (currentPlayer) switch (playbackManager.getRepeatMode(currentPlayer)) { case "RepeatAll": playbackManager.setRepeatMode("RepeatOne", currentPlayer); break; case "RepeatOne": playbackManager.setRepeatMode("RepeatNone", currentPlayer); break; default: playbackManager.setRepeatMode("RepeatAll", currentPlayer) } }), toggleRepeatButtonIcon = toggleRepeatButton.querySelector("i"), volumeSlider = elem.querySelector(".nowPlayingBarVolumeSlider"), volumeSliderContainer = elem.querySelector(".nowPlayingBarVolumeSliderContainer"), appHost.supports("physicalvolumecontrol") ? volumeSliderContainer.classList.add("hide") : volumeSliderContainer.classList.remove("hide"), volumeSlider.addEventListener("change", function() { currentPlayer && currentPlayer.setVolume(this.value) }), positionSlider = elem.querySelector(".nowPlayingBarPositionSlider"), positionSlider.addEventListener("change", function() { if (currentPlayer) { var newPercent = parseFloat(this.value); playbackManager.seekPercent(newPercent, currentPlayer) } }), positionSlider.getBubbleText = function(value) { var state = lastPlayerState; if (!state || !state.NowPlayingItem || !currentRuntimeTicks) return "--:--"; var ticks = currentRuntimeTicks; return ticks /= 100, ticks *= value, datetime.getDisplayRunningTime(ticks) }, elem.addEventListener("click", function(e) { dom.parentWithTag(e.target, ["BUTTON", "INPUT", "A"]) || showRemoteControl() }) } function showRemoteControl() { require(["appRouter"], function(appRouter) { appRouter.showNowPlaying() }) } function getNowPlayingBar() { return nowPlayingBarElement ? Promise.resolve(nowPlayingBarElement) : new Promise(function(resolve, reject) { require(["appFooter-shared", "itemShortcuts", "css!./nowplayingbar.css", "emby-slider"], function(appfooter, itemShortcuts) { var parentContainer = appfooter.element; if (nowPlayingBarElement = parentContainer.querySelector(".nowPlayingBar")) return void resolve(nowPlayingBarElement); parentContainer.insertAdjacentHTML("afterbegin", getNowPlayingBarHtml()), nowPlayingBarElement = parentContainer.querySelector(".nowPlayingBar"), browser.safari && browser.slow && nowPlayingBarElement.classList.add("noMediaProgress"), itemShortcuts.on(nowPlayingBarElement), bindEvents(nowPlayingBarElement), resolve(nowPlayingBarElement) }) }) } function showButton(button) { button.classList.remove("hide") } function hideButton(button) { button.classList.add("hide") } function updatePlayPauseState(isPaused) { var i, length; if (playPauseButtons) if (isPaused) for (i = 0, length = playPauseButtons.length; i < length; i++) playPauseButtons[i].querySelector("i").innerHTML = "play_arrow"; else for (i = 0, length = playPauseButtons.length; i < length; i++) playPauseButtons[i].querySelector("i").innerHTML = "pause" } function updatePlayerStateInternal(event, state, player) { showNowPlayingBar(), lastPlayerState = state; var playerInfo = playbackManager.getPlayerInfo(), playState = state.PlayState || {}; updatePlayPauseState(playState.IsPaused); var supportedCommands = playerInfo.supportedCommands; if (currentPlayerSupportedCommands = supportedCommands, -1 === supportedCommands.indexOf("SetRepeatMode") ? toggleRepeatButton.classList.add("hide") : toggleRepeatButton.classList.remove("hide"), updateRepeatModeDisplay(playState.RepeatMode), updatePlayerVolumeState(playState.IsMuted, playState.VolumeLevel), positionSlider && !positionSlider.dragging) { positionSlider.disabled = !playState.CanSeek; var isProgressClear = state.MediaSource && null == state.MediaSource.RunTimeTicks; positionSlider.setIsClear(isProgressClear) } updateTimeDisplay(playState.PositionTicks, (state.NowPlayingItem || {}).RunTimeTicks, playbackManager.getBufferedRanges(player)), updateNowPlayingInfo(state) } function updateRepeatModeDisplay(repeatMode) { "RepeatAll" === repeatMode ? (toggleRepeatButtonIcon.innerHTML = "repeat", toggleRepeatButton.classList.add("repeatButton-active")) : "RepeatOne" === repeatMode ? (toggleRepeatButtonIcon.innerHTML = "repeat_one", toggleRepeatButton.classList.add("repeatButton-active")) : (toggleRepeatButtonIcon.innerHTML = "repeat", toggleRepeatButton.classList.remove("repeatButton-active")) } function updateTimeDisplay(positionTicks, runtimeTicks, bufferedRanges) { if (positionSlider && !positionSlider.dragging) if (runtimeTicks) { var pct = positionTicks / runtimeTicks; pct *= 100, positionSlider.value = pct } else positionSlider.value = 0; if (positionSlider && positionSlider.setBufferedRanges(bufferedRanges, runtimeTicks, positionTicks), currentTimeElement) { var timeText = null == positionTicks ? "--:--" : datetime.getDisplayRunningTime(positionTicks); runtimeTicks && (timeText += " / " + datetime.getDisplayRunningTime(runtimeTicks)), currentTimeElement.innerHTML = timeText } } function updatePlayerVolumeState(isMuted, volumeLevel) { var supportedCommands = currentPlayerSupportedCommands, showMuteButton = !0, showVolumeSlider = !0; - 1 === supportedCommands.indexOf("ToggleMute") && (showMuteButton = !1), muteButton.querySelector("i").innerHTML = isMuted ? "" : "", -1 === supportedCommands.indexOf("SetVolume") && (showVolumeSlider = !1), currentPlayer.isLocalPlayer && appHost.supports("physicalvolumecontrol") && (showMuteButton = !1, showVolumeSlider = !1), showMuteButton ? showButton(muteButton) : hideButton(muteButton), volumeSlider && (showVolumeSlider ? volumeSliderContainer.classList.remove("hide") : volumeSliderContainer.classList.add("hide"), volumeSlider.dragging || (volumeSlider.value = volumeLevel || 0)) } function getTextActionButton(item, text, serverId) { text || (text = itemHelper.getDisplayName(item)); var html = '" } function seriesImageUrl(item, options) { if (!item) throw new Error("item cannot be null!"); if ("Episode" !== item.Type) return null; if (options = options || {}, options.type = options.type || "Primary", "Primary" === options.type && item.SeriesPrimaryImageTag) return options.tag = item.SeriesPrimaryImageTag, connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options); if ("Thumb" === options.type) { if (item.SeriesThumbImageTag) return options.tag = item.SeriesThumbImageTag, connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options); if (item.ParentThumbImageTag) return options.tag = item.ParentThumbImageTag, connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.ParentThumbItemId, options) } return null } function imageUrl(item, options) { if (!item) throw new Error("item cannot be null!"); return options = options || {}, options.type = options.type || "Primary", item.ImageTags && item.ImageTags[options.type] ? (options.tag = item.ImageTags[options.type], connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.PrimaryImageItemId || item.Id, options)) : item.AlbumId && item.AlbumPrimaryImageTag ? (options.tag = item.AlbumPrimaryImageTag, connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.AlbumId, options)) : null } function updateNowPlayingInfo(state) { var nowPlayingItem = state.NowPlayingItem, textLines = nowPlayingItem ? nowPlayingHelper.getNowPlayingNames(nowPlayingItem) : []; textLines.length > 1 && (textLines[1].secondary = !0); var serverId = nowPlayingItem ? nowPlayingItem.ServerId : null; nowPlayingTextElement.innerHTML = textLines.map(function(nowPlayingName) { var cssClass = nowPlayingName.secondary ? ' class="nowPlayingBarSecondaryText"' : ""; return nowPlayingName.item ? "