feishin/src/renderer/features/player/hooks/use-handle-playqueue-add.ts

124 lines
4.1 KiB
TypeScript
Raw Normal View History

2022-12-31 19:26:58 -08:00
import { useCallback } from 'react';
2022-12-20 04:11:06 -08:00
import { useQueryClient } from '@tanstack/react-query';
import { api } from '/@/renderer/api/index';
import { jfNormalize } from '/@/renderer/api/jellyfin.api';
import { JFSong } from '/@/renderer/api/jellyfin.types';
import { ndNormalize } from '/@/renderer/api/navidrome.api';
import { NDSong } from '/@/renderer/api/navidrome.types';
import { queryKeys } from '/@/renderer/api/query-keys';
import { useAuthStore, usePlayerStore } from '/@/renderer/store';
2022-12-25 01:55:00 -08:00
import { usePlayerType } from '/@/renderer/store/settings.store';
2022-12-20 04:11:06 -08:00
import { PlayQueueAddOptions, LibraryItem, Play, PlaybackType } from '/@/renderer/types';
import { toast } from '/@/renderer/components/toast';
2022-12-25 01:25:46 -08:00
import isElectron from 'is-electron';
2022-12-28 15:31:04 -08:00
import { nanoid } from 'nanoid/non-secure';
import { SongListSort, SortOrder } from '/@/renderer/api/types';
2022-12-20 04:11:06 -08:00
2022-12-25 01:25:46 -08:00
const mpvPlayer = isElectron() ? window.electron.mpvPlayer : null;
2022-12-20 04:11:06 -08:00
export const useHandlePlayQueueAdd = () => {
const queryClient = useQueryClient();
2022-12-25 01:55:00 -08:00
const playerType = usePlayerType();
2022-12-20 04:11:06 -08:00
const deviceId = useAuthStore.getState().deviceId;
const server = useAuthStore.getState().currentServer;
2022-12-31 19:26:58 -08:00
const handlePlayQueueAdd = useCallback(
async (options: PlayQueueAddOptions) => {
if (!server) return toast.error({ message: 'No server selected', type: 'error' });
let songs = null;
if (options.byItemType) {
let songsList;
let queryFilter: any;
let queryKey: any;
if (options.byItemType.type === LibraryItem.ALBUM) {
queryFilter = {
albumIds: options.byItemType?.id || [],
sortBy: SongListSort.ALBUM,
sortOrder: SortOrder.ASC,
startIndex: 0,
};
queryKey = queryKeys.songs.list(server?.id, queryFilter);
} else if (options.byItemType.type === LibraryItem.ALBUM_ARTIST) {
queryFilter = {
artistIds: options.byItemType?.id || [],
sortBy: SongListSort.ALBUM,
sortOrder: SortOrder.ASC,
startIndex: 0,
};
queryKey = queryKeys.songs.list(server?.id, queryFilter);
} else if (options.byItemType.type === LibraryItem.PLAYLIST) {
queryFilter = {
artistIds: options.byItemType?.id || [],
sortBy: SongListSort.ALBUM,
sortOrder: SortOrder.ASC,
startIndex: 0,
};
queryKey = queryKeys.songs.list(server?.id, queryFilter);
}
try {
songsList = await queryClient.fetchQuery(queryKey, async ({ signal }) =>
api.controller.getSongList({
query: queryFilter,
server,
signal,
}),
2022-12-30 21:02:17 -08:00
);
2022-12-31 19:26:58 -08:00
} catch (err: any) {
return toast.error({
message: err.message,
title: 'Play queue add failed',
});
}
if (!songsList) return toast.warn({ message: 'No songs found' });
switch (server?.type) {
case 'jellyfin':
songs = songsList.items?.map((song) =>
jfNormalize.song(song as JFSong, server, deviceId),
);
break;
case 'navidrome':
songs = songsList.items?.map((song) =>
ndNormalize.song(song as NDSong, server, deviceId),
);
break;
case 'subsonic':
break;
}
} else if (options.byData) {
songs = options.byData.map((song) => ({ ...song, uniqueId: nanoid() }));
2022-12-30 21:02:17 -08:00
}
2022-12-20 04:11:06 -08:00
2022-12-31 19:26:58 -08:00
if (!songs) return toast.warn({ message: 'No songs found' });
2022-12-20 04:11:06 -08:00
2022-12-31 19:26:58 -08:00
const playerData = usePlayerStore.getState().actions.addToQueue(songs, options.play);
2022-12-20 04:11:06 -08:00
2022-12-31 19:26:58 -08:00
if (options.play === Play.NEXT || options.play === Play.LAST) {
if (playerType === PlaybackType.LOCAL) {
mpvPlayer.setQueueNext(playerData);
}
2022-12-20 04:11:06 -08:00
}
2022-12-31 19:26:58 -08:00
if (options.play === Play.NOW) {
if (playerType === PlaybackType.LOCAL) {
mpvPlayer.setQueue(playerData);
mpvPlayer.play();
}
2022-12-28 15:31:04 -08:00
2022-12-31 19:26:58 -08:00
usePlayerStore.getState().actions.play();
}
2022-12-28 15:31:04 -08:00
2022-12-31 19:26:58 -08:00
return null;
},
[deviceId, playerType, queryClient, server],
);
2022-12-20 04:11:06 -08:00
return handlePlayQueueAdd;
};