refactor: replace console statements with debug instances
- Replace all console.log/error/warn statements with appropriate debug instances - Add debug utils with modular debug instances for different components - Use debugUI for UI components (pages and components) - Use debugStore for store files - Use debugUtils for utility functions - Use debugPlayroom for Playroom specific debugging - Use debugLyrics for lyrics-related debugging - Use debugVisualizer for audio visualization debugging - Use debugResource for resource checking debugging - Maintain original message content with Chinese descriptions - Preserve Tab indentation throughout all files 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
		
							parent
							
								
									210700bc0d
								
							
						
					
					
						commit
						60740274b7
					
				
							
								
								
									
										24
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										24
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							| 
						 | 
				
			
			@ -10,6 +10,7 @@
 | 
			
		|||
			"dependencies": {
 | 
			
		||||
				"@tailwindcss/vite": "^4.1.7",
 | 
			
		||||
				"axios": "^1.9.0",
 | 
			
		||||
				"debug": "^4.4.1",
 | 
			
		||||
				"gsap": "^3.13.0",
 | 
			
		||||
				"pinia": "^3.0.2",
 | 
			
		||||
				"tailwindcss": "^4.1.7",
 | 
			
		||||
| 
						 | 
				
			
			@ -1613,6 +1614,23 @@
 | 
			
		|||
			"dev": true,
 | 
			
		||||
			"license": "MIT"
 | 
			
		||||
		},
 | 
			
		||||
		"node_modules/debug": {
 | 
			
		||||
			"version": "4.4.1",
 | 
			
		||||
			"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
 | 
			
		||||
			"integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
 | 
			
		||||
			"license": "MIT",
 | 
			
		||||
			"dependencies": {
 | 
			
		||||
				"ms": "^2.1.3"
 | 
			
		||||
			},
 | 
			
		||||
			"engines": {
 | 
			
		||||
				"node": ">=6.0"
 | 
			
		||||
			},
 | 
			
		||||
			"peerDependenciesMeta": {
 | 
			
		||||
				"supports-color": {
 | 
			
		||||
					"optional": true
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
		"node_modules/delayed-stream": {
 | 
			
		||||
			"version": "1.0.0",
 | 
			
		||||
			"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
 | 
			
		||||
| 
						 | 
				
			
			@ -2295,6 +2313,12 @@
 | 
			
		|||
				"url": "https://github.com/sponsors/isaacs"
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
		"node_modules/ms": {
 | 
			
		||||
			"version": "2.1.3",
 | 
			
		||||
			"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
 | 
			
		||||
			"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
 | 
			
		||||
			"license": "MIT"
 | 
			
		||||
		},
 | 
			
		||||
		"node_modules/muggle-string": {
 | 
			
		||||
			"version": "0.4.1",
 | 
			
		||||
			"resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,6 +22,7 @@
 | 
			
		|||
	"dependencies": {
 | 
			
		||||
		"@tailwindcss/vite": "^4.1.7",
 | 
			
		||||
		"axios": "^1.9.0",
 | 
			
		||||
		"debug": "^4.4.1",
 | 
			
		||||
		"gsap": "^3.13.0",
 | 
			
		||||
		"pinia": "^3.0.2",
 | 
			
		||||
		"tailwindcss": "^4.1.7",
 | 
			
		||||
| 
						 | 
				
			
			@ -40,4 +41,4 @@
 | 
			
		|||
		"vite": "^6.0.1",
 | 
			
		||||
		"vue-tsc": "^2.1.10"
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -8,6 +8,7 @@ import LeftArrowIcon from './assets/icons/leftarrow.vue'
 | 
			
		|||
// import SearchIcon from './assets/icons/search.vue'
 | 
			
		||||
import CorgIcon from './assets/icons/corg.vue'
 | 
			
		||||
import { watch } from 'vue'
 | 
			
		||||
import { debug } from './utils/debug'
 | 
			
		||||
 | 
			
		||||
import UpdatePopup from './components/UpdatePopup.vue'
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -17,7 +18,7 @@ const route = useRoute()
 | 
			
		|||
const router = useRouter()
 | 
			
		||||
 | 
			
		||||
watch(() => presentPreferencePanel, (value) => {
 | 
			
		||||
	console.log(value)
 | 
			
		||||
	debug('偏好设置面板显示状态', value)
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
</script>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,6 +11,7 @@ import { artistsOrganize } from '../utils'
 | 
			
		|||
import { usePlayQueueStore } from '../stores/usePlayQueueStore'
 | 
			
		||||
import TrackItem from './TrackItem.vue'
 | 
			
		||||
import LoadingIndicator from '../assets/icons/loadingindicator.vue'
 | 
			
		||||
import { debugUI } from '../utils/debug'
 | 
			
		||||
 | 
			
		||||
const props = defineProps<{
 | 
			
		||||
	albumCid: string
 | 
			
		||||
| 
						 | 
				
			
			@ -97,7 +98,7 @@ watch(() => props.present, async (newVal) => {
 | 
			
		|||
})
 | 
			
		||||
 | 
			
		||||
watch(() => props.albumCid, async () => {
 | 
			
		||||
	console.log("AlbumDetailDialog mounted with albumCid:", props.albumCid)
 | 
			
		||||
	debugUI('专辑详情对话框加载', props.albumCid)
 | 
			
		||||
	album.value = undefined // Reset album when cid changes
 | 
			
		||||
	try {
 | 
			
		||||
		let res = await apis.getAlbum(props.albumCid)
 | 
			
		||||
| 
						 | 
				
			
			@ -106,7 +107,7 @@ watch(() => props.albumCid, async () => {
 | 
			
		|||
		}
 | 
			
		||||
		album.value = res
 | 
			
		||||
	} catch (error) {
 | 
			
		||||
		console.error(error)
 | 
			
		||||
		debugUI('专辑详情加载失败', error)
 | 
			
		||||
	}
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -291,7 +291,7 @@ if (isAudioVisualizationSupported) {
 | 
			
		|||
	isAnalyzing = visualizer.isAnalyzing
 | 
			
		||||
	error = visualizer.error
 | 
			
		||||
	
 | 
			
		||||
	console.log('[Player] audioVisualizer 返回值:', {
 | 
			
		||||
	debugPlayer('audioVisualizer 返回值:', {
 | 
			
		||||
		barHeights: barHeights.value,
 | 
			
		||||
		isAnalyzing: isAnalyzing.value,
 | 
			
		||||
	})
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -90,6 +90,7 @@ import { onMounted, ref, watch, nextTick, computed, onUnmounted } from 'vue'
 | 
			
		|||
import axios from 'axios'
 | 
			
		||||
import gsap from 'gsap'
 | 
			
		||||
import { usePlayQueueStore } from '../stores/usePlayQueueStore'
 | 
			
		||||
import { debugLyrics } from '../utils/debug'
 | 
			
		||||
 | 
			
		||||
// 类型定义
 | 
			
		||||
interface LyricsLine {
 | 
			
		||||
| 
						 | 
				
			
			@ -367,7 +368,7 @@ function handleWheel(event: WheelEvent) {
 | 
			
		|||
// 处理歌词行点击
 | 
			
		||||
function handleLineClick(line: LyricsLine | GapLine, index: number) {
 | 
			
		||||
	if (line.type === 'lyric') {
 | 
			
		||||
		console.log('Jump to time:', line.time)
 | 
			
		||||
		debugLyrics('跳转到时间点', line.time)
 | 
			
		||||
		// 这里可以发出事件让父组件处理音频跳转
 | 
			
		||||
		// emit('seek', line.time)
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -494,7 +495,7 @@ watch(() => playQueueStore.currentTime, (time) => {
 | 
			
		|||
 | 
			
		||||
// 监听歌词源变化
 | 
			
		||||
watch(() => props.lrcSrc, async (newSrc) => {
 | 
			
		||||
	console.log('Loading new lyrics from:', newSrc)
 | 
			
		||||
	debugLyrics('加载新歌词', newSrc)
 | 
			
		||||
	// 重置状态
 | 
			
		||||
	currentLineIndex.value = -1
 | 
			
		||||
	lineRefs.value = []
 | 
			
		||||
| 
						 | 
				
			
			@ -517,7 +518,7 @@ watch(() => props.lrcSrc, async (newSrc) => {
 | 
			
		|||
		try {
 | 
			
		||||
			const response = await axios.get(newSrc)
 | 
			
		||||
			parsedLyrics.value = parseLyrics(response.data)
 | 
			
		||||
			console.log('Parsed lyrics:', parsedLyrics.value)
 | 
			
		||||
			debugLyrics('歌词解析完成', parsedLyrics.value)
 | 
			
		||||
 | 
			
		||||
			autoScroll.value = true
 | 
			
		||||
			userScrolling.value = false
 | 
			
		||||
| 
						 | 
				
			
			@ -528,7 +529,7 @@ watch(() => props.lrcSrc, async (newSrc) => {
 | 
			
		|||
			}
 | 
			
		||||
 | 
			
		||||
		} catch (error) {
 | 
			
		||||
			console.error('Failed to load lyrics:', error)
 | 
			
		||||
			debugLyrics('歌词加载失败', error)
 | 
			
		||||
			parsedLyrics.value = []
 | 
			
		||||
		} finally {
 | 
			
		||||
			loading.value = false
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,6 +4,7 @@ import { ref } from 'vue'
 | 
			
		|||
import { usePlayQueueStore } from '../stores/usePlayQueueStore'
 | 
			
		||||
import { useToast } from 'vue-toast-notification'
 | 
			
		||||
import { useFavourites } from '../stores/useFavourites'
 | 
			
		||||
import { debugUI } from '../utils/debug'
 | 
			
		||||
 | 
			
		||||
import QueueAddIcon from '../assets/icons/queueadd.vue'
 | 
			
		||||
import StarEmptyIcon from '../assets/icons/starempty.vue'
 | 
			
		||||
| 
						 | 
				
			
			@ -23,7 +24,7 @@ const toast = useToast()
 | 
			
		|||
const favourites = useFavourites()
 | 
			
		||||
 | 
			
		||||
function appendToQueue() {
 | 
			
		||||
	console.log('aaa')
 | 
			
		||||
	debugUI('添加歌曲到队列')
 | 
			
		||||
	let queue = playQueueStore.list
 | 
			
		||||
	queue.push({
 | 
			
		||||
		song: props.track,
 | 
			
		||||
| 
						 | 
				
			
			@ -41,7 +42,7 @@ function appendToQueue() {
 | 
			
		|||
<template>
 | 
			
		||||
	<button
 | 
			
		||||
		class="flex justify-between align-center gap-4 text-left px-2 h-[2.75rem] hover:bg-neutral-600/40 odd:bg-netural-600/20 relative overflow-hidden bg-neutral-800/20 odd:bg-neutral-800/40 transition-all"
 | 
			
		||||
		@click="playfrom(index)" @mouseenter="() => { hover = true; console.log('aaa') }" @mouseleave="hover = false">
 | 
			
		||||
		@click="playfrom(index)" @mouseenter="() => { hover = true; debugUI('鼠标悬停在歌曲项') }" @mouseleave="hover = false">
 | 
			
		||||
 | 
			
		||||
		<span class="text-[3.7rem] text-white/10 absolute left-0 top-[-1.4rem] track_num">{{ index + 1 }}</span>
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,6 +5,7 @@ import { useRoute } from 'vue-router'
 | 
			
		|||
import { usePlayQueueStore } from '../stores/usePlayQueueStore'
 | 
			
		||||
import { artistsOrganize } from '../utils'
 | 
			
		||||
import TrackItem from '../components/TrackItem.vue'
 | 
			
		||||
import { debugUI } from '../utils/debug'
 | 
			
		||||
 | 
			
		||||
import PlayIcon from '../assets/icons/play.vue'
 | 
			
		||||
import StarEmptyIcon from '../assets/icons/starempty.vue'
 | 
			
		||||
| 
						 | 
				
			
			@ -24,9 +25,9 @@ onMounted(async () => {
 | 
			
		|||
			res.songs[parseInt(track)] = await apis.getSong(res.songs[parseInt(track)].cid)
 | 
			
		||||
		}
 | 
			
		||||
		album.value = res
 | 
			
		||||
		console.log(res)
 | 
			
		||||
		debugUI('专辑详情加载完成', res)
 | 
			
		||||
	} catch (error) {
 | 
			
		||||
		console.log(error)
 | 
			
		||||
		debugUI('专辑详情加载失败', error)
 | 
			
		||||
	}
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -38,7 +39,7 @@ function playTheAlbum(from: number = 0) {
 | 
			
		|||
 | 
			
		||||
	let newPlayQueue = []
 | 
			
		||||
	for (const track of album.value?.songs ?? []) {
 | 
			
		||||
		console.log(track)
 | 
			
		||||
		debugUI('添加歌曲到播放队列', track)
 | 
			
		||||
		newPlayQueue.push({
 | 
			
		||||
			song: track,
 | 
			
		||||
			album: album.value
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,6 +2,7 @@
 | 
			
		|||
import StarFilledIcon from '../assets/icons/starfilled.vue'
 | 
			
		||||
import PlayIcon from '../assets/icons/play.vue'
 | 
			
		||||
import ShuffleIcon from '../assets/icons/shuffle.vue'
 | 
			
		||||
import { debugUI } from '../utils/debug'
 | 
			
		||||
 | 
			
		||||
import { useFavourites } from '../stores/useFavourites'
 | 
			
		||||
import { ref } from 'vue'
 | 
			
		||||
| 
						 | 
				
			
			@ -124,7 +125,7 @@ function shuffle(list: 'favourites' | number) {
 | 
			
		|||
			<div class="flex flex-col gap-2 mt-4 mr-8 pb-8">
 | 
			
		||||
				<PlayListItem v-for="(item, index) in favourites.favourites.slice().reverse()" :key="item.song.cid" :item="item"
 | 
			
		||||
					:index="index" @play="(playFrom) => {
 | 
			
		||||
						console.log('play from', playFrom)
 | 
			
		||||
						debugUI('从收藏库播放', playFrom)
 | 
			
		||||
						playTheList('favourites', playFrom)
 | 
			
		||||
					}" />
 | 
			
		||||
			</div>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -8,6 +8,7 @@ import { useTemplateRef } from 'vue'
 | 
			
		|||
import { ref, watch } from 'vue'
 | 
			
		||||
import { usePreferences } from '../stores/usePreferences'
 | 
			
		||||
import { useFavourites } from '../stores/useFavourites'
 | 
			
		||||
import { debugPlayroom } from '../utils/debug'
 | 
			
		||||
 | 
			
		||||
import ScrollingLyrics from '../components/ScrollingLyrics.vue'
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -132,14 +133,14 @@ function toggleVolumeControl() {
 | 
			
		|||
 | 
			
		||||
function createVolumeDraggable() {
 | 
			
		||||
	if (!volumeSliderThumb.value || !volumeSliderContainer.value) {
 | 
			
		||||
		console.warn('Volume slider elements not found')
 | 
			
		||||
		debugPlayroom('音量滑块元素未找到')
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 确保容器有宽度
 | 
			
		||||
	const containerWidth = volumeSliderContainer.value.clientWidth
 | 
			
		||||
	if (containerWidth === 0) {
 | 
			
		||||
		console.warn('Volume slider container has no width')
 | 
			
		||||
		debugPlayroom('音量滑块容器宽度为0')
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -164,7 +165,7 @@ function createVolumeDraggable() {
 | 
			
		|||
		}
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	console.log('Volume draggable created successfully')
 | 
			
		||||
	debugPlayroom('音量滑块拖拽创建成功')
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function updateAudioVolume() {
 | 
			
		||||
| 
						 | 
				
			
			@ -187,7 +188,7 @@ function formatDetector() {
 | 
			
		|||
 | 
			
		||||
function playNext() {
 | 
			
		||||
	if (playQueueStore.currentIndex === playQueueStore.list.length - 1) {
 | 
			
		||||
		console.log("at the bottom, pause")
 | 
			
		||||
		debugPlayroom('到达播放队列末尾,暂停')
 | 
			
		||||
		playQueueStore.currentIndex = 0
 | 
			
		||||
		playQueueStore.isPlaying = false
 | 
			
		||||
	} else {
 | 
			
		||||
| 
						 | 
				
			
			@ -305,7 +306,7 @@ function makePlayQueueListDismiss() {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
function getCurrentTrack() {
 | 
			
		||||
	console.log(playQueueStore.queue)
 | 
			
		||||
	debugPlayroom('获取当前播放轨道', playQueueStore.queue)
 | 
			
		||||
	if (playQueueStore.queue.length === 0) {
 | 
			
		||||
		return null
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -438,10 +439,10 @@ function setupPageFocusHandlers() {
 | 
			
		|||
	handleVisibilityChange = () => {
 | 
			
		||||
		if (document.hidden) {
 | 
			
		||||
			// 页面失去焦点时,暂停所有动画
 | 
			
		||||
			console.log('[Playroom] 页面失去焦点,暂停动画')
 | 
			
		||||
			debugPlayroom('页面失去焦点,暂停动画')
 | 
			
		||||
		} else {
 | 
			
		||||
			// 页面重新获得焦点时,重新同步状态
 | 
			
		||||
			console.log('[Playroom] 页面重新获得焦点,同步状态')
 | 
			
		||||
			debugPlayroom('页面重新获得焦点,同步状态')
 | 
			
		||||
			nextTick(() => {
 | 
			
		||||
				resyncLyricsState()
 | 
			
		||||
			})
 | 
			
		||||
| 
						 | 
				
			
			@ -449,7 +450,7 @@ function setupPageFocusHandlers() {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	handlePageFocus = () => {
 | 
			
		||||
		console.log('[Playroom] 窗口获得焦点,同步状态')
 | 
			
		||||
		debugPlayroom('窗口获得焦点,同步状态')
 | 
			
		||||
		nextTick(() => {
 | 
			
		||||
			resyncLyricsState()
 | 
			
		||||
		})
 | 
			
		||||
| 
						 | 
				
			
			@ -465,7 +466,7 @@ function resyncLyricsState() {
 | 
			
		|||
	const currentTrack = getCurrentTrack()
 | 
			
		||||
	if (!currentTrack) { return }
 | 
			
		||||
 | 
			
		||||
	console.log('[Playroom] 重新同步歌词状态')
 | 
			
		||||
	debugPlayroom('重新同步歌词状态')
 | 
			
		||||
 | 
			
		||||
	// 重置动画状态
 | 
			
		||||
	if (controllerRef.value) {
 | 
			
		||||
| 
						 | 
				
			
			@ -488,7 +489,7 @@ function resyncLyricsState() {
 | 
			
		|||
	const shouldShowLyrics = preferences.presentLyrics && currentTrack.song.lyricUrl ? true : false
 | 
			
		||||
 | 
			
		||||
	if (shouldShowLyrics !== presentLyrics.value) {
 | 
			
		||||
		console.log(`[Playroom] 歌词状态不一致,重新设置: ${presentLyrics.value} -> ${shouldShowLyrics}`)
 | 
			
		||||
		debugPlayroom(`歌词状态不一致,重新设置: ${presentLyrics.value} -> ${shouldShowLyrics}`)
 | 
			
		||||
		
 | 
			
		||||
		// 直接设置状态,不触发动画
 | 
			
		||||
		presentLyrics.value = shouldShowLyrics
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,6 @@
 | 
			
		|||
import { defineStore } from "pinia"
 | 
			
		||||
import { ref, watch, computed } from "vue"
 | 
			
		||||
import { debugStore } from '../utils/debug'
 | 
			
		||||
 | 
			
		||||
// 声明全局类型
 | 
			
		||||
declare global {
 | 
			
		||||
| 
						 | 
				
			
			@ -293,7 +294,7 @@ export const useFavourites = defineStore('favourites', () => {
 | 
			
		|||
					await saveFavourites()
 | 
			
		||||
				} catch (error) {
 | 
			
		||||
					// 保存失败时可以考虑回滚或错误处理
 | 
			
		||||
					console.error('Failed to save updated song:', error)
 | 
			
		||||
					debugStore('更新歌曲信息保存失败', error)
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,6 @@
 | 
			
		|||
import { defineStore } from "pinia"
 | 
			
		||||
import { ref } from "vue"
 | 
			
		||||
import { debugStore } from '../utils/debug'
 | 
			
		||||
 | 
			
		||||
// 声明全局类型
 | 
			
		||||
declare global {
 | 
			
		||||
| 
						 | 
				
			
			@ -153,7 +154,7 @@ export const useUpdatePopup = defineStore('updatePopup', () => {
 | 
			
		|||
 | 
			
		||||
			return false
 | 
			
		||||
		} catch (error) {
 | 
			
		||||
			console.error('检查更新弹窗状态失败:', error)
 | 
			
		||||
			debugStore('检查更新弹窗状态失败', error)
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -166,7 +167,7 @@ export const useUpdatePopup = defineStore('updatePopup', () => {
 | 
			
		|||
				await setStoredValue('lastUpdatePopupVersion', currentVersion)
 | 
			
		||||
			}
 | 
			
		||||
		} catch (error) {
 | 
			
		||||
			console.error('标记更新弹窗已显示失败:', error)
 | 
			
		||||
			debugStore('标记更新弹窗已显示失败', error)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -182,7 +183,7 @@ export const useUpdatePopup = defineStore('updatePopup', () => {
 | 
			
		|||
			detectAvailableAPIs()
 | 
			
		||||
			isLoaded.value = true
 | 
			
		||||
		} catch (error) {
 | 
			
		||||
			console.error('初始化更新弹窗 store 失败:', error)
 | 
			
		||||
			debugStore('初始化更新弹窗 store 失败', error)
 | 
			
		||||
			isLoaded.value = true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,6 @@
 | 
			
		|||
// utils/audioVisualizer.ts - 平衡频谱版本
 | 
			
		||||
import { ref, onUnmounted, Ref } from 'vue'
 | 
			
		||||
import { debugVisualizer } from './debug'
 | 
			
		||||
 | 
			
		||||
interface AudioVisualizerOptions {
 | 
			
		||||
  sensitivity?: number
 | 
			
		||||
| 
						 | 
				
			
			@ -27,7 +28,7 @@ export function audioVisualizer(options: AudioVisualizerOptions = {}) {
 | 
			
		|||
    minHeight = 0         // 最小高度百分比
 | 
			
		||||
  } = options
 | 
			
		||||
 | 
			
		||||
  console.log('[AudioVisualizer] 初始化平衡频谱,选项:', options)
 | 
			
		||||
  debugVisualizer('初始化平衡频谱', options)
 | 
			
		||||
 | 
			
		||||
  // 导出的竖杠高度值数组 (0-100)
 | 
			
		||||
  const barHeights: Ref<number[]> = ref(Array(barCount).fill(0))
 | 
			
		||||
| 
						 | 
				
			
			@ -46,7 +47,7 @@ export function audioVisualizer(options: AudioVisualizerOptions = {}) {
 | 
			
		|||
  // 调试日志
 | 
			
		||||
  function log(...args: any[]) {
 | 
			
		||||
    if (debug) {
 | 
			
		||||
      console.log('[AudioVisualizer]', ...args)
 | 
			
		||||
      debugVisualizer(...args)
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,7 @@
 | 
			
		|||
/**
 | 
			
		||||
 * 浏览器检测工具
 | 
			
		||||
 */
 | 
			
		||||
import { debugUtils } from './debug'
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 检测是否为 Safari 浏览器
 | 
			
		||||
| 
						 | 
				
			
			@ -39,7 +40,7 @@ export function supportsWebAudioVisualization(): boolean {
 | 
			
		|||
	// Safari 在某些情况下对 AudioContext 的支持有限制
 | 
			
		||||
	// 特别是在处理跨域音频资源时
 | 
			
		||||
	if (isSafari()) {
 | 
			
		||||
		console.log('[BrowserDetection] Safari detected, audio visualization disabled')
 | 
			
		||||
		debugUtils('Safari浏览器检测,音频可视化禁用')
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										30
									
								
								src/utils/debug.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								src/utils/debug.ts
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,30 @@
 | 
			
		|||
import createDebug from 'debug'
 | 
			
		||||
 | 
			
		||||
// 创建不同模块的 debug 实例
 | 
			
		||||
export const debugPlayer = createDebug('msr:player')
 | 
			
		||||
export const debugStore = createDebug('msr:store')
 | 
			
		||||
export const debugApi = createDebug('msr:api')
 | 
			
		||||
export const debugUI = createDebug('msr:ui')
 | 
			
		||||
export const debugUtils = createDebug('msr:utils')
 | 
			
		||||
export const debugVisualizer = createDebug('msr:visualizer')
 | 
			
		||||
export const debugResource = createDebug('msr:resource')
 | 
			
		||||
export const debugLyrics = createDebug('msr:lyrics')
 | 
			
		||||
export const debugPlayroom = createDebug('msr:playroom')
 | 
			
		||||
 | 
			
		||||
// 通用 debug 实例
 | 
			
		||||
export const debug = createDebug('msr:app')
 | 
			
		||||
 | 
			
		||||
// 在开发环境下默认启用所有 debug
 | 
			
		||||
if (import.meta.env.DEV) {
 | 
			
		||||
	// 从环境变量或 localStorage 读取 DEBUG 设置
 | 
			
		||||
	const debugEnv = import.meta.env.VITE_DEBUG || localStorage.getItem('DEBUG')
 | 
			
		||||
	if (debugEnv) {
 | 
			
		||||
		createDebug.enable(debugEnv)
 | 
			
		||||
	} else {
 | 
			
		||||
		// 开发环境默认启用所有 msr: 相关的调试
 | 
			
		||||
		createDebug.enable('msr:*')
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 导出 createDebug 以便其他地方创建自定义实例
 | 
			
		||||
export default createDebug
 | 
			
		||||
| 
						 | 
				
			
			@ -1,5 +1,6 @@
 | 
			
		|||
import axios from 'axios'
 | 
			
		||||
import apis from '../apis'
 | 
			
		||||
import { debugResource } from './debug'
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 检查歌曲资源 URL 是否可用,如果不可用则刷新
 | 
			
		||||
| 
						 | 
				
			
			@ -12,7 +13,7 @@ export const checkAndRefreshSongResource = async (
 | 
			
		|||
  updateCallback?: (updatedSong: Song) => void
 | 
			
		||||
): Promise<Song> => {
 | 
			
		||||
  if (!song.sourceUrl) {
 | 
			
		||||
    console.warn('[ResourceChecker] 歌曲没有 sourceUrl:', song.name)
 | 
			
		||||
    debugResource('歌曲没有 sourceUrl', song.name)
 | 
			
		||||
    return song
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -31,15 +32,15 @@ export const checkAndRefreshSongResource = async (
 | 
			
		|||
    })
 | 
			
		||||
    
 | 
			
		||||
    // 资源可用,返回原始歌曲
 | 
			
		||||
    console.log('[ResourceChecker] 资源可用:', song.name)
 | 
			
		||||
    debugResource('资源可用', song.name)
 | 
			
		||||
    return song
 | 
			
		||||
  } catch (error) {
 | 
			
		||||
    // 资源不可用,刷新歌曲信息
 | 
			
		||||
    console.log('[ResourceChecker] 资源不可用,正在刷新:', song.name, error)
 | 
			
		||||
    debugResource('资源不可用,正在刷新', song.name, error)
 | 
			
		||||
    
 | 
			
		||||
    try {
 | 
			
		||||
      const updatedSong = await apis.getSong(song.cid)
 | 
			
		||||
      console.log('[ResourceChecker] 歌曲信息已刷新:', updatedSong.name)
 | 
			
		||||
      debugResource('歌曲信息已刷新', updatedSong.name)
 | 
			
		||||
      
 | 
			
		||||
      // 调用更新回调(如果提供)
 | 
			
		||||
      if (updateCallback) {
 | 
			
		||||
| 
						 | 
				
			
			@ -48,7 +49,7 @@ export const checkAndRefreshSongResource = async (
 | 
			
		|||
      
 | 
			
		||||
      return updatedSong
 | 
			
		||||
    } catch (refreshError) {
 | 
			
		||||
      console.error('[ResourceChecker] 刷新歌曲信息失败:', refreshError)
 | 
			
		||||
      debugResource('刷新歌曲信息失败', refreshError)
 | 
			
		||||
      // 刷新失败,返回原始歌曲
 | 
			
		||||
      return song
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue
	
	Block a user