import type { BaseItemDto } from '@jellyfin/sdk/lib/generated-client/models/base-item-dto'; import type { ApiClient } from 'jellyfin-apiclient'; import cardBuilder from 'components/cardbuilder/cardBuilder'; import layoutManager from 'components/layoutManager'; import { appRouter } from 'components/router/appRouter'; import ServerConnections from 'components/ServerConnections'; import globalize from 'lib/globalize'; import type { UserSettings } from 'scripts/settings/userSettings'; import { getBackdropShape } from 'utils/card'; import type { SectionContainerElement, SectionOptions } from './section'; function getNextUpFetchFn( serverId: string, userSettings: UserSettings, { enableOverflow }: SectionOptions ) { return function () { const apiClient = ServerConnections.getApiClient(serverId); const oldestDateForNextUp = new Date(); oldestDateForNextUp.setDate(oldestDateForNextUp.getDate() - userSettings.maxDaysForNextUp()); return apiClient.getNextUpEpisodes({ Limit: enableOverflow ? 24 : 15, Fields: 'PrimaryImageAspectRatio,DateCreated,Path,MediaSourceCount', UserId: apiClient.getCurrentUserId(), ImageTypeLimit: 1, EnableImageTypes: 'Primary,Backdrop,Banner,Thumb', EnableTotalRecordCount: false, DisableFirstEpisode: false, NextUpDateCutoff: oldestDateForNextUp.toISOString(), EnableResumable: false, EnableRewatching: userSettings.enableRewatchingInNextUp() }); }; } function getNextUpItemsHtmlFn( useEpisodeImages: boolean, { enableOverflow }: SectionOptions ) { return function (items: BaseItemDto[]) { const cardLayout = false; return cardBuilder.getCardsHtml({ items: items, preferThumb: true, inheritThumb: !useEpisodeImages, shape: getBackdropShape(enableOverflow), overlayText: false, showTitle: true, showParentTitle: true, lazy: true, overlayPlayButton: true, context: 'home', centerText: !cardLayout, allowBottomPadding: !enableOverflow, cardLayout: cardLayout }); }; } export function loadNextUp( elem: HTMLElement, apiClient: ApiClient, userSettings: UserSettings, options: SectionOptions ) { let html = ''; html += '
'; if (!layoutManager.tv) { html += ''; html += '

'; html += globalize.translate('NextUp'); html += '

'; html += ''; html += '
'; } else { html += '

'; html += globalize.translate('NextUp'); html += '

'; } html += '
'; if (options.enableOverflow) { html += '
'; html += '
'; } else { html += '
'; } if (options.enableOverflow) { html += '
'; } html += '
'; elem.classList.add('hide'); elem.innerHTML = html; const itemsContainer: SectionContainerElement | null = elem.querySelector('.itemsContainer'); if (!itemsContainer) return; itemsContainer.fetchData = getNextUpFetchFn(apiClient.serverId(), userSettings, options); itemsContainer.getItemsHtml = getNextUpItemsHtmlFn(userSettings.useEpisodeImagesInNextUpAndResume(), options); itemsContainer.parentContainer = elem; }