mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
150 lines
4.1 KiB
TypeScript
150 lines
4.1 KiB
TypeScript
import { Api } from '@jellyfin/sdk';
|
|
import { CollectionType } from '@jellyfin/sdk/lib/generated-client/models/collection-type';
|
|
import { useQuery } from '@tanstack/react-query';
|
|
import { useApi } from 'hooks/useApi';
|
|
import { addSection, isLivetv } from '../utils/search';
|
|
import { BaseItemKind } from '@jellyfin/sdk/lib/generated-client/models/base-item-kind';
|
|
import { LIVETV_CARD_OPTIONS } from '../constants/liveTvCardOptions';
|
|
import { CardShape } from 'utils/card';
|
|
import { Section } from '../types';
|
|
import { fetchItemsByType } from './fetchItemsByType';
|
|
|
|
const fetchLiveTv = (api: Api, userId: string | undefined, searchTerm: string | undefined, signal: AbortSignal) => {
|
|
const sections: Section[] = [];
|
|
|
|
// Movies row
|
|
const movies = fetchItemsByType(
|
|
api,
|
|
userId,
|
|
{
|
|
includeItemTypes: [BaseItemKind.LiveTvProgram],
|
|
isMovie: true,
|
|
searchTerm: searchTerm
|
|
},
|
|
{ signal }
|
|
).then(moviesData => {
|
|
addSection(sections, 'Movies', moviesData.Items, {
|
|
...LIVETV_CARD_OPTIONS,
|
|
shape: CardShape.PortraitOverflow
|
|
});
|
|
});
|
|
|
|
// Episodes row
|
|
const episodes = fetchItemsByType(
|
|
api,
|
|
userId,
|
|
{
|
|
includeItemTypes: [BaseItemKind.LiveTvProgram],
|
|
isMovie: false,
|
|
isSeries: true,
|
|
isSports: false,
|
|
isKids: false,
|
|
isNews: false,
|
|
searchTerm: searchTerm
|
|
},
|
|
{ signal }
|
|
).then(episodesData => {
|
|
addSection(sections, 'Episodes', episodesData.Items, {
|
|
...LIVETV_CARD_OPTIONS
|
|
});
|
|
});
|
|
|
|
// Sports row
|
|
const sports = fetchItemsByType(
|
|
api,
|
|
userId,
|
|
{
|
|
includeItemTypes: [BaseItemKind.LiveTvProgram],
|
|
isSports: true,
|
|
searchTerm: searchTerm
|
|
},
|
|
{ signal }
|
|
).then(sportsData => {
|
|
addSection(sections, 'Sports', sportsData.Items, {
|
|
...LIVETV_CARD_OPTIONS
|
|
});
|
|
});
|
|
|
|
// Kids row
|
|
const kids = fetchItemsByType(
|
|
api,
|
|
userId,
|
|
{
|
|
includeItemTypes: [BaseItemKind.LiveTvProgram],
|
|
isKids: true,
|
|
searchTerm: searchTerm
|
|
},
|
|
{ signal }
|
|
).then(kidsData => {
|
|
addSection(sections, 'Kids', kidsData.Items, {
|
|
...LIVETV_CARD_OPTIONS
|
|
});
|
|
});
|
|
|
|
// News row
|
|
const news = fetchItemsByType(
|
|
api,
|
|
userId,
|
|
{
|
|
includeItemTypes: [BaseItemKind.LiveTvProgram],
|
|
isNews: true,
|
|
searchTerm: searchTerm
|
|
},
|
|
{ signal }
|
|
).then(newsData => {
|
|
addSection(sections, 'News', newsData.Items, {
|
|
...LIVETV_CARD_OPTIONS
|
|
});
|
|
});
|
|
|
|
// Programs row
|
|
const programs = fetchItemsByType(
|
|
api,
|
|
userId,
|
|
{
|
|
includeItemTypes: [BaseItemKind.LiveTvProgram],
|
|
isMovie: false,
|
|
isSeries: false,
|
|
isSports: false,
|
|
isKids: false,
|
|
isNews: false,
|
|
searchTerm: searchTerm
|
|
},
|
|
{ signal }
|
|
).then(programsData => {
|
|
addSection(sections, 'Programs', programsData.Items, {
|
|
...LIVETV_CARD_OPTIONS
|
|
});
|
|
});
|
|
|
|
// Channels row
|
|
const channels = fetchItemsByType(
|
|
api,
|
|
userId,
|
|
{
|
|
includeItemTypes: [BaseItemKind.TvChannel],
|
|
searchTerm: searchTerm
|
|
},
|
|
{ signal }
|
|
).then(channelsData => {
|
|
addSection(sections, 'Channels', channelsData.Items);
|
|
});
|
|
|
|
return Promise.all([ movies, episodes, sports, kids, news, programs, channels ]).then(() => sections);
|
|
};
|
|
|
|
export const useLiveTvSearch = (
|
|
parentId?: string,
|
|
collectionType?: CollectionType,
|
|
searchTerm?: string
|
|
) => {
|
|
const { api, user } = useApi();
|
|
const userId = user?.Id;
|
|
|
|
return useQuery({
|
|
queryKey: ['LiveTv', collectionType, parentId, searchTerm],
|
|
queryFn: ({ signal }) =>
|
|
fetchLiveTv(api!, userId!, searchTerm, signal),
|
|
enabled: !!api && !!userId && !!collectionType && !!isLivetv(collectionType)
|
|
});
|
|
};
|