import connectionManager from"./../emby-apiclient/connectionmanager.js";import events from"./../emby-apiclient/events.js";import textEncoding from"./../common/textencoding.js";import globalize from"./../common/globalize.js";import datetime from"./../common/datetime.js";import itemManager from"./../common/itemmanager/itemmanager.js";import playbackManager from"./../common/playback/playbackmanager.js";import dom from"./../dom.js";import browser from"./../browser.js";import focusManager from"./../focusmanager.js";import layoutManager from"./../layoutmanager.js";import mediaInfo from"./../mediainfo/mediainfo.js";import dataFormatter from"./../common/dataformatter.js";import indicators from"./../indicators/indicators.js";import itemShortcuts from"./../shortcuts.js";import{appHost}from"./../common/servicelocator.js";import imageLoader from"./../common/imagehelper.js";import lazyImageLoader from"./../lazyloader/lazyimageloader.js";import EmbyPlaystateButton from"./../emby-elements/userdatabuttons/emby-playstatebutton.js";import EmbyRatingButton from"./../emby-elements/userdatabuttons/emby-ratingbutton.js";import"./../emby-elements/emby-button/paper-icon-button-light.js";import userSettings from"./../common/usersettings/usersettings.js";let SupportsCssAspectRatio=CSS.supports("aspect-ratio","16 / 9"),supportsAsyncDecodedImages=(SupportsCssAspectRatio||require(["css!modules/cardbuilder/cardpadder_legacy.css"]),require(["css!modules/cardbuilder/card.css","programStyles"]),dom.supportsAsyncDecodedImages()),decodingAttribute=supportsAsyncDecodedImages?' decoding="async"':"",supportsObjectFit=CSS.supports("object-fit","contain")&&!browser.edge,supportsCssVariables=CSS.supports("color","var(--fake-var)"),supportsCalc=CSS.supports("width","min(45.2%,calc(100% - .65em))"),supportsMin=CSS.supports("width","min(10em, 5vw)"),EnableFocusTransfrom=dom.allowFocusScaling(),supportsNativeLazyLoading="loading"in HTMLImageElement.prototype,refreshIndicatorLoaded;function loadRefreshIndicator(){refreshIndicatorLoaded||(refreshIndicatorLoaded=!0,Emby.importModule("./modules/emby-elements/emby-itemrefreshindicator/emby-itemrefreshindicator.js"))}let embyCheckboxLoaded;function loadEmbyCheckbox(){embyCheckboxLoaded||(embyCheckboxLoaded=!0,Emby.importModule("./modules/emby-elements/emby-checkbox/emby-checkbox.js"))}function getItemsHtml(items,options){return buildCardsHtmlInternal(items=1===arguments.length?(options=arguments[0]).items:items,options)}let cachedWidths={};function getImageWidth(shape,cardClass,cardBoxClass,cardContentClass,options,screenWidth){options.sideFooter&&(cardClass+=" withsidefooter"),options.imageWidthTestClass&&(cardClass+=" "+options.imageWidthTestClass);var cardSize=options.cardSize;let key=cardClass+screenWidth+cardSize;switch(cardSize){case"":case"normal":case"default":break;default:key+="-"+cardSize}screenWidth=layoutManager.tv;screenWidth&&(key+="-tv");let width=cachedWidths[key];if(!width){console.log("getImageWidth: "+key);var div=document.createElement("div");let itemsContainerClass="itemsContainer padded-left padded-right";screenWidth&&(itemsContainerClass+=" itemsContainer-tv"),div.className=itemsContainerClass,options.cardSize&&setUserPreferredSize(div,options.cardSize),div.style.visibility="hidden",div.innerHTML=options.sideFooter?'
':'';screenWidth=document.body;screenWidth.appendChild(div),width=options.sideFooter?cachedWidths[key]=div.querySelector(".cardImageContainer").offsetWidth||400:cachedWidths[key]=div.querySelector(".cardScalable").offsetWidth||400,screenWidth.removeChild(div),console.log("card width: "+width+" - "+cardClass)}return width}function isResizable(windowWidth){var screen=window.screen;if(screen&&20'),options.PersonRole&&lines.push(""),options.ChapterTime&&lines.push(""),options.ChannelName&&lines.push(""),options.LastServerAddress&&lines.push(""),options.Overview&&lines.push(getOverviewText("")),options.MediaInfo&&lines.push(""),options.Album&&lines.push(""),options.Type&&lines.push(""),options.LastActivityDateRelative&&lines.push(""),options.DateCreated&&lines.push(""),options.DateModified&&lines.push(""),options.Version&&lines.push(""),options.Url&&lines.push(""),options.InstalledVersion&&lines.push(""),options.ItemImageName&&lines.push(""),options.Filename&&lines.push(""),options.FilenameOrName&&lines.push(""),(options.Size||options.Container||options.Bitrate)&&lines.push(""),options.Resolution&&lines.push(""),options.ParentName&&lines.push(""),options.CollectionType&&lines.push(""),options.LibraryFolders&&lines.push(""),options.AppNameVersion&&lines.push(""),options.AppName&&lines.push(""),options.DeviceUserInfo&&lines.push(""),options.CurrentProgramTime&&lines.push(""),options.CurrentProgramParentName&&lines.push(""),options.CurrentProgramParentNameOrName&&lines.push(""),options.CurrentProgramName&&lines.push(""),options.SeriesTimerChannel&&lines.push(""),options.SeriesTimerTime&&lines.push(""),options.ImageEditorStandardButtons&&lines.push(""),options.ImageEditorBackdropButtons&&lines.push(""),options.IpAddress&&lines.push(""),options.Genres&&lines.push(""),options.Tags&&lines.push(""),options.Studios&&lines.push(""),options.SessionNowPlayingInfo&&(lines.push(""),lines.push(""),lines.push("")),options.AirTime&&lines.push(""),options.AccessToken&&lines.push(""),options.DownloadableImageInfo&&(lines.push(""),lines.push("")),lines}function getPlayAction(item,options){return item.IsFolder?"resume":"Photo"===item.MediaType?"playallfromhere":options.playAction}function setListOptions(items,options){null==options.isBoundListItem&&(options.isBoundListItem=!0),options.rtl="rtl"===document.dir,options.loadingLazyAttribute=' loading="lazy"',options.cardSize&&"default"!==options.cardSize||(options.cardSize=userSettings.cardSize()),options.itemSelector=".card",options.playAction||(options.playAction="playallfromhere"===options.action?"playallfromhere":"play"),options.imageFallback=!1!==options.imageFallback;let shape=options.shape||"auto";options.sideFooter&&(shape="banner",options.textLinks=!1),options.fields||(options.fields=[]);var fieldMap={};let i,length;for(i=0,length=options.fields.length;i':""),outerFooterClass=(cardPadderClass=cardPadderClass.join(" "),innerCardFooterClass=innerCardFooterClass.join(" "),autoShape||"none"===options.action?innerHTML+='':innerHTML+='',"cardFooter"),fixedAttributes=(options.vibrant&&(outerFooterClass+=" cardFooter-vibrant"),options.outerFooterClass=outerFooterClass,options.cardLayout&&(innerHTML+='"),options.enableCardBox&&(innerHTML+=""),null==options.defaultIcon&&(options.sideFooter||options.lines||fieldMap.Name?options.defaultIcon=!0:options.defaultIcon=!1),options.moreTitle=globalize.translate("More"),options.multiSelectTitle=globalize.translate("MultiSelect"),options.multiSelect=!1!==options.multiSelect&&!items,options.multiSelect&&loadEmbyCheckbox(),options.enableUserData=!1!==options.enableUserData,"");options.addTabIndex&&(fixedAttributes+=' tabindex="0"'),options.anyDraggable&&(fixedAttributes+=' draggable="true"'),"button"===tagName&&(fixedAttributes+=' type="button"'),options.fixedAttributes=fixedAttributes.trim(),options.templateInnerHTML=innerHTML,options.cardPadderClass=cardPadderClass,options.innerCardFooterClass=innerCardFooterClass,options.tagName=tagName,options.shape=shape,options.imageShape=imageShape,options.className=className,options.isSingleClickElement=autoShape,options.cardContentClass=cardContentClass,options.cardBoxClass=cardBoxClass}function buildCardsHtmlInternal(items,options){setListOptions(items,options);let html="",itemsInRow=0,hasOpenRow;var rows=options.rowCount;for(let i=0,length=items.length;i",hasOpenRow=!1),html+='',hasOpenRow=!0),html+=getCardHtml(item,i,options),itemsInRow++,rows&&itemsInRow>=rows&&(html+="
",hasOpenRow=!1,itemsInRow=0)}return hasOpenRow&&(html+=""),html}function getCardTextLines(lines,cssClass,forceLines,isOuterFooter,maxLines,options){let html="",valid=0,i,length,currentCssClass=(isOuterFooter||(cssClass+=" innerFooter-cardText"),cssClass);for(i=0,length=lines.length;i')+text+"",valid++,maxLines)&&valid>=maxLines)break}if(forceLines)for(length=maxLines||Math.min(lines.length,maxLines||lines.length);valid ',valid++;return html}function isUsingLiveTvNaming(itemType){return"Program"===itemType||"Timer"===itemType||"Recording"===itemType}function getAirTimeText(item,showAirDateTime,showAirEndTime){let airTimeText="";if(item.StartDate)try{var date=new Date(Date.parse(item.StartDate));showAirDateTime&&(airTimeText+=datetime.toLocaleDateString(date,{weekday:"short",month:"short",day:"numeric"})+" "),airTimeText+=datetime.getDisplayTime(date),item.EndDate&&showAirEndTime&&(date=new Date(Date.parse(item.EndDate)),airTimeText+=" – "+datetime.getDisplayTime(date))}catch(e){console.log("Error parsing date: "+item.StartDate)}return airTimeText}function getImageDownloadInfoFirstLine(item){let text="";var lang=item.DisplayLanguage||item.Language;return item.Width&&item.Height?(text+=item.Width+"x"+item.Height,lang&&(text+=" - "+lang)):lang&&(text+=lang),text}function getImageDownloadInfoSecondLine(item){let text;return"Likes"===item.RatingType?text=1===item.CommunityRating?globalize.translate("OneLike"):globalize.translate("LikeCountValue",item.CommunityRating):item.CommunityRating?(text=dataFormatter.numberToString(item.CommunityRating,1),item.VoteCount&&(text+=" - "+(1===item.VoteCount?globalize.translate("OneVote"):globalize.translate("VoteCountValue",item.VoteCount)))):text=globalize.translate("Unrated"),text}function getImageEditorButtons(item,options){let html="";var searchText;return item.Providers.length&&(searchText=item.ImageTag?globalize.translate("HeaderSearchNewImage"):globalize.translate("HeaderSearchForAnImage"),html+=''),item.ImageTag||appHost.supports("fileinput")&&(html+=''),item.ImageTag&&(html+=''),html}function getImageEditorBackdropButtons(item,options){var html="";return html+=''}function addSessionNowPlayingInfo(lines,item){var playstate=item.PlayState,item=item.NowPlayingItem||{};lines.push(item.SeriesName||item.Name),"Episode"===item.Type?lines.push(itemManager.getDisplayName(item,{includeParentInfo:!0})):item.ArtistItems&&item.ArtistItems.length?lines.push(item.ArtistItems[0].Name):item.ProductionYear&&lines.push(item.ProductionYear),item.RunTimeTicks&&lines.push(datetime.getDisplayRunningTime(playstate.PositionTicks||0)+" / "+datetime.getDisplayRunningTime(item.RunTimeTicks))}function getOverviewText(text){var html='';return{html:html+textEncoding.htmlEncode(text||"")+"
"}}function getTextLinksLine(options,item,linkItems,linkItemType,limit){linkItems=linkItems||[];let html="";for(let i=0,length=limit=Math.min(linkItems.length,limit);i'+html+""}function getCardFooterText(item,itemController,options,fieldMap,imgUrl,footerClass,progressHtml,logoUrl,isOuterFooter){var itemType=item.Type;let html="",lines=(logoUrl&&(html+=''),[]),parentTitleUnderneath;switch(itemType){case"MusicAlbum":case"Audio":case"MusicVideo":case"Game":case"Photo":parentTitleUnderneath=!0}let titleAdded;var serverId=item.ServerId||options.serverId;fieldMap.Album&&options.albumFirst&&(isOuterFooter&&item.AlbumId&&item.Album?lines.push(getTextActionButton(options,{Id:item.AlbumId,ServerId:serverId,Name:item.Album,Type:"MusicAlbum",IsFolder:!0})):lines.push(item.Album||"")),!fieldMap.ParentName&&!fieldMap.ParentNameOrName||parentTitleUnderneath||(isOuterFooter&&"Episode"===itemType&&item.SeriesName?item.SeriesId?lines.push(getTextActionButton(options,{Id:item.SeriesId,ServerId:serverId,Name:item.SeriesName,Type:"Series",IsFolder:!0})):lines.push(textEncoding.htmlEncode(item.SeriesName)):isUsingLiveTvNaming(itemType)?(lines.push(textEncoding.htmlEncode(item.Name)),item.EpisodeTitle||(titleAdded=!0)):((parentTitle=item.SeriesName||item.Series||item.Album||(item.AlbumArtist?item.AlbumArtist.Name||item.AlbumArtist:null)||item.GameSystem||"")||fieldMap.Name)&&lines.push(textEncoding.htmlEncode(parentTitle)));let showMediaTitle=fieldMap.Name&&!titleAdded||fieldMap.ParentNameOrName&&!lines.length;if((showMediaTitle=showMediaTitle||titleAdded||!fieldMap.Name?showMediaTitle:!0)&&(parentTitle=itemController.getDisplayName(item,{includeParentInfo:options.includeParentInfoInTitle,channelNumberFirst:options.channelNumberFirst}))&&(isOuterFooter?lines.push(getTextActionButton(options,item,parentTitle,serverId,options.parentId,!0)):lines.push(textEncoding.htmlEncode(parentTitle))),fieldMap.Type&&lines.push(itemController.getItemTypeName(itemType)),fieldMap.ParentName&&parentTitleUnderneath&&(isOuterFooter&&item.AlbumArtists&&item.AlbumArtists.length&&"MusicAlbum"===itemType?(item.AlbumArtists[0].Type="MusicArtist",item.AlbumArtists[0].IsFolder=!0,lines.push(getTextActionButton(options,item.AlbumArtists[0],null,serverId))):isOuterFooter&&item.ArtistItems&&item.ArtistItems.length?(item.ArtistItems[0].Type="MusicArtist",item.ArtistItems[0].IsFolder=!0,lines.push(getTextActionButton(options,item.ArtistItems[0],null,serverId))):isOuterFooter&&item.AlbumArtists&&item.AlbumArtists.length?(item.AlbumArtists[0].Type="MusicArtist",item.AlbumArtists[0].IsFolder=!0,lines.push(getTextActionButton(options,item.AlbumArtists[0],null,serverId))):isOuterFooter&&item.GameSystem&&item.GameSystemId?lines.push(getTextActionButton(options,{Id:item.GameSystemId,ServerId:serverId,Name:item.GameSystem,Type:"GameSystem",IsFolder:!0})):lines.push(textEncoding.htmlEncode(isUsingLiveTvNaming(itemType)?item.Name:item.SeriesName||item.Series||item.Album||(item.AlbumArtist?item.AlbumArtist.Name||item.AlbumArtist:null)||item.GameSystem||""))),options.textLines){var additionalLines=options.textLines(item);for(let i=0,length=additionalLines.length;i'+lineParts.join("")+"")),fieldMap.ProductionYear),showCriticRating=fieldMap.OfficialRating,showRuntime=fieldMap.Runtime;if(parentTitle||showCriticRating||showRuntime){let lineParts=[];parentTitle&&("Series"===itemType?"Continuing"===item.Status?item.ProductionYear&&lineParts.push(globalize.translate("SeriesYearToPresent",item.ProductionYear||"")):(parentTitle=item.EndDate?new Date(Date.parse(item.EndDate)).getFullYear():null)&&item.ProductionYear&&parentTitle!==item.ProductionYear?lineParts.push(item.ProductionYear+" – "+parentTitle):item.ProductionYear&&lineParts.push(item.ProductionYear):item.ProductionYear&&lineParts.push(item.ProductionYear)),showRuntime&&item.RunTimeTicks&&lineParts.push(datetime.getHumanReadableRuntime(item.RunTimeTicks)),showCriticRating&&item.OfficialRating&&lineParts.push(item.OfficialRating),lines.push(lineParts.join(" "))}if(fieldMap.Genres)if(item.GenreItems?.length){let genreType;switch(itemType){case"Audio":case"MusicAlbum":case"MusicArtist":case"MusicVideo":genreType="MusiGenre";break;case"Game":case"GameSystem":genreType="GameGenre";break;default:genreType="Genre"}lines.push(getTextLinksLine(options,item,item.GenreItems,genreType,2))}else emptyLines.push('
');if(fieldMap.Studios&&(item.Studios?.length?lines.push(getTextLinksLine(options,item,item.Studios,"Studio",1)):emptyLines.push('
')),fieldMap.Tags&&(item.TagItems?.length?lines.push(getTextLinksLine(options,item,item.TagItems,"Tag",2)):emptyLines.push('
')),fieldMap.AirTime&&lines.push(getAirTimeText(item,options.showAirDateTime,options.showAirEndTime)||""),fieldMap.ChannelName&&(item.ChannelId?lines.push(getTextActionButton(options,{Id:item.ChannelId,ServerId:serverId,Name:item.ChannelName,ChannelNumber:item.ChannelNumber,Type:"TvChannel",MediaType:item.MediaType,IsFolder:!1})):lines.push(item.ChannelName||" ")),fieldMap.CurrentProgramParentName&&lines.push(item.CurrentProgram?.Name||""),fieldMap.CurrentProgramParentNameOrName){let name=item.CurrentProgram?.Name||itemController.getDisplayName(item,{includeParentInfo:options.includeParentInfoInTitle,channelNumberFirst:options.channelNumberFirst});lines.push(textEncoding.htmlEncode(name||""))}if(fieldMap.CurrentProgramName&&lines.push(item.CurrentProgram?.EpisodeTitle||""),fieldMap.CurrentProgramTime&&(item.CurrentProgram?lines.push(getAirTimeText(item.CurrentProgram,!1,!0)||""):lines.push("")),fieldMap.SeriesTimerTime&&(item.RecordAnyTime?lines.push(globalize.translate("Anytime")):item.StartDate?lines.push(datetime.getDisplayTime(item.StartDate)):lines.push("")),fieldMap.SeriesTimerChannel&&(item.RecordAnyChannel||!item.ChannelIds?.length?lines.push(globalize.translate("AllChannels")):1'+mediaInfo.getPrimaryMediaInfoHtml(item,{episodeTitle:!1,subtitles:!1,endsAt:!1})+""}),fieldMap.Overview&&lines.push(getOverviewText(item.Overview)),(fieldMap.Container||fieldMap.Size||fieldMap.Bitrate)&&(lineParts=[],fieldMap.Container&&item.Container&&lineParts.push(item.Container.toUpperCase()),fieldMap.Size&&item.Size&&(parentTitle=dataFormatter.sizeToString(item.Size))&&lineParts.push(parentTitle),fieldMap.Bitrate&&item.Bitrate&&lineParts.push(dataFormatter.bitrateToString(item.Bitrate)),lines.push(lineParts.join(" ")||" ")),fieldMap.Resolution){let containerInfo=[];fieldMap.Resolution&&item.Width&&item.Height&&(showRuntime=dataFormatter.getResolutionText(item))&&containerInfo.push(showRuntime),lines.push(containerInfo.join(" ")||" ")}if(fieldMap.DownloadableImageInfo&&(lines.push(getImageDownloadInfoFirstLine(item)||""),lines.push(getImageDownloadInfoSecondLine(item)||"")),fieldMap.DateModified&&lines.push(itemController.resolveField(item,"DateModified")),fieldMap.DeviceUserInfo){let deviceHtml="";item.LastUserName&&(item.LastUserId?deviceHtml+=getTextActionButton(options,{Id:item.LastUserId,Name:item.LastUserName,ServerId:serverId,Type:"User"},item.LastUserName+", "+dataFormatter.formatRelativeTime(item.DateLastActivity),null,null):item.LastUserName&&(deviceHtml+=item.LastUserName+", "+dataFormatter.formatRelativeTime(item.DateLastActivity))),lines.push(deviceHtml)}return fieldMap.IpAddress&&lines.push(item.IpAddress||""),fieldMap.MediaStreamInfo&&mediaInfo.pushMediaStreamLines(item,options,lines,itemController.getDefaultIcon(item)),fieldMap.ImageEditorStandardButtons&&lines.push(getImageEditorButtons(item,options)),fieldMap.ImageEditorBackdropButtons&&lines.push(getImageEditorBackdropButtons(item,options)),fieldMap.SessionNowPlayingInfo&&addSessionNowPlayingInfo(lines,item),fieldMap.LastServerAddress&&("Server"===item.Type?(showCriticRating=connectionManager.getApiClient(item),lines.push(showCriticRating&&showCriticRating.serverAddress()||"")):lines.push("")),lines=lines.concat(emptyLines),html+=getCardTextLines(lines,options.cardTextCssClass,isOuterFooter,isOuterFooter,options.lines,options),progressHtml&&(html+=progressHtml),html&&(!isOuterFooter||logoUrl||options.cardLayout)&&(html='"),html}function getTextActionButton(options,item,text,serverId,parentId,isSameItemAsCard){if(text=text||itemManager.getDisplayName(item),layoutManager.tv)return textEncoding.htmlEncode(text);if(!1===options.textLinks||!item.Id)return textEncoding.htmlEncode(text);text=textEncoding.htmlEncode(text);let dataAttributes,action;action=isSameItemAsCard?(dataAttributes="",options.linkButtonAction||"link"):(dataAttributes=itemShortcuts.getShortcutAttributesHtml(item,{serverId:serverId,parentId:parentId,isBoundListItem:options.isBoundListItem&&isSameItemAsCard}),"link");item=!options.anyDraggable||isSameItemAsCard?"":' draggable="true"',serverId='"}function getActiveSessionUserSectionHtml(item,apiClient){let html="";if(item.UserId){html+='"}return html}function getActiveSessionVideoInfoHtml(item){let html="";var playstate=item.PlayState||{},mediaStreams=(item.NowPlayingItem||{}).MediaStreams||[],videoStreamIndex=playstate.VideoStreamIndex,playstate=item.TranscodingInfo||{};let mediaStream;for(let i=0,length=mediaStreams.length;i