feishin/src/renderer/features/player/utils.ts

286 lines
6.9 KiB
TypeScript
Raw Normal View History

import { QueryClient } from '@tanstack/react-query';
import { api } from '/@/renderer/api';
import { queryKeys } from '/@/renderer/api/query-keys';
import {
2023-07-01 19:10:05 -07:00
PlaylistSongListQuery,
ServerListItem,
2023-07-01 19:10:05 -07:00
SongDetailQuery,
SongListQuery,
SongListResponse,
SongListSort,
SortOrder,
2025-05-20 19:23:36 -07:00
} from '/@/shared/types/domain-types';
export const getPlaylistSongsById = async (args: {
2023-07-01 19:10:05 -07:00
id: string;
query?: Partial<PlaylistSongListQuery>;
queryClient: QueryClient;
server: ServerListItem;
}) => {
const { id, query, queryClient, server } = args;
2023-07-01 19:10:05 -07:00
const queryFilter: PlaylistSongListQuery = {
id,
sortBy: SongListSort.ID,
sortOrder: SortOrder.ASC,
startIndex: 0,
...query,
};
const queryKey = queryKeys.playlists.songList(server?.id, id, queryFilter);
const res = await queryClient.fetchQuery(
queryKey,
async ({ signal }) =>
api.controller.getPlaylistSongList({
apiClientProps: {
server,
signal,
},
query: queryFilter,
}),
{
cacheTime: 1000 * 60,
staleTime: 1000 * 60,
},
2023-07-01 19:10:05 -07:00
);
return res;
};
export const getAlbumSongsById = async (args: {
2023-07-01 19:10:05 -07:00
id: string[];
orderByIds?: boolean;
query?: Partial<SongListQuery>;
queryClient: QueryClient;
server: ServerListItem;
}) => {
const { id, query, queryClient, server } = args;
2023-07-01 19:10:05 -07:00
const queryFilter: SongListQuery = {
albumIds: id,
sortBy: SongListSort.ALBUM,
sortOrder: SortOrder.ASC,
startIndex: 0,
...query,
};
const queryKey = queryKeys.songs.list(server?.id, queryFilter);
const res = await queryClient.fetchQuery(
queryKey,
async ({ signal }) =>
api.controller.getSongList({
apiClientProps: {
server,
signal,
},
query: queryFilter,
}),
{
cacheTime: 1000 * 60,
staleTime: 1000 * 60,
},
2023-07-01 19:10:05 -07:00
);
return res;
};
2023-08-04 02:27:04 -07:00
export const getGenreSongsById = async (args: {
id: string[];
orderByIds?: boolean;
query?: Partial<SongListQuery>;
queryClient: QueryClient;
server: null | ServerListItem;
2023-08-04 02:27:04 -07:00
}) => {
const { id, query, queryClient, server } = args;
2023-08-04 02:27:04 -07:00
const data: SongListResponse = {
items: [],
startIndex: 0,
totalRecordCount: 0,
};
for (const genreId of id) {
const queryFilter: SongListQuery = {
2024-09-26 04:23:08 +00:00
genreIds: [genreId],
2023-08-04 02:27:04 -07:00
sortBy: SongListSort.GENRE,
sortOrder: SortOrder.ASC,
startIndex: 0,
...query,
};
const queryKey = queryKeys.songs.list(server?.id, queryFilter);
const res = await queryClient.fetchQuery(
queryKey,
async ({ signal }) =>
api.controller.getSongList({
apiClientProps: {
server,
signal,
},
query: queryFilter,
}),
{
cacheTime: 1000 * 60,
staleTime: 1000 * 60,
},
);
data.items.push(...res!.items);
2024-09-26 04:23:08 +00:00
if (data.totalRecordCount) {
data.totalRecordCount += res!.totalRecordCount || 0;
}
2023-08-04 02:27:04 -07:00
}
return data;
};
export const getAlbumArtistSongsById = async (args: {
2023-07-01 19:10:05 -07:00
id: string[];
orderByIds?: boolean;
query?: Partial<SongListQuery>;
queryClient: QueryClient;
server: ServerListItem;
}) => {
const { id, query, queryClient, server } = args;
2023-07-01 19:10:05 -07:00
const queryFilter: SongListQuery = {
2025-05-06 14:43:42 -07:00
albumArtistIds: id || [],
2023-07-01 19:10:05 -07:00
sortBy: SongListSort.ALBUM_ARTIST,
sortOrder: SortOrder.ASC,
startIndex: 0,
...query,
};
const queryKey = queryKeys.songs.list(server?.id, queryFilter);
2025-05-06 14:43:42 -07:00
const res = await queryClient.fetchQuery(
queryKey,
async ({ signal }) =>
api.controller.getSongList({
apiClientProps: {
server,
signal,
},
query: queryFilter,
}),
{
cacheTime: 1000 * 60,
staleTime: 1000 * 60,
},
);
return res;
};
export const getArtistSongsById = async (args: {
id: string[];
query?: Partial<SongListQuery>;
queryClient: QueryClient;
server: ServerListItem;
}) => {
const { id, query, queryClient, server } = args;
2025-05-06 14:43:42 -07:00
const queryFilter: SongListQuery = {
artistIds: id,
sortBy: SongListSort.ALBUM,
sortOrder: SortOrder.ASC,
startIndex: 0,
...query,
};
const queryKey = queryKeys.songs.list(server?.id, queryFilter);
2023-07-01 19:10:05 -07:00
const res = await queryClient.fetchQuery(
queryKey,
async ({ signal }) =>
api.controller.getSongList({
apiClientProps: {
server,
signal,
},
query: queryFilter,
}),
{
cacheTime: 1000 * 60,
staleTime: 1000 * 60,
},
2023-07-01 19:10:05 -07:00
);
return res;
};
export const getSongsByQuery = async (args: {
2023-07-01 19:10:05 -07:00
query?: Partial<SongListQuery>;
queryClient: QueryClient;
server: ServerListItem;
}) => {
const { query, queryClient, server } = args;
2023-07-01 19:10:05 -07:00
const queryFilter: SongListQuery = {
sortBy: SongListSort.ALBUM,
sortOrder: SortOrder.ASC,
startIndex: 0,
...query,
};
const queryKey = queryKeys.songs.list(server?.id, queryFilter);
const res = await queryClient.fetchQuery(
queryKey,
2024-09-26 04:23:08 +00:00
async ({ signal }) => {
return api.controller.getSongList({
2023-07-01 19:10:05 -07:00
apiClientProps: {
server,
signal,
},
query: queryFilter,
2024-09-26 04:23:08 +00:00
});
},
2023-07-01 19:10:05 -07:00
{
cacheTime: 1000 * 60,
staleTime: 1000 * 60,
},
2023-07-01 19:10:05 -07:00
);
return res;
};
export const getSongById = async (args: {
2023-07-01 19:10:05 -07:00
id: string;
queryClient: QueryClient;
server: ServerListItem;
}): Promise<SongListResponse> => {
2023-07-01 19:10:05 -07:00
const { id, queryClient, server } = args;
const queryFilter: SongDetailQuery = { id };
const queryKey = queryKeys.songs.detail(server?.id, queryFilter);
const res = await queryClient.fetchQuery(
queryKey,
async ({ signal }) =>
api.controller.getSongDetail({
apiClientProps: {
server,
signal,
},
query: queryFilter,
}),
{
cacheTime: 1000 * 60,
staleTime: 1000 * 60,
},
);
2023-07-01 19:10:05 -07:00
if (!res) throw new Error('Song not found');
2023-07-01 19:10:05 -07:00
return {
items: [res],
startIndex: 0,
totalRecordCount: 1,
};
};