EmbyCrackedClient/web/item/linkeditems.js
2025-06-25 11:46:04 +08:00

1 line
No EOL
14 KiB
JavaScript

import"./../modules/emby-elements/emby-scroller/emby-scroller.js";import layoutManager from"./../modules/layoutmanager.js";import cardBuilder from"./../modules/cardbuilder/cardbuilder.js";import listView from"./../modules/listview/listview.js";import globalize from"./../modules/common/globalize.js";import userSettings from"./../modules/common/usersettings/usersettings.js";import connectionManager from"./../modules/emby-apiclient/connectionmanager.js";function getCardOptions(options,scrollX){return{renderer:cardBuilder,options:Object.assign({shape:"autooverflow",fields:["Name","ProductionYear"],centerText:!0,overlayPlayButton:!0,focusTransformTitleAdjust:!0},options),virtualScrollLayout:scrollX?"horizontal-grid":null}}function getGenericCardOptions(){var instance=this.instance,linkedItemType=this.linkedItemType,scrollX=this.scrollX,parentItemType=instance.options.item?.Type;switch(linkedItemType){case"MusicArtist":return getCardOptions({fields:["Name"],round:!0},scrollX);case"Playlist":return getCardOptions({fields:["Name"]},scrollX);case"MusicAlbum":case"MusicVideo":return getCardOptions({fields:"MusicArtist"===parentItemType?["Name","ProductionYear"]:["ParentName","Name"]},scrollX);case"Season":case"Episode":return getCardOptions({fields:["ParentName","Name"]},scrollX);case"Person":case"Folder":return getCardOptions({fields:["Name"]},scrollX);default:return getCardOptions({},scrollX)}}function getListViewOptions(items,options){return{renderer:listView,options:Object.assign({action:"playallfromhere",overlayPlayButton:!1,verticalWrap:!0,mediaInfo:!1,enableSideMediaInfo:!1,enableUserDataButtons:!1,fields:["Name","ParentName"]},options),virtualScrollLayout:"horizontal-grid"}}function enableWrappedListView(){return!layoutManager.tv}function addParentItemToQuery(instance,query){var instance=instance.options,params=instance.params,item=instance.item,instance=params.parentId,params=(instance&&(query.ParentId=instance),item.Type);switch(params){case"Genre":case"MusicGenre":case"GameGenre":query.GenreIds=item.Id;break;case"Studio":query.StudioIds=item.Id;break;case"Person":query.PersonIds=item.Id;break;case"MusicArtist":query.ArtistIds=item.Id;break;case"Tag":query.TagIds=item.Id;break;case"BoxSet":case"Folder":query.ParentId=item.Id}}function fetchArtists(query,instance,scrollX){var apiClient=instance.getApiClient();return query=Object.assign({SortBy:"SortName",SortOrder:"Ascending",Recursive:!0,Fields:instance.getRequestedItemFields()+",PrimaryImageAspectRatio",StartIndex:0,ImageTypeLimit:1,EnableTotalRecordCount:!!scrollX,EnableImageTypes:"Primary"},query),addParentItemToQuery(instance,query),apiClient.getArtists(apiClient.getCurrentUserId(),query)}function fetchBoxSetChildrenItems(query,instance,item,linkedItemType,scrollX){if("BoxSet"!==item.Type)return Promise.resolve({Items:[],TotalRecordCount:0});var apiClient=connectionManager.getApiClient(item);let sortBy=userSettings.itemSortBy(item.Id)||"default";"default"===sortBy&&(sortBy="DisplayOrder");var sortOrder=(sortBy=apiClient.isMinServerVersion("4.8.0.16")?sortBy:null)?userSettings.itemSortOrder(item.Id):null;return linkedItemType&&(query.IncludeItemTypes=linkedItemType),query=Object.assign({ParentId:item.Id,ImageTypeLimit:1,Fields:instance.getRequestedItemFields()+",PrimaryImageAspectRatio,ProductionYear,Status,EndDate",EnableTotalRecordCount:!!scrollX,sortBy:sortBy,sortOrder:sortOrder},query),console.log("query start index: "+query.StartIndex),apiClient.getItems(apiClient.getCurrentUserId(),query).then(function(result){for(let i=0,length=result.Items.length;i<length;i++)result.Items[i].CollectionId=item.Id;return result})}function fetchItems(query){var instance=this.instance,linkedItemType=this.linkedItemType,scrollX=this.scrollX,item=instance.options.item,itemType=item.Type;if("BoxSet"===itemType)return fetchBoxSetChildrenItems(query,instance,item,linkedItemType,scrollX);if("MusicArtist"===linkedItemType)return fetchArtists(query,instance,scrollX);let sortBy="SortName",sortOrder="Ascending";"MusicVideo"===linkedItemType&&"MusicArtist"===itemType&&(sortBy="ProductionYear,SortName",sortOrder="Descending");item=instance.getApiClient();return query=Object.assign({SortBy:sortBy,SortOrder:sortOrder,Recursive:!0,Fields:instance.getRequestedItemFields()+",PrimaryImageAspectRatio,ProductionYear,Status,EndDate",ImageTypeLimit:1,EnableImageTypes:"Primary,Backdrop,Logo"},query),linkedItemType&&(query.IncludeItemTypes=linkedItemType),addParentItemToQuery(instance,query),item.getItems(item.getCurrentUserId(),query)}function getSongListOptions(items){return enableWrappedListView()?getListViewOptions(items,{}):getCardOptions({action:"playallfromhere",fields:["Name","ParentName"],overlayPlayButton:!1,sideFooter:!0,centerText:!1},!0)}function getSectionHeaderHtml(params,item,href,title){let html='<h2 class="sectionTitle sectionTitle-cards">'+title+"</h2>";if(href&&!layoutManager.tv){switch(item.Type){case"Genre":href+="&genreId="+params.id;break;case"MusicGenre":href+="&musicGenreId="+params.id;break;case"GameGenre":href+="&gameGenreId="+params.id;break;case"Studio":href+="&studioId="+params.id;break;case"Person":href+="&personId="+params.id;break;case"MusicArtist":href+="&artistId="+params.id;break;case"Tag":href+="&tagId="+params.id;break;case"BoxSet":case"Folder":href+="&parentId="+params.id}title=params.parentId;title&&(href+="&parentId="+title),href+="&serverId="+params.serverId,html='<a href="'+href+'" is="emby-sectiontitle" class="noautofocus button-link button-link-color-inherit sectionTitleTextButton sectionTitleTextButton-link sectionTitleTextButton-more">'+html+"</a>"}return html}function getSectionHtml(scrollX,params,item,linkedItemType,title,href){let className="linked-"+linkedItemType+"-section",html=(scrollX?className+=" autoScrollSection":href=null,"BoxSet"===item.Type&&(href=null),'<div class="'+className+' hide verticalSection verticalSection-cards">'),itemsContainerClass="",titleContainerClass="",cardSizeAttribute=("Audio"===linkedItemType&&(itemsContainerClass+=" itemsContainer-sideFooters"),enableWrappedListView()?titleContainerClass+="Audio"===linkedItemType?" sectionTitleContainer-wrappedlistview":" sectionTitleContainer-cards":titleContainerClass+=" sectionTitleContainer-cards",layoutManager.tv||(titleContainerClass+=" focusable"),"");layoutManager.tv||"MusicArtist"===linkedItemType&&(cardSizeAttribute=' data-cardsizeoffset="1"');linkedItemType=linkedItemType?' data-itemtype="'+linkedItemType+'"':"";return html=(html+='<div class="sectionTitleContainer padded-left padded-left-page padded-right'+titleContainerClass+'" data-focusabletype="nearest">')+getSectionHeaderHtml(params,item,href,title)+"</div>",html=scrollX?(html=(html+='<div is="emby-scroller" data-mousewheel="false" data-focusscroll="true" class="padded-top-focusscale padded-bottom-focusscale padded-left padded-left-page padded-right">')+"<div"+linkedItemType+' is="emby-itemscontainer" data-focusabletype="nearest"'+cardSizeAttribute+' class="itemsContainer scrollSlider focusable focuscontainer-x'+itemsContainerClass+'" data-virtualscrolllayout="horizontal-grid">')+"</div></div>":html+("<div"+linkedItemType+' is="emby-itemscontainer" class="itemsContainer focuscontainer-x padded-left padded-left-page padded-right'+itemsContainerClass)+'"></div>',html+="</div>"}function loadHtml(options){let html="";var item=options.item,params=options.params,itemTypes=options.itemTypes;let scrollX=!0;"BoxSet"===item.Type&&itemTypes.length<2&&(scrollX=!1),itemTypes.includes("MovieSeries")&&(html+=getSectionHtml(scrollX,params,item,"Movie,Series",globalize.translate("MoviesAndShows"),"list/list.html?type=Movie,Series")),itemTypes.includes("Movie")&&(html+=getSectionHtml(scrollX,params,item,"Movie",globalize.translate("Movies"),"list/list.html?type=Movie")),itemTypes.includes("Series")&&(html+=getSectionHtml(scrollX,params,item,"Series",globalize.translate("Shows"),"list/list.html?type=Series")),itemTypes.includes("Season")&&(html+=getSectionHtml(scrollX,params,item,"Season",globalize.translate("Seasons"),"list/list.html?type=Season")),itemTypes.includes("Episode")&&(html+=getSectionHtml(scrollX,params,item,"Episode",globalize.translate("Episodes"),"list/list.html?type=Episode")),itemTypes.includes("MusicArtist")&&(html+=getSectionHtml(scrollX,params,item,"MusicArtist",globalize.translate("Artists"),"list/list.html?type=MusicArtist")),itemTypes.includes("MusicAlbum")&&(html+=getSectionHtml(scrollX,params,item,"MusicAlbum",globalize.translate("Albums"),"list/list.html?type=MusicAlbum")),itemTypes.includes("Playlist")&&(html+=getSectionHtml(scrollX,params,item,"Playlist",globalize.translate("Playlists"),"list/list.html?type=Playlist")),itemTypes.includes("Audio")&&(html+=getSectionHtml(scrollX,params,item,"Audio",globalize.translate("Songs"),"list/list.html?type=Audio")),itemTypes.includes("MusicVideo")&&(html+=getSectionHtml(scrollX,params,item,"MusicVideo",globalize.translate("HeaderMusicVideos"),"list/list.html?type=MusicVideo")),itemTypes.includes("Trailer")&&(html+=getSectionHtml(scrollX,params,item,"Trailer",globalize.translate("Trailers"),"list/list.html?type=Trailer")),itemTypes.includes("Video")&&(html+=getSectionHtml(scrollX,params,item,"Video",globalize.translate("Videos"),"list/list.html?type=Video")),itemTypes.includes("Photo")&&(html+=getSectionHtml(scrollX,params,item,"Photo",globalize.translate("Photos"),"list/list.html?type=Photo")),itemTypes.includes("Game")&&(html+=getSectionHtml(scrollX,params,item,"Game",globalize.translate("Games"),"list/list.html?type=Game")),itemTypes.includes("Book")&&(html+=getSectionHtml(scrollX,params,item,"Book",globalize.translate("Books"),"list/list.html?type=Book")),itemTypes.includes("Folder")&&(html+=getSectionHtml(scrollX,params,item,"Folder",globalize.translate("Folders"))),itemTypes.includes("Person")&&(html+=getSectionHtml(scrollX,params,item,"Person",globalize.translate("People"))),itemTypes.includes("Items")&&(html+=getSectionHtml(scrollX,params,item,null,globalize.translate("Items"))),options.view.innerHTML=html}function LinkedItemsView(options){this.options=options}function onTemplateLoaded(instance){var options=instance.options;let view=options.view;var params=options.params,itemsContainers=Array.prototype.slice.call(view.querySelectorAll(".itemsContainer"),0);if(params.parentId)for(let i=0,length=itemsContainers.length;i<length;i++)itemsContainers[i].setAttribute("data-parentid",params.parentId);for(let i=0,length=itemsContainers.length;i<length;i++){var itemsContainer=itemsContainers[i],linkedItemType=(itemsContainer.parentContainer=itemsContainer.closest(".verticalSection"),itemsContainer.getAttribute("data-itemtype")),scrollX=itemsContainer.classList.contains("scrollSlider");itemsContainer.fetchData=fetchItems.bind({instance:instance,linkedItemType:linkedItemType,scrollX:scrollX}),itemsContainer.getListOptions="Audio"===linkedItemType?getSongListOptions.bind(instance):getGenericCardOptions.bind({instance:instance,linkedItemType:linkedItemType,scrollX:scrollX})}instance.itemsContainers=itemsContainers,params.parentId?options.apiClient.getItem(options.apiClient.getCurrentUserId(),params.parentId).then(function(parentItem){"audiobooks"===parentItem.CollectionType&&(setSectionTitle(view,".linked-MusicArtist-section .sectionTitle",globalize.translate("Authors")),setSectionTitle(view,".linked-MusicAlbum-section .sectionTitle",globalize.translate("Books")),setSectionTitle(view,".linked-Audio-section .sectionTitle",globalize.translate("Episodes"))),view.classList.remove("hide")}):view.classList.remove("hide")}function setSectionTitle(view,selector,title){view=view.querySelector(selector);view&&(view.innerHTML=title)}function fetchItemTypes(instance,parent){var parent=connectionManager.getApiClient(parent),query={};return addParentItemToQuery(instance,query),parent.getItemTypes(parent.getCurrentUserId(),query).then(function(result){return result.Items.map(function(i){return i.Name})})}function loadItemTypes(instance,parent){let itemType=parent.Type;var itemTypes=[];switch(itemType){case"Person":case"Tag":case"Genre":itemTypes.push("Movie"),itemTypes.push("Video"),itemTypes.push("Trailer")}switch(itemType){case"Person":case"Tag":case"Genre":itemTypes.push("Series")}switch(itemType){case"Person":case"Tag":case"Genre":itemTypes.push("Episode")}switch(itemType){case"MusicGenre":case"Tag":itemTypes.push("MusicArtist"),itemTypes.push("MusicAlbum")}switch(itemType){case"Genre":case"MusicGenre":case"Tag":itemTypes.push("Playlist")}switch(itemType){case"Studio":case"MusicGenre":case"Tag":itemTypes.push("Audio")}switch(itemType){case"Person":case"MusicArtist":case"Tag":case"MusicGenre":itemTypes.push("MusicVideo")}return"Tag"===itemType&&(itemTypes.push("Game"),itemTypes.push("Photo")),"GameGenre"===itemType&&itemTypes.push("Game"),"BoxSet"!==itemType?(instance.options.itemTypes=normalizeItemTypes(parent,itemTypes),Promise.resolve()):fetchItemTypes(instance,parent).then(function(types){types.length||(types=["Items"]),"BoxSet"===itemType&&!userSettings.groupCollectionItems()&&1<types.length&&(types=["Items"]),instance.options.itemTypes=normalizeItemTypes(parent,types)})}function normalizeItemTypes(item,types){return types}function loadSections(instance,resumeOptions){if(instance.sectionsLoaded&&!resumeOptions.refresh)return Promise.resolve();instance.sectionsLoaded=!0;resumeOptions=instance.options.item;return loadItemTypes(instance,resumeOptions).then(function(){loadHtml(instance.options),onTemplateLoaded(instance);var itemsContainers=instance.itemsContainers,promises=[];for(let i=0,length=itemsContainers.length;i<length;i++)promises.push(itemsContainers[i].waitForCustomElementUpgrade());return Promise.all(promises)})}LinkedItemsView.prototype.resume=function(options){let instance=this;return this.options.item=options.item,loadSections(instance,options).then(function(){var promises=[],itemsContainers=instance.itemsContainers;for(let i=0,length=itemsContainers.length;i<length;i++)promises.push(itemsContainers[i].resume(options));return Promise.all(promises).then(function(){options.autoFocus&&instance.autoFocus()})})},LinkedItemsView.prototype.getRequestedItemFields=function(){return this.options.requestedItemFields},LinkedItemsView.prototype.getApiClient=function(){return this.options.apiClient},LinkedItemsView.prototype.pause=function(){var itemsContainers=this.itemsContainers;for(let i=0,length=itemsContainers.length;i<length;i++)itemsContainers[i].pause()},LinkedItemsView.prototype.destroy=function(){this.itemsContainers=null,this.options=null};export default LinkedItemsView;