mirror of
https://github.com/algerkong/AlgerMusicPlayer.git
synced 2026-04-26 01:07:22 +08:00
feat: 重构播放 store
This commit is contained in:
@@ -0,0 +1,264 @@
|
||||
import { defineStore } from 'pinia';
|
||||
import { computed, ref } from 'vue';
|
||||
|
||||
import i18n from '@/../i18n/renderer';
|
||||
import { getLocalStorageItem, setLocalStorageItem } from '@/utils/playerUtils';
|
||||
|
||||
// 定时关闭类型
|
||||
export enum SleepTimerType {
|
||||
NONE = 'none',
|
||||
TIME = 'time',
|
||||
SONGS = 'songs',
|
||||
PLAYLIST_END = 'end'
|
||||
}
|
||||
|
||||
// 定时关闭信息
|
||||
export interface SleepTimerInfo {
|
||||
type: SleepTimerType;
|
||||
value: number;
|
||||
endTime?: number;
|
||||
startSongIndex?: number;
|
||||
remainingSongs?: number;
|
||||
}
|
||||
|
||||
/**
|
||||
* 定时关闭管理 Store
|
||||
* 负责:定时关闭功能
|
||||
*/
|
||||
export const useSleepTimerStore = defineStore('sleepTimer', () => {
|
||||
// ==================== 状态 ====================
|
||||
const sleepTimer = ref<SleepTimerInfo>(
|
||||
getLocalStorageItem('sleepTimer', {
|
||||
type: SleepTimerType.NONE,
|
||||
value: 0
|
||||
})
|
||||
);
|
||||
const showSleepTimer = ref(false);
|
||||
const timerInterval = ref<number | null>(null);
|
||||
|
||||
// ==================== Computed ====================
|
||||
const currentSleepTimer = computed(() => sleepTimer.value);
|
||||
const hasSleepTimerActive = computed(() => sleepTimer.value.type !== SleepTimerType.NONE);
|
||||
|
||||
const sleepTimerRemainingTime = computed(() => {
|
||||
if (sleepTimer.value.type === SleepTimerType.TIME && sleepTimer.value.endTime) {
|
||||
const remaining = Math.max(0, sleepTimer.value.endTime - Date.now());
|
||||
return Math.ceil(remaining / 60000);
|
||||
}
|
||||
return 0;
|
||||
});
|
||||
|
||||
const sleepTimerRemainingSongs = computed(() => {
|
||||
if (sleepTimer.value.type === SleepTimerType.SONGS) {
|
||||
return sleepTimer.value.remainingSongs || 0;
|
||||
}
|
||||
return 0;
|
||||
});
|
||||
|
||||
// ==================== Actions ====================
|
||||
|
||||
/**
|
||||
* 按时间设置定时关闭
|
||||
*/
|
||||
const setSleepTimerByTime = (minutes: number) => {
|
||||
clearSleepTimer();
|
||||
|
||||
if (minutes <= 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const endTime = Date.now() + minutes * 60 * 1000;
|
||||
|
||||
sleepTimer.value = {
|
||||
type: SleepTimerType.TIME,
|
||||
value: minutes,
|
||||
endTime
|
||||
};
|
||||
|
||||
setLocalStorageItem('sleepTimer', sleepTimer.value);
|
||||
|
||||
timerInterval.value = window.setInterval(() => {
|
||||
checkSleepTimer();
|
||||
}, 1000) as unknown as number;
|
||||
|
||||
console.log(`设置定时关闭: ${minutes}分钟后`);
|
||||
return true;
|
||||
};
|
||||
|
||||
/**
|
||||
* 按歌曲数设置定时关闭
|
||||
*/
|
||||
const setSleepTimerBySongs = (songs: number) => {
|
||||
clearSleepTimer();
|
||||
|
||||
if (songs <= 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const { usePlaylistStore } = require('./playlist');
|
||||
const playlistStore = usePlaylistStore();
|
||||
|
||||
sleepTimer.value = {
|
||||
type: SleepTimerType.SONGS,
|
||||
value: songs,
|
||||
startSongIndex: playlistStore.playListIndex,
|
||||
remainingSongs: songs
|
||||
};
|
||||
|
||||
setLocalStorageItem('sleepTimer', sleepTimer.value);
|
||||
|
||||
console.log(`设置定时关闭: 再播放${songs}首歌后`);
|
||||
return true;
|
||||
};
|
||||
|
||||
/**
|
||||
* 播放列表结束时关闭
|
||||
*/
|
||||
const setSleepTimerAtPlaylistEnd = () => {
|
||||
clearSleepTimer();
|
||||
|
||||
sleepTimer.value = {
|
||||
type: SleepTimerType.PLAYLIST_END,
|
||||
value: 0
|
||||
};
|
||||
|
||||
setLocalStorageItem('sleepTimer', sleepTimer.value);
|
||||
|
||||
console.log('设置定时关闭: 播放列表结束时');
|
||||
return true;
|
||||
};
|
||||
|
||||
/**
|
||||
* 取消定时关闭
|
||||
*/
|
||||
const clearSleepTimer = () => {
|
||||
if (timerInterval.value) {
|
||||
window.clearInterval(timerInterval.value);
|
||||
timerInterval.value = null;
|
||||
}
|
||||
|
||||
sleepTimer.value = {
|
||||
type: SleepTimerType.NONE,
|
||||
value: 0
|
||||
};
|
||||
|
||||
setLocalStorageItem('sleepTimer', sleepTimer.value);
|
||||
|
||||
console.log('取消定时关闭');
|
||||
return true;
|
||||
};
|
||||
|
||||
/**
|
||||
* 检查定时关闭是否应该触发
|
||||
*/
|
||||
const checkSleepTimer = () => {
|
||||
if (sleepTimer.value.type === SleepTimerType.NONE) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (sleepTimer.value.type === SleepTimerType.TIME && sleepTimer.value.endTime) {
|
||||
if (Date.now() >= sleepTimer.value.endTime) {
|
||||
stopPlayback();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 停止播放并清除定时器
|
||||
*/
|
||||
const stopPlayback = async () => {
|
||||
console.log('定时器触发:停止播放');
|
||||
|
||||
const { usePlayerCoreStore } = await import('./playerCore');
|
||||
const playerCore = usePlayerCoreStore();
|
||||
const { audioService } = await import('@/services/audioService');
|
||||
|
||||
if (playerCore.isPlaying) {
|
||||
playerCore.setIsPlay(false);
|
||||
audioService.pause();
|
||||
}
|
||||
|
||||
// 发送通知
|
||||
if (window.electron?.ipcRenderer) {
|
||||
window.electron.ipcRenderer.send('show-notification', {
|
||||
title: i18n.global.t('player.sleepTimer.timerEnded'),
|
||||
body: i18n.global.t('player.sleepTimer.playbackStopped')
|
||||
});
|
||||
}
|
||||
|
||||
clearSleepTimer();
|
||||
};
|
||||
|
||||
/**
|
||||
* 监听歌曲变化,处理按歌曲数定时和播放列表结束定时
|
||||
*/
|
||||
const handleSongChange = async () => {
|
||||
console.log('歌曲已切换,检查定时器状态:', sleepTimer.value);
|
||||
|
||||
// 处理按歌曲数定时
|
||||
if (
|
||||
sleepTimer.value.type === SleepTimerType.SONGS &&
|
||||
sleepTimer.value.remainingSongs !== undefined
|
||||
) {
|
||||
sleepTimer.value.remainingSongs--;
|
||||
console.log(`剩余歌曲数: ${sleepTimer.value.remainingSongs}`);
|
||||
|
||||
setLocalStorageItem('sleepTimer', sleepTimer.value);
|
||||
|
||||
if (sleepTimer.value.remainingSongs <= 0) {
|
||||
console.log('已播放完设定的歌曲数,停止播放');
|
||||
stopPlayback();
|
||||
setTimeout(() => {
|
||||
stopPlayback();
|
||||
}, 1000);
|
||||
}
|
||||
}
|
||||
|
||||
// 处理播放列表结束定时
|
||||
if (sleepTimer.value.type === SleepTimerType.PLAYLIST_END) {
|
||||
const { usePlaylistStore } = await import('./playlist');
|
||||
const playlistStore = usePlaylistStore();
|
||||
|
||||
const isLastSong = playlistStore.playListIndex === playlistStore.playList.length - 1;
|
||||
|
||||
if (isLastSong && playlistStore.playMode !== 1) {
|
||||
console.log('已到达播放列表末尾,将在当前歌曲结束后停止播放');
|
||||
sleepTimer.value = {
|
||||
type: SleepTimerType.SONGS,
|
||||
value: 1,
|
||||
remainingSongs: 1
|
||||
};
|
||||
setLocalStorageItem('sleepTimer', sleepTimer.value);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 设置定时器弹窗显示状态
|
||||
*/
|
||||
const setShowSleepTimer = (value: boolean) => {
|
||||
showSleepTimer.value = value;
|
||||
};
|
||||
|
||||
return {
|
||||
// 状态
|
||||
sleepTimer,
|
||||
showSleepTimer,
|
||||
|
||||
// Computed
|
||||
currentSleepTimer,
|
||||
hasSleepTimerActive,
|
||||
sleepTimerRemainingTime,
|
||||
sleepTimerRemainingSongs,
|
||||
|
||||
// Actions
|
||||
setSleepTimerByTime,
|
||||
setSleepTimerBySongs,
|
||||
setSleepTimerAtPlaylistEnd,
|
||||
clearSleepTimer,
|
||||
checkSleepTimer,
|
||||
stopPlayback,
|
||||
handleSongChange,
|
||||
setShowSleepTimer
|
||||
};
|
||||
});
|
||||
Reference in New Issue
Block a user