1 line
No EOL
58 KiB
JavaScript
1 line
No EOL
58 KiB
JavaScript
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?'<div class="'+cardClass+'"><div class="'+cardBoxClass+'"><div class="'+cardContentClass+'"></div></div></div>':'<div class="'+cardClass+'"><div class="'+cardBoxClass+' cardScalable"></div></div>';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<screen.availWidth-windowWidth)return!0;return!1}function getTemplateLines(options){var options=options.fieldMap,lines=[];return options.Name&&lines.push(""),options.ParentNameOrName&&lines.push(""),(options.ProductionYear||options.OfficialRating||options.Runtime)&&lines.push(""),(options.CommunityRating||options.CriticRating)&&lines.push('<div class="mediaInfoItems cardMediaInfoItems"><div class="mediaInfoItem mediaInfoCriticRating cardMediaInfoItem"><div class="mediaInfoCriticRatingImage mediaInfoCriticRatingFresh" style="visibility:hidden;"></div>91%</div></div>'),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<length;i++)fieldMap[options.fields[i]]=!0;options.fieldMap=fieldMap,options.fieldMapWithForceName=Object.assign(Object.assign({},fieldMap),{ParentNameOrName:!0});var templateLines=getTemplateLines(options),autoShape=(options.lines||options.overlayText||(options.lines=templateLines.length),"auto"===shape||"autooverflow"===shape);let imageShape=shape=autoShape?imageLoader.getShape(items,options):shape,className=(options.sideFooter&&(imageShape="square"),"auto"===options.preferThumb&&("square"===imageShape?options.preferThumb=null:options.preferThumb="backdrop"===imageShape||"fourThree"===imageShape),!0===options.preferThumb&&autoShape&&(imageShape="backdrop",options.sideFooter||(shape="backdrop")),!0===options.preferLogo&&autoShape&&(imageShape="backdrop",options.sideFooter||(shape="backdrop")),options.uiAspect=imageLoader.getAspectFromShape(imageShape,options).aspect,!options.width&&options.widths&&(options.width=options.widths[imageShape]),options.horizontalGrid&&(options.rows={portrait:2,square:3,backdrop:3,fourThree:3}),options.rows&&"number"!=typeof options.rowCount&&(options.rowCount=options.rows[imageShape]),"card");shape&&(className+=" "+shape+"Card"),options.horizontal&&(className+=" card-horiz "+shape+"Card-horiz"),options.horizontalGrid&&(className+=" "+shape+"Card-xGrid",options.isVirtualList||(className+=" staticCard-xGrid")),options.cardClass&&(className+=" "+options.cardClass),options.autoWidth&&(className+=" autoWidthCard");items=layoutManager.tv,items||(className+=" card-hoverable"),options.enableFocusScaling=!1!==options.enableFocusScaling&&items&&EnableFocusTransfrom,options.enableCardBox=options.enableFocusScaling||options.cardLayout||options.sideFooter||!items||!options.isVirtualList,options.hoverMenu=!layoutManager.tv&&!1!==options.hoverMenu,autoShape=items&&!options.staticElement||!1===options.hoverMenu&&"none"!==options.action;options.enableFocusScaling&&(className+=" card-focustransform"),options.sideFooter&&(className+=" sideFooterCard",options.horizontal)&&(className+=" sideFooterCard-horiz"),options.smallSideFooter&&(className+=" smallSideFooterCard",options.horizontal)&&(className+=" smallSideFooterCard-horiz"),options.contextMenu=!1!==options.contextMenu;let tagName;autoShape?(tagName="button",className+=" itemAction card-itemAction",options.contextMenu&&(className+=" longpress")):(tagName="div",options.staticElement||(options.addTabIndex=!0)),items?(options.draggable=!1,options.anyDraggable=options.draggable,options.dropTarget=!1,options.dragReorder=!1):(options.draggable=!1!==options.draggable,options.anyDraggable=options.draggable,options.dragReorder&&options.draggable?className+=" drop-target ordered-drop-target-x":options.dropTarget&&(className+=" drop-target full-drop-target"));var lineContents=[];for(options.lines&&(lineContents.length=options.lines),i=0,length=lineContents.length;i<length;i++)lineContents[i]=templateLines[i]||" ";let cardBoxClass=((options.cardBoxClass||"")+" cardBox").trim(),cardContentClass=((options.cardContentClass||"")+" cardContent cardImageContainer").trim(),cardImageClass=((options.cardImageClass||"")+" cardImage").trim(),cardTextFirstClass=(options.sideFooter&&(cardBoxClass+=" cardBox-sideFooter",items&&(cardBoxClass+=" cardBox-sideFooter-f",cardContentClass+=" cardContent-sideFooter-f"),!0!==options.centerText)&&(options.centerText=!1),options.autoWidth&&(cardBoxClass+=" autoWidthCardBox"),null==options.centerText&&(options.centerText=!options.overlayText),options.cardTextCssClass=((options.cardTextCssClass||"")+" cardText").trim(),options.centerText||(options.cardTextCssClass+=" text-align-start"),"cardText-first");options.sideFooter||(cardTextFirstClass+=" cardText-first-padded"),layoutManager.tv&&(cardTextFirstClass+=" cardText-first-tv"),options.cardTextFirstClass=cardTextFirstClass;var lines=lineContents.length?getCardTextLines(lineContents,options.cardTextCssClass,!options.overlayText,!0,lineContents.length,options):"",cardDefaultTextClass=((options.cardDefaultTextClass||"")+" cardText cardDefaultText").trim();options.cardDefaultTextClass=cardDefaultTextClass,(options.cardLayout||options.sideFooter)&&(cardBoxClass+=" visualCardBox",cardContentClass+=" cardContent-nobr",options.vibrant)&&(cardBoxClass+=" visualCardBox-vibrant","large"===options.vibrantMode)&&(cardBoxClass+=" visualCardBox-vibrant-lg"),options.horizontalGrid&&(cardBoxClass+=" xGrid-cardBox"),items&&options.enableFocusScaling&&(cardBoxClass+=" cardBox-focustransform",!options.focusTransformTitleAdjust||"portrait"!==shape&&"square"!==shape&&"fourThree"!==shape||(cardBoxClass+=" cardBox-focustransform-titleadjust")),autoShape||!1===options.moreButton||options.staticElement||(cardBoxClass+=" cardBox-touchzoom",browser.iOS)||browser.osx||(className+=" card-autoactive"),!lineContents.length||options.overlayText||options.cardLayout||options.sideFooter||!1===options.allowBottomPadding||(options.enableCardBox?cardBoxClass+=" cardBox-bottompadded":className+=" card-bottompadded"),options.enableCardBox||(className+=" card-padded");let cardPadderClass=[],innerCardFooterClass=(options.sideFooter||cardPadderClass.push("cardPadder-"+shape),options.cardPadderClass&&cardPadderClass.push(options.cardPadderClass),["innerCardFooter"]),innerHTML=(options.innerCardFooterClass&&innerCardFooterClass.push(options.innerCardFooterClass),options.round=options.round&&"square"===shape,options.cardLayout||options.sideFooter||(cardContentClass+=" cardContent-background","black"===options.background&&(cardContentClass+=" cardContent-bg-black")),options.preferLogo&&null==options.paddedImage&&(options.paddedImage=!0),options.paddedImage&&(cardContentClass+=" paddedImage"),options.defaultBackground&&!options.cardLayout&&(cardContentClass+=" defaultCardBackground"),options.imageClass&&(cardContentClass+=" "+options.imageClass),options.sideFooter&&(cardContentClass+=" cardImageContainer-sideFooter",options.smallSideFooter)&&(cardContentClass+=" cardImageContainer-smallSideFooter"),options.round&&(cardContentClass+=" cardContent-round"),options.enableFocusScaling||options.sideFooter||(autoShape||options.action,items?(options.cardLayout?cardBoxClass+=" cardContent-bxsborder":cardContentClass+=" cardContent-bxsborder",cardImageClass+=" cardImage-bxsborder"):(cardContentClass+=" cardContent-bxsborder-fv",cardImageClass+=" cardImage-bxsborder-fv")),options.cardImageClass=cardImageClass,options.width||(cardDefaultTextClass=dom.getWindowSize().innerWidth,options.width=getImageWidth(imageShape,className,cardBoxClass,cardContentClass,options,cardDefaultTextClass),isResizable(cardDefaultTextClass)&&(options.width=50*Math.ceil(options.width/50))),options.enableCardBox?'<div class="'+cardBoxClass+'">':""),outerFooterClass=(cardPadderClass=cardPadderClass.join(" "),innerCardFooterClass=innerCardFooterClass.join(" "),autoShape||"none"===options.action?innerHTML+='<div class="'+cardContentClass+" "+cardPadderClass+'"></div>':innerHTML+='<button type="button" tabindex="-1" class="cardContent-button '+cardContentClass+" "+cardPadderClass+'"></button>',"cardFooter"),fixedAttributes=(options.vibrant&&(outerFooterClass+=" cardFooter-vibrant"),options.outerFooterClass=outerFooterClass,options.cardLayout&&(innerHTML+='<div class="'+outerFooterClass+'">'),innerHTML+=lines,options.cardLayout&&(innerHTML+="</div>"),options.enableCardBox&&(innerHTML+="</div>"),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<length;i++){var item=items[i];rows&&0===itemsInRow&&(hasOpenRow&&(html+="</div>",hasOpenRow=!1),html+='<div class="cardColumn">',hasOpenRow=!0),html+=getCardHtml(item,i,options),itemsInRow++,rows&&itemsInRow>=rows&&(html+="</div>",hasOpenRow=!1,itemsInRow=0)}return hasOpenRow&&(html+="</div>"),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<length;i++){currentCssClass=cssClass;var text=lines[i];if(text&&text.html)valid++,html+=text.html;else if(0<valid&&isOuterFooter?currentCssClass+=" cardText-secondary":0===valid&&isOuterFooter&&(currentCssClass+=" "+options.cardTextFirstClass),text&&(html=(html+='<div class="'+currentCssClass+'">')+text+"</div>",valid++,maxLines)&&valid>=maxLines)break}if(forceLines)for(length=maxLines||Math.min(lines.length,maxLines||lines.length);valid<length;)currentCssClass=cssClass,0<valid&&isOuterFooter?currentCssClass+=" cardText-secondary":0===valid&&isOuterFooter&&(currentCssClass+=" "+options.cardTextFirstClass),html+='<div class="'+currentCssClass+'"> </div>',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+='<button type="button" is="paper-icon-button-light" class="itemAction" data-action="searchimageproviders" title="'+searchText+'" aria-label="'+searchText+'"><i class="md-icon autortl">search</i></button>'),item.ImageTag||appHost.supports("fileinput")&&(html+='<button type="button" is="paper-icon-button-light" class="itemAction" data-action="addimage" title="'+globalize.translate("HeaderSelectImageFile")+'" aria-label="'+globalize.translate("HeaderSelectImageFile")+'"><i class="md-icon autortl">add_circle_outline</i></button>'),item.ImageTag&&(html+='<button type="button" is="paper-icon-button-light" class="itemAction" data-action="delete" title="'+globalize.translate("Delete")+'" aria-label="'+globalize.translate("Delete")+'"><i class="md-icon autortl">delete</i></button>'),html}function getImageEditorBackdropButtons(item,options){var html="";return html+='<button type="button" is="paper-icon-button-light" class="itemAction" data-action="delete" title="'+globalize.translate("Delete")+'" aria-label="'+globalize.translate("Delete")+'"><i class="md-icon autortl">delete</i></button>'}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='<div class="cardText cardText-secondary cardText-overview"><div class="cardText-overview-text">';return{html:html+textEncoding.htmlEncode(text||"")+"</div></div>"}}function getTextLinksLine(options,item,linkItems,linkItemType,limit){linkItems=linkItems||[];let html="";for(let i=0,length=limit=Math.min(linkItems.length,limit);i<length;i++){var linkItem=linkItems[i];let text=linkItem.Name;i<limit-1&&(text+=","),html+=getTextActionButton(options,{Id:linkItem.Id,Name:linkItem.Name,ServerId:item.ServerId,Type:linkItemType},text,item.ServerId,null,!1)}return'<div class="cardTextLinksLine">'+html+"</div>"}function getCardFooterText(item,itemController,options,fieldMap,imgUrl,footerClass,progressHtml,logoUrl,isOuterFooter){var itemType=item.Type;let html="",lines=(logoUrl&&(html+='<div class="lazy cardFooterLogo" loading="lazy" style="background-image:url('+logoUrl+');"></div>'),[]),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<length;i++)lines.push(additionalLines[i])}fieldMap.ItemImageName&&(item.ImageTag?lines.push(item.Name):lines.push(" ")),fieldMap.Filename&&lines.push(item.FileName||item.Filename),fieldMap.FilenameOrName&&lines.push(textEncoding.htmlEncode(item.FileName||item.Filename||item.Name||"")),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||""));var lineParts,parentTitle=fieldMap.CommunityRating,showCriticRating=fieldMap.CriticRating,emptyLines=[],parentTitle=((parentTitle||showCriticRating)&&(lineParts=[],parentTitle&&item.CommunityRating&&lineParts.push(mediaInfo.getCommunityRating(item,{outerClass:"cardMediaInfoItem"})),showCriticRating&&item.CriticRating&&lineParts.push(mediaInfo.getCriticRating(item,{outerClass:"cardMediaInfoItem"})),(lineParts.length?lines:(lineParts.push(" "),emptyLines)).push('<div class="mediaInfoItems cardMediaInfoItems">'+lineParts.join("")+"</div>")),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('<div class="mediaInfoItems cardMediaInfoItems"> </div>');if(fieldMap.Studios&&(item.Studios?.length?lines.push(getTextLinksLine(options,item,item.Studios,"Studio",1)):emptyLines.push('<div class="mediaInfoItems cardMediaInfoItems"> </div>')),fieldMap.Tags&&(item.TagItems?.length?lines.push(getTextLinksLine(options,item,item.TagItems,"Tag",2)):emptyLines.push('<div class="mediaInfoItems cardMediaInfoItems"> </div>')),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<item.ChannelIds?.length?lines.push(globalize.translate("NumberChannelsValue",item.ChannelIds?.length)):item.ChannelName?lines.push(itemManager.getDisplayName({Id:item.ChannelId,ServerId:serverId,Name:item.ChannelName,ChannelNumber:item.ChannelNumber,Type:"TvChannel",MediaType:item.MediaType,IsFolder:!1},{})):lines.push(globalize.translate("OneChannel"))),fieldMap.PersonRole&&(item.Role?lines.push(item.Role):item.PersonType?lines.push(globalize.translate(item.PersonType)):lines.push("")),fieldMap.ChapterTime&&lines.push(datetime.getDisplayRunningTime(item.StartPositionTicks)),fieldMap.LastActivityDateRelative&&lines.push(itemController.resolveField(item,"LastActivityDateRelative")),fieldMap.AppName&&lines.push(itemController.resolveField(item,"AppName")),fieldMap.AccessToken&&lines.push(itemController.resolveField(item,"AccessToken")),fieldMap.DateCreated&&lines.push(itemController.resolveField(item,"DateCreated")),fieldMap.Url&&lines.push(item.Url||""),fieldMap.Version&&lines.push(textEncoding.htmlEncode(item.Version||"")),fieldMap.CollectionType&&(item.Id?lines.push(itemManager.getContentTypeName(item.CollectionType)):lines.push("")),fieldMap.LibraryFolders&&(item.Locations&&"boxsets"!==item.CollectionType?1===item.Locations.length?lines.push(item.Locations[0]):lines.push(globalize.translate("NumLocationsValue",item.Locations.length)):lines.push("")),fieldMap.AppNameVersion&&lines.push(itemController.resolveField(item,"AppNameVersion")),fieldMap.InstalledVersion&&(item.InstalledVersion?lines.push(globalize.translate("LabelVersionInstalled",item.InstalledVersion)):lines.push("")),fieldMap.InstalledVersion&&lines.push(textEncoding.htmlEncode(item.Version||"")),fieldMap.MediaInfo&&lines.push({html:'<div class="cardText cardText-secondary mediaInfoItems cardText-mediaInfo">'+mediaInfo.getPrimaryMediaInfoHtml(item,{episodeTitle:!1,subtitles:!1,endsAt:!1})+"</div>"}),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='<div class="'+footerClass+'">'+html,html+="</div>"),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='<button tabindex="-1" title="'+text+'" '+dataAttributes+' type="button"'+item+' class="cardMediaInfoItem itemAction textActionButton cardTextActionButton emby-button button-link" data-action="'+action+'">';return serverId+text+"</button>"}function getActiveSessionUserSectionHtml(item,apiClient){let html="";if(item.UserId){html+='<div class="cardSideFooter-bottomsection activeSession-bottomsection activeSession-usersection align-items-center justify-content-center itemAction" data-action="link" '+itemShortcuts.getShortcutAttributesHtml({Type:"User",ServerId:item.ServerId,Id:item.UserId},{})+">";var names=[];item.UserId&&names.push(item.UserName);for(let i=0,length=item.AdditionalUsers.length;i<length;i++)names.push(item.AdditionalUsers[i].UserName);apiClient=item.UserId&&item.UserPrimaryImageTag?apiClient.getUserImageUrl(item.UserId,{tag:item.UserPrimaryImageTag,height:24,type:"Primary"}):null;apiClient&&(html+='<img draggable="false" loading="lazy"'+decodingAttribute+' class="activeSessionUserImage" src="'+apiClient+'" />'),html=html+("<div>"+names.join(", ")+"</div>")+"</div>"}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<length;i++)if("Video"===mediaStreams[i].Type&&(null==videoStreamIndex||videoStreamIndex===mediaStreams[i].Index)){mediaStream=mediaStreams[i];break}if(mediaStream){if(html=(html=(html=html+'<div class="cardSideFooter-bottomsection activeSession-bottomsection">'+'<div class="secondaryText activeSession-bottomsection-title">')+globalize.translate("Video"))+"</div>"+"<div>",mediaStream.DisplayTitle&&(html=(html+='<div class="flex align-items-center flex-wrap-wrap">')+textEncoding.htmlEncode(mediaStream.DisplayTitle),playstate.VideoDecoderHwAccel&&(html+='<i class="md-icon activeSession-hwaccelIcon autortl" title="'+globalize.translate("HeaderHardwareAcceleratedDecoding")+" ("+(playstate.VideoDecoderHwAccel||globalize.translate("Software"))+')"></i>'),html+="</div>"),html=html+'<div class="flex align-items-center flex-wrap-wrap">'+'<i class="md-icon activeSessionStreamIcon autortl"></i>',!1===playstate.IsVideoDirect?(html=(html=html+globalize.translate("Transcode")+" (")+(playstate.VideoCodec||"").toUpperCase()+" ",playstate.VideoBitrate&&(html+=dataFormatter.bitrateToString(playstate.VideoBitrate)),html+=")",playstate.VideoEncoderHwAccel&&(html+='<i class="md-icon activeSession-hwaccelIcon autortl" title="'+globalize.translate("HeaderHardwareAcceleratedEncoding")+" ("+(playstate.VideoEncoderHwAccel||globalize.translate("Software"))+')"></i>')):html+=globalize.translate("HeaderDirectPlay"),html+="</div>",!1===playstate.IsVideoDirect){var pipeline=playstate.VideoPipelineInfo||[];for(let i=0,length=pipeline.length;i<length;i++){var extra,step=pipeline[i];"ToneMapping"!==step.StepType&&"Deinterlace"!==step.StepType&&"SubTitleBurnIn"!==step.StepType&&"SubtitleOverlay"!==step.StepType||(html+='<div><i class="md-icon activeSessionStreamIcon autortl"></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+=' <span class="secondaryText">('+extra.join(" ")+")</span>"),html+="</div>")}}html=html+"</div>"+"</div>"}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<length;i++)if("Audio"===mediaStreams[i].Type&&(null==audioStreamIndex||audioStreamIndex===mediaStreams[i].Index)){mediaStream=mediaStreams[i];break}return mediaStream&&(html=(html=(html+='<div class="cardSideFooter-bottomsection activeSession-bottomsection"><div class="secondaryText activeSession-bottomsection-title">')+globalize.translate("Audio"))+"</div><div>",html=(html=mediaStream.DisplayTitle?(html+="<div>")+textEncoding.htmlEncode(mediaStream.DisplayTitle)+"</div>":html)+'<div><i class="md-icon activeSessionStreamIcon autortl"></i>',!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+="</div>")+"</div></div>"),html}function getActiveSessionStreamInfoHtml(item){let html="";var playstate=item.PlayState||{},nowplayingItem=item.NowPlayingItem||{},item=item.TranscodingInfo||{};if(html=(html=(html=html+'<div class="cardSideFooter-bottomsection activeSession-bottomsection">'+'<div class="secondaryText activeSession-bottomsection-title">')+globalize.translate("Stream"))+"</div>"+"<div>",nowplayingItem.Container&&(html=(html+="<div>")+nowplayingItem.Container.toUpperCase(),nowplayingItem.Bitrate&&(html+=" ("+dataFormatter.bitrateToString(nowplayingItem.Bitrate)+")"),html+="</div>"),html=html+"<div>"+'<i class="md-icon activeSessionStreamIcon autortl"></i>',"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('<span class="secondaryText">Throttling</span>'),html+=nowplayingItem.join(" ")}else html+=globalize.translate("HeaderDirectPlay");html+="</div>";var transcodeReasons=item.TranscodeReasons||[];for(let i=0,length=transcodeReasons.length;i<length;i++)html=(html+="<div>")+globalize.translate(transcodeReasons[i])+"</div>";return html=html+"</div>"+"</div>"}function getActiveSessionDeviceInfoHtml(item,apiClient){let html="";if(item.NowPlayingItem){html+='<div class="cardSideFooter-bottomsection activeSession-bottomsection activeSession-deviceSection itemAction" data-action="link" '+itemShortcuts.getShortcutAttributesHtml({Type:"Device",ServerId:item.ServerId,Id:item.DeviceId},{})+">";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+('<div class="'+imgClass)+'" style="aspect-ratio:1;background-image:url('+imageUrl+');"></div>'):(html=(html=html+('<div class="'+imgClass)+'"><i class="activeSession-deviceimage-icon md-icon autortl">')+itemManager.getDefaultIcon(item))+"</i></div>",html+="<div>",item.Client&&(html=(html+="<div>")+textEncoding.htmlEncode(item.Client+" "+item.ApplicationVersion)+"</div>"),item.DeviceName&&(html=(html+='<div class="secondaryText">')+textEncoding.htmlEncode(item.DeviceName)+"</div>"),item.RemoteEndPoint&&(html=(html+='<div class="secondaryText flex align-items-center">')+item.RemoteEndPoint,(shape=(item.Protocol||"").toLowerCase())&&(html+=" "+shape),shape.includes("https")&&(html+='<i class="md-icon button-icon button-icon-right autortl" style="font-size:inherit;" title="HTTPS">https</i>'),html+="</div>"),html=html+"</div>"+"</div>"}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+='<button is="paper-icon-button-light" class="sessionCardButton btnSessionPlayPause paper-icon-button-light md-icon md-icon-fill autortl itemAction" data-action="session_playpause">'+options+"</button>")+'<button is="paper-icon-button-light" class="sessionCardButton btnSessionStop paper-icon-button-light md-icon md-icon-fill autortl itemAction" data-action="session_stop" title="'+globalize.translate("Stop")+'" aria-label="'+globalize.translate("Stop")+'"></button>'),item.ServerId&&item.SupportedCommands.includes("DisplayMessage")&&item.DeviceId!==connectionManager.deviceId()&&(html+='<button is="paper-icon-button-light" class="sessionCardButton btnSessionSendMessage paper-icon-button-light md-icon autortl itemAction" data-action="session_sendmessage" title="'+globalize.translate("SendMessage")+'" aria-label="'+globalize.translate("SendMessage")+'"></button>'),html&&(html='<div class="cardSideFooter-bottomsection activeSession-bottomsection activeSession-commandsection align-items-center">'+html,html+="</div>")),html}function getActiveSessionFooterHtml(options,item,apiClient){var html="";return(html+='<div class="cardSideFooter-bottomsections activeSession-bottomsections">')+getActiveSessionDeviceInfoHtml(item,apiClient)+getActiveSessionStreamInfoHtml(item)+getActiveSessionVideoInfoHtml(item)+getActiveSessionAudioInfoHtml(item)+getActiveSessionUserSectionHtml(item,apiClient)+getActiveSessionCommandsSectionHtml(options,item)+"</div>"}function getProgramIndicators(item){let html="";return(item=item.CurrentProgram||item).IsLive?html+='<div class="cardProgramIndicator liveTvProgram">'+globalize.translate("Live")+"</div>":item.IsPremiere?html+='<div class="cardProgramIndicator premiereTvProgram">'+globalize.translate("Premiere")+"</div>":item.IsNew&&(html+='<div class="cardProgramIndicator newTvProgram">'+globalize.translate("New")+"</div>"),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+='<div class="'+options.innerCardFooterClass+'">')+progressHtml+"</div>",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='<div class="'+cardFooterContentClass+' itemAction" data-action="'+action+'">'+outerCardFooter+"</div>","ActiveSession"===itemType&&(outerCardFooter+=getActiveSessionFooterHtml(options,item,serverId))}let cardImageContainerOpen,cardImageContainerClose="";if(options.sideFooter||(cardContentClass+=" "+options.cardPadderClass),cardImageContainerClose=isSingleClickElement?(cardImageContainerOpen=blurImageOptions?2===options.lazy?supportsObjectFit?'<div class="'+cardContentClass+'"><img draggable="false" alt=" " class="'+cardImageClass+'"'+options.loadingLazyAttribute+decodingAttribute+' src="'+blurImageOptions+'" />':'<div class="'+cardContentClass+'" style="background-image:url('+blurImageOptions+');">':supportsNativeLazyLoading?'<div class="'+cardContentClass+'"><img draggable="false" alt=" " class="'+cardImageClass+'" loading="lazy"'+decodingAttribute+' src="'+blurImageOptions+'" />':'<div class="'+cardContentClass+' lazy" style="background-image:url('+blurImageOptions+');">':'<div class="'+cardContentClass+'">',"</div>"):"none"===action?(cardImageContainerOpen=blurImageOptions?2===options.lazy?supportsObjectFit?'<div data-action="'+action+'" class="itemAction '+cardContentClass+'"><img draggable="false" alt=" " class="'+cardImageClass+'"'+options.loadingLazyAttribute+decodingAttribute+' src="'+blurImageOptions+'" />':'<div data-action="'+action+'" class="itemAction '+cardContentClass+'" style="background-image:url('+blurImageOptions+');">':supportsNativeLazyLoading?'<div data-action="'+action+'" class="itemAction '+cardContentClass+'"><img draggable="false" alt=" " class="'+cardImageClass+'" loading="lazy"'+decodingAttribute+' src="'+blurImageOptions+'" />':'<div data-action="'+action+'" class="itemAction lazy '+cardContentClass+'" style="background-image:url('+blurImageOptions+');">':'<div data-action="'+action+'" class="'+cardContentClass+' itemAction">',"</div>"):(cardImageContainerOpen=blurImageOptions?2===options.lazy?supportsObjectFit?'<button type="button" data-action="'+action+'" tabindex="-1" class="itemAction cardContent-button '+cardContentClass+'"><img draggable="false" alt=" " class="'+cardImageClass+'"'+options.loadingLazyAttribute+decodingAttribute+' src="'+blurImageOptions+'" />':'<button type="button" data-action="'+action+'" tabindex="-1" class="itemAction cardContent-button '+cardContentClass+'" style="background-image:url('+blurImageOptions+');">':supportsNativeLazyLoading?'<button type="button" data-action="'+action+'" tabindex="-1" class="itemAction cardContent-button '+cardContentClass+'"><img draggable="false" alt=" " class="'+cardImageClass+'" loading="lazy"'+decodingAttribute+' src="'+blurImageOptions+'" />':'<button type="button" data-action="'+action+'" tabindex="-1" class="itemAction cardContent-button lazy '+cardContentClass+'" style="background-image:url('+blurImageOptions+');">':'<button type="button" data-action="'+action+'" tabindex="-1" class="cardContent-button '+cardContentClass+' itemAction">',"</button>"),!1===options.image&&!1===options.imageContainer&&(cardImageContainerClose="",cardImageContainerOpen=""),options.vibrant&&imageShape?("large"===options.vibrantMode&&(cardBoxClass+=" darkContentContainer"),cardImageContainerOpen='<div style="background-image:url('+imageShape+');" class="'+cardBoxClass+'">'+cardImageContainerOpen):options.enableCardBox&&(cardImageContainerOpen='<div class="'+cardBoxClass+'">'+cardImageContainerOpen),options.typeIndicator)switch(itemType){case"Video":cardImageContainerOpen+='<i class="md-icon autortl cardIndicator cardIndicatorIcon"></i>';break;case"Folder":case"PhotoAlbum":cardImageContainerOpen+='<i class="md-icon autortl cardIndicator cardIndicatorIcon"></i>';break;case"Photo":cardImageContainerOpen+='<i class="md-icon autortl cardIndicator cardIndicatorIcon"></i>'}if(!1!==options.syncIndicator&&(100===(forceName=item.SyncPercent)?cardImageContainerOpen+='<i class="cardIndicator md-icon autortl cardSyncIndicator syncIndicator fullSyncIndicator"></i>':null!=forceName&&(cardImageContainerOpen+='<i class="cardIndicator md-icon autortl cardSyncIndicator syncIndicator emptySyncIndicator"></i>')),!1!==options.playedIndicator&&(cardImageContainerOpen+=indicators.getPlayedIndicatorHtml(item,"cardIndicator card")),!1!==options.timerIndicator&&(cardImageContainerOpen+=indicators.getTimerIndicator(item,"cardIndicator card")),item.Policy?.IsDisabled&&(cardImageContainerOpen+='<i class="md-icon cardIndicator cardUserDisabledIcon indicatorIcon" title="'+globalize.translate("Disabled")+'">person_off</i>'),"CollectionFolder"===itemType||item.CollectionType){let refreshClass=item.RefreshProgress?"":"hide";options.sideFooter&&(refreshClass+=" cardRefreshIndicator-sideFooter"),layoutManager.tv||(cardImageContainerOpen+='<div is="emby-itemrefreshindicator" class="'+refreshClass.trim()+'" data-progress="'+(item.RefreshProgress||0)+'"></div>',loadRefreshIndicator())}else"User"===itemType&&item.ConnectLinkType&&(cardImageContainerOpen+='<i class="md-icon cardPlayedIndicator cardIndicator playedIndicator" title="'+globalize.translate("LinkedToEmbyConnect")+'">cloud</i>');!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+='<i title="'+globalize.translate("DragDropToReorder")+'" class="md-icon cardIndicator cardIndicatorIcon cardIndicatorIcon-dragHandle dragHandle"></i>'),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+="</div>"),{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+="</div>"),outerHTML+"</"+overlayText+">"}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+='<div class="cardOverlayContainer itemAction '+menuClass+'" data-action="'+action+'">';menuClass="cardOverlayButton cardOverlayButton-hover itemAction",action=item.Type;options.multiSelect&&(hasContent=!0,html+='<label tabindex="-1" title="'+options.multiSelectTitle+'" aria-label="'+options.multiSelectTitle+'" data-action="multiselect" class="chkItemSelectContainer chkCardSelectContainer cardOverlayButton itemAction emby-checkbox-label"><input tabindex="-1" class="chkItemSelect chkCardSelect emby-checkbox emby-checkbox-notext" is="emby-checkbox" type="checkbox" data-classes="true" /><span class="checkboxLabel chkCardSelect-checkboxLabel"></span></label>');let overlayFabClass=menuClass+" cardOverlayFab-primary";options.rtl&&(overlayFabClass+=" cardOverlayFab-primary-rtl"),!1!==options.hoverPlayButton&&playbackManager.canPlay(item)&&(hasContent=!0,playButtonAction=getPlayAction(item,options),html+='<button tabindex="-1" type="button" is="paper-icon-button-light" class="paper-icon-button-light '+overlayFabClass+' md-icon md-icon-fill autortl cardOverlayButtonIcon" data-action="'+playButtonAction+'"></button>'),options.hoverDownloadButton&&(hasContent=!0,html+='<button tabindex="-1" type="button" is="paper-icon-button-light" class="paper-icon-button-light '+menuClass+'" data-action="custom"><i class="md-icon cardOverlayButtonIcon"></i></button>'),html+='<div class="cardOverlayButton-br">';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+='<button tabindex="-1" type="button" title="'+options.moreTitle+'" aria-label="'+options.moreTitle+'" is="paper-icon-button-light" class="paper-icon-button-light '+menuClass+' md-icon cardOverlayButtonIcon cardOverlayButtonIcon-hover" data-action="menu"></button>'),options.previewImageButton&&supportsTargetBlank&&(hasContent=!0,html+='<a href="'+item.OriginalImageUrl+'" target="_blank" tabindex="-1" type="button" title="'+globalize.translate("HeaderOpenInNewWindow")+'" aria-label="'+globalize.translate("HeaderOpenInNewWindow")+'" is="emby-linkbutton" class="paper-icon-button-light '+menuClass+' md-icon cardOverlayButtonIcon cardOverlayButtonIcon-hover autortl" data-action="openlink"></a>'),hasContent?html+="</div></div>":""}function getItemImageDefaultText(item,options){return'<h2 class="'+options.cardDefaultTextClass+' secondaryText">'+item.Name+"</h2>"}function getCardDefaultText(item,options){var icon;return null!=options.defaultTextContent?'<div class="'+options.cardDefaultTextClass+'">'+options.defaultTextContent+"</div>":"ItemImage"===item.Type?getItemImageDefaultText(item,options):(icon=item.Icon||(!1===options.defaultIcon?null:itemManager.getDefaultIcon(item,options)))?options.smallSideFooter?'<i class="cardImageIcon cardImageIcon-sideFooter cardImageIcon-smallSideFooter md-icon autortl">'+icon+"</i>":options.sideFooter?'<i class="cardImageIcon cardImageIcon-sideFooter md-icon autortl">'+icon+"</i>":'<i class="cardImageIcon cardImageIcon-center md-icon autortl">'+icon+"</i>":(icon=isUsingLiveTvNaming(item.Type)?item.Name:itemManager.getDisplayName(item,{includeParentInfo:options.includeParentInfoInTitle,channelNumberFirst:options.channelNumberFirst}),'<div class="'+options.cardDefaultTextClass+'">'+icon+"</div>")}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}; |