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
91%
'),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+='
'),innerHTML+=lines,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,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+='
";var names=[];item.UserId&&names.push(item.UserName);for(let i=0,length=item.AdditionalUsers.length;i'),html=html+("
"+names.join(", ")+"
")+"
"}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'+'
')+globalize.translate("Video"))+"
"+"
",mediaStream.DisplayTitle&&(html=(html+='
')+textEncoding.htmlEncode(mediaStream.DisplayTitle),playstate.VideoDecoderHwAccel&&(html+=''),html+="
"),html=html+'
'+'',!1===playstate.IsVideoDirect?(html=(html=html+globalize.translate("Transcode")+" (")+(playstate.VideoCodec||"").toUpperCase()+" ",playstate.VideoBitrate&&(html+=dataFormatter.bitrateToString(playstate.VideoBitrate)),html+=")",playstate.VideoEncoderHwAccel&&(html+='')):html+=globalize.translate("HeaderDirectPlay"),html+="
",!1===playstate.IsVideoDirect){var pipeline=playstate.VideoPipelineInfo||[];for(let i=0,length=pipeline.length;i',"ToneMapping"===step.StepType?html+=globalize.translate("HeaderToneMapping"):"Deinterlace"===step.StepType?html+=globalize.translate("Deinterlacing"):"SubTitleBurnIn"!==step.StepType&&"SubtitleOverlay"!==step.StepType||(html+=globalize.translate("HeaderBurningInSubtitles")),extra=[],step.ParamShort?extra.push(step.ParamShort):step.Param?"Subtitles"!==step.Param&&extra.push(step.Param):step.FfmpegOptions&&extra.push(step.FfmpegOptions),extra.length&&(html+=' ('+extra.join(" ")+")"),html+="
")}}html=html+""+""}return html}function getActiveSessionAudioInfoHtml(item){let html="";var playstate=item.PlayState||{},mediaStreams=(item.NowPlayingItem||{}).MediaStreams||[],audioStreamIndex=playstate.AudioStreamIndex,playstate=item.TranscodingInfo||{};let mediaStream;for(let i=0,length=mediaStreams.length;i
')+globalize.translate("Audio"))+"
",html=(html=mediaStream.DisplayTitle?(html+="
")+textEncoding.htmlEncode(mediaStream.DisplayTitle)+"
":html)+'
',!1===playstate.IsAudioDirect?(html=(html=html+globalize.translate("Transcode")+" (")+(playstate.AudioCodec||"").toUpperCase()+" ",playstate.AudioBitrate&&(html+=dataFormatter.bitrateToString(playstate.AudioBitrate)),html+=")"):html+=globalize.translate("HeaderDirectPlay"),html=(html+="
")+"
"),html}function getActiveSessionStreamInfoHtml(item){let html="";var playstate=item.PlayState||{},nowplayingItem=item.NowPlayingItem||{},item=item.TranscodingInfo||{};if(html=(html=(html=html+'
'+'
')+globalize.translate("Stream"))+"
"+"
",nowplayingItem.Container&&(html=(html+="
")+nowplayingItem.Container.toUpperCase(),nowplayingItem.Bitrate&&(html+=" ("+dataFormatter.bitrateToString(nowplayingItem.Bitrate)+")"),html+="
"),html=html+"
"+'',"Transcode"===playstate.PlayMethod){nowplayingItem=[];if(item.SubProtocol&&"progressive"!==item.SubProtocol?nowplayingItem.push(item.SubProtocol.toUpperCase()):item.Container&&nowplayingItem.push(item.Container.toUpperCase()),item.Bitrate){let bitrateInfo="(";item.Bitrate&&(bitrateInfo+=dataFormatter.bitrateToString(item.Bitrate)),item.Framerate&&(bitrateInfo+=" "+dataFormatter.numberToString(item.Framerate,3)+" fps"),bitrateInfo+=")",nowplayingItem.push(bitrateInfo)}item.CurrentThrottle&&nowplayingItem.push('Throttling'),html+=nowplayingItem.join(" ")}else html+=globalize.translate("HeaderDirectPlay");html+="
";var transcodeReasons=item.TranscodeReasons||[];for(let i=0,length=transcodeReasons.length;i")+globalize.translate(transcodeReasons[i])+"
";return html=html+"
"+""}function getActiveSessionDeviceInfoHtml(item,apiClient){let html="";if(item.NowPlayingItem){html+='
";var shape,imageUrl=item.AppIconUrl;let imgClass="secondaryText activeSession-deviceimage";html=imageUrl?(imgClass+=" activeSession-deviceimage-bg",shape=imageLoader.getShapeFromAspect(1),imgClass+=" activeSession-deviceimage-bg-"+shape,html+('
'):(html=(html=html+('
')+itemManager.getDefaultIcon(item))+"
",html+="
",item.Client&&(html=(html+="
")+textEncoding.htmlEncode(item.Client+" "+item.ApplicationVersion)+"
"),item.DeviceName&&(html=(html+='
')+textEncoding.htmlEncode(item.DeviceName)+"
"),item.RemoteEndPoint&&(html=(html+='
')+item.RemoteEndPoint,(shape=(item.Protocol||"").toLowerCase())&&(html+=" "+shape),shape.includes("https")&&(html+='https'),html+="
"),html=html+"
"+"
"}return html}function getActiveSessionCommandsSectionHtml(options,item){let html="";return options.isSingleClickElement||item.DeviceId===connectionManager.deviceId()||(item.ServerId&&item.NowPlayingItem&&item.SupportsRemoteControl&&(options=item.PlayState&&item.PlayState.IsPaused?"":"",html=(html+='")+''),item.ServerId&&item.SupportedCommands.includes("DisplayMessage")&&item.DeviceId!==connectionManager.deviceId()&&(html+=''),html&&(html='
'+html,html+="
")),html}function getActiveSessionFooterHtml(options,item,apiClient){var html="";return(html+='
')+getActiveSessionDeviceInfoHtml(item,apiClient)+getActiveSessionStreamInfoHtml(item)+getActiveSessionVideoInfoHtml(item)+getActiveSessionAudioInfoHtml(item)+getActiveSessionUserSectionHtml(item,apiClient)+getActiveSessionCommandsSectionHtml(options,item)+"
"}function getProgramIndicators(item){let html="";return(item=item.CurrentProgram||item).IsLive?html+='
'+globalize.translate("Live")+"
":item.IsPremiere?html+='
'+globalize.translate("Premiere")+"
":item.IsNew&&(html+='
'+globalize.translate("New")+"
"),html}function getInnerFooterFieldMap(options,fieldMap,overlayText,forceName){return overlayText?!forceName||fieldMap.Name||fieldMap.ParentNameOrName||fieldMap.ParentName?fieldMap:options.fieldMapWithForceName:!forceName||fieldMap.Name||fieldMap.ParentNameOrName||fieldMap.ParentName?{}:{ParentNameOrName:!0}}function getAction(itemType,isFolder,options){let action=options.action||"link";switch(action){case"play":isFolder&&(action="playallfromhere");break;case"none":break;default:switch(itemType){case"Photo":action="playallfromhere";break;case"AddServer":case"EmbyConnect":case"Downloads":action="link"}}return action}function getCardHtml(item,index,options){var itemType=item.Type,isPhoto="Photo"===item.MediaType,action=getAction(itemType,item.IsFolder,options),shape=options.shape,imageShape=options.imageShape,isSingleClickElement=options.isSingleClickElement,serverId=item.ServerId||options.serverId,serverId=serverId?connectionManager.getApiClient(serverId):null;let imageItem;imageItem=options.showCurrentProgramImage?item.CurrentProgram||item:"ActiveSession"===itemType?item.NowPlayingItem:item.ProgramInfo||item;let imgInfo,vibrantImgInfo;!1!==options.image&&imageItem?(imgInfo=imageLoader.getImageUrl(imageItem,serverId,options,imageShape),blurImageOptions="large"===options.vibrantMode?{width:12,blur:2,adjustForPixelRatio:!1}:{width:1,adjustForPixelRatio:!1},vibrantImgInfo=options.vibrant?imageLoader.getImageUrl(imageItem,serverId,blurImageOptions,imageShape):null,imgInfo.imgUrl||imageItem===item||(imageItem=item,imgInfo=imageLoader.getImageUrl(imageItem,serverId,options,imageShape),vibrantImgInfo=options.vibrant?imageLoader.getImageUrl(imageItem,serverId,blurImageOptions,imageShape):null)):imgInfo={};var blurImageOptions=imgInfo.imgUrl,imageShape=(vibrantImgInfo||imgInfo).imgUrl,forceName=imgInfo.forceName&&!isPhoto,overlayText=options.overlayText,fieldMap=options.fieldMap;let cardContentClass=options.cardContentClass,cardImageClass=options.cardImageClass,coveredImageClass=!1===options.coverImage?null:imageLoader.getCoveredImageClass(imageItem,serverId,imgInfo,options.uiAspect,options.coverImage),cardBoxClass=((coveredImageClass=isPhoto&&options.ignoreUIAspect?" coveredImage coveredImage-contain":coveredImageClass)&&(cardContentClass+=coveredImageClass,cardImageClass+=coveredImageClass),options.paddedImage&&(cardImageClass+=" cardImage-padded"),item.Policy&&item.Policy.IsDisabled&&(cardContentClass+=" grayscaleImage"),options.defaultBackground||blurImageOptions||options.cardLayout||(cardContentClass+=" defaultCardBackground"),!options.round&&("MusicArtist"===itemType&&"square"===shape)&&(cardContentClass+=" cardContent-round"),options.cardBoxClass);options.playQueueIndicator&&item.PlaylistItemId&&(playbackManager.currentItem()||{}).PlaylistItemId===item.PlaylistItemId&&(cardBoxClass+=" activePlaylistCardBox");let footerCssClass,progressHtml=!1===options.progress?null:indicators.getProgressBarHtml(item,{containerClass:"cardProgressBarContainer",animated:!1}),innerCardFooter="",logoUrl;options.showChannelLogo&&item.ChannelPrimaryImageTag&&(logoUrl=serverId.getImageUrl(item.ChannelId,{type:"Primary",height:40,tag:item.ChannelPrimaryImageTag})),!1===options.programIndicators||"Program"!==itemType&&"Timer"!==itemType&&"TvChannel"!==itemType||(progressHtml=getProgramIndicators(item)+(progressHtml||""));isPhoto=itemManager.getItemController(itemType);overlayText||forceName?(logoUrl=null,footerCssClass=options.innerCardFooterClass,shape=getInnerFooterFieldMap(options,fieldMap,overlayText,forceName),innerCardFooter+=getCardFooterText(item,isPhoto,options,shape,blurImageOptions,footerCssClass,progressHtml,logoUrl,!1),progressHtml=""):progressHtml&&(innerCardFooter=(innerCardFooter+='
')+progressHtml+"
",progressHtml="");let outerCardFooter="";if(!overlayText&&(footerCssClass=options.cardLayout?options.outerFooterClass:"cardFooter cardFooter-transparent",options.sideFooter&&(footerCssClass+=" cardFooter-side"),logoUrl&&(footerCssClass+=" cardFooter-withlogo"),options.vibrant&&imageShape&&"large"!==options.vibrantMode&&(footerCssClass+=" darkContentContainer"),options.cardLayout||(logoUrl=null),outerCardFooter=getCardFooterText(item,isPhoto,options,fieldMap,blurImageOptions,footerCssClass,progressHtml,logoUrl,!0),options.sideFooter)){let cardFooterContentClass="cardFooterContent";options.centerText||(cardFooterContentClass+=" cardFooterContent-start"),outerCardFooter='
'+outerCardFooter+"
","ActiveSession"===itemType&&(outerCardFooter+=getActiveSessionFooterHtml(options,item,serverId))}let cardImageContainerOpen,cardImageContainerClose="";if(options.sideFooter||(cardContentClass+=" "+options.cardPadderClass),cardImageContainerClose=isSingleClickElement?(cardImageContainerOpen=blurImageOptions?2===options.lazy?supportsObjectFit?'
 ':'
':supportsNativeLazyLoading?'
 ':'
':'
',"
"):"none"===action?(cardImageContainerOpen=blurImageOptions?2===options.lazy?supportsObjectFit?'
 ':'
':supportsNativeLazyLoading?'
 ':'
':'
',"
"):(cardImageContainerOpen=blurImageOptions?2===options.lazy?supportsObjectFit?'"),!1===options.image&&!1===options.imageContainer&&(cardImageContainerClose="",cardImageContainerOpen=""),options.vibrant&&imageShape?("large"===options.vibrantMode&&(cardBoxClass+=" darkContentContainer"),cardImageContainerOpen='
'+cardImageContainerOpen):options.enableCardBox&&(cardImageContainerOpen='
'+cardImageContainerOpen),options.typeIndicator)switch(itemType){case"Video":cardImageContainerOpen+='';break;case"Folder":case"PhotoAlbum":cardImageContainerOpen+='';break;case"Photo":cardImageContainerOpen+=''}if(!1!==options.syncIndicator&&(100===(forceName=item.SyncPercent)?cardImageContainerOpen+='':null!=forceName&&(cardImageContainerOpen+='')),!1!==options.playedIndicator&&(cardImageContainerOpen+=indicators.getPlayedIndicatorHtml(item,"cardIndicator card")),!1!==options.timerIndicator&&(cardImageContainerOpen+=indicators.getTimerIndicator(item,"cardIndicator card")),item.Policy?.IsDisabled&&(cardImageContainerOpen+='person_off'),"CollectionFolder"===itemType||item.CollectionType){let refreshClass=item.RefreshProgress?"":"hide";options.sideFooter&&(refreshClass+=" cardRefreshIndicator-sideFooter"),layoutManager.tv||(cardImageContainerOpen+='
',loadRefreshIndicator())}else"User"===itemType&&item.ConnectLinkType&&(cardImageContainerOpen+='cloud');!blurImageOptions&&options.imageFallback&&(cardImageContainerOpen+=getCardDefaultText(item,options));let additionalCardContent;if(additionalCardContent=layoutManager.tv||!1===options.hoverMenu?"":getHoverMenuHtml(item,isPhoto,action,options,options.cardPadderClass),options.dragReorder&&(additionalCardContent+=''),options.cardParts){shape=itemShortcuts.getShortcutAttributes(item,options);options.isSingleClickElement&&shape.push({name:"data-action",value:action}),options.isVirtualList||shape.push({name:"data-index",value:index}),options.sideFooter?cardImageContainerClose+=innerCardFooter:cardImageContainerClose=innerCardFooter+cardImageContainerClose;let innerHTML=cardImageContainerOpen+cardImageContainerClose+additionalCardContent+outerCardFooter;return options.enableCardBox&&(innerHTML+="
"),{attributes:shape,html:innerHTML}}let dataAttributes=itemShortcuts.getShortcutAttributesHtml(item,options);options.isSingleClickElement&&(dataAttributes+=' data-action="'+action+'"'),options.isVirtualList||(dataAttributes+=' data-index="'+index+'"');overlayText=options.tagName,options.sideFooter?cardImageContainerClose+=innerCardFooter:cardImageContainerClose=innerCardFooter+cardImageContainerClose,fieldMap=options.fixedAttributes;fieldMap&&(dataAttributes+=" "+fieldMap);let outerHTML="<"+overlayText+dataAttributes+' class="'+options.className+'">'+cardImageContainerOpen+cardImageContainerClose+additionalCardContent+outerCardFooter;return options.enableCardBox&&(outerHTML+="
"),outerHTML+""}function getItemParts(item,index,options){return options.cardParts=!0,getCardHtml(item,index,options)}let supportsTargetBlank=appHost.supports("targetblank");function getHoverMenuHtml(item,itemController,action,options,menuClass){let html="",hasContent=!1;SupportsCssAspectRatio;html+='
';menuClass="cardOverlayButton cardOverlayButton-hover itemAction",action=item.Type;options.multiSelect&&(hasContent=!0,html+='');let overlayFabClass=menuClass+" cardOverlayFab-primary";options.rtl&&(overlayFabClass+=" cardOverlayFab-primary-rtl"),!1!==options.hoverPlayButton&&playbackManager.canPlay(item)&&(hasContent=!0,playButtonAction=getPlayAction(item,options),html+=''),options.hoverDownloadButton&&(hasContent=!0,html+=''),html+='
';var playButtonAction=item.UserData||{};return!1!==options.playedButton&&itemManager.canMarkPlayed(item)&&"CollectionFolder"!==action&&(hasContent=!0,html+=EmbyPlaystateButton.getHtml(playButtonAction.Played,menuClass,"cardOverlayButtonIcon cardOverlayButtonIcon-hover")),!1!==options.ratingButton&&itemManager.canRate(item)&&(hasContent=!0,html+=EmbyRatingButton.getHtml(playButtonAction.IsFavorite,menuClass,"cardOverlayButtonIcon cardOverlayButtonIcon-hover")),options.contextMenu&&itemController.supportsContextMenu(item)&&(hasContent=!0,html+=''),options.previewImageButton&&supportsTargetBlank&&(hasContent=!0,html+=''),hasContent?html+="
":""}function getItemImageDefaultText(item,options){return'

'+item.Name+"

"}function getCardDefaultText(item,options){var icon;return null!=options.defaultTextContent?'
'+options.defaultTextContent+"
":"ItemImage"===item.Type?getItemImageDefaultText(item,options):(icon=item.Icon||(!1===options.defaultIcon?null:itemManager.getDefaultIcon(item,options)))?options.smallSideFooter?''+icon+"":options.sideFooter?''+icon+"":''+icon+"":(icon=isUsingLiveTvNaming(item.Type)?item.Name:itemManager.getDisplayName(item,{includeParentInfo:options.includeParentInfoInTitle,channelNumberFirst:options.channelNumberFirst}),'
'+icon+"
")}function buildCards(items,options){var itemsContainer=options.itemsContainer;if(document.body.contains(itemsContainer)){var parentContainer=options.parentContainer;if(parentContainer){if(!items.length)return void parentContainer.classList.add("hide");parentContainer.classList.remove("hide")}parentContainer=buildCardsHtmlInternal(items,options);itemsContainer.innerHTML=parentContainer,itemsContainer.items=items,options.multiSelect&&(itemsContainer.enableMultiSelect?itemsContainer.enableMultiSelect(!0):itemsContainer.setAttribute("data-multiselect","true")),options.contextMenu&&(itemsContainer.enableContextMenu?itemsContainer.enableContextMenu(!0):itemsContainer.setAttribute("data-contextmenu","true")),parentContainer&&lazyImageLoader.lazyChildren(itemsContainer),options.autoFocus&&focusManager.autoFocus(itemsContainer)}}function setListClasses(elem,listOptions){elem=elem.classList;listOptions.options?.rows||(listOptions.virtualScrollLayout||"").includes("horizontal")?elem.remove("vertical-wrap"):elem.add("vertical-wrap"),elem.remove("vertical-list")}function setUserPreferredSize(element,cardSize){if(supportsCalc&&supportsMin&&supportsCssVariables){let offset=0;element&&(offset=parseInt(element.getAttribute("data-cardsizeoffset")||"0"));let value;switch(value=null!=(value=element?cardSize:value)||element&&!offset?value:userSettings.cardSize()){case"extrasmall":value=3;break;case"smaller":value=2;break;case"small":value=1;break;case"large":value=-1;break;case"larger":value=-2;break;case"extralarge":value=-3;break;case"normal":value=0;break;default:value=element&&!offset?"null":0}"number"==typeof value&&(offset&&(value+=offset,value=Math.min(3,value),value=Math.max(-3,value)),value=value.toString());try{element&&"null"===value?element.style.removeProperty("--user-cards-size-adjust"):(element||document.documentElement).style.setProperty("--user-cards-size-adjust",value)}catch(err){console.log("error in setUserPreferredSize: "+err)}}}function onUserSettingsChange(e,name,value){"cardSize"===name&&setUserPreferredSize()}events.on(connectionManager,"localusersignedin",function(){setUserPreferredSize()}),events.on(userSettings,"change",onUserSettingsChange);export default{setListOptions:setListOptions,getItemsHtml:getItemsHtml,getItemParts:getItemParts,buildCards:buildCards,virtualChunkSize:50,setListClasses:setListClasses,setUserPreferredSize:setUserPreferredSize};