define([ "exports", "./../modules/loading/loading.js", "./../modules/emby-apiclient/connectionmanager.js", "./../modules/emby-apiclient/apiclient.js", "./../modules/emby-apiclient/events.js", "./../modules/common/globalize.js", "./../modules/common/playback/playbackmanager.js", "./../modules/appheader/appheader.js", "./../modules/backdrop/backdrop.js", "./../modules/common/itemhelper.js", "./../modules/common/dataformatter.js", "./../modules/common/itemmanager/itemmanager.js", "./../modules/layoutmanager.js", "./../modules/common/usersettings/usersettings.js", "./../modules/viewmanager/baseview.js", "./../modules/emby-elements/emby-scroller/emby-scroller.js", "./../modules/emby-elements/emby-tabs/emby-tabs.js", "./../modules/emby-elements/emby-itemscontainer/emby-itemscontainer.js", "./../modules/emby-elements/emby-button/emby-button.js", "./../modules/emby-elements/sync/emby-downloadbutton.js", "./../modules/emby-elements/emby-select/emby-select.js", "./../modules/listview/listview.js", "./../modules/cardbuilder/cardbuilder.js", "./../modules/itemcontextmenu.js", "./../modules/indicators/indicators.js", "./../modules/navdrawer/navdrawer.js", "./../modules/common/textencoding.js", "./../modules/dom.js", "./../modules/approuter.js", "./../modules/common/datetime.js", "./../modules/mediainfo/mediainfo.js", "./../modules/common/servicelocator.js", "./../modules/focusmanager.js", "./../modules/imageloader/imageloader.js", "./../modules/multiselect/multiselect.js", "./../modules/skinmanager.js", "./../modules/common/input/api.js", ], function ( _exports, _loading, _connectionmanager, _apiclient, _events, _globalize, _playbackmanager, _appheader, _backdrop, _itemhelper, _dataformatter, _itemmanager, _layoutmanager, _usersettings, _baseview, _embyScroller, _embyTabs, _embyItemscontainer, _embyButton, _embyDownloadbutton, _embySelect, _listview, _cardbuilder, _itemcontextmenu, _indicators, _navdrawer, _textencoding, _dom, _approuter, _datetime, _mediainfo, _servicelocator, _focusmanager, _imageloader, _multiselect, _skinmanager, _api, ) { Object.defineProperty(_exports, "__esModule", { value: !0 }), (_exports.default = void 0), require(["flexStyles", "css!item/item.css"]); var backdropContainer = document.querySelector(".backdropContainer"), backgroundContainer = document.querySelector(".backgroundContainer"), skinHeader = document.querySelector(".skinHeader"), decodingAttribute = _dom.default.supportsAsyncDecodedImages() ? ' decoding="async"' : ""; function renderTrackSelectionsWithoutUser(page, instance, item, forceReload) { _connectionmanager.default .getApiClient(item.ServerId) .getCurrentUser() .then(function (user) { renderTrackSelections(page, instance, item, user, forceReload); }); } function isMediaStreamDisplayed(stream) { return "Data" !== stream.Type && "Attachment" !== stream.Type; } function renderMediaSources(page, renderAdminFields, item, mediaSources) { for ( var groupedVersions = mediaSources.filter(function (g) { return "Grouping" === g.Type; }), parentElem = (renderAdminFields && groupedVersions.length ? page .querySelector(".splitVersionContainer") .classList.remove("hide") : page .querySelector(".splitVersionContainer") .classList.add("hide"), page.querySelector(".mediaSources")), anyDisplayed = !1, i = ((parentElem.innerHTML = ""), 0), length = mediaSources.length; i < length; i++ ) { var mediaSource = mediaSources[i]; !(function (version, renderAdminFields) { for (var i = 0, length = version.MediaStreams.length; i < length; i++) if (isMediaStreamDisplayed(version.MediaStreams[i])) return 1; return ( version.Container || (version.Formats && version.Formats.length) || (version.Path && "Http" !== version.Protocol && renderAdminFields) || !!version.Size ); })(mediaSource, renderAdminFields) || ((anyDisplayed = !0), (function (parentElem, renderAdminFields, item, mediaSource, scrollX) { var elem = document.createElement("div"), html = (elem.classList.add("mediaSource"), ""), renderAdminFields = ((html += scrollX ? '
' : '
'), mediaSource.Path && "Http" !== mediaSource.Protocol && renderAdminFields && (html += "
" + mediaSource.Path + "
"), (html += '
'), mediaSource.Container && (html += mediaSource.Container.toUpperCase()), mediaSource.Size && (html += '' + _dataformatter.default.sizeToString(mediaSource.Size) + ""), new Date(Date.parse(item.DateCreated))), renderAdminFields = ((html += '' + _globalize.default.translate( "AddedOnValue", _datetime.default.toLocaleDateString(renderAdminFields) + " " + _datetime.default.getDisplayTime(renderAdminFields), ) + ""), (elem.innerHTML = html = (html = html + "
" + "
") && '
' + html + "
"), elem.insertAdjacentHTML( "beforeend", scrollX ? '
' : '
', ), parentElem.appendChild(elem), mediaSource.MediaStreams.filter(isMediaStreamDisplayed).map( function (s) { return _itemhelper.default.normalizeMediaStreamForDisplay( item, mediaSource, s, ); }, )); scrollX ? _cardbuilder.default.buildCards(renderAdminFields, { shape: "backdrop", overlayText: !0, fields: ["MediaStreamInfo"], itemsContainer: elem.querySelector(".itemsContainer"), action: "none", multiSelect: !1, ratingButton: !1, playedButton: !1, defaultIcon: !1, typeIndicator: !1, playedIndicator: !1, syncIndicator: !1, timerIndicator: !1, randomDefaultBackground: !1, imageFallback: !1, cardPadderClass: _layoutmanager.default.tv ? "mediaStreamPadder-tv" : "mediaStreamPadder", innerCardFooterClass: "mediaStreamInnerCardFooter", enableUserData: !1, draggable: !1, enableFocusScaling: !1, }) : _listview.default.buildItems(renderAdminFields, { image: !1, fields: ["MediaStreamInfo"], itemsContainer: elem.querySelector(".itemsContainer"), action: "none", multiSelect: !1, ratingButton: !1, playedButton: !1, defaultIcon: !1, typeIndicator: !1, playedIndicator: !1, syncIndicator: !1, timerIndicator: !1, randomDefaultBackground: !1, imageFallback: !1, innerCardFooterClass: "mediaStreamInnerCardFooter", enableUserDataButtons: !1, draggable: !1, itemClass: "detailsListItem", }); })(parentElem, renderAdminFields, item, mediaSource, !0)); } } function isRenderingTrackSelections(item) { return !( !_itemhelper.default.supportsMediaSourceSelection(item) || -1 === _playbackmanager.default .getSupportedCommands() .indexOf("PlayMediaSource") || !_playbackmanager.default.canPlay(item) ); } function renderTrackSelections( page, instance, item, user, forceReload, mediaSources, ) { var select = page.querySelector(".selectSource"), apiClient = _connectionmanager.default.getApiClient(item); isRenderingTrackSelections(item) ? (mediaSources ? Promise.resolve(mediaSources) : _playbackmanager.default.getPlaybackMediaSources(item) ).then(function (mediaSources) { var renderAdminFields = user.Policy.IsAdministrator, renderAdminFields = (renderMediaSources(page, renderAdminFields, item, mediaSources), (instance._currentPlaybackMediaSources = mediaSources), instance.trackSelectionsContainer.classList.remove("hide"), select.value), selectedId = mediaSources[0].Id; (select.innerHTML = mediaSources .map(function (v) { var selected = v.Id === selectedId ? " selected" : ""; return ( '" ); }) .join("")), 1 < mediaSources.length ? (select.removeAttribute("disabled"), page .querySelector(".selectSourceContainer") .classList.remove("hide")) : (page .querySelector(".selectSourceContainer") .classList.add("hide"), select.setAttribute("disabled", "disabled")), (select.value === renderAdminFields && !forceReload) || (renderMediaInfo(0, page, item, mediaSources), renderVideoSelections(page, mediaSources), renderAudioSelections(page, mediaSources), renderSubtitleSelections(page, mediaSources), updateTrackSelectionsFocusState(instance, page)); }) : (renderMediaInfo(0, page, item, item.MediaSources || []), renderMediaSources( page, user.Policy.IsAdministrator, item, item.MediaSources || [], ), (instance._currentPlaybackMediaSources = []), instance.trackSelectionsContainer.classList.add("hide"), (select.innerHTML = ""), (page.querySelector(".selectVideo").innerHTML = ""), (page.querySelector(".selectAudio").innerHTML = ""), (page.querySelector(".selectSubtitles").innerHTML = ""), select.setAttribute("disabled", "disabled"), updateTrackSelectionsFocusState(instance, page)); } function renderVideoSelections(page, mediaSources) { var mediaSourceId = page.querySelector(".selectSource").value, mediaSources = mediaSources .filter(function (m) { return m.Id === mediaSourceId; })[0] .MediaStreams.filter(function (m) { return "Video" === m.Type; }), select = page.querySelector(".selectVideo"), selectedId = mediaSources.length ? mediaSources[0].Index : -1; (select.innerHTML = mediaSources .map(function (v) { var selected = v.Index === selectedId ? " selected" : "", titleParts = [], resolutionText = _dataformatter.default.getResolutionText(v); return ( resolutionText && titleParts.push(resolutionText), v.Codec && titleParts.push(v.Codec.toUpperCase()), '" ); }) .join("")), select.setAttribute("disabled", "disabled"), mediaSources.length ? page.querySelector(".selectVideoContainer").classList.remove("hide") : page.querySelector(".selectVideoContainer").classList.add("hide"); } function renderAudioSelections(page, mediaSources) { var mediaSourceId = page.querySelector(".selectSource").value, mediaSources = mediaSources.filter(function (m) { return m.Id === mediaSourceId; })[0], tracks = mediaSources.MediaStreams.filter(function (m) { return "Audio" === m.Type; }), select = page.querySelector(".selectAudio"), selectedId = mediaSources.DefaultAudioStreamIndex; (select.innerHTML = tracks .map(function (v) { var selected = v.Index === selectedId ? " selected" : "", embeddedTitle = v.Title && !(v.DisplayTitle || "").includes(v.Title) ? v.Title : null; return ( "" + _textencoding.default.htmlEncode(v.DisplayTitle) + "" ); }) .join("")), 1 < tracks.length ? select.removeAttribute("disabled") : select.setAttribute("disabled", "disabled"), tracks.length ? page.querySelector(".selectAudioContainer").classList.remove("hide") : page.querySelector(".selectAudioContainer").classList.add("hide"); } function renderSubtitleSelections(page, mediaSources) { var selected, mediaSourceId = page.querySelector(".selectSource").value, mediaSources = mediaSources.filter(function (m) { return m.Id === mediaSourceId; })[0], tracks = mediaSources.MediaStreams.filter(function (m) { return "Subtitle" === m.Type; }), select = page.querySelector(".selectSubtitles"), selectedId = null == mediaSources.DefaultSubtitleStreamIndex ? -1 : mediaSources.DefaultSubtitleStreamIndex; tracks.length ? ((selected = -1 === selectedId ? " selected" : ""), (select.innerHTML = '" + tracks .map(function (v) { selected = v.Index === selectedId ? " selected" : ""; var embeddedTitle = v.Title && !(v.DisplayTitle || "").includes(v.Title) ? v.Title : null; return ( "" + _textencoding.default.htmlEncode(v.DisplayTitle) + "" ); }) .join("")), select.classList.remove("noSelections"), page .querySelector(".selectSubtitlesContainer") .classList.remove("hide")) : ((select.innerHTML = ""), select.classList.add("noSelections"), page.querySelector(".selectSubtitlesContainer").classList.add("hide")); } function setButtonText(page, query, html) { for ( var elems = page.querySelectorAll(query), i = 0, length = elems.length; i < length; i++ ) { elems[i].innerHTML = html; var btn = elems[i].closest("button"); btn && ((btn.title = html), btn.setAttribute("aria-label", html)); } } function setResumeProgress(resumeInfoElement, item) { var ticksLeft, resumeInfoElement = resumeInfoElement.querySelector(".resumeProgress"); item.UserData && 0 < item.UserData.PlaybackPositionTicks && item.RunTimeTicks ? ((ticksLeft = item.RunTimeTicks - item.UserData.PlaybackPositionTicks), (ticksLeft = '
' + _globalize.default.translate( "TimeRemainingValue", _datetime.default.getHumanReadableRuntime(ticksLeft), ) + "
"), (resumeInfoElement.innerHTML = _indicators.default.getProgressBarHtml(item, { containerClass: "resumeInfoProgressBar", animated: !0, }) + ticksLeft), resumeInfoElement.classList.remove("hide")) : resumeInfoElement.classList.add("hide"); } function reloadPlayButtons(instance, page, item, isUserDataChangeEvent) { var now, activeElement, isPlayFocused, btnPlay, btnResume, btnPlayTrailer, btnShuffle, playButtons = page.querySelectorAll(".btnPlay"); "Program" === item.Type ? ((now = new Date()) >= new Date(Date.parse(item.StartDate)) && now < new Date(Date.parse(item.EndDate)) ? hideAll(page, playButtons, !0) : hideAll(page, playButtons), hideAll(page, "btnResume"), hideAll(page, "detailResumeInfo"), hideAll(page, "btnShuffle"), hideAll(page, "btnQueue"), setButtonText( page, ".playButtonText", _globalize.default.translate("Play"), )) : _playbackmanager.default.canPlay(item) ? (hideAll(page, "btnPlay", !0), (now = item.IsFolder || -1 !== ["MusicAlbum", "MusicGenre", "MusicArtist"].indexOf(item.Type)), "MusicAlbum" === item.Type && item.SupportsResume && (now = !1), hideAll( page, "btnShuffle", (now = "Season" !== item.Type && "Series" !== item.Type ? now : !1), ), (isPlayFocused = (activeElement = document.activeElement) && activeElement.classList && (activeElement.classList.contains("btnResume") || activeElement.classList.contains("btnMainPlay"))), (btnPlay = page.querySelector(".btnPlay")), (btnResume = page.querySelector(".btnResume")), ((btnPlayTrailer = page.querySelector( ".btnPlayTrailer-main", )).querySelector("i").innerHTML = _itemmanager.default.getDefaultIcon({ Type: "Trailer", MediaType: "Video", })), (btnShuffle = page.querySelector(".btnShuffle")), "Series" === item.Type || ("MusicAlbum" === item.Type && item.SupportsResume) ? (btnResume.classList.add("detailButton-primary"), btnPlay.classList.remove( "detailButton-primary", "detailButton-highres3", ), (function (instance, page) { getNextUpItems .call(instance, { Limit: 1, EnableTotalRecordCount: !1 }) .then(function (result) { var resumeName, result = result.Items[0], resumeInfo = page.querySelector(".detailResumeInfo"); result ? (((resumeName = resumeInfo.querySelector(".resumeName")).innerHTML = _itemmanager.default.getDisplayName(result)), resumeName.classList.remove("hide"), setResumeProgress(resumeInfo, result), result.UserData && 0 < result.UserData.PlaybackPositionTicks ? setButtonText( page, ".resumeButtonText", _globalize.default.translate("Resume"), ) : setButtonText( page, ".resumeButtonText", _globalize.default.translate("Play"), ), resumeInfo.classList.remove("hide")) : (setButtonText( page, ".resumeButtonText", _globalize.default.translate("Play"), ), resumeInfo.classList.add("hide")); }); })(instance, page), setButtonText( page, ".playButtonText", _globalize.default.translate("PlayFromBeginning"), ), btnPlay.classList.remove("detailButton-stacked"), btnShuffle.classList.remove("detailButton-stacked"), isTrailerButtonVisible(item) ? (btnPlayTrailer.classList.add("detailButton-stacked"), btnResume.classList.add("detailButton-stacked")) : (btnPlayTrailer.classList.remove("detailButton-stacked"), btnResume.classList.remove("detailButton-stacked")), hideAll(page, "detailResumeInfo", !0), hideAll(page, "btnResume", !0), hideAll(page, "btnPlay", now)) : ((instance = item.UserData && 0 < item.UserData.PlaybackPositionTicks) ? (btnResume.classList.add( "detailButton-primary", "detailButton-stacked", ), btnPlay.classList.remove( "detailButton-primary", "detailButton-stacked", ), _layoutmanager.default.tv ? btnPlay.classList.remove("detailButton-highres3") : btnPlay.classList.add("detailButton-highres3"), btnPlayTrailer.classList.add("detailButton-stacked"), btnShuffle.classList.remove("detailButton-stacked"), setButtonText( page, ".playButtonText", _globalize.default.translate("PlayFromBeginning"), ), hideAll(page, "detailResumeInfo", !0), hideAll(page, "resumeName"), setResumeProgress( page.querySelector(".detailResumeInfo"), item, )) : (btnPlay.classList.add("detailButton-primary"), btnPlay.classList.remove("detailButton-highres3"), now ? (btnPlayTrailer.classList.remove("detailButton-stacked"), btnResume.classList.remove("detailButton-stacked"), btnShuffle.classList.add("detailButton-stacked"), btnPlay.classList.add("detailButton-stacked")) : (isTrailerButtonVisible(item) ? (btnPlay.classList.add("detailButton-stacked"), btnResume.classList.remove("detailButton-stacked"), btnPlayTrailer.classList.add("detailButton-stacked")) : (btnPlay.classList.remove("detailButton-stacked"), btnResume.classList.remove("detailButton-stacked"), btnPlayTrailer.classList.remove( "detailButton-stacked", )), btnShuffle.classList.remove("detailButton-stacked")), setButtonText( page, ".playButtonText", _globalize.default.translate("Play"), )), hideAll(page, "detailResumeInfo", instance), hideAll(page, "btnResume", instance)), isUserDataChangeEvent || hideAll(page, "btnQueue", _playbackmanager.default.canQueue(item)), isPlayFocused && focusMainSection.call(activeElement.parentNode)) : (hideAll(page, playButtons), hideAll(page, "btnQueue"), hideAll(page, "btnResume"), hideAll(page, "detailResumeInfo"), hideAll(page, "btnShuffle")); } function focusMainSection() { for ( var btns = this.querySelectorAll(".detailButton"), i = 0, length = btns.length; i < length; i++ ) { var btn = btns[i]; if (_focusmanager.default.isCurrentlyFocusable(btn)) try { return void _focusmanager.default.focus(btn); } catch (err) {} } _focusmanager.default.autoFocus(this, { skipIfNotEnabled: !0 }); } function setTitle(item, apiClient, enableLogo) { (enableLogo = "TvChannel" === item.Type ? !1 : enableLogo) ? _appheader.default.setLogoTitle({ items: [item], titleText: "", preferredLogoImageTypes: _skinmanager.default.getPreferredLogoImageTypes(), }) : _appheader.default.setTitle(""); } function getLogoPlacement(item) { return "TvChannel" === item.Type ? null : (("MusicAlbum" !== item.Type && "Audio" !== item.Type && "MusicVideo" !== item.Type) || (item.ImageTags && item.ImageTags.Logo)) && _usersettings.default.getEnableLogoAsTitle( _globalize.default.getCurrentLocale(), ) ? "title" : "float"; } function getArtistLinksHtml(artists, serverId) { for (var html = [], i = 0, length = artists.length; i < length; i++) { var artist = artists[i], href = _approuter.default.getRouteUrl(artist, { itemType: "MusicArtist", serverId: serverId, }); html.push( '' + _textencoding.default.htmlEncode(artist.Name) + "", ); } return (html = html.join(" / ")); } function inferContext(item) { switch (item.Type) { case "Series": case "Season": case "Episode": return "tvshows"; case "Movie": return "movies"; case "Game": case "GameSystem": return "games"; case "MusicArtist": case "MusicAlbum": case "Audio": case "AudioBook": case "MusicVideo": return "music"; case "Program": case "TvChannel": case "Timer": case "SeriesTimer": return "livetv"; default: return null; } } function renderName(instance, item, apiClient, user, containers) { var parentRoute, itemForTitle = ("Timer" === item.Type && item.ProgramInfo) || item, context = inferContext(itemForTitle), parentNameHtml = [], parentNameLast = !1, hasFocusableButton = !1, fontSize = parseFloat( window .getComputedStyle(document.body, null) .getPropertyValue("font-size"), ), fontSize = Math.round(2 * fontSize * 2.4) + Math.round(0.2 * fontSize), apiClient = "title" !== getLogoPlacement(itemForTitle) ? null : (function (item, apiClient, options) { options = options || {}; var logoTypes = _skinmanager.default.getPreferredLogoImageTypes(); return apiClient.getLogoImageUrl(item, options, logoTypes); })(itemForTitle, apiClient, { maxHeight: Math.max(fontSize, 260) }), fontSize = "itemLogoAsTitle", itemNamePrimaryClass = (_layoutmanager.default.tv && (fontSize += " itemLogoAsTitle-tv"), "itemName-primary"), itemPrimaryNameContainerClass = "itemPrimaryNameContainer", html = (itemForTitle.AlbumArtists && itemForTitle.AlbumArtists.length ? (parentNameHtml.push( getArtistLinksHtml( itemForTitle.AlbumArtists, itemForTitle.ServerId, ), ), (parentNameLast = !0)) : itemForTitle.ArtistItems && itemForTitle.ArtistItems.length && "MusicVideo" === itemForTitle.Type ? (parentNameHtml.push( getArtistLinksHtml( itemForTitle.ArtistItems, itemForTitle.ServerId, ), ), (parentNameLast = !0)) : itemForTitle.SeriesName && itemForTitle.SeriesId ? ((parentRoute = _approuter.default.getRouteUrl( { Id: itemForTitle.SeriesId, Name: itemForTitle.SeriesName, Type: "Series", IsFolder: !0, ServerId: itemForTitle.ServerId, }, { context: context }, )), (seriesName = _textencoding.default.htmlEncode( itemForTitle.SeriesName, )), apiClient ? ((itemNamePrimaryClass += " itemName-primary-logo"), _layoutmanager.default.tv && (itemNamePrimaryClass += " itemName-primary-logo-tv"), (itemPrimaryNameContainerClass += " itemPrimaryNameContainer-logo"), _layoutmanager.default.tv ? (tabIndex = ' tabindex="-1"') : (hasFocusableButton = !(tabIndex = "")), parentNameHtml.push( "' + (seriesName = '' +
                      seriesName +
                      '') + "", )) : ((hasFocusableButton = !0), parentNameHtml.push( '' + seriesName + "", ))) : itemForTitle.SeriesName ? parentNameHtml.push( _textencoding.default.htmlEncode(itemForTitle.SeriesName), ) : (itemForTitle.IsSeries || itemForTitle.EpisodeTitle) && parentNameHtml.push( _textencoding.default.htmlEncode(itemForTitle.Name), ), itemForTitle.Album && itemForTitle.AlbumId && ("MusicVideo" === itemForTitle.Type || "Audio" === itemForTitle.Type) ? ((parentRoute = _approuter.default.getRouteUrl( { Id: itemForTitle.AlbumId, Name: itemForTitle.Album, Type: "MusicAlbum", IsFolder: !0, ServerId: itemForTitle.ServerId, }, { context: context }, )), (hasFocusableButton = !0), parentNameHtml.push( '' + _textencoding.default.htmlEncode(itemForTitle.Album) + "", )) : itemForTitle.Album && parentNameHtml.push( _textencoding.default.htmlEncode(itemForTitle.Album), ), ""), tabIndex = ""; _layoutmanager.default.tv || (_itemmanager.default.canEdit(item, user) && ((hasFocusableButton = !0), (tabIndex += '')), _itemmanager.default.canEditImages(item, user) && ((hasFocusableButton = !0), (tabIndex += ''))), enableItemBackdropAsTopImage(itemForTitle) || (itemPrimaryNameContainerClass += " itemPrimaryNameContainer-centered"), parentNameHtml.length && (html = parentNameLast ? '

' + parentNameHtml.join(" - ") + "

" : '

' + parentNameHtml.join(" - ") + "

"); var seriesName = (seriesName = _itemmanager.default.getDisplayName(itemForTitle, { includeParentInfo: !0, })) && _textencoding.default.htmlEncode(seriesName); html && seriesName && !parentNameLast ? (html += '

' + seriesName + "

" + tabIndex + "
") : (html = (parentNameLast || (apiClient && ((seriesName = '' +
                seriesName +
                ''), (itemNamePrimaryClass += " itemName-primary-logo"), (itemPrimaryNameContainerClass += " itemPrimaryNameContainer-logo"), _layoutmanager.default.tv) && (itemNamePrimaryClass += " itemName-primary-logo-tv")), '

' + seriesName + "

" + tabIndex + "
" + html)); for (var i = 0, length = containers.length; i < length; i++) { var container = containers[i], btnEditMetadata = (enableItemBackdropAsTopImage(itemForTitle) ? container.classList.remove("nameContainer-centered") : container.classList.add("nameContainer-centered"), (container.innerHTML = html), setScopedFocus(null, container, hasFocusableButton, "nearest"), html.length ? container.classList.remove("hide") : container.classList.add("hide"), container.querySelector(".btnEditMetadata")), btnEditMetadata = (btnEditMetadata && btnEditMetadata.addEventListener( "click", onEditMetadataClick.bind(instance), ), container.querySelector(".btnEditImages")); btnEditMetadata && btnEditMetadata.addEventListener( "click", onEditImagesClick.bind(instance), ); } } function isTrailerButtonVisible(item) { if ( _playbackmanager.default.getSupportedCommands().includes("PlayTrailers") ) { if (item.LocalTrailerCount) return 1; if (item.RemoteTrailers && item.RemoteTrailers.length) return 1; } } function setTrailerButtonVisibility(page, item) { isTrailerButtonVisible(item) ? hideAll(page, "btnPlayTrailer", !0) : hideAll(page, "btnPlayTrailer"); } function enableTrackList(item) { return ( !!_layoutmanager.default.tv && ("Playlist" === item.Type || ("MusicAlbum" === item.Type && !item.SupportsResume)) ); } function enableItemBackdropAsTopImage(item) { return ( "Playlist" !== item.Type && "MusicAlbum" !== item.Type && "TvChannel" !== item.Type && "Audio" !== item.Type ); } function hideAll(page, className, show) { for ( var elems = "string" == typeof className ? page.querySelectorAll("." + className) : className, i = 0, length = elems.length; i < length; i++ ) show ? elems[i].classList.remove("hide") : elems[i].classList.add("hide"); } function getCommandOptions(view, item, user, button) { (view = view.querySelector(".selectSource")), (item = { items: [item], open: !1, play: !1, playFromBeginning: !0, playAllFromHere: !1, positionTo: button, cancelTimer: !1, record: !1, deleteItem: !0, shuffle: !0, instantMix: !0, user: user, share: !0, mediaSourceId: (view && view.value) || null, positionY: "center", positionX: "right", transformOrigin: "left top", played: !1, favorites: !1, navigateOnDelete: "back", showSeries: !!_layoutmanager.default.tv, showSeason: !0, }); return ( _servicelocator.appHost.supports("sync") && (item.syncLocal = !1), item ); } function renderMediaInfo(instance, view, item, mediaSources) { var hasFocusElements, mediaSourceId = view.querySelector(".selectSource").value, mediaSources = mediaSources.filter(function (m) { return m.Id === mediaSourceId; })[0], mediaInfoElem = view.querySelector(".mediaInfoPrimary"); "Season" === item.Type || "SeriesTimer" === item.Type ? (mediaInfoElem.classList.add("hide"), mediaInfoElem.classList.remove("focuscontainer-x")) : (_mediainfo.default.fillPrimaryMediaInfo(mediaInfoElem, item, { interactive: !0, episodeTitle: !1, subtitles: !1, dateAdded: !1, genres: !0, context: inferContext(item), endsAt: !0, endsAtClass: "detailEndsAt", bitrate: "Audio" === item.MediaType, runtime: "Timer" !== item.Type, mediaSource: mediaSources, }), (hasFocusElements = null != mediaInfoElem.querySelector("a,button")), setScopedFocus(null, mediaInfoElem, hasFocusElements, "nearest"), hasFocusElements ? mediaInfoElem.classList.add("focuscontainer-x") : mediaInfoElem.classList.remove("focuscontainer-x")), enableItemBackdropAsTopImage(item) ? mediaInfoElem.classList.remove("mediaInfo-centered", "secondaryText") : mediaInfoElem.classList.add("mediaInfo-centered", "secondaryText"), (mediaInfoElem = view.querySelector(".mediaInfoSecondary")), _mediainfo.default.fillSecondaryMediaInfo(mediaInfoElem, item, { interactive: !0, mediaSource: mediaSources, }), (hasFocusElements = null != mediaInfoElem.querySelector("a,button")), setScopedFocus(null, mediaInfoElem, hasFocusElements, "nearest"), hasFocusElements ? mediaInfoElem.classList.add("focuscontainer-x") : mediaInfoElem.classList.remove("focuscontainer-x"), mediaInfoElem.innerHTML.trim() ? mediaInfoElem.classList.remove("hide") : mediaInfoElem.classList.add("hide"); } function renderDetails(instance, view, item, apiClient, user) { var promises = [], overviewElem = view.querySelector(".overview-container"), overviewTextElem = overviewElem.querySelector(".overview-text"), itemForDetails = (enableTrackList(item) ? overviewTextElem.classList.add("overview-text-tracklist") : overviewTextElem.classList.remove("overview-text-tracklist"), ("Timer" === item.Type && item.ProgramInfo) || item), overview = itemForDetails.Overview; overview ? ((function (elem, overview) { var scrollHeight, textButton, textElement = elem.querySelector(".overview-text"), btnReadMore = elem.querySelector(".btnReadMore"); (btnReadMore.innerHTML = _globalize.default.translate("More")), overview ? ((textElement.innerHTML = overview), elem.classList.remove("hide"), (overview = textElement.offsetHeight), (scrollHeight = textElement.scrollHeight), (textButton = textElement.closest("button")), overview && scrollHeight && overview < scrollHeight ? (_layoutmanager.default.tv ? (textButton.removeAttribute("disabled"), btnReadMore.classList.add("hide")) : (textButton.setAttribute("disabled", "disabled"), btnReadMore.classList.remove("hide")), setScopedFocus(null, elem, !0)) : (textButton.setAttribute("disabled", "disabled"), btnReadMore.classList.add("hide"), setScopedFocus(null, elem, !1))) : (elem.classList.add("hide"), (textElement.innerHTML = "")); })(overviewElem, overview ? _dom.default.stripScripts(overview) : ""), "MusicAlbum" === itemForDetails.Type || "Playlist" === itemForDetails.Type ? overviewTextElem.classList.add("overview-twoline") : overviewTextElem.classList.remove("overview-twoline")) : overviewElem.classList.add("hide"), (function (view, item) { var directors = (item.People || []).filter(function (p) { return "Director" === p.Type; }), html = directors .map(function (p) { return _layoutmanager.default.tv ? "" + _textencoding.default.htmlEncode(p.Name) + "" : '' + _textencoding.default.htmlEncode(p.Name) + ""; }) .join(", "), elem = view.querySelector(".directors"); (elem.innerHTML = 1 < directors.length ? _globalize.default.translate("DirectorsValue", html) : _globalize.default.translate("DirectorValue", html)), setScopedFocus( view, elem, directors.length && !_layoutmanager.default.tv, "nearest", ), directors.length ? elem.classList.remove("hide") : elem.classList.add("hide"); })(view, itemForDetails), reloadPlayButtons(instance, view, item), (function (page, item) { for ( var btnPlaystates = page.querySelectorAll(".btnPlaystate"), i = 0, length = btnPlaystates.length; i < length; i++ ) { var btnPlaystate = btnPlaystates[i]; _itemmanager.default.canMarkPlayed(item) ? (btnPlaystate.classList.remove("hide"), btnPlaystate.setItem(item)) : (btnPlaystate.classList.add("hide"), btnPlaystate.setItem(null)); } var btnUserRatings = page.querySelectorAll(".btnUserRating"); for (i = 0, length = btnUserRatings.length; i < length; i++) { var btnUserRating = btnUserRatings[i]; _itemmanager.default.canRate(item) ? (btnUserRating.classList.remove("hide"), btnUserRating.setItem(item)) : (btnUserRating.classList.add("hide"), btnUserRating.setItem(null)); } })(view, item), setTrailerButtonVisibility(view, item), "TvChannel" === item.Type ? hideAll(view, "btnManualRecording", !0) : hideAll(view, "btnManualRecording"), item.CanDelete && !item.IsFolder && "MusicArtist" !== item.Type ? hideAll(view, "btnDeleteItem", !0) : hideAll(view, "btnDeleteItem"), promises.push( (function (instance, page, item, user) { if (instance.currentRecordingFields) return ( instance.currentRecordingFields.refresh(item), Promise.resolve() ); return "Program" === item.Type && user.Policy.EnableLiveTvManagement ? require(["recordingFields"]).then(function (responses) { var responses = responses[0], recordingFieldsElement = page.querySelector(".mainDetailButtons"); (instance.currentRecordingFields = new responses({ parent: recordingFieldsElement, program: item, })), _events.default.on( instance.currentRecordingFields, "recordingchanged", onRecordingChanged.bind(instance), ), _events.default.on( instance.currentRecordingFields, "seriesrecordingchanged", onRecordingChanged.bind(instance), ); }) : Promise.resolve(); })(instance, view, item, user), ); _itemmanager.default.getCommands(getCommandOptions(view, item, user)).length ? hideAll(view, "btnMoreCommands", !0) : hideAll(view, "btnMoreCommands"), "Playlist" === item.Type || ("BoxSet" === item.Type && apiClient.isMinServerVersion("4.8.0.16")) ? hideAll(view, "btnSortItems", !0) : hideAll(view, "btnSortItems"), enableItemBackdropAsTopImage(itemForDetails) ? view .querySelector(".detailTextContainerInner") .classList.remove("detailTextContainerInner-centered") : view .querySelector(".detailTextContainerInner") .classList.add("detailTextContainerInner-centered"), enableTvDetailImageLayout(item) ? view .querySelector(".detailTextContainer") .classList.add("detailTextContainer-extrapadding") : view .querySelector(".detailTextContainer") .classList.remove("detailTextContainer-extrapadding"); overview = view.querySelector(".tagline"); return ( itemForDetails.Taglines && itemForDetails.Taglines.length ? (overview.classList.remove("hide"), (overview.innerHTML = _dom.default.stripScripts( itemForDetails.Taglines[0], ))) : overview.classList.add("hide"), "Person" === itemForDetails.Type && ((overviewTextElem = view.querySelector(".birthDate")), itemForDetails.PremiereDate ? ((overviewElem = _datetime.default.toLocaleDateString( new Date(Date.parse(itemForDetails.PremiereDate)), { year: "numeric", month: "long", day: "numeric" }, )), (overviewElem = itemForDetails.ProductionLocations && itemForDetails.ProductionLocations.length ? _globalize.default.translate( "BornValueWithPlace", overviewElem, itemForDetails.ProductionLocations[0], ) : _globalize.default.translate("BornValue", overviewElem)), (overviewTextElem.innerHTML = overviewElem), overviewTextElem.classList.remove("hide")) : overviewTextElem.classList.add("hide"), (instance = view.querySelector(".deathDate")), itemForDetails.EndDate ? ((user = _datetime.default.toLocaleDateString( new Date(Date.parse(itemForDetails.EndDate)), { year: "numeric", month: "long", day: "numeric" }, )), (user = _globalize.default.translate("DiedValue", user)), (instance.innerHTML = user), instance.classList.remove("hide")) : instance.classList.add("hide")), (function (page, item) { for ( var itemTags = page.querySelector(".itemTags"), tagElements = [], tags = item.TagItems || [], i = 0, length = tags.length; i < length; i++ ) { var href = _approuter.default.getRouteUrl( { Name: tags[i].Name, Type: "Tag", ServerId: item.ServerId, Id: tags[i].Id, }, { itemTypes: "Person" === item.Type || "MusicArtist" === item.Type ? item.Type : null, }, ); tagElements.push( '' + _textencoding.default.htmlEncode(tags[i].Name) + "", ); } (itemTags.innerHTML = tagElements.join("")), tagElements.length ? page.querySelector(".tagsSection").classList.remove("hide") : page.querySelector(".tagsSection").classList.add("hide"); })(view, item), Promise.all(promises) ); } function onRecordingChanged() { reloadItem(this, !0); } function renderPeopleItems(view, item, apiClient) { view = view.querySelector(".peopleItems"); if ("Person" !== item.Type && "MusicArtist" !== item.Type) view.classList.add("hide"); else { view.classList.remove("hide"); for ( var sections = [], sectionElems = ("Person" === item.Type ? (sections.push({ name: _globalize.default.translate("HeaderUpcomingOnTV"), type: "Program", }), sections.push({ name: _globalize.default.translate("Movies"), type: "Movie", }), sections.push({ name: _globalize.default.translate("Shows"), type: "Series", }), sections.push({ name: _globalize.default.translate("Episodes"), type: "Episode", }), sections.push({ name: _globalize.default.translate("Trailers"), type: "Trailer", }), sections.push({ name: _globalize.default.translate("HeaderMusicVideos"), type: "MusicVideo", }), sections.push({ name: _globalize.default.translate("Videos"), type: "Video", })) : "MusicArtist" === item.Type && sections.push({ name: _globalize.default.translate("HeaderMusicVideos"), type: "MusicVideo", }), (view.innerHTML = sections .map(function (section) { var html = ""; return ( (html += '
') + '" + '
' + '
' + "
" + "
" + "
" ); }) .join("")), view.querySelectorAll(".personSection")), i = 0, length = sectionElems.length; i < length; i++ ) !(function (item, element, type, apiClient) { switch (type) { case "Program": loadPeopleItems( element, item, 0, { IncludeItemTypes: "Program", Limit: 12, SortBy: "StartDate", Fields: "PrimaryImageAspectRatio", }, { shape: "autooverflow", fields: ["Name", "ChannelName", "AirTime"], centerText: !0, preferThumb: !0, overlayText: !1, showAirDateTime: !0, }, apiClient, ); break; case "Movie": loadPeopleItems( element, item, 0, { IncludeItemTypes: "Movie", Limit: 12, SortBy: "SortName", Fields: "PrimaryImageAspectRatio", }, { shape: "autooverflow", fields: ["Name", "ProductionYear"], centerText: !0, overlayText: !1, }, apiClient, ); break; case "Video": loadPeopleItems( element, item, 0, { IncludeItemTypes: "Video", Limit: 12, SortBy: "SortName", Fields: "PrimaryImageAspectRatio", }, { shape: "autooverflow", fields: ["Name", "ProductionYear"], centerText: !0, overlayText: !1, }, apiClient, ); break; case "MusicVideo": loadPeopleItems( element, item, 0, { IncludeItemTypes: "MusicVideo", Limit: 12, SortBy: "SortName", Fields: "PrimaryImageAspectRatio", }, { shape: "autooverflow", fields: ["Name", "ProductionYear"], centerText: !0, overlayPlayButton: !0, }, apiClient, ); break; case "Game": loadPeopleItems( element, item, 0, { IncludeItemTypes: "Game", Limit: 12, SortBy: "SortName", Fields: "PrimaryImageAspectRatio", }, { shape: "autooverflow", fields: ["Name"], centerText: !0 }, apiClient, ); break; case "Trailer": loadPeopleItems( element, item, 0, { IncludeItemTypes: "Trailer", Limit: 12, SortBy: "SortName", Fields: "PrimaryImageAspectRatio", }, { shape: "autooverflow", fields: ["Name"], centerText: !0, overlayPlayButton: !0, }, apiClient, ); break; case "Series": loadPeopleItems( element, item, 0, { IncludeItemTypes: "Series", Limit: 12, SortBy: "SortName", Fields: "PrimaryImageAspectRatio", }, { shape: "autooverflow", fields: ["Name"], centerText: !0 }, apiClient, ); break; case "MusicAlbum": loadPeopleItems( element, item, 0, { IncludeItemTypes: "MusicAlbum", Limit: 12, SortBy: "ProductionYear,SortName", SortOrder: "Descending,Ascending", Fields: "ProductionYear,PrimaryImageAspectRatio", }, { shape: "autooverflow", playFromHere: !0, fields: ["Name", "ProductionYear"], centerText: !0, overlayPlayButton: !0, }, apiClient, ); break; case "MusicArtist": loadPeopleItems( element, item, 0, { IncludeItemTypes: "MusicArtist", Limit: 8, SortBy: "SortName", Fields: "PrimaryImageAspectRatio", }, { shape: "autooverflow", playFromHere: !0, fields: ["Name"], centerText: !0, overlayPlayButton: !0, }, apiClient, ); break; case "Episode": loadPeopleItems( element, item, 0, { IncludeItemTypes: "Episode", Limit: 6, SortBy: "SeriesSortName,ParentIndexNumber,IndexNumber,SortName", Fields: "PrimaryImageAspectRatio", }, { shape: "autooverflow", fields: ["ParentName", "Name"], centerText: !0, overlayPlayButton: !0, }, apiClient, ); break; case "Audio": loadPeopleItems( element, item, 0, { IncludeItemTypes: "Audio", SortBy: "AlbumArtist,Album,SortName", Fields: "PrimaryImageAspectRatio", }, { playFromHere: !0, fields: ["Name", "ParentName"], action: "playallfromhere", smallIcon: !0, }, apiClient, ); } })( item, sectionElems[i], sectionElems[i].getAttribute("data-type"), apiClient, ); } } function loadPeopleItems(element, item, type, query, listOptions, apiClient) { (query.SortOrder = "Ascending"), (query.Recursive = !0), (query.CollapseBoxSetItems = !1), (query.Fields = "PrimaryImageAspectRatio,ProductionYear"), "Person" === item.Type ? (query.PersonIds = item.Id) : "MusicArtist" === item.Type && (query.ArtistIds = item.Id), (query.ImageTypeLimit = 1), (query.EnableTotalRecordCount = !1), apiClient .getItems(apiClient.getCurrentUserId(), query) .then(function (result) { _cardbuilder.default.buildCards(result.Items, { parentContainer: element, itemsContainer: element.querySelector(".itemsContainer"), shape: listOptions.shape, fields: listOptions.fields, overlayText: !1, centerText: !0, }); }); } function onTrackSelectionsSubmit(e) { return e.preventDefault(), !1; } function bindAll(view, selector, eventName, fn) { for ( var elems = view.querySelectorAll(selector), i = 0, length = elems.length; i < length; i++ ) elems[i].addEventListener(eventName, fn); } function executeCommandWithCommandProcessor(command, item, options) { require(["commandProcessor"]).then(function (responses) { return responses[0].executeCommand(command, [item], options); }); } function onDataFetched(responses) { var itemInfo = responses[0], item = itemInfo.item, itemInfo = itemInfo.mediaSources, user = responses[1], responses = _connectionmanager.default.getApiClient(item.ServerId), view = this.view, itemMainScrollSlider = (("Person" === item.Type && _backdrop.default.hasBackdrop()) || _backdrop.default.setBackdrops([item], { enableAnimation: !0, enablePrimaryImageBeforeInherited: enableTvDetailImageLayout(item) && "Season" !== item.Type && "Episode" !== item.Type, allowPrimaryImage: enableTvDetailImageLayout(item), }), this.updateDrawerState(), view.querySelector(".itemMainScrollSlider")), detailMainContainerParent = view.querySelector( ".detailMainContainerParent", ), itemMainScrollSlider = (_backdrop.default.hasBackdrop() ? (_layoutmanager.default.tv ? view.classList.add( "darkContentContainer-tv", "darkContentContainer-item", ) : view.classList.add("darkContentContainer-item"), enableTvDetailImageLayout(item) ? (itemMainScrollSlider.classList.add( "itemMainScrollSlider-fade", ), detailMainContainerParent.classList.add( "detailMainContainerParent-fade", ), backgroundContainer.classList.add( "itemBackgroundContainer-brighter", )) : (itemMainScrollSlider.classList.remove( "itemMainScrollSlider-fade", ), detailMainContainerParent.classList.remove( "detailMainContainerParent-fade", ), backgroundContainer.classList.remove( "itemBackgroundContainer-brighter", )), enableItemBackdropAsTopImage(item) ? (backdropContainer.classList.add( "backdropContainer-preventbackdrop", ), backgroundContainer.classList.add( "itemBackgroundContainer", "itemBackgroundContainer-preventbackdrop", )) : (backdropContainer.classList.remove( "backdropContainer-preventbackdrop", ), backgroundContainer.classList.add("itemBackgroundContainer"), backgroundContainer.classList.remove( "itemBackgroundContainer-preventbackdrop", ))) : (view.classList.remove( "darkContentContainer-item", "darkContentContainer-tv", ), itemMainScrollSlider.classList.remove("itemMainScrollSlider-fade"), detailMainContainerParent.classList.remove( "detailMainContainerParent-fade", ), backgroundContainer.classList.remove( "itemBackgroundContainer-brighter", "itemBackgroundContainer", "itemBackgroundContainer-preventbackdrop", ), backdropContainer.classList.remove( "backdropContainer-preventbackdrop", )), (this.currentItem = item), []), detailMainContainerParent = (this.sectionsInitialized || ((this.sectionsInitialized = !0), (function (instance, view, item) { var section; "Episode" === item.Type && ((view = view.querySelector(".moreFromSeasonItemsContainer")), ((section = view.closest(".verticalSection")).querySelector( "h2", ).innerHTML = _globalize.default.translate( "MoreFromValue", item.SeasonName, )), (view.fetchData = function (query) { var apiClient, item = this.currentItem; return item.SeasonId && item.SeriesId ? ((apiClient = _connectionmanager.default.getApiClient(item)), (query = Object.assign( { SeasonId: item.SeasonId, UserId: apiClient.getCurrentUserId(), Fields: this.getRequestedItemFields() + ",PrimaryImageAspectRatio", }, query, )), apiClient .getEpisodes(item.SeriesId, query) .then(function (result) { return !query.StartIndex && result.Items.length < 2 ? Promise.resolve({ TotalRecordCount: 0, Items: [] }) : result; })) : Promise.resolve({ TotalRecordCount: 0, Items: [] }); }.bind(instance)), (view.parentContainer = section), (view.getListOptions = getMoreFromSeasonListOptions), (view.afterRefresh = function (totalResult) { if (totalResult.Items.length) { var item = this.currentItem; if (item) { var view = this.view; if (view) { var itemsContainer = view.querySelector( ".moreFromSeasonItemsContainer", ); if (itemsContainer) { var query, index = itemsContainer.indexOfItemId(item.Id); if (-1 === index) return ( (view = _connectionmanager.default.getApiClient(item)), (query = { SeasonId: item.SeasonId, UserId: view.getCurrentUserId(), Fields: this.getRequestedItemFields() + ",PrimaryImageAspectRatio", Limit: 0, StartItemId: item.Id, }), view .getEpisodes(item.SeriesId, query) .then(function (result) { (index = Math.max( totalResult.TotalRecordCount - result.TotalRecordCount, 0, )), itemsContainer.scrollToIndex( Math.min( index + 1, totalResult.TotalRecordCount - 1, ), { behavior: "instant", offset: "-padding-inline-start", }, !1, ); }) ); itemsContainer.scrollToIndex( Math.min(index + 1, totalResult.TotalRecordCount - 1), { behavior: "instant", offset: "-padding-inline-start", }, !1, ); } } } } }.bind(instance)), view.classList.add("generalItemsContainer")); })(this, view, item), (function (instance, view, item) { var section; ("MusicArtist" !== item.Type && "MusicAlbum" !== item.Type) || ((view = view.querySelector(".moreFromArtistItemsContainer")), (section = view.closest(".verticalSection")), "MusicArtist" === item.Type ? (section.querySelector(".sectionTitle").innerHTML = _globalize.default.translate("HeaderAppearsOn")) : (section.querySelector(".sectionTitle").innerHTML = _globalize.default.translate( "MoreFromValue", _textencoding.default.htmlEncode( item.AlbumArtists[0].Name, ), )), (view.fetchData = function (query) { var item = this.currentItem; if ( "MusicAlbum" === item.Type && !item.AlbumArtists && !item.AlbumArtists.length ) return Promise.resolve({ TotalRecordCount: 0, Items: [] }); query = Object.assign( { IncludeItemTypes: "MusicAlbum", Recursive: !0, SortBy: "ProductionYear,SortName", SortOrder: "Descending", Fields: this.getRequestedItemFields() + ",PrimaryImageAspectRatio,ProductionYear", }, query, ); var apiClient = _connectionmanager.default.getApiClient(item); "MusicArtist" === item.Type ? (query.ContributingArtistIds = item.Id) : ((query.AlbumArtistIds = item.AlbumArtists[0].Id), (query.ExcludeItemIds = item.Id)); return apiClient.getItems(apiClient.getCurrentUserId(), query); }.bind(instance)), (view.parentContainer = section), (view.getListOptions = getMoreFromArtistListOptions), view.classList.add("generalItemsContainer")); })(this, view, item), itemMainScrollSlider.push( (function (instance, item) { var section = instance.view.querySelector(".seriesItemsSection"); return "Series" === item.Type ? getSeasons .call(instance, { EnableUserData: !1, EnableTotalRecordCount: !1, EnableImages: !1, }) .then(function (result) { instance.seasonItems = result.Items; item.Type; setScopedFocus( instance.view, section.querySelector(".focusable"), !0, "nearest", ); var itemsContainer = section.querySelector(".itemsContainer"), seriesDisplay = ((itemsContainer.parentContainer = section), _usersettings.default.seriesDisplay()), hasMultipleSeasons = (_apiclient.default.isLocalItem(item) && (seriesDisplay = ""), 2 <= result.Items.length), seriesDisplay = (instance.renderAllEpisodes = "episodes" === seriesDisplay || ("episodessingleseason" === seriesDisplay && !hasMultipleSeasons)), renderSeasonsWithTabs = seriesDisplay && hasMultipleSeasons && _layoutmanager.default.tv, sectionTitleElement = section.querySelector(".sectionTitle"), sectionTitleElement = ((sectionTitleElement.innerHTML = seriesDisplay ? 1 === result.Items.length ? result.Items[0].Name : _globalize.default.translate("Episodes") : _globalize.default.translate("Seasons")), seriesDisplay && hasMultipleSeasons ? sectionTitleElement.classList.add("hide") : sectionTitleElement.classList.remove("hide"), section.querySelector(".detailSelectSeason")), detailSelectSeasonContainer = section.querySelector( ".detailSelectSeasonContainer", ), hasMultipleSeasons = (seriesDisplay && hasMultipleSeasons && !renderSeasonsWithTabs ? detailSelectSeasonContainer.classList.remove( "hide", ) : detailSelectSeasonContainer.classList.add("hide"), section.querySelector(".seasonTabs")); seriesDisplay ? (itemsContainer.classList.add( "allEpisodesItemsContainer", ), renderSeasonsWithTabs ? ((function (seasonTabsParent, items) { var index; items.length ? ((index = 0), (items = '
' + items .map(function (item) { var tabClass = "emby-button emby-tab-button secondaryText detailSeasonTab", tabClass = (_layoutmanager.default.tv && (tabClass += " emby-button-tv"), '"); return index++, tabClass; }) .join("") + "
"), (seasonTabsParent.innerHTML = items), seasonTabsParent.classList.remove("hide")) : (seasonTabsParent.classList.add("hide"), (seasonTabsParent.innerHTML = "")); })(hasMultipleSeasons, result.Items), (instance.seasonTabs = section.querySelector( ".seasonTabs-emby-tabs", )), instance.seasonTabs.addEventListener( "tabchange", function (e) { var id, seasonTabs = this.seasonTabs; seasonTabs && ((e = e.detail.selectedTabIndex), (seasonTabs = seasonTabs.querySelector( '.detailSeasonTab[data-index="' + e + '"]', ))) && ((id = seasonTabs.getAttribute("data-id")), (e = (this.seasonItems || []).filter( function (s) { return s.Id === id; }, )[0])) && scrollEpisodesToSeason(this, e.Id); }.bind(instance), )) : (hasMultipleSeasons.classList.add("hide"), (hasMultipleSeasons.innerHTML = ""), (instance.seasonTabs = null))) : ((hasMultipleSeasons.innerHTML = ""), hasMultipleSeasons.classList.add("hide"), (instance.seasonTabs = null)), (instance.detailSelectSeason = sectionTitleElement) && ((sectionTitleElement.getItems = getSeasons.bind(instance)), sectionTitleElement.addEventListener( "change", function (e) { e = e.target.value; e && scrollEpisodesToSeason(this, e); }.bind(instance), )), (itemsContainer.fetchData = function (query) { var item = this.currentItem, apiClient = _connectionmanager.default.getApiClient(item), fields = this.getRequestedItemFields() + ",PrimaryImageAspectRatio"; if (this.renderAllEpisodes) return ( (fields += ",Overview,PremiereDate,ProductionYear,RunTimeTicks,SpecialEpisodeNumbers"), (query = Object.assign( { UserId: apiClient.getCurrentUserId(), Fields: fields, Recursive: !0, IsFolder: !1, ParentId: item.Id, }, query, )), apiClient.isMinServerVersion("4.8") || (query.IncludeItemTypes = "Episode"), apiClient.getItems( apiClient.getCurrentUserId(), query, ) ); return apiClient.getSeasons( item.Id, Object.assign( { UserId: apiClient.getCurrentUserId(), Fields: fields, }, query, ), ); }.bind(instance)), (itemsContainer.getListOptions = function (items) { var fields = ["Name"], centerText = !0; this.renderAllEpisodes && (fields.push("Overview"), fields.push("MediaInfo"), (centerText = !1)); return { renderer: _cardbuilder.default, options: { shape: "auto", scalable: !0, centerText: centerText, fields: fields, overlayText: !1, focusTransformTitleAdjust: !0, }, virtualScrollLayout: "horizontal-grid", }; }.bind(instance)), seriesDisplay && ((itemsContainer.afterRefresh = function ( totalResult, ) { if (totalResult.Items.length) { var item = this.currentItem; if (item) { var view = this.view; if (view) { var apiClient, instance = this, itemsContainer = view.querySelector( ".childrenItemsContainer", ); if (itemsContainer) return ( (apiClient = _connectionmanager.default.getApiClient( item, )), getNextUpItems .call(this, { Limit: 1 }) .then(function (nextUpResult) { var nextUpResult = nextUpResult.Items[0], detailSelectSeason = view.querySelector( ".detailSelectSeason", ); if (nextUpResult) { onSeriesEpisodeFocusedOrScrolled( instance, nextUpResult, ); var select, index = itemsContainer.indexOfItemId( nextUpResult.Id, ); if (-1 === index) return ( (nextUpResult = { UserId: apiClient.getCurrentUserId(), Limit: 0, StartItemId: nextUpResult.Id, }), apiClient .getEpisodes( item.SeriesId || item.Id, nextUpResult, ) .then(function (result) { (index = Math.max( totalResult.TotalRecordCount - result.TotalRecordCount, 0, )), itemsContainer.scrollToIndex( Math.min( index, totalResult.TotalRecordCount - 1, ), { behavior: "instant", offset: "-padding-inline-start", }, !1, ); }) ); itemsContainer.scrollToIndex( index, { behavior: "instant", offset: "-padding-inline-start", }, !1, ); } else itemsContainer.scrollToIndex( 0, { behavior: "instant", offset: "-padding-inline-start", }, !1, ), detailSelectSeason && (select = detailSelectSeason) .getItems({ StartIndex: 0, Limit: 1, }) .then(function (result) { result.Items.length && select.setValues( [result.Items[0].Id], !1, [result.Items[0]], ); }); }) ); } } } }.bind(instance)), (detailSelectSeasonContainer = instance.view.querySelector( ".childrenItemsScroller", )).addScrollEventListener( function (e) { var scrollSize, padding; _layoutmanager.default.tv || ((e = e.currentTarget), (padding = e.getPadding()), (padding = e.getScrollLeft() + padding.inlineStart + padding.inlineEnd), (scrollSize = e.getScrollWidth()), (padding = Math.min(1, padding / scrollSize)), (scrollSize = e.querySelector( ".childrenItemsContainer", )), (e = scrollSize.getItems()), (padding = Math.floor(padding * e.length)) < e.length && (e = scrollSize.getItem(padding)) && onSeriesEpisodeFocusedOrScrolled(this, e)); }.bind(instance), {}, ), detailSelectSeasonContainer.addEventListener( "focus", function (e) { var itemsContainer = e.currentTarget.querySelector( ".childrenItemsContainer", ), e = e.target.closest( itemsContainer.getItemSelector(), ), itemsContainer = itemsContainer.getItemFromElement(e); itemsContainer && onSeriesEpisodeFocusedOrScrolled( this, itemsContainer, ); }.bind(instance), !0, )); }) : (section.classList.add("hide"), Promise.resolve()); })(this, item), ), (function (instance, item) { var section = instance.view.querySelector( ".collectionItemsSection", ), itemsContainer = section.querySelector(".itemsContainer"); (itemsContainer.parentContainer = section), (itemsContainer.fetchData = function (query) { var item = this.currentItem; if ("BoxSet" !== item.Type) return Promise.resolve({ Items: [], TotalRecordCount: 0 }); var apiClient = _connectionmanager.default.getApiClient(item), sortBy = _usersettings.default.itemSortBy(item.Id) || "default"; "default" === sortBy && (sortBy = "DisplayOrder"); apiClient.isMinServerVersion("4.8.0.16") || (sortBy = null); var sortOrder = sortBy ? _usersettings.default.itemSortOrder(item.Id) : null; return apiClient .getItems( apiClient.getCurrentUserId(), Object.assign( { ParentId: item.Id, ImageTypeLimit: 1, Fields: this.getRequestedItemFields() + ",PrimaryImageAspectRatio,ProductionYear", EnableTotalRecordCount: !1, sortBy: sortBy, sortOrder: sortOrder, }, query, ), ) .then(function (result) { for ( var i = 0, length = result.Items.length; i < length; i++ ) result.Items[i].CollectionId = item.Id; return result; }); }.bind(instance)), (itemsContainer.afterRefresh = setSortLabelText.bind(instance)), (itemsContainer.getListOptions = (function (id) { return function (items) { return { renderer: _cardbuilder.default, options: { shape: "auto", scalable: !0, centerText: !0, fields: ["Name", "ProductionYear"], overlayText: !1, collectionId: id, }, }; }; })(item.Id)), itemsContainer.setAttribute("data-monitor", "CollectionItems"), itemsContainer.setAttribute("data-monitorids", item.Id); })(this, item), (function (instance, view, item, apiClient) { var headerText; "MusicArtist" === item.Type && ((headerText = view.querySelector(".artistSongsItemsHeader")), (apiClient = _approuter.default.getRouteUrl("list", { serverId: apiClient.serverId(), itemTypes: "Audio", artistId: item.Id, })), (item = ""), (item = ''), (item = (item = (item += '

') + _globalize.default.translate("Songs")) + "

"), (headerText.innerHTML = item), (apiClient = view.querySelector( ".artistSongsItemsContainer", )).classList.add("generalItemsContainer"), (apiClient.fetchData = function (query) { var item = this.currentItem, item = _connectionmanager.default.getApiClient(item); return item.getItems( item.getCurrentUserId(), Object.assign( { Recursive: !0, IncludeItemTypes: "Audio", ArtistIds: this.currentItem.Id, SortBy: "PlayCount,SortName", SortOrder: "Descending,Ascending", ImageTypeLimit: 1, Fields: this.getRequestedItemFields() + ",PrimaryImageAspectRatio", }, query, ), ); }.bind(instance)), (apiClient.getListOptions = getArtistSongsListOptions), (apiClient.parentContainer = apiClient.closest(".verticalSection"))); })(this, view, item, responses), (function (instance, item, apiClient) { var section = instance.view.querySelector(".artistAlbumsSection"), itemsContainer = (setScopedFocus( instance.view, section.querySelector(".focusable"), !0, "nearest", ), section.querySelector(".itemsContainer")), apiClient = ((itemsContainer.parentContainer = section), _approuter.default.getRouteUrl("list", { serverId: apiClient.serverId(), itemTypes: "MusicAlbum", albumArtistId: item.Id, })); (section.querySelector(".sectionTitleTextButton").href = apiClient), itemsContainer.setAttribute( "data-virtualscrolllayout", "horizontal-grid", ), (itemsContainer.fetchData = function (query) { var item = this.currentItem; if ("MusicArtist" !== item.Type) return Promise.resolve({ Items: [], TotalRecordCount: 0 }); var apiClient = _connectionmanager.default.getApiClient(item); return ( ((query = Object.assign( { IncludeItemTypes: "MusicAlbum", Recursive: !0, SortBy: "ProductionYear,SortName", SortOrder: "Descending,Ascending", ImageTypeLimit: 1, Fields: this.getRequestedItemFields() + ",PrimaryImageAspectRatio,ProductionYear", }, query, )).AlbumArtistIds = item.Id), apiClient.getItems(apiClient.getCurrentUserId(), query) ); }.bind(instance)), (itemsContainer.getListOptions = getMusicArtistChildrenListOptions); })(this, item, responses), (function (instance, item, apiClient) { var trackList = instance.view.querySelector(".trackList"); (trackList.parentContainer = trackList), "Season" === item.Type ? ((trackList.fetchData = (function ( serverId, seriesId, seasonId, ) { return function (query) { var apiClient = _connectionmanager.default.getApiClient(serverId); return apiClient.getEpisodes( seriesId, Object.assign( { SeasonId: seasonId, ImageTypeLimit: 1, UserId: apiClient.getCurrentUserId(), Fields: "Overview,PrimaryImageAspectRatio,PremiereDate,ProductionYear", }, query, ), ); }; })(apiClient.serverId(), item.SeriesId, item.Id)), (trackList.getListOptions = (function (item) { return function () { return { renderer: _listview.default, options: { showIndexNumber: !1, imageSize: "large", highlight: !1, action: "link", imagePlayButton: !_layoutmanager.default.tv, includeParentInfoInTitle: !1, enableSpecialEpisodePrefix: 0 !== item.IndexNumber, itemClass: "detailsListItem", fields: ["Name", "Overview"], }, virtualScrollLayout: "vertical-list", }; }; })(item)), trackList.setAttribute( "data-virtualscrolllayout", "vertical-grid", ), trackList.classList.add("padded-bottom-page")) : "MusicAlbum" === item.Type ? ((trackList.fetchData = function (query) { var item = this.currentItem, apiClient = _connectionmanager.default.getApiClient(item), includeOverview = !0 === item.SupportsResume, fields = this.getRequestedItemFields() + ",PrimaryImageAspectRatio"; includeOverview && (fields += ",Overview"); return apiClient.getItems( apiClient.getCurrentUserId(), Object.assign({ ParentId: item.Id, Fields: fields, ImageTypeLimit: 1, SortBy: null, EnableTotalRecordCount: !1, }), ); }.bind(instance)), (trackList.getListOptions = ( !0 === item.SupportsResume ? function (item) { return function (items) { var fields = []; return ( (function (items) { for ( var i = 0, length = items.length; i < length; i++ ) { var item = items[i]; if ( "Audio" !== item.MediaType || item.SupportsResume ) return 1; } return; })(items) && fields.push("Overview"), "Playlist" === item.Type && fields.push("ParentName"), fields.push("Name"), { renderer: _listview.default, options: { showIndexNumberLeft: !1, highlight: !1, action: "link", dragHandle: !1, image: !0, imageSize: "medium", showIndexNumber: !0, artist: "auto", imagePlayButton: !_layoutmanager.default.tv, showIndex: "MusicAlbum" === item.Type, fields: fields, index: "disc", containerAlbumArtists: "MusicAlbum" === item.Type ? item.AlbumArtists : null, playAction: "playallfromhere", includeParentInfoInTitle: !1, itemClass: "detailsListItem", autoHideMediaInfo: !1, enableSideMediaInfo: !0, }, virtualScrollLayout: "vertical-list", commandOptions: { openAlbum: !1 }, } ); }; } : getPlaylistListOptionsFn )(item)), trackList.classList.add("generalItemsContainer")) : "Playlist" === item.Type && ((trackList.fetchData = function (query) { var currentItem = this.currentItem, apiClient = _connectionmanager.default.getApiClient(currentItem), itemId = currentItem.Id, currentItem = _usersettings.default.itemSortBy(itemId) || "default"; "default" === currentItem && (currentItem = "ListItemOrder"); var sortOrder = currentItem ? _usersettings.default.itemSortOrder(itemId) : null; return apiClient .getItems( apiClient.getCurrentUserId(), Object.assign( { ParentId: itemId, Fields: "PrimaryImageAspectRatio,Overview,PremiereDate,ProductionYear,OfficialRating,CommunityRating", ImageTypeLimit: 1, SortBy: currentItem, SortOrder: sortOrder, }, query, ), ) .then(function (result) { for ( var i = 0, length = result.Items.length; i < length; i++ ) result.Items[i].PlaylistId = itemId; return result; }); }.bind(instance)), (trackList.getListOptions = getPlaylistListOptionsFn(item)), trackList.setAttribute("data-monitor", "PlaylistItems"), trackList.setAttribute("data-monitorids", item.Id), trackList.setAttribute( "data-virtualscrolllayout", "vertical-grid", ), trackList.classList.add("padded-bottom-page"), (trackList.afterRefresh = setSortLabelText.bind(instance)), trackList.classList.add("generalItemsContainer")); _layoutmanager.default.tv || ("Playlist" !== item.Type && "MusicAlbum" !== item.Type) ? trackList.classList.remove("tracklist-topmargin") : trackList.classList.add("tracklist-topmargin"); _layoutmanager.default.tv && "Season" === item.Type ? trackList.classList.add("tracklist-sidemargin") : trackList.classList.remove("tracklist-sidemargin"); })(this, item, responses), (function (instance, view, item, user) { (_itemmanager.default.canAddToCollection(item, user) || _itemmanager.default.canAddToPlaylist(item)) && "Season" !== item.Type && (((user = view.querySelector( ".appearsOnListsItemsContainer", )).fetchData = function (query) { var item = this.currentItem, apiClient = _connectionmanager.default.getApiClient(item); return ( (query = Object.assign( { fields: this.getRequestedItemFields() + ",PrimaryImageAspectRatio", IncludeItemTypes: "Playlist,BoxSet", Recursive: !0, SortBy: "SortName", ListItemIds: item.Id, }, query, )), apiClient.getItems(apiClient.getCurrentUserId(), query) ); }.bind(instance)), (user.getListOptions = getAppearsOnListsListOptions), (user.parentContainer = user.closest(".verticalSection")), user.classList.add("generalItemsContainer")); })(this, view, item, user), (function (instance, view) { view = view.querySelector(".peopleItemsContainer"); (view.fetchData = (function (instance) { return function (query) { var serverId = instance.currentItem.ServerId, people = (instance.currentItem.People || []).filter( function (p) { return ( (p.ServerId = serverId), "Person" !== p.Type && ((p.PersonType = p.Type), (p.Type = "Person")), !0 ); }, ), totalRecordCount = people.length; return ( query && ((people = people.slice(query.StartIndex || 0)), query.Limit) && people.length > query.Limit && (people.length = query.Limit), Promise.resolve({ Items: people, TotalRecordCount: totalRecordCount, }) ); }; })(instance)), (view.parentContainer = view.closest(".verticalSection")), (view.getListOptions = getPeopleListOptions), view.classList.add("generalItemsContainer"); })(this, view), (function (instance, view, item) { _itemhelper.default.supportsSimilarItems(item) && (((view = view.querySelector( ".similarItemsContainer", )).fetchData = function () { var item = this.currentItem, apiClient = _connectionmanager.default.getApiClient(item), options = { Limit: 12, UserId: apiClient.getCurrentUserId(), ImageTypeLimit: 1, Fields: this.getRequestedItemFields() + ",PrimaryImageAspectRatio,ProductionYear", EnableTotalRecordCount: !1, }; ("Program" === item.Type || ("Timer" === item.Type && item.ProgramId && !item.IsSports)) && (options.GroupProgramsBySeries = !0); "MusicAlbum" === item.Type && item.AlbumArtists && item.AlbumArtists.length && (options.ExcludeArtistIds = item.AlbumArtists[0].Id); item = "Timer" === item.Type ? item.ProgramId : item.Id; return apiClient.getSimilarItems(item, options); }.bind(instance)), (view.parentContainer = view.closest(".verticalSection")), (view.getListOptions = (function (item) { return function (items) { var fields = ["Name"]; return ( ("Movie" !== item.Type && "Trailer" !== item.Type && "Program" !== item.Type && "Game" !== item.Type) || fields.push("ProductionYear"), ("MusicAlbum" !== item.Type && "Game" !== item.Type) || fields.push("ParentName"), "Program" === item.Type && fields.unshift("ParentName"), { renderer: _cardbuilder.default, options: { shape: "auto", lines: "Game" === item.Type ? 3 : "Program" === item.Type ? 2 : null, centerText: !0, fields: fields, overlayPlayButton: !0, overlayText: !1, multiSelect: "Program" !== item.Type && "Timer" !== item.Type, contextMenu: "Program" !== item.Type && "Timer" !== item.Type, draggable: "Program" !== item.Type && "Timer" !== item.Type, focusTransformTitleAdjust: !0, }, virtualScrollLayout: "horizontal-grid", } ); }; })(item)), view.classList.add("generalItemsContainer")); })(this, view, item), (function (instance, view, item, apiClient) { _itemhelper.default.supportsSimilarItemsOnLiveTV(item, apiClient) && (((item = view.querySelector( ".similarOnLiveTVItemsContainer", )).fetchData = function () { var item = this.currentItem, apiClient = _connectionmanager.default.getApiClient(item); return apiClient.getSimilarItems(item.Id, { userId: apiClient.getCurrentUserId(), limit: 12, fields: this.getRequestedItemFields() + ",PrimaryImageAspectRatio,ProductionYear", IncludeItemTypes: "Program", EnableTotalRecordCount: !1, GroupProgramsBySeries: !0, }); }.bind(instance)), (item.parentContainer = item.closest(".verticalSection")), (item.getListOptions = getMoreLikeThisOnLiveTVListOptions), item.classList.add("generalItemsContainer")); })(this, view, item, responses), (function (instance, view, item) { ("Series" === item.Type || "Program" === item.Type || ("Timer" === item.Type && item.ProgramId)) && (((view = view.querySelector( ".seriesScheduleItemsContainer", )).fetchData = function (query) { var item = this.currentItem, apiClient = _connectionmanager.default.getApiClient(item); (query = Object.assign( { UserId: apiClient.getCurrentUserId(), HasAired: !1, SortBy: "StartDate", ImageTypeLimit: 1, EnableImageTypes: "Primary,Thumb,Backdrop", EnableUserData: !1, Fields: "PrimaryImageAspectRatio,ChannelInfo", }, query, )), "Program" === item.Type || ("Timer" === item.Type && item.ProgramId) ? item.AsSeries ? (query.SeriesFromProgramId = item.Id) : ((query.ShowingsFromProgramId = item.ProgramId || item.Id), (query.ExcludeItemIds = item.ProgramId || item.Id)) : (query.LibrarySeriesId = item.Id); return apiClient.getLiveTvPrograms(query); }.bind(instance)), (view.parentContainer = view.closest(".verticalSection")), (view.getListOptions = function (items) { return { renderer: _cardbuilder.default, options: { preferThumb: "auto", shape: "autooverflow", fields: ["Name", "ChannelName", "AirTime"], centerText: !0, overlayText: !1, overlayPlayButton: !1, showAirDateTime: !0, multiSelect: !1, draggable: !1, focusTransformTitleAdjust: !0, }, virtualScrollLayout: "horizontal-grid", }; }.bind(instance)), view.classList.add("generalItemsContainer"), ("Program" !== item.Type && "Timer" !== item.Type) || (item.AsSeries ? (view.parentContainer.querySelector( ".sectionTitle", ).innerHTML = _globalize.default.translate("Showings")) : (view.parentContainer.querySelector( ".sectionTitle", ).innerHTML = _globalize.default.translate( "HeaderOtherShowings", )))); })(this, view, item), (function (instance, view, item) { _itemhelper.default.supportsExtras(item) && (((item = view.querySelector(".extrasItemsContainer")).fetchData = function (query) { var item = this.currentItem, apiClient = _connectionmanager.default.getApiClient(item); return apiClient .getSpecialFeatures(apiClient.getCurrentUserId(), item.Id) .then(function (items) { var totalRecordCount = items.length; return ( query && ((items = items.slice(query.StartIndex || 0)), query.Limit) && items.length > query.Limit && (items.length = query.Limit), { Items: items, TotalRecordCount: totalRecordCount } ); }); }.bind(instance)), (item.parentContainer = item.closest(".verticalSection")), (item.getListOptions = getExtrasListOptions), item.classList.add("generalItemsContainer")); })(this, view, item), (function (instance, view) { view = view.querySelector(".chaptersItemsContainer"); (view.fetchData = function (query) { var item = this.currentItem, chapters = item.Chapters || []; chapters.length && "Video" === item.MediaType && !chapters[0].ImageTag && (chapters = []); var videoStream = ( ((item.MediaSources || [])[0] || {}).MediaStreams || [] ).filter(function (i) { return "Video" === i.Type; })[0] || {}, aspect = null; videoStream.Width && videoStream.Height && (aspect = videoStream.Width / videoStream.Height); for (var i = 0, length = chapters.length; i < length; i++) { var chapter = chapters[i]; (chapter.Id = item.Id), (chapter.Type = item.Type), (chapter.ServerId = item.ServerId), (chapter.MediaType = item.MediaType), (chapter.PrimaryImageAspectRatio = aspect), null == chapter.ChapterIndex && (chapter.ChapterIndex = i); } videoStream = (chapters = (function (chapters) { for ( var list = [], i = 0, length = chapters.length; i < length; i++ ) { var chapter = chapters[i]; (chapter.MarkerType && "Chapter" !== chapter.MarkerType) || list.push(chapter); } return list; })(chapters)).length; query && ((chapters = chapters.slice(query.StartIndex || 0)), query.Limit) && chapters.length > query.Limit && (chapters.length = query.Limit); return Promise.resolve({ Items: chapters, TotalRecordCount: videoStream, }); }.bind(instance)), (view.parentContainer = view.closest(".verticalSection")), (view.getListOptions = getChaptersListOptions), view.classList.add("generalItemsContainer"); })(this, view), (function (instance, view) { view = view.querySelector(".additionalPartsItemsContainer"); (view.fetchData = function () { var item = this.currentItem; if ((item.PartCount || 1) < 2) return Promise.resolve({ TotalRecordCount: 0, Items: [] }); var apiClient = _connectionmanager.default.getApiClient(item); return apiClient.getAdditionalVideoParts( apiClient.getCurrentUserId(), item.Id, ); }.bind(instance)), (view.parentContainer = view.closest(".verticalSection")), (view.getListOptions = getAdditionalPartsListOptions), view.classList.add("generalItemsContainer"); })(this, view), (function (instance, view, item) { "TvChannel" === item.Type && (((item = view.querySelector( ".programGuideItemsContainer", )).fetchData = function (query) { var item = this.currentItem, apiClient = _connectionmanager.default.getApiClient(item); return apiClient.getLiveTvPrograms( Object.assign( { ChannelIds: item.Id, UserId: apiClient.getCurrentUserId(), HasAired: !1, SortBy: "StartDate", ImageTypeLimit: 1, EnableUserData: !1, Fields: "PrimaryImageAspectRatio,Overview", }, query, ), ); }.bind(instance)), (item.parentContainer = item.closest(".programGuideSection")), (item.getListOptions = getProgramGuideListOptions), item.classList.add("generalItemsContainer")); })(this, view, item), (function (instance, view, item) { "SeriesTimer" === item.Type && (((item = view.querySelector( ".seriesTimerScheduleItemsContainer", )).fetchData = function () { var item = this.currentItem, apiClient = _connectionmanager.default.getApiClient(item); return apiClient.getLiveTvTimers({ UserId: apiClient.getCurrentUserId(), ImageTypeLimit: 1, EnableImageTypes: "Primary,Backdrop,Thumb", SortBy: "StartDate", EnableTotalRecordCount: !1, EnableUserData: !1, SeriesTimerId: item.Id, Fields: "ChannelInfo,ChannelImage", }); }.bind(instance)), (item.parentContainer = item.closest(".verticalSection")), (item.getListOptions = getSeriesTimerListOptions), item.classList.add("generalItemsContainer")); })(this, view, item), (function (instance, view, item) { var itemsContainer = (function (view, item) { var sideImageContainer = view.querySelector( ".detailImageContainer-side", ), view = view.querySelector(".detailImageContainer-main"); return enableTrackList(item) ? (view.classList.add("hide"), sideImageContainer.classList.remove("hide"), sideImageContainer) : (view.classList.remove("hide"), sideImageContainer.classList.add("hide"), view); })(view, item), detailImage = itemsContainer, view = view.querySelector(".detailImageContainer-main"); enableTrackList(item) || ("Person" !== item.Type && "BoxSet" !== item.Type && "Season" !== item.Type && "TvChannel" !== item.Type && "Playlist" !== item.Type) || detailImage.classList.add("detailImageContainer-small"); "MusicAlbum" !== item.Type && "Playlist" !== item.Type && view.classList.add("detailImageContainer-main-extrabottommargin"); _layoutmanager.default.tv ? view.classList.add("detailImageContainer-main-tv") : view.classList.remove("detailImageContainer-main-tv"); enableItemBackdropAsTopImage(item) ? view.classList.add("detailImageContainer-hidemobile") : view.classList.remove("detailImageContainer-hidemobile"); view = _imageloader.default.getShape([item], {}); detailImage.classList.remove( "detailImageContainer-backdrop", "detailImageContainer-square", "detailImageContainer-portrait", "detailImageContainer-fourThree", "detailImageContainer-banner", ), view && detailImage.classList.add("detailImageContainer-" + view); "TvChannel" === item.Type || "Season" === item.Type || "MusicAlbum" === item.Type || "Playlist" === item.Type ? detailImage.classList.add("detailImage-nomarginleft") : detailImage.classList.remove("detailImage-nomarginleft"); (itemsContainer.fetchData = function () { var item = this.currentItem, items = []; !item || enableTvDetailImageLayout(item) || items.push(item); return Promise.resolve({ Items: items, TotalRecordCount: items.length, }); }.bind(instance)), ((itemsContainer.parentContainer = itemsContainer).getListOptions = (function ( itemType, cardClass, imageContainerClassName, ) { (imageContainerClassName = imageContainerClassName .split(" ") .filter(function (c) { return c.includes("detailImage"); }) .join(" ")).includes("detailImageContainer-side") && (imageContainerClassName += " item-fixed-side"); return ( (imageContainerClassName += " imageWidthTest"), function (items) { return { renderer: _cardbuilder.default, options: { overlayText: !0, fields: [], action: "none", imageClass: "detailImage", imageWidthTestClass: imageContainerClassName, multiSelect: !1, contextMenu: !1, ratingButton: !1, playedButton: !1, cardClass: cardClass, defaultIcon: !0, typeIndicator: !1, playedIndicator: !1, syncIndicator: !1, timerIndicator: !1, randomDefaultBackground: !1, staticElement: !0, progress: "Program" === itemType || "Timer" === itemType, enableUserData: !1, draggable: !1, moreButton: !1, programIndicators: !1, keepImageAnimation: !0, }, virtualScrollLayout: "vertical-grid", }; } ); })(item.Type, "detailImageContainerCard", detailImage.className)), (itemsContainer.afterRefresh = afterDetailImageRefreshed), itemsContainer.classList.add("generalItemsContainer"), enableTvDetailImageLayout(item) && itemsContainer.classList.add("hide"); })(this, view, item)), view.querySelector(".details-additionalContent")), detailMainContainer = ("TvChannel" === item.Type || "Playlist" === item.Type || "Season" === item.Type ? detailMainContainerParent.classList.remove("padded-bottom-page") : detailMainContainerParent.classList.add("padded-bottom-page"), this.mainSection), detailMainContainerParent = (_backdrop.default.hasBackdrop() ? (detailMainContainerParent.classList.add( "details-additionalContent-withbackdrop", ), detailMainContainer.classList.add( "detailMainContainer-withbackdrop", )) : (detailMainContainerParent.classList.remove( "details-additionalContent-withbackdrop", ), detailMainContainer.classList.remove( "detailMainContainer-withbackdrop", )), enableTrackList(item) ? "Season" === item.Type ? setTitle(item) : setTitle(item, 0, _layoutmanager.default.tv) : setTitle( item, 0, "float" === getLogoPlacement(item) && "MusicAlbum" !== item.Type, ), view.querySelector(".topDetailsMain")), itemSideContainer = view.querySelector(".item-fixed-side"), mainDetailButtons = view.querySelector(".mainDetailButtons"); return ( enableTrackList(item) ? ("MusicAlbum" === item.Type ? detailMainContainer.classList.add( "detailMainContainer-marginleft", ) : detailMainContainer.classList.remove( "detailMainContainer-marginleft", ), detailMainContainerParent.classList.remove( "topDetailsMain-graphic", "topDetailsMain-graphic-tv", ), detailMainContainer.classList.remove( "detailMainContainer-withitembackdrop", "detailMainContainer-vertical", ), itemSideContainer.classList.remove("hide"), _layoutmanager.default.tv && "Season" !== item.Type ? detailMainContainerParent.classList.add( "padded-left", "padded-left-page", "padded-right", ) : detailMainContainerParent.classList.remove( "padded-left", "padded-left-page", "padded-right", )) : (detailMainContainer.classList.remove( "detailMainContainer-marginleft", ), enableItemBackdropAsTopImage(item) ? (detailMainContainer.classList.add( "detailMainContainer-withitembackdrop", ), detailMainContainer.classList.remove( "detailMainContainer-vertical", )) : (detailMainContainer.classList.remove( "detailMainContainer-withitembackdrop", ), detailMainContainer.classList.add( "detailMainContainer-vertical", )), enableTvDetailImageLayout(item) ? _layoutmanager.default.tv ? detailMainContainerParent.classList.add( "topDetailsMain-graphic", "topDetailsMain-graphic-tv", ) : (detailMainContainerParent.classList.add( "topDetailsMain-graphic", ), detailMainContainerParent.classList.remove( "topDetailsMain-graphic-tv", )) : detailMainContainerParent.classList.remove( "topDetailsMain-graphic", "topDetailsMain-graphic-tv", ), itemSideContainer.classList.add("hide"), detailMainContainerParent.classList.remove( "padded-left", "padded-left-page", "padded-right", )), renderName( this, item, responses, user, view.querySelectorAll(".nameContainer"), ), (function (view, item, apiClient) { var imgUrl, usePrimaryImage, screenWidth = screen.availWidth, itemBackdropContainerElement = view.querySelector( ".itemBackdropContainer", ), itemBackdropElement = itemBackdropContainerElement.querySelector(".itemBackdrop"); enableItemBackdropAsTopImage(item) ? (itemBackdropContainerElement.classList.remove("hide"), (usePrimaryImage = ("Video" === item.MediaType && "Movie" !== item.Type && "Trailer" !== item.Type) || (item.MediaType && "Video" !== item.MediaType) || "MusicAlbum" === item.Type || "Playlist" === item.Type), "Program" === item.Type && item.ImageTags && item.ImageTags.Thumb ? (imgUrl = apiClient.getImageUrl(item.Id, { type: "Thumb", index: 0, maxWidth: screenWidth, tag: item.ImageTags.Thumb, EnableImageEnhancers: !1, })) : usePrimaryImage && item.ImageTags && item.ImageTags.Primary ? (imgUrl = apiClient.getImageUrl(item.Id, { type: "Primary", index: 0, maxWidth: screenWidth, tag: item.ImageTags.Primary, EnableImageEnhancers: !1, })) : item.BackdropImageTags && item.BackdropImageTags.length ? (imgUrl = apiClient.getImageUrl(item.Id, { type: "Backdrop", index: 0, maxWidth: screenWidth, tag: item.BackdropImageTags[0], })) : item.ParentBackdropItemId && item.ParentBackdropImageTags && item.ParentBackdropImageTags.length ? (imgUrl = apiClient.getImageUrl(item.ParentBackdropItemId, { type: "Backdrop", index: 0, tag: item.ParentBackdropImageTags[0], maxWidth: screenWidth, })) : item.ImageTags && item.ImageTags.Thumb ? (imgUrl = apiClient.getImageUrl(item.Id, { type: "Thumb", index: 0, maxWidth: screenWidth, tag: item.ImageTags.Thumb, EnableImageEnhancers: !1, })) : item.ImageTags && item.ImageTags.Primary && (imgUrl = apiClient.getImageUrl(item.Id, { type: "Primary", index: 0, maxWidth: screenWidth, tag: item.ImageTags.Primary, EnableImageEnhancers: !1, })), "TvChannel" === item.Type && itemBackdropContainerElement.classList.add( "itemBackdropContainer-small", ), (usePrimaryImage = view.querySelector(".itemMainScrollSlider")), _layoutmanager.default.tv ? usePrimaryImage.classList.remove( "itemMainScrollSlider-moveup", "itemMainScrollSlider-nopaddingtop", ) : "TvChannel" !== item.Type && enableItemBackdropAsTopImage(item) && usePrimaryImage.classList.add( "itemMainScrollSlider-nopaddingtop", ), ("TvChannel" !== item.Type && "Person" !== item.Type) || itemBackdropElement.classList.add("itemBackdrop-contain"), (itemBackdropElement.style.backgroundImage = imgUrl ? "url('" + imgUrl + "')" : "")) : itemBackdropContainerElement.classList.add("hide"); })(view, item, responses), renderTrackSelections(view, this, item, user, !0, itemInfo), itemMainScrollSlider.push( renderDetails(this, view, item, responses, user), ), (function (view, user, item) { if (_servicelocator.appHost.supports("sync")) for ( var canSync = _itemmanager.default.canSync(item, user), buttons = view.querySelectorAll(".btnSyncDownload"), i = 0, length = buttons.length; i < length; i++ ) buttons[i].setItem(item), canSync ? buttons[i].classList.remove("hide") : buttons[i].classList.add("hide"); })(view, user, item), Promise.all(itemMainScrollSlider).then(function () { return ( enableTrackList(item) || (function (elem) { for ( var btns = elem.querySelectorAll(".detailButton"), i = 0, length = btns.length; i < length; i++ ) { var btn = btns[i]; if (_focusmanager.default.isCurrentlyFocusable(btn)) return setScopedFocus(null, elem, !0); } setScopedFocus(null, elem, !1); })(mainDetailButtons), [item, user] ); }) ); } function getItemWithMediaSource(instance, apiClient) { return (function (instance, apiClient) { var options; return (instance = instance.params).seriesTimerId ? apiClient.getLiveTvSeriesTimer(instance.seriesTimerId) : instance.timerId ? apiClient.getLiveTvTimer(instance.timerId) : ((options = {}), "true" === instance.asSeries ? (options.AsSeries = !0) : (options.Fields = "ShareLevel"), apiClient.getItem( apiClient.getCurrentUserId(), instance.id, options, )); })(instance, apiClient).then(function (item) { var playbackMediaSourcesPromise = isRenderingTrackSelections(item) ? _playbackmanager.default.getPlaybackMediaSources(item) : Promise.resolve([]); return playbackMediaSourcesPromise.then(function (mediaSources) { return { item: item, mediaSources: mediaSources }; }); }); } function startDataLoad(instance) { var params = instance.params, apiClient = _connectionmanager.default.getApiClient(params.serverId), params = Promise.all([ getItemWithMediaSource(instance, apiClient), apiClient.getCurrentUser(), ]).then(onDataFetched.bind(instance), function (err) { return ( console.log("error loading item: " + err), (function (instance, apiClient) { (instance = instance.view) .querySelector(".details-additionalContent") .classList.add("hide"), (html = "

Content no longer available.

"); var apiClient = _approuter.default.getRouteUrl("home", { serverId: apiClient.serverId(), }), html = (html += '') + _globalize.default.translate("Home") + "
"; (instance.querySelector(".detailMainContainer").innerHTML = html), _focusmanager.default.focus( instance.querySelector(".btnHomeItemNotFound"), ); })(instance, apiClient), Promise.reject(err) ); }); instance.dataPromise = params; } function playCurrentItem(instance, mode) { var item; _multiselect.default.canPlay() ? _multiselect.default.play() : ((item = instance.currentItem), ((instance = (function (view, startPositionTicks) { var audioStreamIndex = view.querySelector(".selectAudio").value || null; return { startPositionTicks: startPositionTicks, mediaSourceId: view.querySelector(".selectSource").value, audioStreamIndex: audioStreamIndex, subtitleStreamIndex: view.querySelector(".selectSubtitles").value, }; })( instance.view, item.UserData && "resume" === mode ? null : 0, )).items = [item]), _playbackmanager.default.play(instance)); } function onPlayClick(e) { playCurrentItem(this, e.currentTarget.getAttribute("data-mode")); } function onEdited() { reloadItem(this, !0); } function onEditCancel() {} function onEditMetadataClick() { var currentItem = this.currentItem, instance = this; require(["metadataEditor"]).then(function (responses) { return new responses[0]() .show(currentItem.Id, currentItem.ServerId) .then(onEdited.bind(instance), onEditCancel); }); } function onEditImagesClick() { var currentItem = this.currentItem, instance = this; require(["imageEditor"], function (imageEditor) { imageEditor .show({ itemId: currentItem.Id, serverId: currentItem.ServerId }) .then(onEdited.bind(instance), onEditCancel); }); } function onDeleteClick() { var currentItem = this.currentItem; _itemmanager.default.deleteItems({ items: [currentItem], navigate: "back", }); } function onDownloadChange() { reloadItem(this, !0); } function splitVersions(instance, page, apiClient, params) { var options; (options = "Are you sure you wish to split the media sources into separate items?"), Emby.importModule("./modules/common/dialogs/confirm.js") .then(function (confirm) { return confirm(options); }) .then(function () { _loading.default.show(), apiClient.ungroupVersions(params.id).then(function () { _loading.default.hide(), reloadItem(instance, !0); }); }); } function onReadMoreClick(e) { var options, e = e.currentTarget .closest(".overview-container") .querySelector(".overview-text"); (options = { html: e.innerHTML, confirmButton: !1, title: _itemmanager.default.getDisplayName(this.currentItem) || this.currentItem.Name, centerText: !1, item: this.currentItem, }), Emby.importModule("./modules/common/dialogs/alert.js").then( function (alert) { return alert(options); }, ); } function onPromiseRejected(e) { console.log("itemContextMenu close: " + e); } function getSortMenuOptions(item) { var options = []; return ( options.push({ name: "Playlist" === item.Type ? _globalize.default.translate("PlaylistOrder") : "BoxSet" === item.Type ? _globalize.default.translate("CollectionOrder") : _globalize.default.translate("Default"), value: "default", defaultSortOrder: "Ascending", }), options.push({ name: _globalize.default.translate("Album"), value: "Album,ParentIndexNumber,IndexNumber", defaultSortOrder: "Ascending", }), "Playlist" === item.Type && options.push({ name: _globalize.default.translate("AlbumArtist"), value: "AlbumArtist,Album,ParentIndexNumber,IndexNumber,SortName", defaultSortOrder: "Ascending", }), options.push({ name: _globalize.default.translate("Artist"), value: "Artist,Album,ParentIndexNumber,IndexNumber,SortName", defaultSortOrder: "Ascending", }), options.push({ name: _globalize.default.translate("Runtime"), value: "Runtime,SortName", defaultSortOrder: "Ascending", }), options.push({ name: _globalize.default.translate("Title"), value: "SortName", defaultSortOrder: "Ascending", }), options.push({ name: _globalize.default.translate("Year"), value: "ProductionYear,SortName", defaultSortOrder: "Descending", }), options ); } function getSortMenuOption(sortMenuOptions, sortBy) { for (var i = 0, length = sortMenuOptions.length; i < length; i++) { var option = sortMenuOptions[i]; if (option.value === sortBy) return option; } return null; } function setSortLabelText() { var item = this.currentItem, sortItems = getSortMenuOptions(item), view = this.view, sortItems = getSortMenuOption( sortItems, _usersettings.default.itemSortBy(item.Id) || "default", ), item = view.querySelector(".btnSortItems"); item.setAttribute( "title", _globalize.default.translate("SortByValue", sortItems.name), ), item.setAttribute( "aria-label", _globalize.default.translate("SortByValue", sortItems.name), ), (item.querySelector(".btnSortText").innerHTML = _globalize.default.translate("HeaderSortBy")); } function sortItem(instance, item, options) { var currentValues = { sortBy: _usersettings.default.itemSortBy(item.Id), sortOrder: _usersettings.default.itemSortOrder(item.Id), }, sortItems = getSortMenuOptions(item); return ( (function (options, currentValues) { for (var i = 0, length = options.length; i < length; i++) { var opt = options[i]; if ( ((opt.selected = opt.value === (currentValues.sortBy || "default")), opt.selected) ) { var icon = "Descending" === currentValues.sortOrder ? "" : ""; opt.asideIcon = icon; break; } } })(sortItems, currentValues), (function (options) { return Emby.importModule("./modules/actionsheet/actionsheet.js").then( function (ActionSheet) { return ActionSheet.show(options); }, ); })({ items: sortItems, positionTo: options.positionTo, positionY: options.positionY, positionX: options.positionX, positionClientY: options.positionClientY, positionClientX: options.positionClientX, transformOrigin: options.transformOrigin, title: _globalize.default.translate("HeaderSortBy"), offsetTop: 2, hasItemAsideIcon: !0, hasItemSelectionState: !0, }).then(function (value) { var sortOrder; sortOrder || ((sortOrder = currentValues.sortOrder), (sortOrder = currentValues.sortBy === value ? "Ascending" === sortOrder ? "Descending" : "Ascending" : (function (sortMenuOptions, sortBy) { if (sortBy) { sortMenuOptions = getSortMenuOption( sortMenuOptions, sortBy, ); if ( sortMenuOptions && sortMenuOptions.value === sortBy && sortMenuOptions.defaultSortOrder ) return sortMenuOptions.defaultSortOrder; } return "Descending"; })(sortItems, value))), _usersettings.default.itemSortBy(item.Id, value), _usersettings.default.itemSortOrder(item.Id, sortOrder); }) ); } function getMusicArtistChildrenListOptions(items) { return { renderer: _cardbuilder.default, options: { shape: "auto", scalable: !0, centerText: !0, fields: ["Name", "ProductionYear"], overlayText: !1, focusTransformTitleAdjust: !0, }, virtualScrollLayout: "horizontal-grid", }; } function getSeasons(query) { var item = this.currentItem, apiClient = _connectionmanager.default.getApiClient(item), fields = this.getRequestedItemFields() + ",PrimaryImageAspectRatio,Overview"; return apiClient.getSeasons( item.Id, Object.assign( { UserId: apiClient.getCurrentUserId(), Fields: fields }, query, ), ); } function getPlaylistListOptionsFn(item) { return function (items) { var fields = [], items = (fields.push("ParentName"), fields.push("Name"), (function (items) { for (var i = 0, length = items.length; i < length; i++) if (items[i].Overview) return !0; return !1; })(items)), enableSideMediaInfo = !0, sortBy = (items && (fields.push("Overview"), (enableSideMediaInfo = !1)), _usersettings.default.itemSortBy(item.Id) || "default"), sortOrder = (sortBy = "default" === sortBy ? "ListItemOrder" : sortBy) ? _usersettings.default.itemSortOrder(item.Id) : null; return { renderer: _listview.default, options: { showIndexNumberLeft: "MusicAlbum" === item.Type, action: "playallfromhere", dragHandle: "Playlist" === item.Type && !_layoutmanager.default.tv && "ListItemOrder" === sortBy && "Ascending" === sortOrder, playlistId: "Playlist" === item.Type ? item.Id : null, image: "Playlist" === item.Type, artist: "auto", showIndex: "MusicAlbum" === item.Type, autoHideArtist: "MusicAlbum" === item.Type, index: "disc", containerAlbumArtists: "MusicAlbum" === item.Type ? item.AlbumArtists : null, fields: fields, playAction: "playallfromhere", itemClass: "detailsListItem", enableSideMediaInfo: enableSideMediaInfo, imageSize: items ? "medium" : null, autoMoveParentName: !0, }, virtualScrollLayout: "vertical-list", commandOptions: { openAlbum: "MusicAlbum" !== item.Type }, }; }; } function scrollEpisodesToSeason(instance, seasonId) { var apiClient, seriesId, itemsContainer = instance.view.querySelector(".childrenItemsContainer"); itemsContainer && ((instance = instance.currentItem), (apiClient = _connectionmanager.default.getApiClient(instance)), (seriesId = instance.Id), apiClient .getEpisodes(seriesId, { SeasonId: seasonId, UserId: apiClient.getCurrentUserId(), EnableImages: !1, EnableUserData: !1, Limit: 1, TotalRecordCount: !1, }) .then(function (result) { var startItem = result.Items[0]; startItem && (-1 !== (result = itemsContainer.indexOfItemId(startItem.Id)) ? itemsContainer.scrollToIndex( result, { offset: "-padding-inline-start" }, !1, ) : apiClient .getEpisodes(seriesId, { UserId: apiClient.getCurrentUserId(), EnableTotalRecordCount: !1, EnableImages: !1, EnableUserData: !1, }) .then(function (totalResult) { for ( var i = 0, length = totalResult.Items.length; i < length; i++ ) if (totalResult.Items[i].Id === startItem.Id) { itemsContainer.scrollToIndex( i, { offset: "-padding-inline-start" }, !1, ); break; } })); })); } function onSeriesEpisodeFocusedOrScrolled(instance, item) { var detailSelectSeason, item = (function (instance, item) { if ( ((instance = instance.seasonItems || []), item.SeasonId && 0 !== item.ParentIndexNumber) ) { var season = instance.filter(function (s) { return s.Id === item.SeasonId; })[0]; if (season) return season; } var seasonNumber = null == item.SortParentIndexNumber ? item.ParentIndexNumber : item.SortParentIndexNumber; if (null != seasonNumber) { season = instance.filter(function (s) { return s.IndexNumber === seasonNumber; })[0]; if (season) return season; } if (item.SeasonId) { season = instance.filter(function (s) { return s.Id === item.SeasonId; })[0]; if (season) return season; } return null; })(instance, item); item && ((detailSelectSeason = instance.detailSelectSeason) && detailSelectSeason.setValues([item.Id], !1, [item]), (detailSelectSeason = instance.seasonTabs)) && (instance = detailSelectSeason.querySelector( '.detailSeasonTab[data-id="' + item.Id + '"]', )) && detailSelectSeason.selectedIndex( parseInt(instance.getAttribute("data-index")), !1, ); } function getAppearsOnListsListOptions(items) { return { renderer: _cardbuilder.default, options: { shape: "autooverflow", centerText: !0, fields: ["Name"], overlayText: !1, focusTransformTitleAdjust: !0, }, virtualScrollLayout: "horizontal-grid", }; } function getArtistSongsListOptions(items) { return { renderer: _cardbuilder.default, options: { shape: "auto", lines: 2, centerText: !1, fields: ["Name", "Album"], overlayPlayButton: !0, overlayText: !1, sideFooter: !0, action: "play", }, virtualScrollLayout: "horizontal-grid", commandOptions: { openArtist: !1 }, }; } function getPeopleListOptions(items) { return { renderer: _cardbuilder.default, options: { cardLayout: !1, centerText: !0, fields: ["Name", "PersonRole"], cardFooterAside: !1, showPersonRoleOrType: !0, multiSelect: !1, coverImage: !0, shape: "portrait", draggable: !1, focusTransformTitleAdjust: !0, }, virtualScrollLayout: "horizontal-grid", }; } function getMoreLikeThisOnLiveTVListOptions(items) { return { renderer: _cardbuilder.default, options: { shape: "auto", fields: ["ParentName", "Name", "ProductionYear"], centerText: !0, showDetailsMenu: !0, overlayPlayButton: !0, overlayText: !1, lines: 2, draggable: !1, multiSelect: !1, focusTransformTitleAdjust: !0, }, virtualScrollLayout: "horizontal-grid", }; } function getNextUpItems(query) { var item = this.currentItem, apiClient = _connectionmanager.default.getApiClient(item); return "MusicAlbum" === item.Type ? apiClient.getNextUpAudioBookItems( Object.assign( { AlbumId: item.Id, Fields: this.getRequestedItemFields() + ",PrimaryImageAspectRatio", ImageTypeLimit: 1, UserId: apiClient.getCurrentUserId(), }, query, ), ) : apiClient.getNextUpEpisodes( Object.assign( { SeriesId: item.Id, Fields: this.getRequestedItemFields() + ",PrimaryImageAspectRatio", ImageTypeLimit: 1, UserId: apiClient.getCurrentUserId(), }, query, ), ); } function getAdditionalPartsListOptions(items) { return { renderer: _cardbuilder.default, options: { shape: "autooverflow", scalable: !0, fields: ["Name", "Runtime"], action: "playallfromhere", centerText: !0, overlayText: !1, draggable: !1, focusTransformTitleAdjust: !0, }, virtualScrollLayout: "horizontal-grid", }; } function getExtrasListOptions(items) { return { renderer: _cardbuilder.default, options: { shape: "autooverflow", scalable: !0, fields: ["Name", "Runtime"], centerText: !0, overlayText: !1, draggable: !1, focusTransformTitleAdjust: !0, }, virtualScrollLayout: "horizontal-grid", }; } function getProgramGuideListOptions(items) { return { renderer: _listview.default, options: { imageSize: "large", enableUserDataButtons: !1, mediaInfo: !0, mediaInfoWithTitle: !0, draggable: !1, multiSelect: !1, defaultShape: "portrait", itemClass: "detailsListItem", fields: ["ParentName", "Name", "StartToEndDateTime", "Overview"], highlight: !1, }, virtualScrollLayout: "vertical-grid", }; } function getSeriesTimerListOptions(items) { return { renderer: _listview.default, options: { enableUserDataButtons: !1, image: !0, mediaInfo: !1, imageSize: "large", moreButton: !1, recordButton: !1, draggable: !1, multiSelect: !1, itemClass: "detailsListItem", fields: [ "ParentName", "Name", "StartToEndDateTime", "ChannelName", "Overview", ], highlight: !1, }, virtualScrollLayout: "vertical-grid", }; } function enableTvDetailImageLayout(item) { if (_layoutmanager.default.tv) { switch (item.Type) { case "Series": case "Season": case "Audio": case "Program": return !0; case "BoxSet": case "TvChannel": case "Playlist": case "MusicAlbum": case "MusicArtist": return !1; } switch (item.MediaType) { case "Video": case "Photo": case "Game": case "Book": return !0; } } return !1; } function afterDetailImageRefreshed() { var detailImageElement = this.querySelector(".detailImage"); detailImageElement && (this.querySelector(".cardImageIcon") ? detailImageElement.classList.remove("detailImage-transparent") : detailImageElement.classList.add("detailImage-transparent")); } function getChaptersListOptions(items) { return { renderer: _cardbuilder.default, options: { shape: "autooverflow", centerText: !0, overlayText: !1, fields: ["Name", "ChapterTime"], multiSelect: !1, contextMenu: !1, playedButton: !1, ratingButton: !1, action: "play", enableUserData: !1, draggable: !1, background: "black", focusTransformTitleAdjust: !0, }, virtualScrollLayout: "horizontal-grid", }; } function getMoreFromSeasonListOptions(items) { return { renderer: _cardbuilder.default, options: { shape: "auto", scalable: !0, fields: ["Name"], overlayText: !1, centerText: !0, includeParentInfoInTitle: !1, focusTransformTitleAdjust: !0, }, virtualScrollLayout: "horizontal-grid", }; } function getMoreFromArtistListOptions(items) { return { renderer: _cardbuilder.default, options: { shape: "auto", scalable: !0, fields: ["Name", "ProductionYear"], centerText: !0, overlayText: !1, overlayPlayButton: !0, focusTransformTitleAdjust: !0, }, virtualScrollLayout: "horizontal-grid", }; } function onPromiseFailure() {} function reloadItem(instance, reloadAllData, restartDataLoad) { !reloadAllData || (instance.dataPromise && !1 === restartDataLoad) || startDataLoad(instance), instance.dataPromise.then(function (responses) { var trackList, item = responses[0], responses = responses[1], apiClient = _connectionmanager.default.getApiClient(item.ServerId), view = instance.view; !(function (view, refreshData) { for ( var containers = view.querySelectorAll(".generalItemsContainer"), i = 0, length = containers.length; i < length; i++ ) containers[i].resume({ refresh: refreshData }); })(view, reloadAllData), "Season" === item.Type && (trackList = view.querySelector(".trackList")) && trackList.resume({ refresh: reloadAllData }).then(function () { !(function (element) { var items = element.getItems(), focusItem = items.filter(function (i) { return !i.UserData || !i.UserData.Played; })[0]; if ((focusItem = focusItem || items[0])) { items = element.indexOfItemId(focusItem.Id); if (-1 !== items) return element.scrollToIndex(items, {}, !0), 1; } })(trackList) && _focusmanager.default.autoFocus(view, { skipIfNotEnabled: !0 }); }), reloadAllData && (renderPeopleItems(view, item, apiClient), (function (view, item, user, apiClient) { "SeriesTimer" === item.Type && (user.Policy.EnableLiveTvManagement ? (require(["seriesRecordingEditor"], function ( seriesRecordingEditor, ) { seriesRecordingEditor.embed(item, apiClient.serverId(), { context: view.querySelector(".recordingEditor"), }); }), view .querySelector(".seriesTimerScheduleSection") .classList.remove("hide"), view .querySelector(".btnCancelSeriesTimer") .classList.remove("hide")) : (view .querySelector(".seriesTimerScheduleSection") .classList.add("hide"), view .querySelector(".btnCancelSeriesTimer") .classList.add("hide"))); })(view, item, responses, apiClient), (function (instance, view, item, user, apiClient) { ("Timer" === item.Type || ("Recording" === item.Type && item.TimerId && "InProgress" === item.Status)) && user.Policy.EnableLiveTvManagement ? (hideAll(view, "btnCancelTimer", !0), require(["recordingEditor"], function (RecordingEditor) { RecordingEditor = new RecordingEditor(); (instance.recordingEditor = RecordingEditor).embed( item, apiClient.serverId(), { context: view.querySelector(".recordingEditor") }, ); })) : hideAll(view, "btnCancelTimer"); })(instance, view, item, responses, apiClient), (function (page, item) { var page = page.querySelector(".linksSection"), links = []; if ( item.ExternalUrls && _servicelocator.appHost.supports("externallinks") && !_layoutmanager.default.tv ) for ( var i = 0, length = item.ExternalUrls.length; i < length; i++ ) { var url = item.ExternalUrls[i]; links.push( 'link' + _textencoding.default.htmlEncode(url.Name) + "", ); } (page.querySelector(".itemLinks").innerHTML = links.join("")), links.length ? page.classList.remove("hide") : page.classList.add("hide"); })(view, item), view .querySelector(".audioVideoMediaInfo") .classList.remove("mediainfo-forcehide"), view .querySelector(".details-additionalContent") .classList.remove("hide"), focusMainSection.call(instance.mainSection)), (function (instance, eventName, item) { instance.itemShowDispatched || ((instance.itemShowDispatched = !0), instance.view.dispatchEvent( new CustomEvent(eventName, { detail: { item: item }, bubbles: !0, cancelable: !1, }), )); })(instance, "itemshow", item), _loading.default.hide(); }, onPromiseFailure); } function addClass(elems, className) { for (var i = 0, length = elems.length; i < length; i++) elems[i].classList.add(className); } function setScopedFocus(view, query, enabled, type) { view = "string" == typeof query ? view.querySelector(query) : query; enabled ? (view.classList.add("focusable"), view.setAttribute("data-focusabletype", type || "autofocus")) : (view.classList.remove("focusable"), view.removeAttribute("data-focusabletype")); } function updateTrackSelectionsFocusState(instance, view) { var instance = instance.trackSelectionsContainer, isEnabled = instance.querySelector("select:enabled:not(.noSelections)"); setScopedFocus(view, instance, isEnabled, "nearest"); } var drawerElement = document.querySelector(".mainDrawer"); function onNavDrawerStateChange(e, drawerState) { 2 <= drawerState && _backdrop.default.hasBackdrop() ? drawerElement.classList.add("darkContentContainer") : drawerElement.classList.remove("darkContentContainer"); } function ItemPage(view, params) { _baseview.default.apply(this, arguments), (this.params = params), (this.playerChangeFn = function () { var view = this.view, item = this.currentItem; view && item && renderTrackSelectionsWithoutUser(view, this, item); }.bind(this)), (this.playbackStopFn = function (e, stopInfo) { var state = stopInfo.state || {}; state.NextMediaType || state.IsBackgroundPlayback || (null != (stopInfo = stopInfo.player) && stopInfo.isLocalPlayer && !_usersettings.default.enableVideoUnderUI() && ((stopInfo = state.NowPlayingItem || {}), (this.currentItem || {}).MediaType === stopInfo.MediaType) && stopInfo.MediaType && "Episode" === stopInfo.Type && (this.showItemOnResume = stopInfo)); }.bind(this)), (this.onNavDrawerStateChangeFn = onNavDrawerStateChange.bind(this)), (this.topDetailsContainer = view.querySelector(".topDetailsContainer")), (this.mainSection = view.querySelector(".detailMainContainer")), (this.trackSelectionsContainer = view.querySelector(".trackSelections")), _layoutmanager.default.tv ? addClass( view.querySelectorAll(".reduce-font-size-tv"), "reduce-font-size", ) : (addClass( view.querySelectorAll(".detailTextContainer"), "details-largefont", ), addClass( view.querySelectorAll(".reduce-font-size-tv"), "reduce-font-size-mobile", )), (function (view, query, enabled, type) { for ( var elems = view.querySelectorAll(query), i = 0, length = elems.length; i < length; i++ ) setScopedFocus(view, elems[i], enabled, type); })(view, ".focusable", !0, "nearest"), this.trackSelectionsContainer.addEventListener( "submit", onTrackSelectionsSubmit, ), bindAll(view, ".btnPlay", "click", onPlayClick.bind(this)), bindAll(view, ".btnResume", "click", onPlayClick.bind(this)), bindAll( view, ".btnShuffle", "click", function () { var currentItem = this.currentItem; _playbackmanager.default.shuffle(currentItem); }.bind(this), ), bindAll( view, ".btnPlayTrailer", "click", function () { var currentItem = this.currentItem; _playbackmanager.default.playTrailers(currentItem); }.bind(this), ), bindAll( view, ".btnCancelSeriesTimer", "click", function () { onDeleteClick.call(this); }.bind(this), ), bindAll( view, ".btnCancelTimer", "click", function () { var instance = this, item = this.currentItem, type = item.Type, serverId = item.ServerId, timerId = "Timer" === type ? item.Id : item.TimerId; require(["recordingHelper"], function (recordingHelper) { recordingHelper .cancelTimer( _connectionmanager.default.getApiClient(serverId), timerId, ) .then(function () { reloadItem(instance, !0); }); }); }.bind(this), ), bindAll(view, ".btnDeleteItem", "click", onDeleteClick.bind(this)), bindAll( view, ".btnSyncDownload", "download", onDownloadChange.bind(this), ), bindAll( view, ".btnSyncDownload", "download-cancel", onDownloadChange.bind(this), ), bindAll( view, ".btnMoreCommands", "click", function (e) { var button = e.currentTarget, instance = this, e = this.params, e = _connectionmanager.default.getApiClient(e.serverId), currentItem = this.currentItem, view = this.view; e.getCurrentUser().then(function (user) { _itemcontextmenu.default .show(getCommandOptions(view, currentItem, user, button)) .then(function (result) { ("addtoplaylist" !== result.command && "addtocollection" !== result.command) || reloadItem(instance, !0); }, onPromiseRejected); }); }.bind(this), ), bindAll( view, ".btnSortItems", "click", function (e) { var e = e.currentTarget, instance = this; sortItem(0, instance.currentItem, { positionTo: e, positionY: "bottom", }).then(function () { reloadItem(instance, !0); }); }.bind(this), ), bindAll( view, ".btnManageSeriesRecording", "click", function (e) { var item = this.currentItem; item.SeriesTimerId && _approuter.default.showItem({ Type: "SeriesTimer", Id: item.SeriesTimerId, ServerId: item.ServerId, }); }.bind(this), ), bindAll( view, ".btnManageRecording", "click", function (e) { var item = this.currentItem; item.TimerId && _approuter.default.showItem({ Type: "Timer", Id: item.TimerId, ServerId: item.ServerId, }); }.bind(this), ), this.mainSection.addEventListener( "focus", function (e) { _layoutmanager.default.tv && !e.target.closest( ".btnReadMore,.recordingEditor,.btnOverviewText", ) && this.view.scrollToBeginning(); }.bind(this), !0, ), bindAll( view, ".btnSplitVersions", "click", function () { var params = this.params, apiClient = _connectionmanager.default.getApiClient( params.serverId, ); splitVersions(this, this.view, apiClient, params); }.bind(this), ), bindAll(view, ".btnReadMore", "click", onReadMoreClick.bind(this)), bindAll(view, ".btnOverviewText", "click", onReadMoreClick.bind(this)); var instance = this, onLibraryChangedFn = (view .querySelector(".selectSource") .addEventListener("change", function () { renderMediaInfo( 0, view, instance.currentItem, instance._currentPlaybackMediaSources, _connectionmanager.default.getApiClient(instance.currentItem), ), renderVideoSelections( view, instance._currentPlaybackMediaSources, ), renderAudioSelections( view, instance._currentPlaybackMediaSources, ), renderSubtitleSelections( view, instance._currentPlaybackMediaSources, ), updateTrackSelectionsFocusState(instance, view); }), view.querySelector(".btnManualRecording").addEventListener( "click", function (e) { executeCommandWithCommandProcessor("record", this.currentItem, { positionTo: e.target, }); }.bind(this), ), view.addEventListener( "viewbeforehide", function (e) { ((e = e.detail) && e.newView && e.newView.classList.contains("itemView")) || (backgroundContainer.classList.remove( "itemBackgroundContainer", "itemBackgroundContainer-brighter", "itemBackgroundContainer-preventbackdrop", ), backdropContainer.classList.remove( "backdropContainer-preventbackdrop", ), skinHeader.classList.remove("detailHeader-noIcons")); }.bind(this), ), (this.onUserDataChangedFn = function (e, apiClient, userData) { var currentItem = this.currentItem, view = this.view; currentItem && currentItem.Id === userData.ItemId && ((currentItem.UserData = userData), this.paused || reloadPlayButtons(this, view, currentItem, !0)); }.bind(this)), (this.onLibraryChangedFn = function (e, apiClient, data) { var currentItem = this.currentItem; currentItem && null != (data = data.ItemsUpdated) && data.includes(currentItem.Id) && (this.paused ? (this._fullReloadOnResume = !0) : reloadItem(this, !0)); }.bind(this)), (this.onTimerCancelledFn = function (e, apiClient, data) { var currentItem = this.currentItem; currentItem && currentItem.Id === data.Id && !this.paused && _approuter.default.back(); }.bind(this)), _events.default.on( _navdrawer.default, "drawer-state-change", this.onNavDrawerStateChangeFn, ), this.onLibraryChangedFn), onLibraryChangedFn = (onLibraryChangedFn && _events.default.on( _api.default, "LibraryChanged", onLibraryChangedFn, ), this.onUserDataChangedFn), onLibraryChangedFn = (onLibraryChangedFn && _events.default.on( _api.default, "UserDataChanged", onLibraryChangedFn, ), this.onTimerCancelledFn); onLibraryChangedFn && _events.default.on(_api.default, "TimerCancelled", onLibraryChangedFn); } Object.assign(ItemPage.prototype, _baseview.default.prototype), (ItemPage.prototype.onInputCommand = function (e) { var command = e.detail.command; switch (command) { case "play": return ( playCurrentItem(this, "resume"), e.preventDefault(), void e.stopPropagation() ); case "delete": return ( onDeleteClick.call(this), e.preventDefault(), void e.stopPropagation() ); case "record": return ( executeCommandWithCommandProcessor(command, this.currentItem, { positionTo: e.target, }), e.preventDefault(), void e.stopPropagation() ); } _baseview.default.prototype.onInputCommand.apply(this, arguments); }), (ItemPage.prototype.onBeginResume = function (options) { _baseview.default.prototype.onBeginResume.apply(this, arguments), _layoutmanager.default.tv ? skinHeader.classList.add("detailHeader-noIcons") : skinHeader.classList.remove("detailHeader-noIcons"), startDataLoad(this); }), (ItemPage.prototype.onResume = function (options) { this.showItemOnResume && ((newItem = this.showItemOnResume), _approuter.default.replaceState( _approuter.default.getRouteUrl(newItem, {}), {}, !0, ), (this.showItemOnResume = null)), _baseview.default.prototype.onResume.apply(this, arguments), (this.itemShowDispatched = null); var newItem = this.view, onPlayerChangeFn = this.playerChangeFn, onPlayerChangeFn = (onPlayerChangeFn && _events.default.on( _playbackmanager.default, "playerchange", onPlayerChangeFn, ), this.playbackStopFn), onPlayerChangeFn = (onPlayerChangeFn && _events.default.on( _playbackmanager.default, "playbackstop", onPlayerChangeFn, ), options.refresh || this._fullReloadOnResume); (this._fullReloadOnResume = !1), reloadItem(this, onPlayerChangeFn, !1), onPlayerChangeFn || (renderTrackSelectionsWithoutUser( newItem, this, (onPlayerChangeFn = this.currentItem), !0, ), setTrailerButtonVisibility(newItem, onPlayerChangeFn)), (this._fullReloadOnResume = !1), this.updateDrawerState(); }), (ItemPage.prototype.updateDrawerState = function () { onNavDrawerStateChange.call(this, {}, _navdrawer.default.drawerState); }), (ItemPage.prototype.onPause = function (options) { _baseview.default.prototype.onPause.apply(this, arguments); for ( var onPlayerChangeFn = this.playerChangeFn, onPlayerChangeFn = (onPlayerChangeFn && _events.default.off( _playbackmanager.default, "playerchange", onPlayerChangeFn, ), this.playbackStopFn), onPlayerChangeFn = (onPlayerChangeFn && _events.default.off( _playbackmanager.default, "playbackstopped", onPlayerChangeFn, ), this.onNavDrawerStateChangeFn && _events.default.off( _navdrawer.default, "drawer-state-change", this.onNavDrawerStateChangeFn, ), this.view), containers = onPlayerChangeFn.querySelectorAll( ".generalItemsContainer", ), i = 0, length = containers.length; i < length; i++ ) containers[i].pause(); (null != (onPlayerChangeFn = options.event) && null != (onPlayerChangeFn = onPlayerChangeFn.detail) && onPlayerChangeFn.newView.classList.contains("itemView")) || drawerElement.classList.remove("darkContentContainer"), this.recordingEditor && this.recordingEditor.pause(); }), (ItemPage.prototype.enableTransitions = function () { return !0; }), (ItemPage.prototype.destroy = function () { var onLibraryChangedFn = this.onLibraryChangedFn, onLibraryChangedFn = (onLibraryChangedFn && _events.default.off( _api.default, "LibraryChanged", onLibraryChangedFn, ), (this.onLibraryChangedFn = null), this.onUserDataChangedFn), onLibraryChangedFn = (onLibraryChangedFn && _events.default.off( _api.default, "UserDataChanged", onLibraryChangedFn, ), (this.onUserDataChangedFn = null), this.onTimerCancelledFn); onLibraryChangedFn && _events.default.off(_api.default, "TimerCancelled", onLibraryChangedFn), (this.onTimerCancelledFn = null), _baseview.default.prototype.destroy.apply(this, arguments), (this.onNavDrawerStateChangeFn = null), (this.playerChangeFn = null), (this.playbackStopFn = null), (this.currentItem = null), (this._currentPlaybackMediaSources = null), this.currentRecordingFields && (this.currentRecordingFields.destroy(), (this.currentRecordingFields = null)), this.recordingEditor && (this.recordingEditor.destroy(), (this.recordingEditor = null)), (this.topDetailsContainer = null), (this.mainSection = null), (this.trackSelectionsContainer = null), (this.detailSelectSeason = null), (this.seasonTabs = null), (this.seasonItems = null), (this.params = null), (this.dataPromise = null); }), (_exports.default = ItemPage); });