mirror of
https://github.com/Jerryplusy/rc-plugin.git
synced 2025-10-14 16:19:18 +00:00
🎈 pref: 优化触发词
This commit is contained in:
parent
69d68c6f98
commit
e534f58b56
@ -17,7 +17,7 @@ export class songRequest extends plugin {
|
|||||||
priority: 300,
|
priority: 300,
|
||||||
rule: [
|
rule: [
|
||||||
{
|
{
|
||||||
reg: '^点歌|#听[1-9][0-9]|#听[0-9]*$',
|
reg: '^点歌|#?听[1-9][0-9]|#?听[0-9]*$',
|
||||||
fnc: 'pickSong'
|
fnc: 'pickSong'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -52,6 +52,90 @@ export class songRequest extends plugin {
|
|||||||
return (await redisGetKey(REDIS_YUNZAI_ISOVERSEA)).os;
|
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) {
|
async pickSong(e) {
|
||||||
const isOversea = await this.isOverseasServer();
|
const isOversea = await this.isOverseasServer();
|
||||||
let autoSelectNeteaseApi
|
let autoSelectNeteaseApi
|
||||||
@ -63,9 +147,7 @@ export class songRequest extends plugin {
|
|||||||
autoSelectNeteaseApi = isOversea ? NETEASE_SONG_DOWNLOAD : NETEASE_API_CN;
|
autoSelectNeteaseApi = isOversea ? NETEASE_SONG_DOWNLOAD : NETEASE_API_CN;
|
||||||
}
|
}
|
||||||
let songInfo = []
|
let songInfo = []
|
||||||
|
|
||||||
// 获取搜索歌曲列表信息
|
// 获取搜索歌曲列表信息
|
||||||
|
|
||||||
let searchUrl = autoSelectNeteaseApi + '/search?keywords={}&limit=10' //搜索API
|
let searchUrl = autoSelectNeteaseApi + '/search?keywords={}&limit=10' //搜索API
|
||||||
let detailUrl = autoSelectNeteaseApi + "/song/detail?ids={}" //歌曲详情API
|
let detailUrl = autoSelectNeteaseApi + "/song/detail?ids={}" //歌曲详情API
|
||||||
if (e.msg.replace(/\s+/g, "").match(/点歌(.+)/)) {
|
if (e.msg.replace(/\s+/g, "").match(/点歌(.+)/)) {
|
||||||
@ -105,8 +187,8 @@ export class songRequest extends plugin {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
} else if (await redisGetKey(REDIS_YUNZAI_SONGINFO) != []) {
|
} else if (await redisGetKey(REDIS_YUNZAI_SONGINFO) != []) {
|
||||||
if (e.msg.match(/#听(\d+)/)) {
|
if (e.msg.match(/听(\d+)/)) {
|
||||||
const pickNumber = e.msg.match(/#听(\d+)/)[1] - 1
|
const pickNumber = e.msg.match(/听(\d+)/)[1] - 1
|
||||||
let songInfo = await redisGetKey(REDIS_YUNZAI_SONGINFO)
|
let songInfo = await redisGetKey(REDIS_YUNZAI_SONGINFO)
|
||||||
const AUTO_NETEASE_SONG_DOWNLOAD = autoSelectNeteaseApi + "/song/url/v1?id={}&level=" + this.neteaseCloudAudioQuality;
|
const AUTO_NETEASE_SONG_DOWNLOAD = autoSelectNeteaseApi + "/song/url/v1?id={}&level=" + this.neteaseCloudAudioQuality;
|
||||||
const pickSongUrl = AUTO_NETEASE_SONG_DOWNLOAD.replace("{}", songInfo[pickNumber].id)
|
const pickSongUrl = AUTO_NETEASE_SONG_DOWNLOAD.replace("{}", songInfo[pickNumber].id)
|
||||||
@ -127,90 +209,12 @@ export class songRequest extends plugin {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
// // 请求netease数据
|
// // 请求netease数据
|
||||||
axios.get(pickSongUrl, {
|
this.neteasePlay(pickSongUrl, songInfo, pickNumber, isCkExpired)
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取当前发送人/群的下载路径
|
* 获取当前发送人/群的下载路径
|
||||||
|
Loading…
x
Reference in New Issue
Block a user