From df2fe9291676ae48c3c415d37fc6ad48a476d04a Mon Sep 17 00:00:00 2001 From: zhiyu <542716863@qq.com> Date: Sat, 11 May 2024 11:49:42 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat:=20=E6=96=B0=E5=A2=9EAM?= =?UTF-8?q?=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 解析需要阅读文档 --- README.md | 51 +++++++++++------- apps/tools.js | 83 +++++++++++++++++++++++++++++- config/help.yaml | 8 +-- config/version.yaml | 7 ++- resources/img/icon/applemusic.png | Bin 0 -> 8418 bytes resources/img/icon/bilimusic.png | Bin 3469 -> 0 bytes 6 files changed, 120 insertions(+), 29 deletions(-) create mode 100644 resources/img/icon/applemusic.png delete mode 100644 resources/img/icon/bilimusic.png diff --git a/README.md b/README.md index 72a058d..0db0527 100644 --- a/README.md +++ b/README.md @@ -79,6 +79,16 @@ chmod a+rx ~/.local/bin/yt-dlp sudo pacman -Syu yt-dlp ``` +`AM解析`需要使用两个依赖`freyr`、`atomicparsley`,现在只以Debian系统为例: + +```shell +npm install -g freyr +# 或者你有yarn的话可以使用 +yarn global add freyr +# 接着安装它的依赖 +apt-get install atomicparsley +``` + 4. 【可选】小程序解析适配了: * 喵崽:[Yoimiya / Miao-Yunzai](https://gitee.com/yoimiya-kokomi/Miao-Yunzai) * TRSS:[时雨◎星空 / Yunzai](https://gitee.com/TimeRainStarSky/Yunzai) @@ -102,8 +112,8 @@ sudo pacman -Syu yt-dlp ```shell # 删除当前的R插件 rm -rf ./plugins/rconsole-plugin/ -# 克隆指定版本的R插件 -git clone -b 1.5.1 https://gitee.com/kyrzy0416/rconsole-plugin.git +# 克隆指定版本的R插件稳定版本 +git clone -b 1.6.7-lts https://gitee.com/kyrzy0416/rconsole-plugin.git ``` ## 🐤 Q&A @@ -152,25 +162,25 @@ git clone -b 1.5.1 https://gitee.com/kyrzy0416/rconsole-plugin.git 1. 配置文件,将拉格朗日的配置文件`appsettings.json`中`Implementations`加入一个正向连接`ForwardWebSocket` ,如(最好是9091,这样就不用改tools配置文件): -```json +```yaml "Implementations": [ -{ -"Type": "ReverseWebSocket", -"Host": "127.0.0.1", -"Port": 9090, -"Suffix": "/onebot/v11/", -"ReconnectInterval": 5000, -"HeartBeatInterval": 5000, -"AccessToken": "" -}, -{ -"Type": "ForwardWebSocket", -"Host": "127.0.0.1", -"Port": 9091, -"HeartBeatInterval": 5000, -"HeartBeatEnable": true, -"AccessToken": "" -} + { + "Type": "ReverseWebSocket", + "Host": "127.0.0.1", + "Port": 9090, + "Suffix": "/onebot/v11/", + "ReconnectInterval": 5000, + "HeartBeatInterval": 5000, + "AccessToken": "" + }, + { + "Type": "ForwardWebSocket", + "Host": "127.0.0.1", + "Port": 9091, + "HeartBeatInterval": 5000, + "HeartBeatEnable": true, + "AccessToken": "" + } ] ``` @@ -233,6 +243,7 @@ git clone -b 1.5.1 https://gitee.com/kyrzy0416/rconsole-plugin.git 🌸 感谢以下框架的开源: - [yt-dlp:A youtube-dl fork with additional features and fixes](https://github.com/yt-dlp/yt-dlp) +- [freyr-js](https://github.com/miraclx/freyr-js) ## ☕ 请我喝一杯瑞幸咖啡 如果你觉得插件能帮助到你增进好友关系,那么你可以在有条件的情况下[请我喝一杯瑞幸咖啡](https://afdian.net/a/zhiyu1998),这是我开源这个插件的最大动力! diff --git a/apps/tools.js b/apps/tools.js index dcd5c48..a6b8d57 100644 --- a/apps/tools.js +++ b/apps/tools.js @@ -8,7 +8,7 @@ import _ from "lodash"; import tunnel from "tunnel"; import HttpProxyAgent from "https-proxy-agent"; import { exec, execSync } from "child_process"; -import { checkAndRemoveFile, mkdirIfNotExists } from "../utils/file.js"; +import { checkAndRemoveFile, deleteFolderRecursive, mkdirIfNotExists } from "../utils/file.js"; import { downloadBFile, getBiliAudio, @@ -67,8 +67,14 @@ import { getDS } from "../utils/mihoyo.js"; import GeneralLinkAdapter from "../utils/general-link-adapter.js"; import { mid2id } from "../utils/weibo.js"; import { LagrangeAdapter } from "../utils/lagrange-adapter.js"; +import path from "path"; export class tools extends plugin { + /** + * 用于计数applemusic,达到一定数量清理文件 + * @type {number} + */ + static #amCount = 0; /** * 构造安全的命令 * @type {{existsPromptKey: string, existsTransKey: string}} @@ -161,6 +167,10 @@ export class tools extends plugin { { reg: "share.xiaochuankeji.cn", fnc: "zuiyou" + }, + { + reg: "music.apple.com", + fnc: "applemusic" } ], }); @@ -1432,6 +1442,77 @@ export class tools extends plugin { } } + async applemusic(e) { + // https://music.apple.com/cn/album/hectopascal-from-yagate-kimi-ni-naru-piano-arrangement/1468323115?i=1468323724 + // 过滤参数 + const message = e.msg.replace("&ls", ""); + // 找到R插件保存目录 + const currentWorkingDirectory = path.resolve(this.defaultPath); + // 如果没有文件夹就创建一个 + await mkdirIfNotExists(currentWorkingDirectory + "/am") + // 执行命令 + const result = await execSync(`freyr -d ${ currentWorkingDirectory } get ${ message }`); + logger.info(result.toString()); + // 获取信息 + const { title, album, artist } = await this.parseFreyrLog(result.toString()); + e.reply(`识别:Apple Music,${ title }--${ artist }\n${ album }`); + // 检查目录是否存在 + const musicPath = currentWorkingDirectory + "/am/" + artist + "/" + album; + const that = this; + // 找到音频文件 + if (fs.existsSync(musicPath)) { + logger.info('目录存在。正在获取.m4a文件...'); + + // 读取目录中的所有文件和文件夹 + fs.readdir(musicPath, (err, files) => { + if (err) { + e.reply("Apple Music解析出错,请查看日志!") + logger.error('读取目录时出错:', err); + return; + } + + // 过滤出以.m4a结尾的文件 + const m4aFiles = files.filter(file => path.extname(file).toLowerCase() === '.m4a'); + + // 打印出所有.m4a文件 + logger.info('找到以下.m4a文件:'); + m4aFiles.forEach(file => { + that.uploadGroupFile(e, path.join(musicPath, file)); + }); + }); + } else { + e.reply("下载失败!没有找到Apple Music下载下来文件!"); + } + // 计数 + tools.#amCount += 1; + logger.info(`当前Apple Music已经下载了:${ tools.#amCount }次`); + // 定时清理 + if (tools.#amCount >= 5) { + await deleteFolderRecursive(currentWorkingDirectory + "/am"); + // 重置 + tools.#amCount = 0; + } + return true; + } + + /** + * 用于Apple Music抓取部分信息的函数 + * @link {applemusic} + * @param log + * @returns {Promise<{artist: (*|string), album: (*|string), title: (*|string)}>} + */ + async parseFreyrLog(log) { + const titleMatch = log.match(/Title: (.*)/); + const albumMatch = log.match(/Album: (.*)/); + const artistMatch = log.match(/Artist: (.*)/); + + const title = titleMatch ? titleMatch[1] : 'N/A'; + const album = albumMatch ? albumMatch[1] : 'N/A'; + const artist = artistMatch ? artistMatch[1] : 'N/A'; + + return { title, album, artist }; + } + /** * 哔哩哔哩下载 * @param title diff --git a/config/help.yaml b/config/help.yaml index abdc896..eef37fc 100644 --- a/config/help.yaml +++ b/config/help.yaml @@ -39,11 +39,11 @@ title: "bilibili/b23" desc: 哔哩哔哩分享实时下载 - icon: bqrcode - title: "R插件B站扫码" + title: "#rbq/#RBQ" desc: R插件B站扫码 - - icon: bilimusic - title: "bili音乐+链接" - desc: 哔哩哔哩音乐分享实时下载 + - icon: applemusic + title: "Apple Music" + desc: Apple Music音乐分享实时下载 - icon: youtube title: "youtube.com" desc: 油管学习版分享实时下载 diff --git a/config/version.yaml b/config/version.yaml index e4faafc..3222ccf 100644 --- a/config/version.yaml +++ b/config/version.yaml @@ -1,11 +1,10 @@ - { - version: 1.7.0, + version: 1.7.1, data: [ - 新增适配拉格朗日上传功能, + 新增AM解析功能, + 适配拉格朗日上传功能, 新增超过文件大小转上传功能, - 新增B站下载功能, - 新增B站扫码功能, 支持锅巴插件,方便查看和修改配置, 添加#R帮助获取插件帮助, 添加#R版本获取插件版本, diff --git a/resources/img/icon/applemusic.png b/resources/img/icon/applemusic.png new file mode 100644 index 0000000000000000000000000000000000000000..2e2a10b225c31c9e008e451cc86e42d431e631ab GIT binary patch literal 8418 zcmZ{KXFQx;(D&}@(TOgIC`ojSu%fRPB}5Nm^)8}|wunv;B~~xd7SV$smWbX(jT*i8 zzU;HP-w*Ha`S4s{&b6n^oH;Y|-A7HXrxD0c?dSXo8|IMoP`;GT`yqTJVs`EIX zXG37yzB}@9RJ>Eu&1vgK_Ra0Q-$yNI45qm)I`1{{Z=ePWKUqw1DpEyKs}Q-zJ_bh^ zMIn&cREe4}sGcO=OpNP&p9h9%Ko0h?WAxEMmiYf&? zv-^p3`J#~`@N45KQ&{HJ?3!eE}pxcu*=s|2X= z>L4Fj-6l}B!KorfIp2)xlo-W`X&@@m3>38)FkGhJ)m!DRw)(4#<%gq4{Ey#4`1?iN zCUQeN;LL#2!Y=RTOUjG+=||+ud_Djb|9wYCy;VunURsZ>4J|GcFq>-PrXc?AEIR}j ze!2037AVGk?5z9D_#T!zDy>IMw+(MMR_c1nC@Qpxxo;-2M*-!@aJQT+2pdSN_O;5O zES2-*IdoVMhU?B^0${a@#+F^6Ay`I9AZNxNiU1#enOfm2e(?-t`fWlOOdNMhoqdsG z5ijK-XFd`zQXrk_59Yi?AP`~QF5SJ)Jo_iV8{xq(=glf&C9kOZ0%Rwk(RqEz2XPEw zTBv@Qo7r41-Ac~QYimv8f0QYq(nQZYPZgwf?!F2AW4wU(BYJzhnuIP&*amPx2L*X`WVgskXHCb{%Tj)iDGWBlZ_7zJKk@kv#SnB7P92*eGT{1aSw0+sOZ*^ zP3))!t-mD$+mt68(jcd}pBg;_yq+#bqS1LQpYKtW9qpVKcgTn1gmlF+@X&Z!zCt_0vGe2duIW&i&UCLdL`o

$Rb;OyA3FawK98 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