mirror of
https://github.com/algerkong/AlgerMusicPlayer.git
synced 2026-04-20 12:47:23 +08:00
ad2df12957
- App.vue: offline 监听器添加 onUnmounted 清理,移除冗余 console.log - MusicHook.ts: document.onkeyup 直接赋值改为 addEventListener + 防重复 - MusicHook.ts: audio-ready 监听器提取为命名函数,先移除再注册防堆叠
201 lines
5.8 KiB
Vue
201 lines
5.8 KiB
Vue
<template>
|
|
<div class="app-container h-full w-full" :class="{ mobile: isMobile, noElectron: !isElectron }">
|
|
<n-config-provider :theme="theme === 'dark' ? darkTheme : lightTheme">
|
|
<n-dialog-provider>
|
|
<n-message-provider>
|
|
<router-view></router-view>
|
|
<traffic-warning-drawer v-if="!isElectron"></traffic-warning-drawer>
|
|
<disclaimer-modal></disclaimer-modal>
|
|
</n-message-provider>
|
|
</n-dialog-provider>
|
|
</n-config-provider>
|
|
</div>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import { cloneDeep } from 'lodash';
|
|
import { darkTheme, lightTheme } from 'naive-ui';
|
|
import { computed, nextTick, onMounted, watch } from 'vue';
|
|
import { useI18n } from 'vue-i18n';
|
|
import { useRouter } from 'vue-router';
|
|
|
|
import DisclaimerModal from '@/components/common/DisclaimerModal.vue';
|
|
import TrafficWarningDrawer from '@/components/TrafficWarningDrawer.vue';
|
|
import { usePlayerStore } from '@/store/modules/player';
|
|
import { usePlayerCoreStore } from '@/store/modules/playerCore';
|
|
import { useSettingsStore } from '@/store/modules/settings';
|
|
import { useUserStore } from '@/store/modules/user';
|
|
import { isElectron, isLyricWindow } from '@/utils';
|
|
import { checkLoginStatus } from '@/utils/auth';
|
|
|
|
import { initAudioListeners, initMusicHook } from './hooks/MusicHook';
|
|
import { audioService } from './services/audioService';
|
|
import { initLxMusicRunner } from './services/LxMusicSourceRunner';
|
|
import { isMobile } from './utils';
|
|
import { useAppShortcuts } from './utils/appShortcuts';
|
|
|
|
const { locale } = useI18n();
|
|
const settingsStore = useSettingsStore();
|
|
const playerStore = usePlayerStore();
|
|
const playerCoreStore = usePlayerCoreStore();
|
|
const userStore = useUserStore();
|
|
const router = useRouter();
|
|
|
|
// 监听语言变化
|
|
watch(
|
|
() => settingsStore.setData.language,
|
|
(newLanguage) => {
|
|
if (newLanguage && newLanguage !== locale.value) {
|
|
locale.value = newLanguage;
|
|
}
|
|
},
|
|
{ immediate: true }
|
|
);
|
|
|
|
const theme = computed(() => {
|
|
return settingsStore.theme;
|
|
});
|
|
|
|
// 监听字体变化并应用
|
|
watch(
|
|
() => [settingsStore.setData.fontFamily, settingsStore.setData.fontScope],
|
|
([newFont, fontScope]) => {
|
|
const appElement = document.body;
|
|
if (newFont && fontScope === 'global') {
|
|
appElement.style.fontFamily = newFont;
|
|
} else {
|
|
appElement.style.fontFamily = '';
|
|
}
|
|
}
|
|
);
|
|
|
|
const handleSetLanguage = (value: string) => {
|
|
console.log('应用语言变更:', value);
|
|
if (value) {
|
|
locale.value = value;
|
|
}
|
|
};
|
|
|
|
if (!isLyricWindow.value) {
|
|
settingsStore.initializeSettings();
|
|
settingsStore.initializeTheme();
|
|
settingsStore.initializeSystemFonts();
|
|
|
|
// 初始化登录状态 - 从 localStorage 恢复用户信息和登录类型
|
|
const loginInfo = checkLoginStatus();
|
|
if (loginInfo.isLoggedIn) {
|
|
if (loginInfo.user && !userStore.user) {
|
|
userStore.setUser(loginInfo.user);
|
|
}
|
|
if (loginInfo.loginType && !userStore.loginType) {
|
|
userStore.setLoginType(loginInfo.loginType);
|
|
}
|
|
}
|
|
}
|
|
|
|
handleSetLanguage(settingsStore.setData.language);
|
|
|
|
// 监听迷你模式状态
|
|
if (isElectron) {
|
|
window.api.onLanguageChanged(handleSetLanguage);
|
|
window.electron.ipcRenderer.on('mini-mode', (_, value) => {
|
|
settingsStore.setMiniMode(value);
|
|
if (value) {
|
|
// 存储当前路由
|
|
localStorage.setItem('currentRoute', router.currentRoute.value.path);
|
|
router.push('/mini');
|
|
} else {
|
|
// 清理迷你模式下设置的 body 样式
|
|
document.body.style.height = '';
|
|
document.body.style.overflow = '';
|
|
// 恢复当前路由
|
|
const currentRoute = localStorage.getItem('currentRoute');
|
|
if (currentRoute) {
|
|
router.push(currentRoute);
|
|
localStorage.removeItem('currentRoute');
|
|
} else {
|
|
router.push('/');
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
// 使用应用内快捷键
|
|
useAppShortcuts();
|
|
|
|
onMounted(async () => {
|
|
playerStore.setIsPlay(false);
|
|
if (isLyricWindow.value) {
|
|
return;
|
|
}
|
|
|
|
// 检查网络状态,离线时自动跳转到本地音乐页面
|
|
if (!navigator.onLine) {
|
|
router.push('/local-music');
|
|
}
|
|
|
|
// 监听网络状态变化,断网时跳转到本地音乐页面
|
|
const handleOffline = () => {
|
|
router.push('/local-music');
|
|
};
|
|
window.addEventListener('offline', handleOffline);
|
|
onUnmounted(() => {
|
|
window.removeEventListener('offline', handleOffline);
|
|
});
|
|
|
|
// 初始化 MusicHook,注入 playerStore
|
|
initMusicHook(playerStore);
|
|
// 设置 URL 过期自动续播处理器
|
|
const { setupUrlExpiredHandler } = await import('@/services/playbackController');
|
|
setupUrlExpiredHandler();
|
|
// 初始化播放状态
|
|
await playerStore.initializePlayState();
|
|
|
|
// 初始化音频设备变化监听器
|
|
playerCoreStore.initAudioDeviceListener();
|
|
|
|
// 初始化落雪音源(如果有激活的音源)
|
|
const activeLxApiId = settingsStore.setData?.activeLxMusicApiId;
|
|
if (activeLxApiId) {
|
|
const lxMusicScripts = settingsStore.setData?.lxMusicScripts || [];
|
|
const activeScript = lxMusicScripts.find((script: any) => script.id === activeLxApiId);
|
|
if (activeScript && activeScript.script) {
|
|
try {
|
|
console.log('[App] 初始化激活的落雪音源:', activeScript.name);
|
|
await initLxMusicRunner(activeScript.script);
|
|
} catch (error) {
|
|
console.error('[App] 初始化落雪音源失败:', error);
|
|
}
|
|
}
|
|
}
|
|
|
|
// 如果有正在播放的音乐,则初始化音频监听器
|
|
if (playerStore.playMusic && playerStore.playMusic.id) {
|
|
// 使用 nextTick 确保 DOM 更新后再初始化
|
|
await nextTick();
|
|
initAudioListeners();
|
|
if (isElectron) {
|
|
window.api.sendSong(cloneDeep(playerStore.playMusic));
|
|
}
|
|
}
|
|
|
|
audioService.releaseOperationLock();
|
|
});
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
.app-container {
|
|
user-select: none;
|
|
}
|
|
|
|
.mobile {
|
|
.text-base {
|
|
font-size: 14px !important;
|
|
}
|
|
}
|
|
|
|
.html:has(.mobile) {
|
|
font-size: 14px;
|
|
}
|
|
</style>
|