feishin/src/renderer/features/player/hooks/use-center-controls.ts

774 lines
24 KiB
TypeScript
Raw Normal View History

2022-12-19 15:59:14 -08:00
import isElectron from 'is-electron';
import debounce from 'lodash/debounce';
import { useCallback, useEffect } from 'react';
import { useTranslation } from 'react-i18next';
import { toast } from '/@/renderer/components';
import { useScrobble } from '/@/renderer/features/player/hooks/use-scrobble';
import { updateSong } from '/@/renderer/features/player/update-remote-song';
2022-12-19 15:59:14 -08:00
import {
2023-07-01 19:10:05 -07:00
useCurrentPlayer,
useCurrentStatus,
useDefaultQueue,
usePlayerControls,
usePlayerStore,
useRepeatStatus,
useSetCurrentTime,
useShuffleStatus,
2022-12-19 15:59:14 -08:00
} from '/@/renderer/store';
import { usePlaybackType } from '/@/renderer/store/settings.store';
import { PlaybackType, PlayerRepeat, PlayerShuffle, PlayerStatus } from '/@/renderer/types';
2024-09-01 08:26:30 -07:00
import { setAutoNext, setQueue, setQueueNext } from '/@/renderer/utils/set-transcoded-queue-data';
2022-12-19 15:59:14 -08:00
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;
2024-07-03 08:47:26 +00:00
const mediaSession = navigator.mediaSession;
2022-12-19 15:59:14 -08:00
export const useCenterControls = (args: { playersRef: any }) => {
const { t } = useTranslation();
2023-07-01 19:10:05 -07:00
const { playersRef } = args;
const currentPlayer = useCurrentPlayer();
const { autoNext, next, pause, play, previous, setCurrentIndex, setRepeat, setShuffle } =
2023-07-01 19:10:05 -07:00
usePlayerControls();
const setCurrentTime = useSetCurrentTime();
const queue = useDefaultQueue();
const playerStatus = useCurrentStatus();
const repeatStatus = useRepeatStatus();
const shuffleStatus = useShuffleStatus();
const playbackType = usePlaybackType();
2023-07-01 19:10:05 -07:00
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();
2023-07-01 19:10:05 -07:00
2024-07-03 08:47:26 +00:00
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]);
2023-07-01 19:10:05 -07:00
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();
2023-05-22 21:11:26 -07:00
}
2023-07-01 19:10:05 -07:00
}, [currentPlayerRef, nextPlayerRef]);
const stopPlayback = useCallback(() => {
player1Ref.getInternalPlayer().pause();
player2Ref.getInternalPlayer().pause();
resetPlayers();
}, [player1Ref, player2Ref, resetPlayers]);
const isMpvPlayer = isElectron() && playbackType === PlaybackType.LOCAL;
2023-07-01 19:10:05 -07:00
const handlePlay = useCallback(() => {
if (isMpvPlayer) {
mpvPlayer?.volume(usePlayerStore.getState().volume);
mpvPlayer!.play();
2022-12-19 15:59:14 -08:00
} else {
currentPlayerRef
.getInternalPlayer()
?.play()
.catch(() => {});
2022-12-19 15:59:14 -08:00
}
play();
2023-07-01 19:10:05 -07:00
}, [currentPlayerRef, isMpvPlayer, play]);
const handlePause = useCallback(() => {
if (isMpvPlayer) {
mpvPlayer!.pause();
2022-12-19 15:59:14 -08:00
}
2023-07-01 19:10:05 -07:00
pause();
}, [isMpvPlayer, pause]);
2022-12-19 15:59:14 -08:00
2023-07-01 19:10:05 -07:00
const handleStop = useCallback(() => {
if (isMpvPlayer) {
mpvPlayer!.pause();
mpvPlayer!.seekTo(0);
2022-12-19 15:59:14 -08:00
} else {
2023-07-01 19:10:05 -07:00
stopPlayback();
2022-12-19 15:59:14 -08:00
}
2023-07-01 19:10:05 -07:00
setCurrentTime(0);
pause();
}, [isMpvPlayer, pause, setCurrentTime, stopPlayback]);
const handleToggleShuffle = useCallback(() => {
if (shuffleStatus === PlayerShuffle.NONE) {
const playerData = setShuffle(PlayerShuffle.TRACK);
remote?.updateShuffle(true);
2024-09-01 08:26:30 -07:00
return setQueueNext(playerData);
2022-12-19 15:59:14 -08:00
}
2023-07-01 19:10:05 -07:00
const playerData = setShuffle(PlayerShuffle.NONE);
remote?.updateShuffle(false);
2024-09-01 08:26:30 -07:00
return setQueueNext(playerData);
2023-07-01 19:10:05 -07:00
}, [setShuffle, shuffleStatus]);
const handleToggleRepeat = useCallback(() => {
if (repeatStatus === PlayerRepeat.NONE) {
const playerData = setRepeat(PlayerRepeat.ALL);
remote?.updateRepeat(PlayerRepeat.ALL);
2024-09-01 08:26:30 -07:00
return setQueueNext(playerData);
2022-12-19 15:59:14 -08:00
}
2023-07-01 19:10:05 -07:00
if (repeatStatus === PlayerRepeat.ALL) {
const playerData = setRepeat(PlayerRepeat.ONE);
remote?.updateRepeat(PlayerRepeat.ONE);
2024-09-01 08:26:30 -07:00
return setQueueNext(playerData);
2022-12-19 15:59:14 -08:00
}
2023-07-01 19:10:05 -07:00
2023-10-17 12:49:29 +00:00
const playerData = setRepeat(PlayerRepeat.NONE);
remote?.updateRepeat(PlayerRepeat.NONE);
2024-09-01 08:26:30 -07:00
return setQueueNext(playerData);
2023-07-01 19:10:05 -07:00
}, [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();
2024-07-03 08:47:26 +00:00
updateSong(playerData.current.song);
2024-09-01 08:26:30 -07:00
setAutoNext(playerData);
2023-07-01 19:10:05 -07:00
play();
},
web: () => {
const playerData = autoNext();
2024-07-03 08:47:26 +00:00
updateSong(playerData.current.song);
2023-07-01 19:10:05 -07:00
},
};
const handleRepeatNone = {
local: () => {
if (isLastTrack) {
const playerData = setCurrentIndex(0);
2024-07-03 08:47:26 +00:00
updateSong(playerData.current.song);
2024-09-01 08:26:30 -07:00
setQueue(playerData, true);
2023-07-01 19:10:05 -07:00
pause();
} else {
const playerData = autoNext();
2024-07-03 08:47:26 +00:00
updateSong(playerData.current.song);
2024-09-01 08:26:30 -07:00
setAutoNext(playerData);
2023-07-01 19:10:05 -07:00
play();
}
},
web: () => {
if (isLastTrack) {
resetPlayers();
pause();
} else {
const playerData = autoNext();
2024-07-03 08:47:26 +00:00
updateSong(playerData.current.song);
2023-07-01 19:10:05 -07:00
resetPlayers();
}
},
};
const handleRepeatOne = {
local: () => {
const playerData = autoNext();
2024-07-03 08:47:26 +00:00
updateSong(playerData.current.song);
2024-09-01 08:26:30 -07:00
setAutoNext(playerData);
2023-07-01 19:10:05 -07:00
play();
},
web: () => {
if (isLastTrack) {
resetPlayers();
} else {
2024-07-03 08:47:26 +00:00
autoNext();
2023-07-01 19:10:05 -07:00
resetPlayers();
}
},
};
switch (repeatStatus) {
case PlayerRepeat.ALL:
handleRepeatAll[playbackType]();
2023-07-01 19:10:05 -07:00
break;
case PlayerRepeat.NONE:
handleRepeatNone[playbackType]();
break;
2023-07-01 19:10:05 -07:00
case PlayerRepeat.ONE:
handleRepeatOne[playbackType]();
2023-07-01 19:10:05 -07:00
break;
default:
break;
}
}, [
autoNext,
checkIsLastTrack,
pause,
play,
playbackType,
2023-07-01 19:10:05 -07:00
repeatStatus,
resetPlayers,
setCurrentIndex,
]);
const handleNextTrack = useCallback(() => {
const isLastTrack = checkIsLastTrack();
setCurrentTime(0);
const handleRepeatAll = {
local: () => {
const playerData = next();
2024-07-03 08:47:26 +00:00
updateSong(playerData.current.song);
2024-09-01 08:26:30 -07:00
setQueue(playerData);
2023-07-01 19:10:05 -07:00
},
web: () => {
const playerData = next();
2024-07-03 08:47:26 +00:00
updateSong(playerData.current.song);
2023-07-01 19:10:05 -07:00
},
};
const handleRepeatNone = {
local: () => {
if (isLastTrack) {
const playerData = setCurrentIndex(0);
2024-07-03 08:47:26 +00:00
updateSong(playerData.current.song);
2024-09-01 08:26:30 -07:00
setQueue(playerData, true);
2023-07-01 19:10:05 -07:00
pause();
} else {
const playerData = next();
2024-07-03 08:47:26 +00:00
updateSong(playerData.current.song);
2024-09-01 08:26:30 -07:00
setQueue(playerData);
2023-07-01 19:10:05 -07:00
}
},
web: () => {
if (isLastTrack) {
const playerData = setCurrentIndex(0);
2024-07-03 08:47:26 +00:00
updateSong(playerData.current.song);
2023-07-01 19:10:05 -07:00
resetPlayers();
pause();
} else {
const playerData = next();
2024-07-03 08:47:26 +00:00
updateSong(playerData.current.song);
2023-07-01 19:10:05 -07:00
resetPlayers();
}
},
};
const handleRepeatOne = {
local: () => {
if (!isLastTrack) {
const playerData = next();
2024-07-03 08:47:26 +00:00
updateSong(playerData.current.song);
2024-09-01 08:26:30 -07:00
setQueue(playerData);
}
2023-07-01 19:10:05 -07:00
},
web: () => {
if (!isLastTrack) {
const playerData = next();
2024-07-03 08:47:26 +00:00
updateSong(playerData.current.song);
2023-07-01 19:10:05 -07:00
}
},
};
switch (repeatStatus) {
case PlayerRepeat.ALL:
handleRepeatAll[playbackType]();
2023-07-01 19:10:05 -07:00
break;
case PlayerRepeat.NONE:
handleRepeatNone[playbackType]();
break;
2023-07-01 19:10:05 -07:00
case PlayerRepeat.ONE:
handleRepeatOne[playbackType]();
2023-07-01 19:10:05 -07:00
break;
default:
break;
2022-12-19 15:59:14 -08:00
}
2023-07-01 19:10:05 -07:00
setCurrentTime(0);
}, [
checkIsLastTrack,
next,
pause,
playbackType,
2023-07-01 19:10:05 -07:00
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);
2023-07-01 19:10:05 -07:00
}
return currentPlayerRef.seekTo(0);
}
const isFirstTrack = checkIsFirstTrack();
const handleRepeatAll = {
local: () => {
if (!isFirstTrack) {
const playerData = previous();
2024-07-03 08:47:26 +00:00
updateSong(playerData.current.song);
2024-09-01 08:26:30 -07:00
setQueue(playerData);
2023-07-01 19:10:05 -07:00
} else {
const playerData = setCurrentIndex(queue.length - 1);
2024-07-03 08:47:26 +00:00
updateSong(playerData.current.song);
2024-09-01 08:26:30 -07:00
setQueue(playerData);
2023-07-01 19:10:05 -07:00
}
},
web: () => {
if (isFirstTrack) {
const playerData = setCurrentIndex(queue.length - 1);
2024-07-03 08:47:26 +00:00
updateSong(playerData.current.song);
2023-07-01 19:10:05 -07:00
resetPlayers();
} else {
const playerData = previous();
2024-07-03 08:47:26 +00:00
updateSong(playerData.current.song);
2023-07-01 19:10:05 -07:00
resetPlayers();
}
},
};
const handleRepeatNone = {
local: () => {
if (isFirstTrack) {
const playerData = setCurrentIndex(0);
2024-07-03 08:47:26 +00:00
updateSong(playerData.current.song);
2024-09-01 08:26:30 -07:00
setQueue(playerData, true);
pause();
} else {
const playerData = previous();
2024-07-03 08:47:26 +00:00
updateSong(playerData.current.song);
2024-09-01 08:26:30 -07:00
setQueue(playerData);
}
2023-07-01 19:10:05 -07:00
},
web: () => {
if (isFirstTrack) {
resetPlayers();
pause();
} else {
const playerData = previous();
2024-07-03 08:47:26 +00:00
updateSong(playerData.current.song);
2023-07-01 19:10:05 -07:00
resetPlayers();
}
},
};
const handleRepeatOne = {
local: () => {
const playerData = previous();
2024-07-03 08:47:26 +00:00
updateSong(playerData.current.song);
2024-09-01 08:26:30 -07:00
setQueue(playerData);
2023-07-01 19:10:05 -07:00
},
web: () => {
const playerData = previous();
2024-07-03 08:47:26 +00:00
updateSong(playerData.current.song);
2023-07-01 19:10:05 -07:00
resetPlayers();
},
};
switch (repeatStatus) {
case PlayerRepeat.ALL:
handleRepeatAll[playbackType]();
2023-07-01 19:10:05 -07:00
break;
case PlayerRepeat.NONE:
handleRepeatNone[playbackType]();
break;
2023-07-01 19:10:05 -07:00
case PlayerRepeat.ONE:
handleRepeatOne[playbackType]();
2023-07-01 19:10:05 -07:00
break;
default:
break;
}
return setCurrentTime(0);
}, [
checkIsFirstTrack,
currentPlayerRef,
handleScrobbleFromSongRestart,
isMpvPlayer,
pause,
playbackType,
2023-07-01 19:10:05 -07:00
previous,
queue.length,
repeatStatus,
resetPlayers,
setCurrentIndex,
setCurrentTime,
]);
const handlePlayPause = useCallback(() => {
if (queue.length > 0) {
2023-07-01 19:10:05 -07:00
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);
2022-12-19 15:59:14 -08:00
} else {
2023-07-01 19:10:05 -07:00
resetNextPlayer();
2024-09-02 10:56:46 -07:00
currentPlayerRef.seekTo(newTime, 'seconds');
2022-12-19 15:59:14 -08:00
}
};
2023-07-01 19:10:05 -07:00
const handleSkipForward = (seconds: number) => {
const currentTime = isMpvPlayer
? usePlayerStore.getState().current.time
: currentPlayerRef.getCurrentTime();
if (isMpvPlayer) {
const newTime = currentTime + seconds;
mpvPlayer!.seek(seconds);
2023-07-01 19:10:05 -07:00
mpris?.updateSeek(newTime);
setCurrentTime(newTime, true);
2022-12-19 15:59:14 -08:00
} else {
2023-07-01 19:10:05 -07:00
const checkNewTime = currentTime + seconds;
const songDuration = currentPlayerRef.player.player.duration;
const newTime = checkNewTime >= songDuration ? songDuration - 1 : checkNewTime;
mpris?.updateSeek(newTime);
resetNextPlayer();
setCurrentTime(newTime, true);
2024-09-02 10:56:46 -07:00
currentPlayerRef.seekTo(newTime, 'seconds');
2022-12-19 15:59:14 -08:00
}
};
2023-07-01 19:10:05 -07:00
const debouncedSeek = debounce((e: number) => {
if (isMpvPlayer) {
mpvPlayer!.seekTo(e);
2023-07-01 19:10:05 -07:00
} else {
2024-09-02 10:56:46 -07:00
currentPlayerRef.seekTo(e, 'seconds');
2023-05-22 21:11:26 -07:00
}
2023-07-01 19:10:05 -07:00
}, 100);
const handleSeekSlider = useCallback(
(e: any | number) => {
2023-07-01 19:10:05 -07:00
setCurrentTime(e, true);
handleScrobbleFromSeek(e);
debouncedSeek(e);
mpris?.updateSeek(e);
},
[debouncedSeek, handleScrobbleFromSeek, setCurrentTime],
);
const handleQuit = useCallback(() => {
mpvPlayer!.quit();
2023-07-01 19:10:05 -07:00
}, []);
const handleError = useCallback(
(message: string) => {
toast.error({
id: 'mpv-error',
message,
title: t('error.playbackError', { postProcess: 'sentenceCase' }),
});
2023-07-01 19:10:05 -07:00
pause();
mpvPlayer!.pause();
},
[pause, t],
2023-07-01 19:10:05 -07:00
);
useEffect(() => {
if (mpvPlayerListener) {
2023-07-01 19:10:05 -07:00
mpvPlayerListener.rendererPlayPause(() => {
handlePlayPause();
});
mpvPlayerListener.rendererNext(() => {
handleNextTrack();
});
mpvPlayerListener.rendererPrevious(() => {
handlePrevTrack();
});
mpvPlayerListener.rendererPlay(() => {
handlePlay();
});
mpvPlayerListener.rendererPause(() => {
handlePause();
});
mpvPlayerListener.rendererStop(() => {
handleStop();
});
mpvPlayerListener.rendererCurrentTime((_event: any, time: number) => {
console.log('time :>> ', time);
2023-07-01 19:10:05 -07:00
setCurrentTime(time);
});
mpvPlayerListener.rendererAutoNext(() => {
handleAutoNext();
});
mpvPlayerListener.rendererToggleShuffle(() => {
handleToggleShuffle();
});
mpvPlayerListener.rendererToggleRepeat(() => {
handleToggleRepeat();
});
mpvPlayerListener.rendererError((_event: any, message: string) => {
handleError(message);
});
}
2023-07-01 19:10:05 -07:00
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);
};
}
2023-07-01 19:10:05 -07:00
return () => {};
}, [
handleNextTrack,
handlePause,
handlePlay,
handlePrevTrack,
handleSeekSlider,
handleStop,
setCurrentTime,
]);
useEffect(() => {
if (remote) {
2023-07-01 19:10:05 -07:00
const unsubCurrentTime = usePlayerStore.subscribe(
(state) => state.current.time,
(time) => {
remote.updatePosition(time);
2023-07-01 19:10:05 -07:00
},
);
return () => {
unsubCurrentTime();
};
}
2023-07-01 19:10:05 -07:00
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 }) => {
2023-07-01 19:10:05 -07:00
const newTime = data.position;
handleSeekSlider(newTime);
});
remote.requestSeek((_e: any, data: { offset: number }) => {
2023-07-01 19:10:05 -07:00
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);
2023-07-01 19:10:05 -07:00
if (isMpvPlayer) {
mpvPlayer!.volume(data.volume);
2023-07-01 19:10:05 -07:00
}
});
return () => {
ipc?.removeAllListeners('request-position');
ipc?.removeAllListeners('request-seek');
ipc?.removeAllListeners('request-volume');
2023-07-01 19:10:05 -07:00
};
}
2023-07-01 19:10:05 -07:00
return () => {};
});
2023-07-01 19:10:05 -07:00
return {
handleNextTrack,
handlePause,
handlePlay,
handlePlayPause,
handlePrevTrack,
handleSeekSlider,
handleSkipBackward,
handleSkipForward,
handleStop,
handleToggleRepeat,
handleToggleShuffle,
};
2022-12-19 15:59:14 -08:00
};