mirror of
https://github.com/Jerryplusy/rc-plugin.git
synced 2025-10-14 08:09:19 +00:00
✨ feat: 1.8.0-beta 更新
更新内容如下: 1. 添加小飞机解析 2. 添加信任用户
This commit is contained in:
parent
d25c9883ff
commit
ceb242dfa8
@ -1,7 +1,8 @@
|
||||
import config from "../model/config.js";
|
||||
import schedule from 'node-schedule';
|
||||
import { REDIS_YUNZAI_ISOVERSEA, REDIS_YUNZAI_LAGRANGE } from "../constants/constant.js";
|
||||
import { REDIS_YUNZAI_ISOVERSEA, REDIS_YUNZAI_LAGRANGE, REDOS_YUNZAI_WHITELIST } from "../constants/constant.js";
|
||||
import { deleteFolderRecursive, readCurrentDir } from "../utils/file.js";
|
||||
import { redisExistAndGetKey, redisExistKey, redisGetKey, redisSetKey } from "../utils/redis-util.js";
|
||||
|
||||
//自动清理定时
|
||||
const autotime = config.getConfig("tools").autoclearTrashtime
|
||||
@ -30,6 +31,21 @@ export class switchers extends plugin {
|
||||
fnc: "clearTrash",
|
||||
permission: "master",
|
||||
},
|
||||
{
|
||||
reg: "^#设置R信任用户(.*)",
|
||||
fnc: "setWhiteList",
|
||||
permission: "master",
|
||||
},
|
||||
{
|
||||
reg: "^#R信任用户$",
|
||||
fnc: "getWhiteList",
|
||||
permission: "master",
|
||||
},
|
||||
{
|
||||
reg: "^#查询R信任用户(.*)",
|
||||
fnc: "searchWhiteList",
|
||||
permission: "master",
|
||||
}
|
||||
]
|
||||
});
|
||||
}
|
||||
@ -41,45 +57,42 @@ export class switchers extends plugin {
|
||||
*/
|
||||
async setOversea(e) {
|
||||
// 查看当前设置
|
||||
let os;
|
||||
if ((await redis.exists(REDIS_YUNZAI_ISOVERSEA))) {
|
||||
os = JSON.parse(await redis.get(REDIS_YUNZAI_ISOVERSEA)).os;
|
||||
}
|
||||
let os = (await redisExistAndGetKey(REDIS_YUNZAI_ISOVERSEA)).os;
|
||||
// 设置
|
||||
os = ~os
|
||||
await redis.set(
|
||||
REDIS_YUNZAI_ISOVERSEA,
|
||||
JSON.stringify({
|
||||
os: os,
|
||||
}),
|
||||
);
|
||||
await redisSetKey(REDIS_YUNZAI_ISOVERSEA, {
|
||||
os: os,
|
||||
});
|
||||
e.reply(`当前服务器:${ os ? '海外服务器' : '国内服务器' }`)
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置拉格朗日
|
||||
* @param e
|
||||
* @returns {Promise<boolean>}
|
||||
*/
|
||||
async setLagrange(e) {
|
||||
// 查看当前设置
|
||||
let driver;
|
||||
if ((await redis.exists(REDIS_YUNZAI_LAGRANGE))) {
|
||||
driver = JSON.parse(await redis.get(REDIS_YUNZAI_LAGRANGE)).driver;
|
||||
}
|
||||
let driver = (await redisExistAndGetKey(REDIS_YUNZAI_LAGRANGE)).driver;
|
||||
// 异常检测,之前算法出现问题,如果出现异常就检测纠正
|
||||
if (driver === -1) {
|
||||
driver = 1;
|
||||
}
|
||||
// 设置
|
||||
driver ^= 1;
|
||||
await redis.set(
|
||||
REDIS_YUNZAI_LAGRANGE,
|
||||
JSON.stringify({
|
||||
driver: driver,
|
||||
}),
|
||||
);
|
||||
await redisSetKey({
|
||||
driver: driver,
|
||||
})
|
||||
e.reply(`当前驱动:${ driver ? '拉格朗日' : '其他驱动' }`)
|
||||
return true;
|
||||
}
|
||||
|
||||
//手动清理垃圾
|
||||
/**
|
||||
* 手动清理垃圾
|
||||
* @param e
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
async clearTrash(e) {
|
||||
try {
|
||||
const { dataClearFileLen, rTempFileLen } = await autoclearTrash();
|
||||
@ -90,6 +103,88 @@ export class switchers extends plugin {
|
||||
e.reply(`手动清理垃圾时发生错误: ${ err.message }`);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置解析信任用户
|
||||
* @param e
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
async setWhiteList(e) {
|
||||
let trustUserId;
|
||||
// 判断是不是回复用户命令
|
||||
if (e?.reply_id !== undefined) {
|
||||
trustUserId = (await e.getReply()).user_id;
|
||||
} else {
|
||||
// 如果不是回复就看发送内容
|
||||
trustUserId = e.msg.replace("#设置R信任用户", "");
|
||||
}
|
||||
// 用户ID检测
|
||||
if (trustUserId == null || trustUserId === "") {
|
||||
e.reply("无效的R信任用户");
|
||||
return;
|
||||
}
|
||||
let whiteList = await redisExistAndGetKey(REDOS_YUNZAI_WHITELIST);
|
||||
// 不存在就创建
|
||||
if (whiteList == null) {
|
||||
whiteList = [];
|
||||
}
|
||||
// 重复检测
|
||||
if (whiteList.includes(trustUserId)) {
|
||||
e.reply("R信任用户已存在,无须添加!");
|
||||
return;
|
||||
}
|
||||
whiteList = [...whiteList, trustUserId];
|
||||
// 放置到Redis里
|
||||
await redisSetKey(REDOS_YUNZAI_WHITELIST, whiteList);
|
||||
e.reply(`成功添加R信任用户:${ trustUserId }`);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取信任用户名单
|
||||
* @param e
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
async getWhiteList(e) {
|
||||
let whiteList = await redisExistAndGetKey(REDOS_YUNZAI_WHITELIST);
|
||||
if (whiteList == null) {
|
||||
whiteList = [];
|
||||
}
|
||||
const message = `R信任用户列表:${ whiteList.join(",\n") }`;
|
||||
if (this.e.isGroup) {
|
||||
await Bot.pickUser(this.e.user_id).sendMsg(await this.e.runtime.common.makeForwardMsg(this.e, message));
|
||||
await this.reply('R插件的信任用户名单已发送至您的私信了~');
|
||||
} else {
|
||||
await e.reply(await makeForwardMsg(this.e, message));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询某个用户是否是信任用户
|
||||
* @param e
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
async searchWhiteList(e) {
|
||||
let trustUserId;
|
||||
// 判断是不是回复用户命令
|
||||
if (e?.reply_id !== undefined) {
|
||||
trustUserId = (await e.getReply()).user_id;
|
||||
} else {
|
||||
// 如果不是回复就看发送内容
|
||||
trustUserId = e.msg.replace("#设置R信任用户", "");
|
||||
}
|
||||
let whiteList = await redisExistAndGetKey(REDOS_YUNZAI_WHITELIST);
|
||||
if (whiteList == null) {
|
||||
e.reply("R插件当前没有任何信任用户!");
|
||||
return;
|
||||
}
|
||||
const isInWhiteList = whiteList.includes(trustUserId);
|
||||
if (isInWhiteList) {
|
||||
e.reply(`✅ ${trustUserId}已经是R插件的信任用户哦~`);
|
||||
} else {
|
||||
e.reply(`⚠️ ${trustUserId}不是R插件的信任用户哦~`);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
130
apps/tools.js
130
apps/tools.js
@ -14,9 +14,9 @@ import {
|
||||
COMMON_USER_AGENT,
|
||||
DIVIDING_LINE,
|
||||
douyinTypeMap,
|
||||
HELP_DOC,
|
||||
HELP_DOC, MESSAGE_RECALL_TIME,
|
||||
REDIS_YUNZAI_ISOVERSEA,
|
||||
REDIS_YUNZAI_LAGRANGE,
|
||||
REDIS_YUNZAI_LAGRANGE, REDOS_YUNZAI_WHITELIST,
|
||||
SUMMARY_PROMPT,
|
||||
transMap,
|
||||
TWITTER_BEARER_TOKEN,
|
||||
@ -43,7 +43,7 @@ import {
|
||||
import config from "../model/config.js";
|
||||
import * as aBogus from "../utils/a-bogus.cjs";
|
||||
import { downloadM3u8Videos, mergeAcFileToMp4, parseM3u8, parseUrl } from "../utils/acfun.js";
|
||||
import { checkBBDown, startBBDown } from "../utils/bbdown-util.js";
|
||||
import { startBBDown } from "../utils/bbdown-util.js";
|
||||
import { av2BV } from "../utils/bilibili-bv-av-convert.js";
|
||||
import {
|
||||
downloadBFile,
|
||||
@ -61,6 +61,7 @@ import { getWbi } from "../utils/biliWbi.js";
|
||||
import { getBodianAudio, getBodianMusicInfo, getBodianMv } from "../utils/bodian.js";
|
||||
import {
|
||||
checkCommandExists,
|
||||
checkToolInCurEnv,
|
||||
cleanFilename,
|
||||
downloadAudio,
|
||||
downloadImg,
|
||||
@ -71,14 +72,17 @@ import {
|
||||
testProxy,
|
||||
truncateString
|
||||
} from "../utils/common.js";
|
||||
import { checkAndRemoveFile, deleteFolderRecursive, mkdirIfNotExists } from "../utils/file.js";
|
||||
import { checkAndRemoveFile, deleteFolderRecursive, getMediaFiles, mkdirIfNotExists } from "../utils/file.js";
|
||||
import GeneralLinkAdapter from "../utils/general-link-adapter.js";
|
||||
import { LagrangeAdapter } from "../utils/lagrange-adapter.js";
|
||||
import { contentEstimator } from "../utils/link-share-summary-util.js";
|
||||
import { getDS } from "../utils/mihoyo.js";
|
||||
import { OpenaiBuilder } from "../utils/openai-builder.js";
|
||||
import { redisExistKey, redisGetKey, redisSetKey } from "../utils/redis-util.js";
|
||||
import { startTDL } from "../utils/tdl-util.js";
|
||||
import Translate from "../utils/trans-strategy.js";
|
||||
import { mid2id } from "../utils/weibo.js";
|
||||
import { dy2b } from "../utils/yt-dlp-util.js";
|
||||
import { textArrayToMakeForward } from "../utils/yunzai-util.js";
|
||||
|
||||
export class tools extends plugin {
|
||||
@ -186,6 +190,10 @@ export class tools extends plugin {
|
||||
{
|
||||
reg: "(qishui.douyin.com)",
|
||||
fnc: "qishuiMusic"
|
||||
},
|
||||
{
|
||||
reg: "(t.me)",
|
||||
fnc: "aircraft"
|
||||
}
|
||||
],
|
||||
});
|
||||
@ -626,7 +634,7 @@ export class tools extends plugin {
|
||||
// 检测是否开启BBDown
|
||||
if (this.biliUseBBDown) {
|
||||
// 检测环境的 BBDown
|
||||
const isExistBBDown = await checkBBDown();
|
||||
const isExistBBDown = await checkToolInCurEnv("BBDown");
|
||||
// 存在 BBDown
|
||||
if (isExistBBDown) {
|
||||
// 删除之前的文件
|
||||
@ -897,6 +905,10 @@ export class tools extends plugin {
|
||||
|
||||
// 使用现有api解析小蓝鸟
|
||||
async twitter_x(e) {
|
||||
if (!(await this.isTrustUser(e.user_id))) {
|
||||
e.reply("你没有权限使用此命令");
|
||||
return;
|
||||
}
|
||||
// 配置参数及解析
|
||||
const reg = /https?:\/\/x.com\/[0-9-a-zA-Z_]{1,20}\/status\/([0-9]*)/;
|
||||
const twitterUrl = reg.exec(e.msg)[0];
|
||||
@ -1340,28 +1352,6 @@ export class tools extends plugin {
|
||||
return true
|
||||
}
|
||||
|
||||
/**
|
||||
* yt-dlp工具类
|
||||
* @returns {Promise<void>}
|
||||
* @param path 下载路径
|
||||
* @param url 下载链接
|
||||
* @param isOversea 是否是海外用户
|
||||
*/
|
||||
async dy2b(path, url, isOversea) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const command = `yt-dlp ${ isOversea ? "" : `--proxy ${ this.myProxy }` } -P ${ path } -o "temp.%(ext)s" --merge-output-format "mp4" ${ url }`;
|
||||
exec(command, (error, stdout) => {
|
||||
if (error) {
|
||||
console.error(`Error executing command: ${ error }`);
|
||||
reject(error);
|
||||
} else {
|
||||
console.log(`Command output: ${ stdout }`);
|
||||
resolve(stdout);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// 油管解析
|
||||
async sy2b(e) {
|
||||
const isOversea = await this.isOverseasServer();
|
||||
@ -1382,7 +1372,7 @@ export class tools extends plugin {
|
||||
await checkAndRemoveFile(path + "/temp.mp4")
|
||||
const title = execSync(`yt-dlp --get-title ${ url } ${ isOversea ? "" : `--proxy ${ this.myProxy }` }`)
|
||||
e.reply(`识别:油管,视频下载中请耐心等待 \n${ title }`);
|
||||
await this.dy2b(path, url, isOversea);
|
||||
await dy2b(path, url, isOversea);
|
||||
this.sendVideoToUpload(e, `${ path }/temp.mp4`);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
@ -1697,7 +1687,7 @@ export class tools extends plugin {
|
||||
.setModel(this.aiModel)
|
||||
.setPrompt(SUMMARY_PROMPT)
|
||||
.build();
|
||||
e.reply(`识别:${ name },正在为您总结,请稍等...`, true, { recallMsg: 60 });
|
||||
e.reply(`识别:${ name },正在为您总结,请稍等...`, true, { recallMsg: MESSAGE_RECALL_TIME });
|
||||
const { ans: kimiAns, model } = await builder.kimi(summaryLink);
|
||||
// 计算阅读时间
|
||||
const stats = estimateReadingTime(kimiAns);
|
||||
@ -1771,6 +1761,48 @@ export class tools extends plugin {
|
||||
return true;
|
||||
}
|
||||
|
||||
// TG下载
|
||||
async aircraft(e) {
|
||||
if (!(await this.isTrustUser(e.user_id))) {
|
||||
e.reply("你没有权限使用此命令");
|
||||
return;
|
||||
}
|
||||
const isOversea = await this.isOverseasServer();
|
||||
if (!isOversea && !(await testProxy(this.proxyAddr, this.proxyPort))) {
|
||||
e.reply("检测到没有梯子,无法解析小飞机");
|
||||
return false;
|
||||
}
|
||||
const urlRex = /(?:https?:\/\/)?t\.me\/[A-Za-z\d._?%&+\-=\/#]*/g;
|
||||
// 检查当前环境
|
||||
const isExistTdl = await checkToolInCurEnv("tdl");
|
||||
if (!isExistTdl) {
|
||||
e.reply(`未检测到必要的环境,无法解析小飞机${HELP_DOC}`);
|
||||
return;
|
||||
}
|
||||
const url = urlRex.exec(e.msg)[0];
|
||||
const tgSavePath = this.getCurDownloadPath(e);
|
||||
await startTDL(url, tgSavePath, isOversea, this.myProxy);
|
||||
e.reply(`识别:小飞机(学习版)`);
|
||||
const mediaFiles = await getMediaFiles(tgSavePath);
|
||||
if (mediaFiles.images.length > 0) {
|
||||
const imagesData = mediaFiles.images.map(item => {
|
||||
const fileContent = fs.readFileSync(`${tgSavePath}/${item}`);
|
||||
return {
|
||||
message: segment.image(fileContent),
|
||||
nickname: e.sender.card || e.user_id,
|
||||
user_id: e.user_id,
|
||||
};
|
||||
})
|
||||
e.reply(await Bot.makeForwardMsg(imagesData), true, { recallMsg: MESSAGE_RECALL_TIME });
|
||||
} else if (mediaFiles.videos.length > 0) {
|
||||
for (const item of mediaFiles.videos) {
|
||||
await this.sendVideoToUpload(e, `${tgSavePath}/${item}`);
|
||||
}
|
||||
}
|
||||
await deleteFolderRecursive(tgSavePath);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 哔哩哔哩下载
|
||||
* @param title
|
||||
@ -2021,17 +2053,14 @@ export class tools extends plugin {
|
||||
*/
|
||||
async isOverseasServer() {
|
||||
// 如果第一次使用没有值就设置
|
||||
if (!(await redis.exists(REDIS_YUNZAI_ISOVERSEA))) {
|
||||
await redis.set(
|
||||
REDIS_YUNZAI_ISOVERSEA,
|
||||
JSON.stringify({
|
||||
os: false,
|
||||
}),
|
||||
);
|
||||
if (!(await redisExistKey(REDIS_YUNZAI_ISOVERSEA))) {
|
||||
await redisSetKey(REDIS_YUNZAI_ISOVERSEA, {
|
||||
os: false,
|
||||
})
|
||||
return true;
|
||||
}
|
||||
// 如果有就取出来
|
||||
return JSON.parse((await redis.get(REDIS_YUNZAI_ISOVERSEA))).os;
|
||||
return (await redis.get(REDIS_YUNZAI_ISOVERSEA)).os;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -2040,17 +2069,28 @@ export class tools extends plugin {
|
||||
*/
|
||||
async isLagRangeDriver() {
|
||||
// 如果第一次使用没有值就设置
|
||||
if (!(await redis.exists(REDIS_YUNZAI_LAGRANGE))) {
|
||||
await redis.set(
|
||||
REDIS_YUNZAI_LAGRANGE,
|
||||
JSON.stringify({
|
||||
driver: 0,
|
||||
}),
|
||||
);
|
||||
if (!(await redisExistKey(REDIS_YUNZAI_LAGRANGE))) {
|
||||
await redisSetKey(REDIS_YUNZAI_LAGRANGE, {
|
||||
driver: 0,
|
||||
});
|
||||
return true;
|
||||
}
|
||||
// 如果有就取出来
|
||||
return JSON.parse((await redis.get(REDIS_YUNZAI_LAGRANGE))).driver;
|
||||
return (await redisGetKey(REDIS_YUNZAI_LAGRANGE)).driver;
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断当前用户是否是信任用户
|
||||
* @param userId
|
||||
* @returns {Promise<boolean>}
|
||||
*/
|
||||
async isTrustUser(userId) {
|
||||
// 如果不存在则返回
|
||||
if (!(await redisExistKey(REDOS_YUNZAI_WHITELIST))) {
|
||||
return false;
|
||||
}
|
||||
const whiteList = await redisGetKey(REDOS_YUNZAI_WHITELIST);
|
||||
return whiteList.includes(userId);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -80,6 +80,9 @@
|
||||
- icon: spotify
|
||||
title: "Spotify"
|
||||
desc: 解析Spotify音乐
|
||||
- icon: telegram
|
||||
title: "小飞机(学习版)"
|
||||
desc: 解析小飞机
|
||||
- group: 其他指令
|
||||
list:
|
||||
- icon: update
|
||||
|
@ -1,10 +1,10 @@
|
||||
- {
|
||||
version: 1.7.4,
|
||||
version: 1.8.0-beta,
|
||||
data:
|
||||
[
|
||||
新增<span class="cmd">小飞机解析 Beta</span>功能,
|
||||
新增<span class="cmd">BBDown更换CDN</span>功能,
|
||||
新增<span class="cmd">Aria2下载选项</span>功能,
|
||||
新增<span class="cmd">最大上传限制选项</span>功能,
|
||||
支持<span class="cmd">锅巴</span>插件,方便查看和修改配置,
|
||||
输入<span class="cmd">#R帮助</span>获取插件帮助,
|
||||
输入<span class="cmd">#R更新</span>更新插件,
|
||||
|
@ -80,6 +80,12 @@ export const REDIS_YUNZAI_ISOVERSEA = "Yz:rconsole:tools:oversea";
|
||||
*/
|
||||
export const REDIS_YUNZAI_LAGRANGE = "Yz:rconsole:tools:lagrange";
|
||||
|
||||
/**
|
||||
* 某些功能的解析白名单
|
||||
* @type {string}
|
||||
*/
|
||||
export const REDOS_YUNZAI_WHITELIST = "Yz:rconsole:tools:whitelist";
|
||||
|
||||
export const TWITTER_BEARER_TOKEN = "";
|
||||
|
||||
/**
|
||||
@ -132,4 +138,10 @@ export const BILI_DOWNLOAD_METHOD = Object.freeze([
|
||||
{ label: '稳定(原生)', value: 0 },
|
||||
{ label: '性能(Aria2)', value: 1 },
|
||||
{ label: '轻量(axel/wget)', value: 2 }
|
||||
]);
|
||||
]);
|
||||
|
||||
/**
|
||||
* 消息撤回时间
|
||||
* @type {number}
|
||||
*/
|
||||
export const MESSAGE_RECALL_TIME = 60;
|
BIN
resources/img/icon/telegram.png
Normal file
BIN
resources/img/icon/telegram.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.2 KiB |
@ -1,25 +1,4 @@
|
||||
import { exec } from 'child_process';
|
||||
import os from 'os';
|
||||
|
||||
/**
|
||||
* 检测 BBDown 是否存在
|
||||
*/
|
||||
export function checkBBDown() {
|
||||
// 根据操作系统选择命令
|
||||
return new Promise((resolve, reject) => {
|
||||
const command = os.platform() === 'win32' ? 'where BBDown' : 'which BBDown';
|
||||
|
||||
exec(command, (error, stdout, stderr) => {
|
||||
if (error) {
|
||||
logger.error(`[R插件][BBDown]未找到: ${stderr || error.message}`);
|
||||
resolve(false);
|
||||
return;
|
||||
}
|
||||
logger.info(`[R插件][BBDown]找到: ${stdout.trim()}`);
|
||||
resolve(true);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 使用BBDown下载
|
||||
|
@ -1,12 +1,13 @@
|
||||
import schedule from "node-schedule";
|
||||
import common from "../../../lib/common/common.js";
|
||||
import axios from "axios";
|
||||
import fs from "node:fs";
|
||||
import fetch from "node-fetch";
|
||||
import { mkdirIfNotExists } from "./file.js";
|
||||
import { TEN_THOUSAND } from "../constants/constant.js";
|
||||
import { exec } from "child_process";
|
||||
import { HttpsProxyAgent } from 'https-proxy-agent';
|
||||
import fetch from "node-fetch";
|
||||
import schedule from "node-schedule";
|
||||
import fs from "node:fs";
|
||||
import os from "os";
|
||||
import common from "../../../lib/common/common.js";
|
||||
import { TEN_THOUSAND } from "../constants/constant.js";
|
||||
import { mkdirIfNotExists } from "./file.js";
|
||||
|
||||
/**
|
||||
* 请求模板
|
||||
@ -454,4 +455,26 @@ export function cleanFilename(filename) {
|
||||
filename = filename.trim();
|
||||
|
||||
return filename;
|
||||
}
|
||||
|
||||
/**
|
||||
* 检测当前环境是否存在某个命令
|
||||
* @param someCommand
|
||||
* @returns {Promise<boolean>}
|
||||
*/
|
||||
export function checkToolInCurEnv(someCommand) {
|
||||
// 根据操作系统选择命令
|
||||
return new Promise((resolve, reject) => {
|
||||
const command = os.platform() === 'win32' ? `where ${someCommand}` : `which ${someCommand}`;
|
||||
|
||||
exec(command, (error, stdout, stderr) => {
|
||||
if (error) {
|
||||
logger.error(`[R插件][checkTool]未找到${someCommand}: ${stderr || error.message}`);
|
||||
resolve(false);
|
||||
return;
|
||||
}
|
||||
logger.info(`[R插件][checkTool]找到${someCommand}: ${stdout.trim()}`);
|
||||
resolve(true);
|
||||
});
|
||||
});
|
||||
}
|
@ -139,3 +139,40 @@ function getMimeType(filePath) {
|
||||
const ext = filePath.substring(filePath.lastIndexOf('.')).toLowerCase();
|
||||
return mimeTypes[ext] || 'application/octet-stream';
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取文件夹中的图片和视频文件
|
||||
* @param {string} folderPath - 要检测的文件夹路径
|
||||
* @returns {Promise<Object>} 包含图片和视频文件名的对象
|
||||
*/
|
||||
export async function getMediaFiles(folderPath) {
|
||||
return new Promise((resolve, reject) => {
|
||||
// 定义图片和视频的扩展名
|
||||
const imageExtensions = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.webp'];
|
||||
const videoExtensions = ['.mp4', '.mkv', '.avi', '.mov', '.wmv', '.flv', '.webm'];
|
||||
|
||||
// 初始化存储图片和视频的数组
|
||||
const images = [];
|
||||
const videos = [];
|
||||
|
||||
// 读取文件夹中的所有文件
|
||||
fs.readdir(folderPath, (err, files) => {
|
||||
if (err) {
|
||||
return reject('无法读取文件夹: ' + err);
|
||||
}
|
||||
|
||||
files.forEach(file => {
|
||||
const ext = path.extname(file).toLowerCase();
|
||||
|
||||
if (imageExtensions.includes(ext)) {
|
||||
images.push(file);
|
||||
} else if (videoExtensions.includes(ext)) {
|
||||
videos.push(file);
|
||||
}
|
||||
});
|
||||
|
||||
// 返回包含图片和视频的对象
|
||||
resolve({ images, videos });
|
||||
});
|
||||
});
|
||||
}
|
42
utils/redis-util.js
Normal file
42
utils/redis-util.js
Normal file
@ -0,0 +1,42 @@
|
||||
/**
|
||||
* 判断某个key是否存在
|
||||
* @param key
|
||||
* @returns {Promise<boolean>}
|
||||
*/
|
||||
export async function redisExistKey(key) {
|
||||
return redis.exists(key);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取某个key的值
|
||||
* @param key
|
||||
* @returns {Promise<Object>}
|
||||
*/
|
||||
export async function redisGetKey(key) {
|
||||
return JSON.parse(await redis.get(key));
|
||||
}
|
||||
|
||||
/**
|
||||
* 为某个key设置值,value必须是个键值对
|
||||
* @param key
|
||||
* @param value
|
||||
* @returns {Promise<*>}
|
||||
*/
|
||||
export async function redisSetKey(key, value = {}) {
|
||||
return redis.set(
|
||||
key,
|
||||
JSON.stringify(value),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断是否存在这个key然后再取值,如果没有就返回null
|
||||
* @param key
|
||||
* @returns {Promise<Object|Array>}
|
||||
*/
|
||||
export async function redisExistAndGetKey(key) {
|
||||
if (await redisExistKey(key)) {
|
||||
return redisGetKey(key);
|
||||
}
|
||||
return null;
|
||||
}
|
29
utils/tdl-util.js
Normal file
29
utils/tdl-util.js
Normal file
@ -0,0 +1,29 @@
|
||||
import { exec } from 'child_process';
|
||||
import path from 'path'
|
||||
|
||||
/**
|
||||
* 执行 TDL 进行下载
|
||||
* @param url
|
||||
* @param curPath
|
||||
* @param isOversea
|
||||
* @param proxyAddr
|
||||
* @returns {Promise<string>}
|
||||
*/
|
||||
export async function startTDL(url, curPath, isOversea, proxyAddr) {
|
||||
return new Promise((resolve, reject) => {
|
||||
curPath = path.resolve(curPath);
|
||||
const proxyStr = isOversea ? `` : `--proxy ${ proxyAddr }`;
|
||||
const command = `tdl dl -u ${url} -d ${curPath} ${proxyStr}`
|
||||
exec(command, (error, stdout, stderr) => {
|
||||
if (error) {
|
||||
reject(`[R插件][TDL]执行出错: ${error.message}`);
|
||||
return;
|
||||
}
|
||||
if (stderr) {
|
||||
reject(`[R插件][TDL]错误信息: ${stderr}`);
|
||||
return;
|
||||
}
|
||||
resolve(stdout);
|
||||
})
|
||||
})
|
||||
}
|
27
utils/y2b.js
27
utils/y2b.js
@ -1,27 +0,0 @@
|
||||
/**
|
||||
* y2b 音频信息
|
||||
* @param id
|
||||
* @param format
|
||||
* @param rate
|
||||
* @param info
|
||||
* @param size
|
||||
* @returns {{size: (string|*), rate: (string|*), format, id, info}}
|
||||
*/
|
||||
export function getAudio(id, format, rate, info, size) {
|
||||
return { id, format, rate: rate == 0 ? '未知' : rate, info, size: size == 0 ? '未知' : size };
|
||||
}
|
||||
|
||||
/**
|
||||
* y2b 视频信息
|
||||
* @param id
|
||||
* @param format
|
||||
* @param scale
|
||||
* @param frame
|
||||
* @param rate
|
||||
* @param info
|
||||
* @param size
|
||||
* @returns {{size: (string|*), rate: (string|*), format, scale, id, frame, info}}
|
||||
*/
|
||||
export function getVideo(id, format, scale, frame, rate, info, size) {
|
||||
return { id, format, scale, frame, rate: rate == 0 ? '未知' : rate, info, size: size == 0 ? '未知' : size };
|
||||
}
|
21
utils/yt-dlp-util.js
Normal file
21
utils/yt-dlp-util.js
Normal file
@ -0,0 +1,21 @@
|
||||
/**
|
||||
* yt-dlp工具类
|
||||
* @returns {Promise<void>}
|
||||
* @param path 下载路径
|
||||
* @param url 下载链接
|
||||
* @param isOversea 是否是海外用户
|
||||
*/
|
||||
export async function dy2b(path, url, isOversea) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const command = `yt-dlp ${ isOversea ? "" : `--proxy ${ this.myProxy }` } -P ${ path } -o "temp.%(ext)s" --merge-output-format "mp4" ${ url }`;
|
||||
exec(command, (error, stdout) => {
|
||||
if (error) {
|
||||
console.error(`Error executing command: ${ error }`);
|
||||
reject(error);
|
||||
} else {
|
||||
console.log(`Command output: ${ stdout }`);
|
||||
resolve(stdout);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user