From f5f0dbb222c5faf191569c19e1640d013e151280 Mon Sep 17 00:00:00 2001 From: alger Date: Mon, 19 May 2025 23:13:06 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E6=92=AD=E6=94=BE?= =?UTF-8?q?=E6=A0=8F=EF=BC=8C=E6=95=B4=E5=90=88=E9=AB=98=E7=BA=A7=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E8=8F=9C=E5=8D=95=EF=BC=8C=E5=B0=86=E5=AE=9A=E6=97=B6?= =?UTF-8?q?=E3=80=81=E5=9D=87=E8=A1=A1=E5=99=A8=E3=80=81=E9=80=9F=E5=BA=A6?= =?UTF-8?q?=E6=8E=A7=E5=88=B6=E6=94=B9=E4=B8=BA=E6=9B=B4=E5=A4=9A=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E6=8C=89=E9=92=AE=E6=98=BE=E7=A4=BA,=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E5=AE=9A=E6=97=B6=E5=85=B3=E9=97=AD=E9=A1=B6=E9=83=A8?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/i18n/lang/en-US/player.ts | 3 +- src/i18n/lang/zh-CN/player.ts | 3 +- src/renderer/components/EQControl.vue | 1 - .../player/AdvancedControlsPopover.vue | 251 +++++++++ src/renderer/components/player/PlayBar.vue | 83 +-- src/renderer/components/player/SleepTimer.vue | 342 +++++++++++++ .../components/player/SleepTimerPopover.vue | 478 ------------------ .../components/player/SleepTimerTop.vue | 124 +++++ src/renderer/layout/AppLayout.vue | 2 + src/renderer/store/modules/player.ts | 22 +- 10 files changed, 752 insertions(+), 557 deletions(-) create mode 100644 src/renderer/components/player/AdvancedControlsPopover.vue create mode 100644 src/renderer/components/player/SleepTimer.vue delete mode 100644 src/renderer/components/player/SleepTimerPopover.vue create mode 100644 src/renderer/components/player/SleepTimerTop.vue diff --git a/src/i18n/lang/en-US/player.ts b/src/i18n/lang/en-US/player.ts index 538a97a..378ccc5 100644 --- a/src/i18n/lang/en-US/player.ts +++ b/src/i18n/lang/en-US/player.ts @@ -59,7 +59,8 @@ export default { volume: 'Volume', favorite: 'Favorite {name}', unFavorite: 'Unfavorite {name}', - playbackSpeed: 'Playback Speed' + playbackSpeed: 'Playback Speed', + advancedControls: 'Advanced Controls', }, eq: { title: 'Equalizer', diff --git a/src/i18n/lang/zh-CN/player.ts b/src/i18n/lang/zh-CN/player.ts index b9986da..7431b48 100644 --- a/src/i18n/lang/zh-CN/player.ts +++ b/src/i18n/lang/zh-CN/player.ts @@ -60,7 +60,8 @@ export default { favorite: '已收藏{name}', unFavorite: '已取消收藏{name}', miniPlayBar: '迷你播放栏', - playbackSpeed: '播放速度' + playbackSpeed: '播放速度', + advancedControls: '更多设置s', }, eq: { title: '均衡器', diff --git a/src/renderer/components/EQControl.vue b/src/renderer/components/EQControl.vue index 28da198..3d5ac7e 100644 --- a/src/renderer/components/EQControl.vue +++ b/src/renderer/components/EQControl.vue @@ -264,7 +264,6 @@ const formatFreq = (freq: number) => { .eq-control { @apply p-6 rounded-lg; @apply bg-light dark:bg-dark; - @apply shadow-lg dark:shadow-none; width: 100%; max-width: 700px; diff --git a/src/renderer/components/player/AdvancedControlsPopover.vue b/src/renderer/components/player/AdvancedControlsPopover.vue new file mode 100644 index 0000000..edebaf8 --- /dev/null +++ b/src/renderer/components/player/AdvancedControlsPopover.vue @@ -0,0 +1,251 @@ + + + + + \ No newline at end of file diff --git a/src/renderer/components/player/PlayBar.vue b/src/renderer/components/player/PlayBar.vue index cc4fc91..e05a02e 100644 --- a/src/renderer/components/player/PlayBar.vue +++ b/src/renderer/components/player/PlayBar.vue @@ -56,10 +56,13 @@
-
+
{{ playMusic.name }} + + {{ playbackRate }}x +
{{ t('player.playBar.reparse') }} - - - - - - + + + + {{ t('player.playBar.playList') }} - - - - - {{ t('player.playBar.playbackSpeed') }} - -
@@ -189,9 +157,6 @@ import { useThrottleFn } from '@vueuse/core'; import { useMessage } from 'naive-ui'; import { computed, ref, watch } from 'vue'; import { useI18n } from 'vue-i18n'; - -import EqControl from '@/components/EQControl.vue'; -import SleepTimerPopover from '@/components/player/SleepTimerPopover.vue'; import ReparsePopover from '@/components/player/ReparsePopover.vue'; import { allTime, @@ -207,10 +172,12 @@ import MusicFull from '@/layout/components/MusicFull.vue'; import { audioService } from '@/services/audioService'; import { isBilibiliIdMatch, - usePlayerStore + usePlayerStore } from '@/store/modules/player'; import { useSettingsStore } from '@/store/modules/settings'; import { getImgUrl, isElectron, isMobile, secondToMinute, setAnimationClass } from '@/utils'; +import AdvancedControlsPopover from '@/components/player/AdvancedControlsPopover.vue'; +import { storeToRefs } from 'pinia'; const playerStore = usePlayerStore(); const settingsStore = useSettingsStore(); @@ -337,22 +304,7 @@ const playModeText = computed(() => { }); // 播放速度控制 -const playbackRate = ref(1.0); -const playbackRateOptions = [ - { label: '0.5x', key: 0.5 }, - { label: '0.75x', key: 0.75 }, - { label: '1.0x', key: 1.0 }, - { label: '1.25x', key: 1.25 }, - { label: '1.5x', key: 1.5 }, - { label: '2.0x', key: 2.0 } -]; - - -const handlePlaybackRateChange = (rate: number) => { - playbackRate.value = rate; - audioService.setPlaybackRate(rate); -}; - +const {playbackRate} = storeToRefs(playerStore); // 切换播放模式 const togglePlayMode = () => { playerStore.togglePlayMode(); @@ -434,8 +386,6 @@ const handleArtistClick = (id: number) => { navigateToArtist(id); }; -const isEQVisible = ref(false); - // 打开播放列表抽屉 const openPlayListDrawer = () => { playerStore.setPlayListDrawerVisible(true); @@ -464,7 +414,7 @@ const openPlayListDrawer = () => { } .music-content { - width: 160px; + width: 200px; @apply ml-4; &-title { @@ -756,4 +706,11 @@ const openPlayListDrawer = () => { .speed-button:hover { background: var(--hover-color-dark); } + + +.playback-rate-badge { + @apply ml-2 px-1.5 h-4 flex items-center text-xs rounded bg-green-500 bg-opacity-15 text-green-600 dark:text-green-400; + font-weight: 500; + vertical-align: 1px; +} diff --git a/src/renderer/components/player/SleepTimer.vue b/src/renderer/components/player/SleepTimer.vue new file mode 100644 index 0000000..15c6ea8 --- /dev/null +++ b/src/renderer/components/player/SleepTimer.vue @@ -0,0 +1,342 @@ + + + + + \ No newline at end of file diff --git a/src/renderer/components/player/SleepTimerPopover.vue b/src/renderer/components/player/SleepTimerPopover.vue deleted file mode 100644 index e39bdcc..0000000 --- a/src/renderer/components/player/SleepTimerPopover.vue +++ /dev/null @@ -1,478 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/renderer/components/player/SleepTimerTop.vue b/src/renderer/components/player/SleepTimerTop.vue new file mode 100644 index 0000000..c83422c --- /dev/null +++ b/src/renderer/components/player/SleepTimerTop.vue @@ -0,0 +1,124 @@ + + + + + \ No newline at end of file diff --git a/src/renderer/layout/AppLayout.vue b/src/renderer/layout/AppLayout.vue index 074de88..dbdb175 100644 --- a/src/renderer/layout/AppLayout.vue +++ b/src/renderer/layout/AppLayout.vue @@ -52,6 +52,7 @@ +
@@ -69,6 +70,7 @@ import { useMenuStore } from '@/store/modules/menu'; import { usePlayerStore } from '@/store/modules/player'; import { useSettingsStore } from '@/store/modules/settings'; import { isElectron, isMobile } from '@/utils'; +import SleepTimerTop from '@/components/player/SleepTimerTop.vue'; const keepAliveInclude = computed(() => { const allRoutes = [...homeRouter, ...otherRouter]; diff --git a/src/renderer/store/modules/player.ts b/src/renderer/store/modules/player.ts index 852b30d..285424b 100644 --- a/src/renderer/store/modules/player.ts +++ b/src/renderer/store/modules/player.ts @@ -389,7 +389,7 @@ export const usePlayerStore = defineStore('player', () => { const musicFull = ref(false); const favoriteList = ref>(getLocalStorageItem('favoriteList', [])); const savedPlayProgress = ref(); - + const showSleepTimer = ref(false); // 定时弹窗 // 添加播放列表抽屉状态 const playListDrawerVisible = ref(false); @@ -399,8 +399,8 @@ export const usePlayerStore = defineStore('player', () => { value: 0 })); - // 添加播放速度状态 - const playbackRate = ref(1.0); + // 播放速度状态 + const playbackRate = ref(parseFloat(getLocalStorageItem('playbackRate', '1.0'))); // 清空播放列表 const clearPlayAll = async () => { @@ -1053,15 +1053,6 @@ export const usePlayerStore = defineStore('player', () => { localStorage.setItem('playbackRate', rate.toString()); }; - // 初始化播放速度 - const initializePlaybackRate = () => { - const savedRate = localStorage.getItem('playbackRate'); - if (savedRate) { - playbackRate.value = parseFloat(savedRate); - audioService.setPlaybackRate(playbackRate.value); - } - }; - // 初始化播放状态 const initializePlayState = async () => { const settingStore = useSettingsStore(); @@ -1113,7 +1104,11 @@ export const usePlayerStore = defineStore('player', () => { localStorage.removeItem('playProgress'); } } - initializePlaybackRate(); + + setTimeout(() => { + audioService.setPlaybackRate(playbackRate.value); + }, 2000); + }; const initializeFavoriteList = async () => { @@ -1332,6 +1327,7 @@ export const usePlayerStore = defineStore('player', () => { // 定时关闭相关 sleepTimer, + showSleepTimer, currentSleepTimer, hasSleepTimerActive, sleepTimerRemainingTime,