diff --git a/apps/music.js b/apps/music.js index 07abd80..5256aa4 100644 --- a/apps/music.js +++ b/apps/music.js @@ -133,7 +133,8 @@ export class CrystelfMusic extends plugin { if (type === 'voice' || quality === 1) { await Group.sendGroupRecord(e, e.group_id, `file://${audioFile}`, adapter); } else { - const filename = `${song.displayTitle} - ${song.displayArtist}.${(this.getFileExtension())}`; + const extension = await this.getFileExtension(); + const filename = `${song.displayTitle} - ${song.displayArtist}.${extension}`; await Group.sendGroupFile(e, e.group_id, `file://${audioFile}`, filename, adapter); } musicSearch.clearUserSelection(e.group_id, e.user_id); @@ -150,9 +151,9 @@ export class CrystelfMusic extends plugin { */ async getFileExtension() { const musicConfig =await ConfigControl.get('music'); - if(musicConfig.quality === 3){ - return 'flac' - } - return 'mp3' + //if(musicConfig.quality === '3'){ + //return 'flac' + //} + return 'flac' } } \ No newline at end of file diff --git a/lib/music/audioProcessor.js b/lib/music/audioProcessor.js index 0835b0d..a33a76a 100644 --- a/lib/music/audioProcessor.js +++ b/lib/music/audioProcessor.js @@ -148,6 +148,10 @@ class AudioProcessor { }; } + const startTime = Date.now(); + let lastProgressTime = startTime; + let lastProgressPercent = 0; + // download the file const response = await axios({ url, @@ -156,9 +160,31 @@ class AudioProcessor { timeout: 30000, headers: { 'User-Agent': 'crystelf-music/1.0' + }, + onDownloadProgress: (progressEvent) => { + const percentCompleted = Math.round( + (progressEvent.loaded * 100) / (progressEvent.total || 1) + ); + + const currentTime = Date.now(); + if (percentCompleted - lastProgressPercent >= 10 || + currentTime - lastProgressTime >= 5000) { + const loadedSize = this.formatFileSize(progressEvent.loaded); + const totalSize = this.formatFileSize(progressEvent.total || 0); + const speed = this.formatFileSize( + (progressEvent.loaded * 1000) / (currentTime - startTime) + ); + + logger.info( + `[crystelf-music] 下载进度: ${percentCompleted}% (${loadedSize}/${totalSize}) ` + + `速度: ${speed}/s - ${songInfo.displayTitle}` + ); + lastProgressPercent = percentCompleted; + lastProgressTime = currentTime; + } } }); - + const writer = fs.createWriteStream(filePath); response.data.pipe(writer); @@ -168,7 +194,13 @@ class AudioProcessor { }); const stats = fs.statSync(filePath); - logger.info(`[crystelf-music] 音频下载完成: ${filename} (${this.formatFileSize(stats.size)})`); + const downloadTime = (Date.now() - startTime) / 1000; + const avgSpeed = this.formatFileSize(stats.size / downloadTime); + + logger.info( + `[crystelf-music] 音频下载完成: ${filename} (${this.formatFileSize(stats.size)}) ` + + `耗时: ${downloadTime.toFixed(1)}秒 平均速度: ${avgSpeed}/s` + ); return { success: true, diff --git a/lib/music/musicApi.js b/lib/music/musicApi.js index 2073e21..a277ea9 100644 --- a/lib/music/musicApi.js +++ b/lib/music/musicApi.js @@ -105,7 +105,6 @@ class MusicApi { const songs = searchResult?.song || []; songs.sort((a, b) => b.score - a.score); const topSongs = songs.slice(0, count); - logger.info(topSongs); return this.enhanceSearchResults(topSongs, query); } catch (error) { logger.error('[crystelf-music] 搜索失败:', error.message);