From e534f58b56ffc8bed3bf90d474ccd12f312440db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=8B=E5=88=80=E9=B1=BC?= <9903082+qdyovo@user.noreply.gitee.com> Date: Mon, 4 Nov 2024 09:15:51 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=88=20pref:=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E8=A7=A6=E5=8F=91=E8=AF=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/songRequest.js | 174 ++++++++++++++++++++++---------------------- 1 file changed, 89 insertions(+), 85 deletions(-) diff --git a/apps/songRequest.js b/apps/songRequest.js index a4f058a..8c9a664 100644 --- a/apps/songRequest.js +++ b/apps/songRequest.js @@ -17,7 +17,7 @@ export class songRequest extends plugin { priority: 300, rule: [ { - reg: '^点歌|#听[1-9][0-9]|#听[0-9]*$', + reg: '^点歌|#?听[1-9][0-9]|#?听[0-9]*$', fnc: 'pickSong' }, { @@ -52,6 +52,90 @@ export class songRequest extends plugin { return (await redisGetKey(REDIS_YUNZAI_ISOVERSEA)).os; } + // 网易云音乐下载策略 + neteasePlay(pickSongUrl, songInfo, pickNumber = 0, isCkExpired){ + axios.get(pickSongUrl, { + headers: { + "User-Agent": COMMON_USER_AGENT, + "Cookie": this.neteaseCookie + }, + }).then(async resp => { + // 国内解决方案,替换API后这里也需要修改 + + // 英转中字典匹配 + const translationDict = { + 'standard': '标准', + 'higher': '较高', + 'exhigh': '极高', + 'lossless': '无损', + 'hires': 'Hi-Res', + 'jyeffect': '高清环绕声', + 'sky': '沉浸环绕声', + 'dolby': '杜比全景声', + 'jymaster': '超清母带' + }; + + // 英转中 + function translateToChinese(word) { + return translationDict[word] || word; // 如果找不到对应翻译,返回原词 + } + + // 字节转MB + function bytesToMB(sizeInBytes) { + const sizeInMB = sizeInBytes / (1024 * 1024); // 1 MB = 1024 * 1024 bytes + return sizeInMB.toFixed(2); // 保留两位小数 + } + logger.info('下载歌曲详情-----------', resp.data.data) + let url = await resp.data.data?.[0]?.url || null; + const AudioLevel = translateToChinese(resp.data.data?.[0]?.level) + const AudioSize = bytesToMB(resp.data.data?.[0]?.size) + // 获取歌曲信息 + let title = songInfo[pickNumber].songName + '-' + songInfo[pickNumber].singerName + // 一般这个情况是VIP歌曲 (如果没有url或者是国内,公用接口暂时不可用,必须自建并且ck可用状态才能进行高质量解析) + if (!isCkExpired || !this.useLocalNeteaseAPI || url == null) { + url = await this.musicTempApi(e, title, "网易云音乐"); + } else { + // 拥有ck,并且有效,直接进行解析 + let audioInfo = AudioLevel; + if (AudioLevel == '杜比全景声') { + audioInfo += '\n(杜比下载文件为MP4,编码格式为AC-4,需要设备支持才可播放)'; + } + e.reply([segment.image(songInfo[pickNumber].cover), `${this.identifyPrefix}识别:网易云音乐,${title}\n当前下载音质: ${audioInfo}\n预估大小: ${AudioSize}MB`]); + } + // 动态判断后缀名 + let musicExt = resp.data.data?.[0]?.type + // 下载音乐 + downloadAudio(url, this.getCurDownloadPath(e), title, 'follow', musicExt).then(async path => { + // 发送语音 + if (musicExt != 'mp4') { + await e.reply(segment.record(path)); + } + // 上传群文件 + await this.uploadGroupFile(e, path); + // 删除文件 + await checkAndRemoveFile(path); + }).catch(err => { + logger.error(`下载音乐失败,错误信息为: ${err}`); + }); + }); + } + + async musicTempApi(e, title, musicType) { + let musicReqApi = NETEASE_TEMP_API; + // 临时接口,title经过变换后搜索到的音乐质量提升 + const vipMusicData = await axios.get(musicReqApi.replace("{}", title.replace("-", " ")), { + headers: { + "User-Agent": COMMON_USER_AGENT, + }, + }); + const messageTitle = title + "\nR插件检测到当前为VIP音乐,正在转换..."; + // ??后的内容是适配`QQ_MUSIC_TEMP_API`、最后是汽水 + const url = vipMusicData.data?.music_url ?? vipMusicData.data?.data?.music_url ?? vipMusicData.data?.music; + const cover = vipMusicData.data?.cover ?? vipMusicData.data?.data?.cover ?? vipMusicData.data?.cover; + await e.reply([segment.image(cover), `${this.identifyPrefix}识别:${musicType},${messageTitle}`]); + return url; + } + async pickSong(e) { const isOversea = await this.isOverseasServer(); let autoSelectNeteaseApi @@ -63,9 +147,7 @@ export class songRequest extends plugin { autoSelectNeteaseApi = isOversea ? NETEASE_SONG_DOWNLOAD : NETEASE_API_CN; } let songInfo = [] - // 获取搜索歌曲列表信息 - let searchUrl = autoSelectNeteaseApi + '/search?keywords={}&limit=10' //搜索API let detailUrl = autoSelectNeteaseApi + "/song/detail?ids={}" //歌曲详情API if (e.msg.replace(/\s+/g, "").match(/点歌(.+)/)) { @@ -105,8 +187,8 @@ export class songRequest extends plugin { } }) } else if (await redisGetKey(REDIS_YUNZAI_SONGINFO) != []) { - if (e.msg.match(/#听(\d+)/)) { - const pickNumber = e.msg.match(/#听(\d+)/)[1] - 1 + if (e.msg.match(/听(\d+)/)) { + const pickNumber = e.msg.match(/听(\d+)/)[1] - 1 let songInfo = await redisGetKey(REDIS_YUNZAI_SONGINFO) const AUTO_NETEASE_SONG_DOWNLOAD = autoSelectNeteaseApi + "/song/url/v1?id={}&level=" + this.neteaseCloudAudioQuality; const pickSongUrl = AUTO_NETEASE_SONG_DOWNLOAD.replace("{}", songInfo[pickNumber].id) @@ -127,91 +209,13 @@ export class songRequest extends plugin { } }) // // 请求netease数据 - axios.get(pickSongUrl, { - headers: { - "User-Agent": COMMON_USER_AGENT, - "Cookie": this.neteaseCookie - }, - }).then(async resp => { - // 国内解决方案,替换API后这里也需要修改 - - // 英转中字典匹配 - const translationDict = { - 'standard': '标准', - 'higher': '较高', - 'exhigh': '极高', - 'lossless': '无损', - 'hires': 'Hi-Res', - 'jyeffect': '高清环绕声', - 'sky': '沉浸环绕声', - 'dolby': '杜比全景声', - 'jymaster': '超清母带' - }; - - // 英转中 - function translateToChinese(word) { - return translationDict[word] || word; // 如果找不到对应翻译,返回原词 - } - - // 字节转MB - function bytesToMB(sizeInBytes) { - const sizeInMB = sizeInBytes / (1024 * 1024); // 1 MB = 1024 * 1024 bytes - return sizeInMB.toFixed(2); // 保留两位小数 - } - logger.info('下载歌曲详情-----------', resp.data.data) - let url = await resp.data.data?.[0]?.url || null; - const AudioLevel = translateToChinese(resp.data.data?.[0]?.level) - const AudioSize = bytesToMB(resp.data.data?.[0]?.size) - // 获取歌曲信息 - let title = songInfo[pickNumber].songName + '-' + songInfo[pickNumber].singerName - // 一般这个情况是VIP歌曲 (如果没有url或者是国内,公用接口暂时不可用,必须自建并且ck可用状态才能进行高质量解析) - if (!isCkExpired || !this.useLocalNeteaseAPI || url == null) { - url = await this.musicTempApi(e, title, "网易云音乐"); - } else { - // 拥有ck,并且有效,直接进行解析 - let audioInfo = AudioLevel; - if (AudioLevel == '杜比全景声') { - audioInfo += '\n(杜比下载文件为MP4,编码格式为AC-4,需要设备支持才可播放)'; - } - e.reply([segment.image(songInfo[pickNumber].cover), `${this.identifyPrefix}识别:网易云音乐,${title}\n当前下载音质: ${audioInfo}\n预估大小: ${AudioSize}MB`]); - } - // 动态判断后缀名 - let musicExt = resp.data.data?.[0]?.type - // 下载音乐 - downloadAudio(url, this.getCurDownloadPath(e), title, 'follow', musicExt).then(async path => { - // 发送语音 - if (musicExt != 'mp4') { - await e.reply(segment.record(path)); - } - // 上传群文件 - await this.uploadGroupFile(e, path); - // 删除文件 - await checkAndRemoveFile(path); - }).catch(err => { - logger.error(`下载音乐失败,错误信息为: ${err}`); - }); - }); + this.neteasePlay(pickSongUrl, songInfo, pickNumber, isCkExpired) } } } - async musicTempApi(e, title, musicType) { - let musicReqApi = NETEASE_TEMP_API; - // 临时接口,title经过变换后搜索到的音乐质量提升 - const vipMusicData = await axios.get(musicReqApi.replace("{}", title.replace("-", " ")), { - headers: { - "User-Agent": COMMON_USER_AGENT, - }, - }); - const messageTitle = title + "\nR插件检测到当前为VIP音乐,正在转换..."; - // ??后的内容是适配`QQ_MUSIC_TEMP_API`、最后是汽水 - const url = vipMusicData.data?.music_url ?? vipMusicData.data?.data?.music_url ?? vipMusicData.data?.music; - const cover = vipMusicData.data?.cover ?? vipMusicData.data?.data?.cover ?? vipMusicData.data?.cover; - await e.reply([segment.image(cover), `${this.identifyPrefix}识别:${musicType},${messageTitle}`]); - return url; - } - + /** * 获取当前发送人/群的下载路径 * @param e Yunzai 机器人事件