From 1acde80d61cf5978ac94247e4ddeb3cabb467fc1 Mon Sep 17 00:00:00 2001 From: jeffvli Date: Tue, 18 Nov 2025 14:20:00 -0800 Subject: [PATCH] clean up unused files --- .../context/play-queue-handler-context.ts | 9 - .../player/hooks/use-center-controls.ts | 771 ------------------ .../player/hooks/use-handle-playqueue-add.ts | 226 ----- .../player/hooks/use-media-session.ts | 2 +- .../player/hooks/use-right-controls.ts | 144 ---- .../utils/set-transcoded-queue-data.ts | 49 -- 6 files changed, 1 insertion(+), 1200 deletions(-) delete mode 100644 src/renderer/features/player/context/play-queue-handler-context.ts delete mode 100644 src/renderer/features/player/hooks/use-center-controls.ts delete mode 100644 src/renderer/features/player/hooks/use-handle-playqueue-add.ts delete mode 100644 src/renderer/features/player/hooks/use-right-controls.ts delete mode 100644 src/renderer/utils/set-transcoded-queue-data.ts diff --git a/src/renderer/features/player/context/play-queue-handler-context.ts b/src/renderer/features/player/context/play-queue-handler-context.ts deleted file mode 100644 index 16902c55e..000000000 --- a/src/renderer/features/player/context/play-queue-handler-context.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { createContext } from 'react'; - -import { PlayQueueAddOptions } from '/@/shared/types/types'; - -export const PlayQueueHandlerContext = createContext<{ - handlePlayQueueAdd: ((options: PlayQueueAddOptions) => void) | undefined; -}>({ - handlePlayQueueAdd: undefined, -}); diff --git a/src/renderer/features/player/hooks/use-center-controls.ts b/src/renderer/features/player/hooks/use-center-controls.ts deleted file mode 100644 index ea9687b06..000000000 --- a/src/renderer/features/player/hooks/use-center-controls.ts +++ /dev/null @@ -1,771 +0,0 @@ -// import isElectron from 'is-electron'; -// import debounce from 'lodash/debounce'; -// import { useCallback, useEffect } from 'react'; -// import { useTranslation } from 'react-i18next'; - -// import { useScrobble } from '/@/renderer/features/player/hooks/use-scrobble'; -// import { updateSong } from '/@/renderer/features/plaayer/update-remote-song'; -// import { -// usePlayerNum, -// usePlayerStatus, -// usePlayerQueue, -// usePlayerControls, -// usePlayerStore, -// useRepeatStatus, -// useSetCurrentTime, -// useShuffleStatus, -// } from '/@/renderer/store'; -// import { usePlaybackType } from '/@/renderer/store/settings.store'; -// import { setAutoNext, setQueue, setQueueNext } from '/@/renderer/utils/set-transcoded-queue-data'; -// import { toast } from '/@/shared/components/toast/toast'; -// import { PlaybackType, PlayerRepeat, PlayerShuffle, PlayerStatus } from '/@/shared/types/types'; - -// const mpvPlayer = isElectron() ? window.api.mpvPlayer : null; -// const mpvPlayerListener = isElectron() ? window.api.mpvPlayerListener : null; -// const ipc = isElectron() ? window.api.ipc : null; -// const utils = isElectron() ? window.api.utils : null; -// const mpris = isElectron() && utils?.isLinux() ? window.api.mpris : null; -// const remote = isElectron() ? window.api.remote : null; -// const mediaSession = navigator.mediaSession; - -// export const useCenterControls = (args: { playersRef: any }) => { -// const { t } = useTranslation(); -// const { playersRef } = args; - -// const currentPlayer = usePlayerNum(); -// const { autoNext, next, pause, play, previous, setCurrentIndex, setRepeat, setShuffle } = -// usePlayerControls(); -// const setCurrentTime = useSetCurrentTime(); -// const queue = usePlayerQueue(); -// const playerStatus = usePlayerStatus(); -// const repeatStatus = useRepeatStatus(); -// const shuffleStatus = useShuffleStatus(); -// const playbackType = usePlaybackType(); -// const player1Ref = playersRef?.current?.player1; -// const player2Ref = playersRef?.current?.player2; -// const currentPlayerRef = currentPlayer === 1 ? player1Ref : player2Ref; -// const nextPlayerRef = currentPlayer === 1 ? player2Ref : player1Ref; - -// const { handleScrobbleFromSeek, handleScrobbleFromSongRestart } = useScrobble(); - -// useEffect(() => { -// if (mediaSession) { -// mediaSession.playbackState = -// playerStatus === PlayerStatus.PLAYING ? 'playing' : 'paused'; -// } - -// remote?.updatePlayback(playerStatus); -// }, [playerStatus]); - -// useEffect(() => { -// remote?.updateRepeat(repeatStatus); -// }, [repeatStatus]); - -// useEffect(() => { -// remote?.updateShuffle(shuffleStatus !== PlayerShuffle.NONE); -// }, [shuffleStatus]); - -// const resetPlayers = useCallback(() => { -// if (player1Ref.getInternalPlayer()) { -// player1Ref.getInternalPlayer().currentTime = 0; -// player1Ref.getInternalPlayer().pause(); -// } - -// if (player2Ref.getInternalPlayer()) { -// player2Ref.getInternalPlayer().currentTime = 0; -// player2Ref.getInternalPlayer().pause(); -// } -// }, [player1Ref, player2Ref]); - -// const resetNextPlayer = useCallback(() => { -// currentPlayerRef.getInternalPlayer().volume = 0.1; - -// const nextPlayer = nextPlayerRef.getInternalPlayer(); -// if (nextPlayer) { -// nextPlayer.currentTime = 0; -// nextPlayer.pause(); -// } -// }, [currentPlayerRef, nextPlayerRef]); - -// const stopPlayback = useCallback(() => { -// player1Ref.getInternalPlayer().pause(); -// player2Ref.getInternalPlayer().pause(); -// resetPlayers(); -// }, [player1Ref, player2Ref, resetPlayers]); - -// const isMpvPlayer = isElectron() && playbackType === PlaybackType.LOCAL; - -// const handlePlay = useCallback(() => { -// if (isMpvPlayer) { -// mpvPlayer?.volume(usePlayerStore.getState().volume); -// mpvPlayer!.play(); -// } else { -// currentPlayerRef -// .getInternalPlayer() -// ?.play() -// .catch(() => {}); -// } - -// play(); -// }, [currentPlayerRef, isMpvPlayer, play]); - -// const handlePause = useCallback(() => { -// if (isMpvPlayer) { -// mpvPlayer!.pause(); -// } - -// pause(); -// }, [isMpvPlayer, pause]); - -// const handleStop = useCallback(() => { -// if (isMpvPlayer) { -// mpvPlayer!.stop(); -// } else { -// stopPlayback(); -// } - -// setCurrentTime(0); -// pause(); -// }, [isMpvPlayer, pause, setCurrentTime, stopPlayback]); - -// const handleToggleShuffle = useCallback(() => { -// if (shuffleStatus === PlayerShuffle.NONE) { -// const playerData = setShuffle(PlayerShuffle.TRACK); -// remote?.updateShuffle(true); -// return setQueueNext(playerData); -// } - -// const playerData = setShuffle(PlayerShuffle.NONE); -// remote?.updateShuffle(false); -// return setQueueNext(playerData); -// }, [setShuffle, shuffleStatus]); - -// const handleToggleRepeat = useCallback(() => { -// if (repeatStatus === PlayerRepeat.NONE) { -// const playerData = setRepeat(PlayerRepeat.ALL); -// remote?.updateRepeat(PlayerRepeat.ALL); -// return setQueueNext(playerData); -// } - -// if (repeatStatus === PlayerRepeat.ALL) { -// const playerData = setRepeat(PlayerRepeat.ONE); -// remote?.updateRepeat(PlayerRepeat.ONE); -// return setQueueNext(playerData); -// } - -// const playerData = setRepeat(PlayerRepeat.NONE); -// remote?.updateRepeat(PlayerRepeat.NONE); -// return setQueueNext(playerData); -// }, [repeatStatus, setRepeat]); - -// const checkIsLastTrack = useCallback(() => { -// return usePlayerStore.getState().actions.checkIsLastTrack(); -// }, []); - -// const checkIsFirstTrack = useCallback(() => { -// return usePlayerStore.getState().actions.checkIsFirstTrack(); -// }, []); - -// const handleAutoNext = useCallback(() => { -// const isLastTrack = checkIsLastTrack(); - -// const handleRepeatAll = { -// local: () => { -// const playerData = autoNext(); -// updateSong(playerData.current.song); -// setAutoNext(playerData); -// play(); -// }, -// web: () => { -// const playerData = autoNext(); -// updateSong(playerData.current.song); -// }, -// }; - -// const handleRepeatNone = { -// local: () => { -// if (isLastTrack) { -// const playerData = setCurrentIndex(0); -// updateSong(playerData.current.song); -// setQueue(playerData, true); -// pause(); -// } else { -// const playerData = autoNext(); -// updateSong(playerData.current.song); -// setAutoNext(playerData); -// play(); -// } -// }, -// web: () => { -// if (isLastTrack) { -// resetPlayers(); -// pause(); -// } else { -// const playerData = autoNext(); -// updateSong(playerData.current.song); -// resetPlayers(); -// } -// }, -// }; - -// const handleRepeatOne = { -// local: () => { -// const playerData = autoNext(); -// updateSong(playerData.current.song); -// setAutoNext(playerData); -// play(); -// }, -// web: () => { -// if (isLastTrack) { -// resetPlayers(); -// } else { -// autoNext(); -// resetPlayers(); -// } -// }, -// }; - -// switch (repeatStatus) { -// case PlayerRepeat.ALL: -// handleRepeatAll[playbackType](); -// break; -// case PlayerRepeat.NONE: -// handleRepeatNone[playbackType](); -// break; -// case PlayerRepeat.ONE: -// handleRepeatOne[playbackType](); -// break; - -// default: -// break; -// } -// }, [ -// autoNext, -// checkIsLastTrack, -// pause, -// play, -// playbackType, -// repeatStatus, -// resetPlayers, -// setCurrentIndex, -// ]); - -// const handleNextTrack = useCallback(() => { -// const isLastTrack = checkIsLastTrack(); -// setCurrentTime(0); - -// const handleRepeatAll = { -// local: () => { -// const playerData = next(); -// updateSong(playerData.current.song); -// setQueue(playerData); -// }, -// web: () => { -// const playerData = next(); -// updateSong(playerData.current.song); -// }, -// }; - -// const handleRepeatNone = { -// local: () => { -// if (isLastTrack) { -// const playerData = setCurrentIndex(0); -// updateSong(playerData.current.song); -// setQueue(playerData, true); -// pause(); -// } else { -// const playerData = next(); -// updateSong(playerData.current.song); -// setQueue(playerData); -// } -// }, -// web: () => { -// if (isLastTrack) { -// const playerData = setCurrentIndex(0); -// updateSong(playerData.current.song); -// resetPlayers(); -// pause(); -// } else { -// const playerData = next(); -// updateSong(playerData.current.song); -// resetPlayers(); -// } -// }, -// }; - -// const handleRepeatOne = { -// local: () => { -// if (!isLastTrack) { -// const playerData = next(); -// updateSong(playerData.current.song); -// setQueue(playerData); -// } -// }, -// web: () => { -// if (!isLastTrack) { -// const playerData = next(); -// updateSong(playerData.current.song); -// } -// }, -// }; - -// switch (repeatStatus) { -// case PlayerRepeat.ALL: -// handleRepeatAll[playbackType](); -// break; -// case PlayerRepeat.NONE: -// handleRepeatNone[playbackType](); -// break; -// case PlayerRepeat.ONE: -// handleRepeatOne[playbackType](); -// break; - -// default: -// break; -// } - -// setCurrentTime(0); -// }, [ -// checkIsLastTrack, -// next, -// pause, -// playbackType, -// repeatStatus, -// resetPlayers, -// setCurrentIndex, -// setCurrentTime, -// ]); - -// const handlePrevTrack = useCallback(() => { -// const currentTime = isMpvPlayer -// ? usePlayerStore.getState().current.time -// : currentPlayerRef.getCurrentTime(); - -// // Reset the current track more than 10 seconds have elapsed -// if (currentTime >= 10) { -// setCurrentTime(0, true); -// handleScrobbleFromSongRestart(currentTime); -// mpris?.updateSeek(0); -// if (isMpvPlayer) { -// return mpvPlayer!.seekTo(0); -// } -// return currentPlayerRef.seekTo(0); -// } - -// const isFirstTrack = checkIsFirstTrack(); - -// const handleRepeatAll = { -// local: () => { -// if (!isFirstTrack) { -// const playerData = previous(); -// updateSong(playerData.current.song); -// setQueue(playerData); -// } else { -// const playerData = setCurrentIndex(queue.length - 1); -// updateSong(playerData.current.song); -// setQueue(playerData); -// } -// }, -// web: () => { -// if (isFirstTrack) { -// const playerData = setCurrentIndex(queue.length - 1); -// updateSong(playerData.current.song); -// resetPlayers(); -// } else { -// const playerData = previous(); -// updateSong(playerData.current.song); -// resetPlayers(); -// } -// }, -// }; - -// const handleRepeatNone = { -// local: () => { -// if (isFirstTrack) { -// const playerData = setCurrentIndex(0); -// updateSong(playerData.current.song); -// setQueue(playerData, true); -// pause(); -// } else { -// const playerData = previous(); -// updateSong(playerData.current.song); -// setQueue(playerData); -// } -// }, -// web: () => { -// if (isFirstTrack) { -// resetPlayers(); -// pause(); -// } else { -// const playerData = previous(); -// updateSong(playerData.current.song); -// resetPlayers(); -// } -// }, -// }; - -// const handleRepeatOne = { -// local: () => { -// const playerData = previous(); -// updateSong(playerData.current.song); -// setQueue(playerData); -// }, -// web: () => { -// const playerData = previous(); -// updateSong(playerData.current.song); -// resetPlayers(); -// }, -// }; - -// switch (repeatStatus) { -// case PlayerRepeat.ALL: -// handleRepeatAll[playbackType](); -// break; -// case PlayerRepeat.NONE: -// handleRepeatNone[playbackType](); -// break; -// case PlayerRepeat.ONE: -// handleRepeatOne[playbackType](); -// break; - -// default: -// break; -// } - -// return setCurrentTime(0); -// }, [ -// checkIsFirstTrack, -// currentPlayerRef, -// handleScrobbleFromSongRestart, -// isMpvPlayer, -// pause, -// playbackType, -// previous, -// queue.length, -// repeatStatus, -// resetPlayers, -// setCurrentIndex, -// setCurrentTime, -// ]); - -// const handlePlayPause = useCallback(() => { -// if (queue.length > 0) { -// if (playerStatus === PlayerStatus.PAUSED) { -// return handlePlay(); -// } - -// return handlePause(); -// } - -// return null; -// }, [handlePause, handlePlay, playerStatus, queue]); - -// const handleSkipBackward = (seconds: number) => { -// const currentTime = isMpvPlayer -// ? usePlayerStore.getState().current.time -// : currentPlayerRef.getCurrentTime(); - -// const evaluatedTime = currentTime - seconds; -// const newTime = evaluatedTime < 0 ? 0 : evaluatedTime; -// setCurrentTime(newTime, true); -// mpris?.updateSeek(newTime); - -// if (isMpvPlayer) { -// mpvPlayer!.seek(-seconds); -// } else { -// resetNextPlayer(); -// currentPlayerRef.seekTo(newTime, 'seconds'); -// } -// }; - -// const handleSkipForward = (seconds: number) => { -// const currentTime = isMpvPlayer -// ? usePlayerStore.getState().current.time -// : currentPlayerRef.getCurrentTime(); - -// if (isMpvPlayer) { -// const newTime = currentTime + seconds; -// mpvPlayer!.seek(seconds); -// mpris?.updateSeek(newTime); -// setCurrentTime(newTime, true); -// } else { -// const checkNewTime = currentTime + seconds; -// const songDuration = currentPlayerRef.player.player.duration; - -// const newTime = checkNewTime >= songDuration ? songDuration - 1 : checkNewTime; -// mpris?.updateSeek(newTime); - -// resetNextPlayer(); -// setCurrentTime(newTime, true); -// currentPlayerRef.seekTo(newTime, 'seconds'); -// } -// }; - -// const debouncedSeek = debounce((e: number) => { -// if (isMpvPlayer) { -// mpvPlayer!.seekTo(e); -// } else { -// currentPlayerRef.seekTo(e, 'seconds'); -// } -// }, 100); - -// const handleSeekSlider = useCallback( -// (e: any | number) => { -// setCurrentTime(e, true); -// handleScrobbleFromSeek(e); -// debouncedSeek(e); - -// mpris?.updateSeek(e); -// }, -// [debouncedSeek, handleScrobbleFromSeek, setCurrentTime], -// ); - -// const handleQuit = useCallback(() => { -// mpvPlayer!.quit(); -// }, []); - -// const handleError = useCallback( -// (message: string) => { -// toast.error({ -// id: 'mpv-error', -// message, -// title: t('error.playbackError', { postProcess: 'sentenceCase' }), -// }); -// pause(); -// mpvPlayer!.pause(); -// }, -// [pause, t], -// ); - -// useEffect(() => { -// if (mpvPlayerListener) { -// mpvPlayerListener.rendererPlayPause(() => { -// handlePlayPause(); -// }); - -// mpvPlayerListener.rendererNext(() => { -// handleNextTrack(); -// }); - -// mpvPlayerListener.rendererPrevious(() => { -// handlePrevTrack(); -// }); - -// mpvPlayerListener.rendererPlay(() => { -// handlePlay(); -// }); - -// mpvPlayerListener.rendererPause(() => { -// handlePause(); -// }); - -// mpvPlayerListener.rendererStop(() => { -// handleStop(); -// }); - -// mpvPlayerListener.rendererCurrentTime((_event: any, time: number) => { -// setCurrentTime(time); -// }); - -// mpvPlayerListener.rendererAutoNext(() => { -// handleAutoNext(); -// }); - -// mpvPlayerListener.rendererToggleShuffle(() => { -// handleToggleShuffle(); -// }); - -// mpvPlayerListener.rendererToggleRepeat(() => { -// handleToggleRepeat(); -// }); - -// mpvPlayerListener.rendererError((_event: any, message: string) => { -// handleError(message); -// }); -// } - -// return () => { -// ipc?.removeAllListeners('renderer-player-play-pause'); -// ipc?.removeAllListeners('renderer-player-next'); -// ipc?.removeAllListeners('renderer-player-previous'); -// ipc?.removeAllListeners('renderer-player-play'); -// ipc?.removeAllListeners('renderer-player-pause'); -// ipc?.removeAllListeners('renderer-player-stop'); -// ipc?.removeAllListeners('renderer-player-current-time'); -// ipc?.removeAllListeners('renderer-player-auto-next'); -// ipc?.removeAllListeners('renderer-player-toggle-shuffle'); -// ipc?.removeAllListeners('renderer-player-toggle-repeat'); -// ipc?.removeAllListeners('renderer-player-error'); -// }; -// }, [ -// autoNext, -// handleAutoNext, -// handleError, -// handleNextTrack, -// handlePause, -// handlePlay, -// handlePlayPause, -// handlePrevTrack, -// handleQuit, -// handleStop, -// handleToggleRepeat, -// handleToggleShuffle, -// isMpvPlayer, -// next, -// pause, -// play, -// previous, -// setCurrentTime, -// ]); - -// useEffect(() => { -// if (!isElectron() && mediaSession) { -// mediaSession.setActionHandler('nexttrack', () => { -// handleNextTrack(); -// }); - -// mediaSession.setActionHandler('pause', () => { -// handlePause(); -// }); - -// mediaSession.setActionHandler('play', () => { -// handlePlay(); -// }); - -// mediaSession.setActionHandler('previoustrack', () => { -// handlePrevTrack(); -// }); - -// mediaSession.setActionHandler('seekto', (evt) => { -// const time = evt.seekTime; - -// if (time !== undefined) { -// handleSeekSlider(time); -// } -// }); - -// mediaSession.setActionHandler('stop', () => { -// handleStop(); -// }); - -// return () => { -// mediaSession.setActionHandler('nexttrack', null); -// mediaSession.setActionHandler('pause', null); -// mediaSession.setActionHandler('play', null); -// mediaSession.setActionHandler('previoustrack', null); -// mediaSession.setActionHandler('seekto', null); -// mediaSession.setActionHandler('stop', null); -// }; -// } - -// return () => {}; -// }, [ -// handleNextTrack, -// handlePause, -// handlePlay, -// handlePrevTrack, -// handleSeekSlider, -// handleStop, -// setCurrentTime, -// ]); - -// useEffect(() => { -// if (remote) { -// const unsubCurrentTime = usePlayerStore.subscribe( -// (state) => state.current.time, -// (time) => { -// remote.updatePosition(time); -// }, -// ); - -// return () => { -// unsubCurrentTime(); -// }; -// } - -// return () => {}; -// }, []); - -// useEffect(() => { -// if (utils?.isLinux()) { -// mpris!.requestToggleRepeat((_e: any, data: { repeat: string }) => { -// if (data.repeat === 'Playlist') { -// usePlayerStore.getState().actions.setRepeat(PlayerRepeat.ALL); -// } else if (data.repeat === 'Track') { -// usePlayerStore.getState().actions.setRepeat(PlayerRepeat.ONE); -// } else { -// usePlayerStore.getState().actions.setRepeat(PlayerRepeat.NONE); -// } -// }); - -// mpris!.requestToggleShuffle((_e: any, data: { shuffle: boolean }) => { -// usePlayerStore -// .getState() -// .actions.setShuffle(data.shuffle ? PlayerShuffle.TRACK : PlayerShuffle.NONE); -// }); - -// return () => { -// ipc?.removeAllListeners('mpris-request-toggle-repeat'); -// ipc?.removeAllListeners('mpris-request-toggle-shuffle'); -// }; -// } - -// return () => {}; -// }, [handleSeekSlider, isMpvPlayer]); - -// useEffect(() => { -// if (remote) { -// remote.requestPosition((_e: any, data: { position: number }) => { -// const newTime = data.position; -// handleSeekSlider(newTime); -// }); - -// remote.requestSeek((_e: any, data: { offset: number }) => { -// const currentTime = usePlayerStore.getState().current.time; -// const currentSongDuration = usePlayerStore.getState().current.song?.duration || 0; -// const resultingTime = currentTime + data.offset; - -// let newTime = resultingTime; -// if (resultingTime > currentSongDuration) { -// newTime = currentSongDuration - 1; -// } - -// if (resultingTime < 0) { -// newTime = 0; -// } - -// handleSeekSlider(newTime); -// }); - -// remote.requestVolume((_e: any, data: { volume: number }) => { -// usePlayerStore.getState().actions.setVolume(data.volume); - -// if (isMpvPlayer) { -// mpvPlayer!.volume(data.volume); -// } -// }); - -// return () => { -// ipc?.removeAllListeners('request-position'); -// ipc?.removeAllListeners('request-seek'); -// ipc?.removeAllListeners('request-volume'); -// }; -// } - -// return () => {}; -// }); - -// return { -// handleNextTrack, -// handlePause, -// handlePlay, -// handlePlayPause, -// handlePrevTrack, -// handleSeekSlider, -// handleSkipBackward, -// handleSkipForward, -// handleStop, -// handleToggleRepeat, -// handleToggleShuffle, -// }; -// }; diff --git a/src/renderer/features/player/hooks/use-handle-playqueue-add.ts b/src/renderer/features/player/hooks/use-handle-playqueue-add.ts deleted file mode 100644 index 54f5b4d55..000000000 --- a/src/renderer/features/player/hooks/use-handle-playqueue-add.ts +++ /dev/null @@ -1,226 +0,0 @@ -// 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, 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; - -// 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; -// }; - -// const mpvPlayer = isElectron() ? window.api.mpvPlayer : null; - -// 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>>({}); - -// 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; - -// 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), -// }; - -// 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); -// delete timeoutIds.current[fetchId]; -// if (toastId) { -// toast.hide(toastId); -// } -// } catch (err: any) { -// if (instanceOfCancellationError(err)) { -// return null; -// } - -// clearTimeout(timeoutIds.current[fetchId] as ReturnType); -// delete timeoutIds.current[fetchId]; -// toast.hide(fetchId); - -// 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; -// } - -// 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); -// } - -// const hadSong = usePlayerStore.getState().queue.default.length > 0; -// const playerData = addToQueue({ initialIndex: initialSongIndex, playType, songs }); - -// updateSong(playerData.current.song); - -// const replacesQueue = playType === Play.NOW || playType === Play.SHUFFLE; - -// 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; -// } -// } - -// // 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 handlePlayQueueAdd; -// }; diff --git a/src/renderer/features/player/hooks/use-media-session.ts b/src/renderer/features/player/hooks/use-media-session.ts index 557c1f59c..f74e2e4a9 100644 --- a/src/renderer/features/player/hooks/use-media-session.ts +++ b/src/renderer/features/player/hooks/use-media-session.ts @@ -1,9 +1,9 @@ import { useEffect } from 'react'; import { + usePlaybackSettings, usePlayerSong, usePlayerStatus, - usePlaybackSettings, useSettingsStore, } from '/@/renderer/store'; import { PlayerStatus } from '/@/shared/types/types'; diff --git a/src/renderer/features/player/hooks/use-right-controls.ts b/src/renderer/features/player/hooks/use-right-controls.ts deleted file mode 100644 index bf188a649..000000000 --- a/src/renderer/features/player/hooks/use-right-controls.ts +++ /dev/null @@ -1,144 +0,0 @@ -import isElectron from 'is-electron'; -import { useCallback, useEffect, WheelEvent } from 'react'; - -import { usePlayerMuted, usePlayerSpeed, usePlayerVolume } from '/@/renderer/store'; -import { useGeneralSettings } from '/@/renderer/store/settings.store'; - -const mpvPlayer = isElectron() ? window.api.mpvPlayer : null; -const mpvPlayerListener = isElectron() ? window.api.mpvPlayerListener : null; -const ipc = isElectron() ? window.api.ipc : null; -const remote = isElectron() ? window.api.remote : null; - -const calculateVolumeUp = (volume: number, volumeWheelStep: number) => { - let volumeToSet; - const newVolumeGreaterThanHundred = volume + volumeWheelStep > 100; - if (newVolumeGreaterThanHundred) { - volumeToSet = 100; - } else { - volumeToSet = volume + volumeWheelStep; - } - - return volumeToSet; -}; - -const calculateVolumeDown = (volume: number, volumeWheelStep: number) => { - let volumeToSet; - const newVolumeLessThanZero = volume - volumeWheelStep < 0; - if (newVolumeLessThanZero) { - volumeToSet = 0; - } else { - volumeToSet = volume - volumeWheelStep; - } - - return volumeToSet; -}; - -export const useRightControls = () => { - // const { setMuted, setVolume } = usePlayerControls(); - const volume = usePlayerVolume(); - const muted = usePlayerMuted(); - const { volumeWheelStep } = useGeneralSettings(); - const speed = usePlayerSpeed(); - // const setCurrentSpeed = useSetCurrentSpeed(); - - // Ensure that the mpv player volume is set on startup - useEffect(() => { - remote?.updateVolume(volume); - - if (mpvPlayer) { - mpvPlayer.volume(volume); - mpvPlayer.setProperties({ speed }); - - if (muted) { - mpvPlayer.mute(muted); - } - } - - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - 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); - }; - - const handleVolumeSliderState = (e: number) => { - remote?.updateVolume(e); - // setVolume(e); - }; - - const handleVolumeDown = useCallback(() => { - const volumeToSet = calculateVolumeDown(volume, volumeWheelStep); - mpvPlayer?.volume(volumeToSet); - remote?.updateVolume(volumeToSet); - // setVolume(volumeToSet); - }, [volume, volumeWheelStep]); - - const handleVolumeUp = useCallback(() => { - const volumeToSet = calculateVolumeUp(volume, volumeWheelStep); - mpvPlayer?.volume(volumeToSet); - remote?.updateVolume(volumeToSet); - // setVolume(volumeToSet); - }, [volume, volumeWheelStep]); - - const handleVolumeWheel = useCallback( - (e: WheelEvent) => { - let volumeToSet; - if (e.deltaY > 0 || e.deltaX > 0) { - volumeToSet = calculateVolumeDown(volume, volumeWheelStep); - } else { - volumeToSet = calculateVolumeUp(volume, volumeWheelStep); - } - - mpvPlayer?.volume(volumeToSet); - remote?.updateVolume(volumeToSet); - // setVolume(volumeToSet); - }, - [volume, volumeWheelStep], - ); - - const handleMute = useCallback(() => { - // setMuted(!muted); - mpvPlayer?.mute(!muted); - }, [muted]); - - useEffect(() => { - if (isElectron()) { - mpvPlayerListener?.rendererVolumeMute(() => { - handleMute(); - }); - - mpvPlayerListener?.rendererVolumeUp(() => { - handleVolumeUp(); - }); - - mpvPlayerListener?.rendererVolumeDown(() => { - handleVolumeDown(); - }); - } - - return () => { - ipc?.removeAllListeners('renderer-player-volume-mute'); - ipc?.removeAllListeners('renderer-player-volume-up'); - ipc?.removeAllListeners('renderer-player-volume-down'); - }; - }, [handleMute, handleVolumeDown, handleVolumeUp]); - - return { - handleMute, - handleSpeed, - handleVolumeDown, - handleVolumeSlider, - handleVolumeSliderState, - handleVolumeUp, - handleVolumeWheel, - }; -}; diff --git a/src/renderer/utils/set-transcoded-queue-data.ts b/src/renderer/utils/set-transcoded-queue-data.ts deleted file mode 100644 index 0fe73aba4..000000000 --- a/src/renderer/utils/set-transcoded-queue-data.ts +++ /dev/null @@ -1,49 +0,0 @@ -import type { PlayerData, QueueSong } from '/@/shared/types/domain-types'; - -import isElectron from 'is-electron'; - -import { api } from '/@/renderer/api'; -import { useSettingsStore } from '/@/renderer/store'; - -const mpvPlayer = isElectron() ? window.api.mpvPlayer : null; - -const modifyUrl = (song: QueueSong): string => { - const transcode = useSettingsStore.getState().playback.transcode; - if (transcode.enabled) { - const streamUrl = api.controller.getTranscodingUrl({ - apiClientProps: { - serverId: song._serverId, - }, - query: { - base: song.streamUrl, - ...transcode, - }, - })!; - - return streamUrl; - } - - return song.streamUrl; -}; - -export const setQueue = (data: PlayerData, pause?: boolean): void => { - const current = data.queue.current ? modifyUrl(data.queue.current) : undefined; - const next = data.queue.next ? modifyUrl(data.queue.next) : undefined; - mpvPlayer?.setQueue(current, next, pause); -}; - -export const setQueueNext = (data: PlayerData): void => { - if (data.queue.next) { - mpvPlayer?.setQueueNext(modifyUrl(data.queue.next)); - } else { - mpvPlayer?.setQueueNext(undefined); - } -}; - -export const setAutoNext = (data: PlayerData): void => { - if (data.queue.next) { - mpvPlayer?.autoNext(modifyUrl(data.queue.next)); - } else { - mpvPlayer?.autoNext(undefined); - } -};