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": {
|
"dependencies": {
|
||||||
"@tailwindcss/vite": "^4.1.7",
|
"@tailwindcss/vite": "^4.1.7",
|
||||||
"axios": "^1.9.0",
|
"axios": "^1.9.0",
|
||||||
|
"debug": "^4.4.1",
|
||||||
"gsap": "^3.13.0",
|
"gsap": "^3.13.0",
|
||||||
"pinia": "^3.0.2",
|
"pinia": "^3.0.2",
|
||||||
"tailwindcss": "^4.1.7",
|
"tailwindcss": "^4.1.7",
|
||||||
|
@ -1613,6 +1614,23 @@
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"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": {
|
"node_modules/delayed-stream": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
|
||||||
|
@ -2295,6 +2313,12 @@
|
||||||
"url": "https://github.com/sponsors/isaacs"
|
"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": {
|
"node_modules/muggle-string": {
|
||||||
"version": "0.4.1",
|
"version": "0.4.1",
|
||||||
"resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz",
|
"resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz",
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@tailwindcss/vite": "^4.1.7",
|
"@tailwindcss/vite": "^4.1.7",
|
||||||
"axios": "^1.9.0",
|
"axios": "^1.9.0",
|
||||||
|
"debug": "^4.4.1",
|
||||||
"gsap": "^3.13.0",
|
"gsap": "^3.13.0",
|
||||||
"pinia": "^3.0.2",
|
"pinia": "^3.0.2",
|
||||||
"tailwindcss": "^4.1.7",
|
"tailwindcss": "^4.1.7",
|
||||||
|
|
|
@ -8,6 +8,7 @@ import LeftArrowIcon from './assets/icons/leftarrow.vue'
|
||||||
// import SearchIcon from './assets/icons/search.vue'
|
// import SearchIcon from './assets/icons/search.vue'
|
||||||
import CorgIcon from './assets/icons/corg.vue'
|
import CorgIcon from './assets/icons/corg.vue'
|
||||||
import { watch } from 'vue'
|
import { watch } from 'vue'
|
||||||
|
import { debug } from './utils/debug'
|
||||||
|
|
||||||
import UpdatePopup from './components/UpdatePopup.vue'
|
import UpdatePopup from './components/UpdatePopup.vue'
|
||||||
|
|
||||||
|
@ -17,7 +18,7 @@ const route = useRoute()
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
|
|
||||||
watch(() => presentPreferencePanel, (value) => {
|
watch(() => presentPreferencePanel, (value) => {
|
||||||
console.log(value)
|
debug('偏好设置面板显示状态', value)
|
||||||
})
|
})
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -11,6 +11,7 @@ import { artistsOrganize } from '../utils'
|
||||||
import { usePlayQueueStore } from '../stores/usePlayQueueStore'
|
import { usePlayQueueStore } from '../stores/usePlayQueueStore'
|
||||||
import TrackItem from './TrackItem.vue'
|
import TrackItem from './TrackItem.vue'
|
||||||
import LoadingIndicator from '../assets/icons/loadingindicator.vue'
|
import LoadingIndicator from '../assets/icons/loadingindicator.vue'
|
||||||
|
import { debugUI } from '../utils/debug'
|
||||||
|
|
||||||
const props = defineProps<{
|
const props = defineProps<{
|
||||||
albumCid: string
|
albumCid: string
|
||||||
|
@ -97,7 +98,7 @@ watch(() => props.present, async (newVal) => {
|
||||||
})
|
})
|
||||||
|
|
||||||
watch(() => props.albumCid, async () => {
|
watch(() => props.albumCid, async () => {
|
||||||
console.log("AlbumDetailDialog mounted with albumCid:", props.albumCid)
|
debugUI('专辑详情对话框加载', props.albumCid)
|
||||||
album.value = undefined // Reset album when cid changes
|
album.value = undefined // Reset album when cid changes
|
||||||
try {
|
try {
|
||||||
let res = await apis.getAlbum(props.albumCid)
|
let res = await apis.getAlbum(props.albumCid)
|
||||||
|
@ -106,7 +107,7 @@ watch(() => props.albumCid, async () => {
|
||||||
}
|
}
|
||||||
album.value = res
|
album.value = res
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(error)
|
debugUI('专辑详情加载失败', error)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -291,7 +291,7 @@ if (isAudioVisualizationSupported) {
|
||||||
isAnalyzing = visualizer.isAnalyzing
|
isAnalyzing = visualizer.isAnalyzing
|
||||||
error = visualizer.error
|
error = visualizer.error
|
||||||
|
|
||||||
console.log('[Player] audioVisualizer 返回值:', {
|
debugPlayer('audioVisualizer 返回值:', {
|
||||||
barHeights: barHeights.value,
|
barHeights: barHeights.value,
|
||||||
isAnalyzing: isAnalyzing.value,
|
isAnalyzing: isAnalyzing.value,
|
||||||
})
|
})
|
||||||
|
|
|
@ -90,6 +90,7 @@ import { onMounted, ref, watch, nextTick, computed, onUnmounted } from 'vue'
|
||||||
import axios from 'axios'
|
import axios from 'axios'
|
||||||
import gsap from 'gsap'
|
import gsap from 'gsap'
|
||||||
import { usePlayQueueStore } from '../stores/usePlayQueueStore'
|
import { usePlayQueueStore } from '../stores/usePlayQueueStore'
|
||||||
|
import { debugLyrics } from '../utils/debug'
|
||||||
|
|
||||||
// 类型定义
|
// 类型定义
|
||||||
interface LyricsLine {
|
interface LyricsLine {
|
||||||
|
@ -367,7 +368,7 @@ function handleWheel(event: WheelEvent) {
|
||||||
// 处理歌词行点击
|
// 处理歌词行点击
|
||||||
function handleLineClick(line: LyricsLine | GapLine, index: number) {
|
function handleLineClick(line: LyricsLine | GapLine, index: number) {
|
||||||
if (line.type === 'lyric') {
|
if (line.type === 'lyric') {
|
||||||
console.log('Jump to time:', line.time)
|
debugLyrics('跳转到时间点', line.time)
|
||||||
// 这里可以发出事件让父组件处理音频跳转
|
// 这里可以发出事件让父组件处理音频跳转
|
||||||
// emit('seek', line.time)
|
// emit('seek', line.time)
|
||||||
}
|
}
|
||||||
|
@ -494,7 +495,7 @@ watch(() => playQueueStore.currentTime, (time) => {
|
||||||
|
|
||||||
// 监听歌词源变化
|
// 监听歌词源变化
|
||||||
watch(() => props.lrcSrc, async (newSrc) => {
|
watch(() => props.lrcSrc, async (newSrc) => {
|
||||||
console.log('Loading new lyrics from:', newSrc)
|
debugLyrics('加载新歌词', newSrc)
|
||||||
// 重置状态
|
// 重置状态
|
||||||
currentLineIndex.value = -1
|
currentLineIndex.value = -1
|
||||||
lineRefs.value = []
|
lineRefs.value = []
|
||||||
|
@ -517,7 +518,7 @@ watch(() => props.lrcSrc, async (newSrc) => {
|
||||||
try {
|
try {
|
||||||
const response = await axios.get(newSrc)
|
const response = await axios.get(newSrc)
|
||||||
parsedLyrics.value = parseLyrics(response.data)
|
parsedLyrics.value = parseLyrics(response.data)
|
||||||
console.log('Parsed lyrics:', parsedLyrics.value)
|
debugLyrics('歌词解析完成', parsedLyrics.value)
|
||||||
|
|
||||||
autoScroll.value = true
|
autoScroll.value = true
|
||||||
userScrolling.value = false
|
userScrolling.value = false
|
||||||
|
@ -528,7 +529,7 @@ watch(() => props.lrcSrc, async (newSrc) => {
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Failed to load lyrics:', error)
|
debugLyrics('歌词加载失败', error)
|
||||||
parsedLyrics.value = []
|
parsedLyrics.value = []
|
||||||
} finally {
|
} finally {
|
||||||
loading.value = false
|
loading.value = false
|
||||||
|
|
|
@ -4,6 +4,7 @@ import { ref } from 'vue'
|
||||||
import { usePlayQueueStore } from '../stores/usePlayQueueStore'
|
import { usePlayQueueStore } from '../stores/usePlayQueueStore'
|
||||||
import { useToast } from 'vue-toast-notification'
|
import { useToast } from 'vue-toast-notification'
|
||||||
import { useFavourites } from '../stores/useFavourites'
|
import { useFavourites } from '../stores/useFavourites'
|
||||||
|
import { debugUI } from '../utils/debug'
|
||||||
|
|
||||||
import QueueAddIcon from '../assets/icons/queueadd.vue'
|
import QueueAddIcon from '../assets/icons/queueadd.vue'
|
||||||
import StarEmptyIcon from '../assets/icons/starempty.vue'
|
import StarEmptyIcon from '../assets/icons/starempty.vue'
|
||||||
|
@ -23,7 +24,7 @@ const toast = useToast()
|
||||||
const favourites = useFavourites()
|
const favourites = useFavourites()
|
||||||
|
|
||||||
function appendToQueue() {
|
function appendToQueue() {
|
||||||
console.log('aaa')
|
debugUI('添加歌曲到队列')
|
||||||
let queue = playQueueStore.list
|
let queue = playQueueStore.list
|
||||||
queue.push({
|
queue.push({
|
||||||
song: props.track,
|
song: props.track,
|
||||||
|
@ -41,7 +42,7 @@ function appendToQueue() {
|
||||||
<template>
|
<template>
|
||||||
<button
|
<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"
|
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>
|
<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 { usePlayQueueStore } from '../stores/usePlayQueueStore'
|
||||||
import { artistsOrganize } from '../utils'
|
import { artistsOrganize } from '../utils'
|
||||||
import TrackItem from '../components/TrackItem.vue'
|
import TrackItem from '../components/TrackItem.vue'
|
||||||
|
import { debugUI } from '../utils/debug'
|
||||||
|
|
||||||
import PlayIcon from '../assets/icons/play.vue'
|
import PlayIcon from '../assets/icons/play.vue'
|
||||||
import StarEmptyIcon from '../assets/icons/starempty.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)
|
res.songs[parseInt(track)] = await apis.getSong(res.songs[parseInt(track)].cid)
|
||||||
}
|
}
|
||||||
album.value = res
|
album.value = res
|
||||||
console.log(res)
|
debugUI('专辑详情加载完成', res)
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log(error)
|
debugUI('专辑详情加载失败', error)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -38,7 +39,7 @@ function playTheAlbum(from: number = 0) {
|
||||||
|
|
||||||
let newPlayQueue = []
|
let newPlayQueue = []
|
||||||
for (const track of album.value?.songs ?? []) {
|
for (const track of album.value?.songs ?? []) {
|
||||||
console.log(track)
|
debugUI('添加歌曲到播放队列', track)
|
||||||
newPlayQueue.push({
|
newPlayQueue.push({
|
||||||
song: track,
|
song: track,
|
||||||
album: album.value
|
album: album.value
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
import StarFilledIcon from '../assets/icons/starfilled.vue'
|
import StarFilledIcon from '../assets/icons/starfilled.vue'
|
||||||
import PlayIcon from '../assets/icons/play.vue'
|
import PlayIcon from '../assets/icons/play.vue'
|
||||||
import ShuffleIcon from '../assets/icons/shuffle.vue'
|
import ShuffleIcon from '../assets/icons/shuffle.vue'
|
||||||
|
import { debugUI } from '../utils/debug'
|
||||||
|
|
||||||
import { useFavourites } from '../stores/useFavourites'
|
import { useFavourites } from '../stores/useFavourites'
|
||||||
import { ref } from 'vue'
|
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">
|
<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"
|
<PlayListItem v-for="(item, index) in favourites.favourites.slice().reverse()" :key="item.song.cid" :item="item"
|
||||||
:index="index" @play="(playFrom) => {
|
:index="index" @play="(playFrom) => {
|
||||||
console.log('play from', playFrom)
|
debugUI('从收藏库播放', playFrom)
|
||||||
playTheList('favourites', playFrom)
|
playTheList('favourites', playFrom)
|
||||||
}" />
|
}" />
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -8,6 +8,7 @@ import { useTemplateRef } from 'vue'
|
||||||
import { ref, watch } from 'vue'
|
import { ref, watch } from 'vue'
|
||||||
import { usePreferences } from '../stores/usePreferences'
|
import { usePreferences } from '../stores/usePreferences'
|
||||||
import { useFavourites } from '../stores/useFavourites'
|
import { useFavourites } from '../stores/useFavourites'
|
||||||
|
import { debugPlayroom } from '../utils/debug'
|
||||||
|
|
||||||
import ScrollingLyrics from '../components/ScrollingLyrics.vue'
|
import ScrollingLyrics from '../components/ScrollingLyrics.vue'
|
||||||
|
|
||||||
|
@ -132,14 +133,14 @@ function toggleVolumeControl() {
|
||||||
|
|
||||||
function createVolumeDraggable() {
|
function createVolumeDraggable() {
|
||||||
if (!volumeSliderThumb.value || !volumeSliderContainer.value) {
|
if (!volumeSliderThumb.value || !volumeSliderContainer.value) {
|
||||||
console.warn('Volume slider elements not found')
|
debugPlayroom('音量滑块元素未找到')
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// 确保容器有宽度
|
// 确保容器有宽度
|
||||||
const containerWidth = volumeSliderContainer.value.clientWidth
|
const containerWidth = volumeSliderContainer.value.clientWidth
|
||||||
if (containerWidth === 0) {
|
if (containerWidth === 0) {
|
||||||
console.warn('Volume slider container has no width')
|
debugPlayroom('音量滑块容器宽度为0')
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -164,7 +165,7 @@ function createVolumeDraggable() {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
console.log('Volume draggable created successfully')
|
debugPlayroom('音量滑块拖拽创建成功')
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateAudioVolume() {
|
function updateAudioVolume() {
|
||||||
|
@ -187,7 +188,7 @@ function formatDetector() {
|
||||||
|
|
||||||
function playNext() {
|
function playNext() {
|
||||||
if (playQueueStore.currentIndex === playQueueStore.list.length - 1) {
|
if (playQueueStore.currentIndex === playQueueStore.list.length - 1) {
|
||||||
console.log("at the bottom, pause")
|
debugPlayroom('到达播放队列末尾,暂停')
|
||||||
playQueueStore.currentIndex = 0
|
playQueueStore.currentIndex = 0
|
||||||
playQueueStore.isPlaying = false
|
playQueueStore.isPlaying = false
|
||||||
} else {
|
} else {
|
||||||
|
@ -305,7 +306,7 @@ function makePlayQueueListDismiss() {
|
||||||
}
|
}
|
||||||
|
|
||||||
function getCurrentTrack() {
|
function getCurrentTrack() {
|
||||||
console.log(playQueueStore.queue)
|
debugPlayroom('获取当前播放轨道', playQueueStore.queue)
|
||||||
if (playQueueStore.queue.length === 0) {
|
if (playQueueStore.queue.length === 0) {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
@ -438,10 +439,10 @@ function setupPageFocusHandlers() {
|
||||||
handleVisibilityChange = () => {
|
handleVisibilityChange = () => {
|
||||||
if (document.hidden) {
|
if (document.hidden) {
|
||||||
// 页面失去焦点时,暂停所有动画
|
// 页面失去焦点时,暂停所有动画
|
||||||
console.log('[Playroom] 页面失去焦点,暂停动画')
|
debugPlayroom('页面失去焦点,暂停动画')
|
||||||
} else {
|
} else {
|
||||||
// 页面重新获得焦点时,重新同步状态
|
// 页面重新获得焦点时,重新同步状态
|
||||||
console.log('[Playroom] 页面重新获得焦点,同步状态')
|
debugPlayroom('页面重新获得焦点,同步状态')
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
resyncLyricsState()
|
resyncLyricsState()
|
||||||
})
|
})
|
||||||
|
@ -449,7 +450,7 @@ function setupPageFocusHandlers() {
|
||||||
}
|
}
|
||||||
|
|
||||||
handlePageFocus = () => {
|
handlePageFocus = () => {
|
||||||
console.log('[Playroom] 窗口获得焦点,同步状态')
|
debugPlayroom('窗口获得焦点,同步状态')
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
resyncLyricsState()
|
resyncLyricsState()
|
||||||
})
|
})
|
||||||
|
@ -465,7 +466,7 @@ function resyncLyricsState() {
|
||||||
const currentTrack = getCurrentTrack()
|
const currentTrack = getCurrentTrack()
|
||||||
if (!currentTrack) { return }
|
if (!currentTrack) { return }
|
||||||
|
|
||||||
console.log('[Playroom] 重新同步歌词状态')
|
debugPlayroom('重新同步歌词状态')
|
||||||
|
|
||||||
// 重置动画状态
|
// 重置动画状态
|
||||||
if (controllerRef.value) {
|
if (controllerRef.value) {
|
||||||
|
@ -488,7 +489,7 @@ function resyncLyricsState() {
|
||||||
const shouldShowLyrics = preferences.presentLyrics && currentTrack.song.lyricUrl ? true : false
|
const shouldShowLyrics = preferences.presentLyrics && currentTrack.song.lyricUrl ? true : false
|
||||||
|
|
||||||
if (shouldShowLyrics !== presentLyrics.value) {
|
if (shouldShowLyrics !== presentLyrics.value) {
|
||||||
console.log(`[Playroom] 歌词状态不一致,重新设置: ${presentLyrics.value} -> ${shouldShowLyrics}`)
|
debugPlayroom(`歌词状态不一致,重新设置: ${presentLyrics.value} -> ${shouldShowLyrics}`)
|
||||||
|
|
||||||
// 直接设置状态,不触发动画
|
// 直接设置状态,不触发动画
|
||||||
presentLyrics.value = shouldShowLyrics
|
presentLyrics.value = shouldShowLyrics
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import { defineStore } from "pinia"
|
import { defineStore } from "pinia"
|
||||||
import { ref, watch, computed } from "vue"
|
import { ref, watch, computed } from "vue"
|
||||||
|
import { debugStore } from '../utils/debug'
|
||||||
|
|
||||||
// 声明全局类型
|
// 声明全局类型
|
||||||
declare global {
|
declare global {
|
||||||
|
@ -293,7 +294,7 @@ export const useFavourites = defineStore('favourites', () => {
|
||||||
await saveFavourites()
|
await saveFavourites()
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
// 保存失败时可以考虑回滚或错误处理
|
// 保存失败时可以考虑回滚或错误处理
|
||||||
console.error('Failed to save updated song:', error)
|
debugStore('更新歌曲信息保存失败', error)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import { defineStore } from "pinia"
|
import { defineStore } from "pinia"
|
||||||
import { ref } from "vue"
|
import { ref } from "vue"
|
||||||
|
import { debugStore } from '../utils/debug'
|
||||||
|
|
||||||
// 声明全局类型
|
// 声明全局类型
|
||||||
declare global {
|
declare global {
|
||||||
|
@ -153,7 +154,7 @@ export const useUpdatePopup = defineStore('updatePopup', () => {
|
||||||
|
|
||||||
return false
|
return false
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('检查更新弹窗状态失败:', error)
|
debugStore('检查更新弹窗状态失败', error)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -166,7 +167,7 @@ export const useUpdatePopup = defineStore('updatePopup', () => {
|
||||||
await setStoredValue('lastUpdatePopupVersion', currentVersion)
|
await setStoredValue('lastUpdatePopupVersion', currentVersion)
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('标记更新弹窗已显示失败:', error)
|
debugStore('标记更新弹窗已显示失败', error)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -182,7 +183,7 @@ export const useUpdatePopup = defineStore('updatePopup', () => {
|
||||||
detectAvailableAPIs()
|
detectAvailableAPIs()
|
||||||
isLoaded.value = true
|
isLoaded.value = true
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('初始化更新弹窗 store 失败:', error)
|
debugStore('初始化更新弹窗 store 失败', error)
|
||||||
isLoaded.value = true
|
isLoaded.value = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// utils/audioVisualizer.ts - 平衡频谱版本
|
// utils/audioVisualizer.ts - 平衡频谱版本
|
||||||
import { ref, onUnmounted, Ref } from 'vue'
|
import { ref, onUnmounted, Ref } from 'vue'
|
||||||
|
import { debugVisualizer } from './debug'
|
||||||
|
|
||||||
interface AudioVisualizerOptions {
|
interface AudioVisualizerOptions {
|
||||||
sensitivity?: number
|
sensitivity?: number
|
||||||
|
@ -27,7 +28,7 @@ export function audioVisualizer(options: AudioVisualizerOptions = {}) {
|
||||||
minHeight = 0 // 最小高度百分比
|
minHeight = 0 // 最小高度百分比
|
||||||
} = options
|
} = options
|
||||||
|
|
||||||
console.log('[AudioVisualizer] 初始化平衡频谱,选项:', options)
|
debugVisualizer('初始化平衡频谱', options)
|
||||||
|
|
||||||
// 导出的竖杠高度值数组 (0-100)
|
// 导出的竖杠高度值数组 (0-100)
|
||||||
const barHeights: Ref<number[]> = ref(Array(barCount).fill(0))
|
const barHeights: Ref<number[]> = ref(Array(barCount).fill(0))
|
||||||
|
@ -46,7 +47,7 @@ export function audioVisualizer(options: AudioVisualizerOptions = {}) {
|
||||||
// 调试日志
|
// 调试日志
|
||||||
function log(...args: any[]) {
|
function log(...args: any[]) {
|
||||||
if (debug) {
|
if (debug) {
|
||||||
console.log('[AudioVisualizer]', ...args)
|
debugVisualizer(...args)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
/**
|
/**
|
||||||
* 浏览器检测工具
|
* 浏览器检测工具
|
||||||
*/
|
*/
|
||||||
|
import { debugUtils } from './debug'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 检测是否为 Safari 浏览器
|
* 检测是否为 Safari 浏览器
|
||||||
|
@ -39,7 +40,7 @@ export function supportsWebAudioVisualization(): boolean {
|
||||||
// Safari 在某些情况下对 AudioContext 的支持有限制
|
// Safari 在某些情况下对 AudioContext 的支持有限制
|
||||||
// 特别是在处理跨域音频资源时
|
// 特别是在处理跨域音频资源时
|
||||||
if (isSafari()) {
|
if (isSafari()) {
|
||||||
console.log('[BrowserDetection] Safari detected, audio visualization disabled')
|
debugUtils('Safari浏览器检测,音频可视化禁用')
|
||||||
return false
|
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 axios from 'axios'
|
||||||
import apis from '../apis'
|
import apis from '../apis'
|
||||||
|
import { debugResource } from './debug'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 检查歌曲资源 URL 是否可用,如果不可用则刷新
|
* 检查歌曲资源 URL 是否可用,如果不可用则刷新
|
||||||
|
@ -12,7 +13,7 @@ export const checkAndRefreshSongResource = async (
|
||||||
updateCallback?: (updatedSong: Song) => void
|
updateCallback?: (updatedSong: Song) => void
|
||||||
): Promise<Song> => {
|
): Promise<Song> => {
|
||||||
if (!song.sourceUrl) {
|
if (!song.sourceUrl) {
|
||||||
console.warn('[ResourceChecker] 歌曲没有 sourceUrl:', song.name)
|
debugResource('歌曲没有 sourceUrl', song.name)
|
||||||
return song
|
return song
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,15 +32,15 @@ export const checkAndRefreshSongResource = async (
|
||||||
})
|
})
|
||||||
|
|
||||||
// 资源可用,返回原始歌曲
|
// 资源可用,返回原始歌曲
|
||||||
console.log('[ResourceChecker] 资源可用:', song.name)
|
debugResource('资源可用', song.name)
|
||||||
return song
|
return song
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
// 资源不可用,刷新歌曲信息
|
// 资源不可用,刷新歌曲信息
|
||||||
console.log('[ResourceChecker] 资源不可用,正在刷新:', song.name, error)
|
debugResource('资源不可用,正在刷新', song.name, error)
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const updatedSong = await apis.getSong(song.cid)
|
const updatedSong = await apis.getSong(song.cid)
|
||||||
console.log('[ResourceChecker] 歌曲信息已刷新:', updatedSong.name)
|
debugResource('歌曲信息已刷新', updatedSong.name)
|
||||||
|
|
||||||
// 调用更新回调(如果提供)
|
// 调用更新回调(如果提供)
|
||||||
if (updateCallback) {
|
if (updateCallback) {
|
||||||
|
@ -48,7 +49,7 @@ export const checkAndRefreshSongResource = async (
|
||||||
|
|
||||||
return updatedSong
|
return updatedSong
|
||||||
} catch (refreshError) {
|
} catch (refreshError) {
|
||||||
console.error('[ResourceChecker] 刷新歌曲信息失败:', refreshError)
|
debugResource('刷新歌曲信息失败', refreshError)
|
||||||
// 刷新失败,返回原始歌曲
|
// 刷新失败,返回原始歌曲
|
||||||
return song
|
return song
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user