temporarily remove old player implementations to prevent broken app

This commit is contained in:
jeffvli
2025-11-02 01:40:20 -08:00
parent 1d4069d4fa
commit 550ba4f768
42 changed files with 2571 additions and 2598 deletions
File diff suppressed because it is too large Load Diff
@@ -1,226 +1,226 @@
import { useQueryClient } from '@tanstack/react-query';
import isElectron from 'is-electron';
import { nanoid } from 'nanoid/non-secure';
import { useCallback, useRef } from 'react';
import { useTranslation } from 'react-i18next';
// import { useQueryClient } from '@tanstack/react-query';
// import isElectron from 'is-electron';
// import { nanoid } from 'nanoid/non-secure';
// import { useCallback, useRef } from 'react';
// import { useTranslation } from 'react-i18next';
import { queryKeys } from '/@/renderer/api/query-keys';
import { PlayersRef } from '/@/renderer/features/player/ref/players-ref';
import { updateSong } from '/@/renderer/features/player/update-remote-song';
import {
getAlbumArtistSongsById,
getAlbumSongsById,
getArtistSongsById,
getGenreSongsById,
getPlaylistSongsById,
getSongById,
getSongsByQuery,
} from '/@/renderer/features/player/utils';
import { useCurrentServer, usePlayerControls, usePlayerStore } from '/@/renderer/store';
import { useGeneralSettings, usePlaybackType } from '/@/renderer/store/settings.store';
import { setQueue, setQueueNext } from '/@/renderer/utils/set-transcoded-queue-data';
import { toast } from '/@/shared/components/toast/toast';
import {
instanceOfCancellationError,
LibraryItem,
QueueSong,
Song,
SongListResponse,
} from '/@/shared/types/domain-types';
import { Play, PlaybackType, PlayQueueAddOptions } from '/@/shared/types/types';
// import { queryKeys } from '/@/renderer/api/query-keys';
// import { PlayersRef } from '/@/renderer/features/player/ref/players-ref';
// import { updateSong } from '/@/renderer/features/player/update-remote-song';
// import {
// getAlbumArtistSongsById,
// getAlbumSongsById,
// getArtistSongsById,
// getGenreSongsById,
// getPlaylistSongsById,
// getSongById,
// getSongsByQuery,
// } from '/@/renderer/features/player/utils';
// import { useCurrentServer, usePlayerStore } from '/@/renderer/store';
// import { useGeneralSettings, usePlaybackType } from '/@/renderer/store/settings.store';
// import { setQueue, setQueueNext } from '/@/renderer/utils/set-transcoded-queue-data';
// import { toast } from '/@/shared/components/toast/toast';
// import {
// instanceOfCancellationError,
// LibraryItem,
// QueueSong,
// Song,
// SongListResponse,
// } from '/@/shared/types/domain-types';
// import { Play, PlaybackType, PlayQueueAddOptions } from '/@/shared/types/types';
const getRootQueryKey = (itemType: LibraryItem, serverId: string) => {
let queryKey;
// const getRootQueryKey = (itemType: LibraryItem, serverId: string) => {
// let queryKey;
switch (itemType) {
case LibraryItem.ALBUM:
queryKey = queryKeys.songs.list(serverId);
break;
case LibraryItem.ALBUM_ARTIST:
queryKey = queryKeys.songs.list(serverId);
break;
case LibraryItem.GENRE:
queryKey = queryKeys.songs.list(serverId);
break;
case LibraryItem.PLAYLIST:
queryKey = queryKeys.playlists.songList(serverId);
break;
case LibraryItem.SONG:
queryKey = queryKeys.songs.list(serverId);
break;
default:
queryKey = queryKeys.songs.list(serverId);
break;
}
// switch (itemType) {
// case LibraryItem.ALBUM:
// queryKey = queryKeys.songs.list(serverId);
// break;
// case LibraryItem.ALBUM_ARTIST:
// queryKey = queryKeys.songs.list(serverId);
// break;
// case LibraryItem.GENRE:
// queryKey = queryKeys.songs.list(serverId);
// break;
// case LibraryItem.PLAYLIST:
// queryKey = queryKeys.playlists.songList(serverId);
// break;
// case LibraryItem.SONG:
// queryKey = queryKeys.songs.list(serverId);
// break;
// default:
// queryKey = queryKeys.songs.list(serverId);
// break;
// }
return queryKey;
};
// return queryKey;
// };
const mpvPlayer = isElectron() ? window.api.mpvPlayer : null;
// const mpvPlayer = isElectron() ? window.api.mpvPlayer : null;
const addToQueue = usePlayerStore.getState().actions.addToQueue;
// const addToQueue = usePlayerStore.getState().actions.addToQueue;
export const useHandlePlayQueueAdd = () => {
const { t } = useTranslation();
const queryClient = useQueryClient();
const playbackType = usePlaybackType();
const server = useCurrentServer();
const { play } = usePlayerControls();
const timeoutIds = useRef<null | Record<string, ReturnType<typeof setTimeout>>>({});
// export const useHandlePlayQueueAdd = () => {
// const { t } = useTranslation();
// const queryClient = useQueryClient();
// const playbackType = usePlaybackType();
// const server = useCurrentServer();
// const { play } = usePlayerControls();
// const timeoutIds = useRef<null | Record<string, ReturnType<typeof setTimeout>>>({});
const { doubleClickQueueAll } = useGeneralSettings();
// const { doubleClickQueueAll } = useGeneralSettings();
const handlePlayQueueAdd = useCallback(
async (options: PlayQueueAddOptions) => {
if (!server) return toast.error({ message: 'No server selected', type: 'error' });
const { byData, byItemType, initialIndex, initialSongId, playType, query } = options;
let songs: null | QueueSong[] = null;
// Allow this to be undefined for "play shuffled". If undefined, default to 0,
// otherwise, choose the selected item in the queue
let initialSongIndex: number | undefined;
let toastId: null | string = null;
// const handlePlayQueueAdd = useCallback(
// async (options: PlayQueueAddOptions) => {
// if (!server) return toast.error({ message: 'No server selected', type: 'error' });
// const { byData, byItemType, initialIndex, initialSongId, playType, query } = options;
// let songs: null | QueueSong[] = null;
// // Allow this to be undefined for "play shuffled". If undefined, default to 0,
// // otherwise, choose the selected item in the queue
// let initialSongIndex: number | undefined;
// let toastId: null | string = null;
if (byItemType) {
let songList: SongListResponse | undefined;
const { id, type: itemType } = byItemType;
// if (byItemType) {
// let songList: SongListResponse | undefined;
// const { id, type: itemType } = byItemType;
const fetchId = nanoid();
timeoutIds.current = {
...timeoutIds.current,
[fetchId]: setTimeout(() => {
toastId = toast.info({
autoClose: false,
message: t('player.playbackFetchCancel', {
postProcess: 'sentenceCase',
}),
onClose: () => {
queryClient.cancelQueries({
exact: false,
queryKey: getRootQueryKey(itemType, server?.id),
});
},
title: t('player.playbackFetchInProgress', {
postProcess: 'sentenceCase',
}),
});
}, 2000),
};
// const fetchId = nanoid();
// timeoutIds.current = {
// ...timeoutIds.current,
// [fetchId]: setTimeout(() => {
// toastId = toast.info({
// autoClose: false,
// message: t('player.playbackFetchCancel', {
// postProcess: 'sentenceCase',
// }),
// onClose: () => {
// queryClient.cancelQueries({
// exact: false,
// queryKey: getRootQueryKey(itemType, server?.id),
// });
// },
// title: t('player.playbackFetchInProgress', {
// postProcess: 'sentenceCase',
// }),
// });
// }, 2000),
// };
try {
if (itemType === LibraryItem.PLAYLIST) {
songList = await getPlaylistSongsById({
id: id?.[0],
query,
queryClient,
server,
});
} else if (itemType === LibraryItem.ALBUM) {
songList = await getAlbumSongsById({ id, query, queryClient, server });
} else if (itemType === LibraryItem.ALBUM_ARTIST) {
songList = await getAlbumArtistSongsById({
id,
query,
queryClient,
server,
});
} else if (itemType === LibraryItem.ARTIST) {
songList = await getArtistSongsById({
id,
query,
queryClient,
server,
});
} else if (itemType === LibraryItem.GENRE) {
songList = await getGenreSongsById({ id, query, queryClient, server });
} else if (itemType === LibraryItem.SONG) {
if (id?.length === 1) {
songList = await getSongById({ id: id?.[0], queryClient, server });
} else if (!doubleClickQueueAll && initialSongId) {
songList = await getSongById({
id: initialSongId,
queryClient,
server,
});
} else {
songList = await getSongsByQuery({ query, queryClient, server });
}
}
// try {
// if (itemType === LibraryItem.PLAYLIST) {
// songList = await getPlaylistSongsById({
// id: id?.[0],
// query,
// queryClient,
// server,
// });
// } else if (itemType === LibraryItem.ALBUM) {
// songList = await getAlbumSongsById({ id, query, queryClient, server });
// } else if (itemType === LibraryItem.ALBUM_ARTIST) {
// songList = await getAlbumArtistSongsById({
// id,
// query,
// queryClient,
// server,
// });
// } else if (itemType === LibraryItem.ARTIST) {
// songList = await getArtistSongsById({
// id,
// query,
// queryClient,
// server,
// });
// } else if (itemType === LibraryItem.GENRE) {
// songList = await getGenreSongsById({ id, query, queryClient, server });
// } else if (itemType === LibraryItem.SONG) {
// if (id?.length === 1) {
// songList = await getSongById({ id: id?.[0], queryClient, server });
// } else if (!doubleClickQueueAll && initialSongId) {
// songList = await getSongById({
// id: initialSongId,
// queryClient,
// server,
// });
// } else {
// songList = await getSongsByQuery({ query, queryClient, server });
// }
// }
clearTimeout(timeoutIds.current[fetchId] as ReturnType<typeof setTimeout>);
delete timeoutIds.current[fetchId];
if (toastId) {
toast.hide(toastId);
}
} catch (err: any) {
if (instanceOfCancellationError(err)) {
return null;
}
// clearTimeout(timeoutIds.current[fetchId] as ReturnType<typeof setTimeout>);
// delete timeoutIds.current[fetchId];
// if (toastId) {
// toast.hide(toastId);
// }
// } catch (err: any) {
// if (instanceOfCancellationError(err)) {
// return null;
// }
clearTimeout(timeoutIds.current[fetchId] as ReturnType<typeof setTimeout>);
delete timeoutIds.current[fetchId];
toast.hide(fetchId);
// clearTimeout(timeoutIds.current[fetchId] as ReturnType<typeof setTimeout>);
// delete timeoutIds.current[fetchId];
// toast.hide(fetchId);
return toast.error({
message: err.message,
title: t('error.genericError', { postProcess: 'sentenceCase' }) as string,
});
}
// return toast.error({
// message: err.message,
// title: t('error.genericError', { postProcess: 'sentenceCase' }) as string,
// });
// }
songs =
songList?.items?.map((song: Song) => ({ ...song, uniqueId: nanoid() })) || null;
} else if (byData) {
songs = byData.map((song) => ({ ...song, uniqueId: nanoid() })) || null;
}
// songs =
// songList?.items?.map((song: Song) => ({ ...song, uniqueId: nanoid() })) || null;
// } else if (byData) {
// songs = byData.map((song) => ({ ...song, uniqueId: nanoid() })) || null;
// }
if (!songs || songs?.length === 0)
return toast.warn({
message: t('common.noResultsFromQuery', { postProcess: 'sentenceCase' }),
title: t('player.playbackFetchNoResults', { postProcess: 'sentenceCase' }),
});
// if (!songs || songs?.length === 0)
// return toast.warn({
// message: t('common.noResultsFromQuery', { postProcess: 'sentenceCase' }),
// title: t('player.playbackFetchNoResults', { postProcess: 'sentenceCase' }),
// });
if (initialIndex) {
initialSongIndex = initialIndex;
} else if (initialSongId) {
initialSongIndex = songs.findIndex((song) => song.id === initialSongId);
}
// if (initialIndex) {
// initialSongIndex = initialIndex;
// } else if (initialSongId) {
// initialSongIndex = songs.findIndex((song) => song.id === initialSongId);
// }
const hadSong = usePlayerStore.getState().queue.default.length > 0;
const playerData = addToQueue({ initialIndex: initialSongIndex, playType, songs });
// const hadSong = usePlayerStore.getState().queue.default.length > 0;
// const playerData = addToQueue({ initialIndex: initialSongIndex, playType, songs });
updateSong(playerData.current.song);
// updateSong(playerData.current.song);
const replacesQueue = playType === Play.NOW || playType === Play.SHUFFLE;
// const replacesQueue = playType === Play.NOW || playType === Play.SHUFFLE;
if (playbackType === PlaybackType.LOCAL) {
mpvPlayer!.volume(usePlayerStore.getState().volume);
// if (playbackType === PlaybackType.LOCAL) {
// mpvPlayer!.volume(usePlayerStore.getState().volume);
if (replacesQueue || !hadSong) {
mpvPlayer!.pause();
setQueue(playerData, false);
} else {
setQueueNext(playerData);
}
} else {
const player =
playerData.current.player === 1
? PlayersRef.current?.player1
: PlayersRef.current?.player2;
const underlying = player?.getInternalPlayer();
if (underlying && replacesQueue) {
underlying.currentTime = 0;
}
}
// if (replacesQueue || !hadSong) {
// mpvPlayer!.pause();
// setQueue(playerData, false);
// } else {
// setQueueNext(playerData);
// }
// } else {
// const player =
// playerData.current.player === 1
// ? PlayersRef.current?.player1
// : PlayersRef.current?.player2;
// const underlying = player?.getInternalPlayer();
// if (underlying && replacesQueue) {
// underlying.currentTime = 0;
// }
// }
// We should only play if the queue was empty, or we are doing play NOW
// (override the queue).
if (replacesQueue || !hadSong) {
play();
}
// // We should only play if the queue was empty, or we are doing play NOW
// // (override the queue).
// if (replacesQueue || !hadSong) {
// play();
// }
return null;
},
[doubleClickQueueAll, play, playbackType, queryClient, server, t],
);
// return null;
// },
// [doubleClickQueueAll, play, playbackType, queryClient, server, t],
// );
return handlePlayQueueAdd;
};
// return handlePlayQueueAdd;
// };
@@ -1,8 +1,8 @@
import { useEffect } from 'react';
import {
useCurrentSong,
useCurrentStatus,
usePlayerSong,
usePlayerStatus,
usePlaybackSettings,
useSettingsStore,
} from '/@/renderer/store';
@@ -28,8 +28,8 @@ export const useMediaSession = ({
handleStop: () => void;
}) => {
const { mediaSession: mediaSessionEnabled } = usePlaybackSettings();
const playerStatus = useCurrentStatus();
const currentSong = useCurrentSong();
const playerStatus = usePlayerStatus();
const currentSong = usePlayerSong();
const mediaSession = navigator.mediaSession;
const skip = useSettingsStore((state) => state.general.skipButtons);
@@ -1,14 +1,14 @@
import isElectron from 'is-electron';
import { useCallback, useEffect } from 'react';
import { useCurrentStatus } from '/@/renderer/store';
import { usePlayerStatus } from '/@/renderer/store';
import { useWindowSettings } from '/@/renderer/store';
import { PlayerStatus } from '/@/shared/types/types';
const ipc = isElectron() ? window.api.ipc : null;
export const usePowerSaveBlocker = () => {
const status = useCurrentStatus();
const status = usePlayerStatus();
const { preventSleepOnPlayback } = useWindowSettings();
const startPowerSaveBlocker = useCallback(async () => {
@@ -1,13 +1,7 @@
import isElectron from 'is-electron';
import { useCallback, useEffect, WheelEvent } from 'react';
import {
useMuted,
usePlayerControls,
useSetCurrentSpeed,
useSpeed,
useVolume,
} from '/@/renderer/store';
import { usePlayerMuted, usePlayerSpeed, usePlayerVolume } from '/@/renderer/store';
import { useGeneralSettings } from '/@/renderer/store/settings.store';
const mpvPlayer = isElectron() ? window.api.mpvPlayer : null;
@@ -40,12 +34,12 @@ const calculateVolumeDown = (volume: number, volumeWheelStep: number) => {
};
export const useRightControls = () => {
const { setMuted, setVolume } = usePlayerControls();
const volume = useVolume();
const muted = useMuted();
// const { setMuted, setVolume } = usePlayerControls();
const volume = usePlayerVolume();
const muted = usePlayerMuted();
const { volumeWheelStep } = useGeneralSettings();
const speed = useSpeed();
const setCurrentSpeed = useSetCurrentSpeed();
const speed = usePlayerSpeed();
// const setCurrentSpeed = useSetCurrentSpeed();
// Ensure that the mpv player volume is set on startup
useEffect(() => {
@@ -63,40 +57,37 @@ export const useRightControls = () => {
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
const handleSpeed = useCallback(
(e: number) => {
setCurrentSpeed(e);
if (mpvPlayer) {
mpvPlayer?.setProperties({ speed: e });
}
},
[setCurrentSpeed],
);
const handleSpeed = useCallback((e: number) => {
// setCurrentSpeed(e);
if (mpvPlayer) {
mpvPlayer?.setProperties({ speed: e });
}
}, []);
const handleVolumeSlider = (e: number) => {
mpvPlayer?.volume(e);
remote?.updateVolume(e);
setVolume(e);
// setVolume(e);
};
const handleVolumeSliderState = (e: number) => {
remote?.updateVolume(e);
setVolume(e);
// setVolume(e);
};
const handleVolumeDown = useCallback(() => {
const volumeToSet = calculateVolumeDown(volume, volumeWheelStep);
mpvPlayer?.volume(volumeToSet);
remote?.updateVolume(volumeToSet);
setVolume(volumeToSet);
}, [setVolume, volume, volumeWheelStep]);
// setVolume(volumeToSet);
}, [volume, volumeWheelStep]);
const handleVolumeUp = useCallback(() => {
const volumeToSet = calculateVolumeUp(volume, volumeWheelStep);
mpvPlayer?.volume(volumeToSet);
remote?.updateVolume(volumeToSet);
setVolume(volumeToSet);
}, [setVolume, volume, volumeWheelStep]);
// setVolume(volumeToSet);
}, [volume, volumeWheelStep]);
const handleVolumeWheel = useCallback(
(e: WheelEvent<HTMLButtonElement | HTMLDivElement>) => {
@@ -109,15 +100,15 @@ export const useRightControls = () => {
mpvPlayer?.volume(volumeToSet);
remote?.updateVolume(volumeToSet);
setVolume(volumeToSet);
// setVolume(volumeToSet);
},
[setVolume, volume, volumeWheelStep],
[volume, volumeWheelStep],
);
const handleMute = useCallback(() => {
setMuted(!muted);
// setMuted(!muted);
mpvPlayer?.mute(!muted);
}, [muted, setMuted]);
}, [muted]);
useEffect(() => {
if (isElectron()) {