feat: 1.8.0-beta 更新

更新内容如下:
1. 添加小飞机解析
2. 添加信任用户
This commit is contained in:
zhiyu1998 2024-08-13 16:20:09 +08:00
parent d25c9883ff
commit ceb242dfa8
13 changed files with 378 additions and 124 deletions

View File

@ -1,7 +1,8 @@
import config from "../model/config.js"; import config from "../model/config.js";
import schedule from 'node-schedule'; 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 { deleteFolderRecursive, readCurrentDir } from "../utils/file.js";
import { redisExistAndGetKey, redisExistKey, redisGetKey, redisSetKey } from "../utils/redis-util.js";
//自动清理定时 //自动清理定时
const autotime = config.getConfig("tools").autoclearTrashtime const autotime = config.getConfig("tools").autoclearTrashtime
@ -30,6 +31,21 @@ export class switchers extends plugin {
fnc: "clearTrash", fnc: "clearTrash",
permission: "master", 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) { async setOversea(e) {
// 查看当前设置 // 查看当前设置
let os; let os = (await redisExistAndGetKey(REDIS_YUNZAI_ISOVERSEA)).os;
if ((await redis.exists(REDIS_YUNZAI_ISOVERSEA))) {
os = JSON.parse(await redis.get(REDIS_YUNZAI_ISOVERSEA)).os;
}
// 设置 // 设置
os = ~os os = ~os
await redis.set( await redisSetKey(REDIS_YUNZAI_ISOVERSEA, {
REDIS_YUNZAI_ISOVERSEA,
JSON.stringify({
os: os, os: os,
}), });
);
e.reply(`当前服务器:${ os ? '海外服务器' : '国内服务器' }`) e.reply(`当前服务器:${ os ? '海外服务器' : '国内服务器' }`)
return true; return true;
} }
/**
* 设置拉格朗日
* @param e
* @returns {Promise<boolean>}
*/
async setLagrange(e) { async setLagrange(e) {
// 查看当前设置 // 查看当前设置
let driver; let driver = (await redisExistAndGetKey(REDIS_YUNZAI_LAGRANGE)).driver;
if ((await redis.exists(REDIS_YUNZAI_LAGRANGE))) {
driver = JSON.parse(await redis.get(REDIS_YUNZAI_LAGRANGE)).driver;
}
// 异常检测,之前算法出现问题,如果出现异常就检测纠正 // 异常检测,之前算法出现问题,如果出现异常就检测纠正
if (driver === -1) { if (driver === -1) {
driver = 1; driver = 1;
} }
// 设置 // 设置
driver ^= 1; driver ^= 1;
await redis.set( await redisSetKey({
REDIS_YUNZAI_LAGRANGE,
JSON.stringify({
driver: driver, driver: driver,
}), })
);
e.reply(`当前驱动:${ driver ? '拉格朗日' : '其他驱动' }`) e.reply(`当前驱动:${ driver ? '拉格朗日' : '其他驱动' }`)
return true; return true;
} }
//手动清理垃圾 /**
* 手动清理垃圾
* @param e
* @returns {Promise<void>}
*/
async clearTrash(e) { async clearTrash(e) {
try { try {
const { dataClearFileLen, rTempFileLen } = await autoclearTrash(); const { dataClearFileLen, rTempFileLen } = await autoclearTrash();
@ -90,6 +103,88 @@ export class switchers extends plugin {
e.reply(`手动清理垃圾时发生错误: ${ err.message }`); 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;
}
} }

View File

@ -14,9 +14,9 @@ import {
COMMON_USER_AGENT, COMMON_USER_AGENT,
DIVIDING_LINE, DIVIDING_LINE,
douyinTypeMap, douyinTypeMap,
HELP_DOC, HELP_DOC, MESSAGE_RECALL_TIME,
REDIS_YUNZAI_ISOVERSEA, REDIS_YUNZAI_ISOVERSEA,
REDIS_YUNZAI_LAGRANGE, REDIS_YUNZAI_LAGRANGE, REDOS_YUNZAI_WHITELIST,
SUMMARY_PROMPT, SUMMARY_PROMPT,
transMap, transMap,
TWITTER_BEARER_TOKEN, TWITTER_BEARER_TOKEN,
@ -43,7 +43,7 @@ import {
import config from "../model/config.js"; import config from "../model/config.js";
import * as aBogus from "../utils/a-bogus.cjs"; import * as aBogus from "../utils/a-bogus.cjs";
import { downloadM3u8Videos, mergeAcFileToMp4, parseM3u8, parseUrl } from "../utils/acfun.js"; 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 { av2BV } from "../utils/bilibili-bv-av-convert.js";
import { import {
downloadBFile, downloadBFile,
@ -61,6 +61,7 @@ import { getWbi } from "../utils/biliWbi.js";
import { getBodianAudio, getBodianMusicInfo, getBodianMv } from "../utils/bodian.js"; import { getBodianAudio, getBodianMusicInfo, getBodianMv } from "../utils/bodian.js";
import { import {
checkCommandExists, checkCommandExists,
checkToolInCurEnv,
cleanFilename, cleanFilename,
downloadAudio, downloadAudio,
downloadImg, downloadImg,
@ -71,14 +72,17 @@ import {
testProxy, testProxy,
truncateString truncateString
} from "../utils/common.js"; } 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 GeneralLinkAdapter from "../utils/general-link-adapter.js";
import { LagrangeAdapter } from "../utils/lagrange-adapter.js"; import { LagrangeAdapter } from "../utils/lagrange-adapter.js";
import { contentEstimator } from "../utils/link-share-summary-util.js"; import { contentEstimator } from "../utils/link-share-summary-util.js";
import { getDS } from "../utils/mihoyo.js"; import { getDS } from "../utils/mihoyo.js";
import { OpenaiBuilder } from "../utils/openai-builder.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 Translate from "../utils/trans-strategy.js";
import { mid2id } from "../utils/weibo.js"; import { mid2id } from "../utils/weibo.js";
import { dy2b } from "../utils/yt-dlp-util.js";
import { textArrayToMakeForward } from "../utils/yunzai-util.js"; import { textArrayToMakeForward } from "../utils/yunzai-util.js";
export class tools extends plugin { export class tools extends plugin {
@ -186,6 +190,10 @@ export class tools extends plugin {
{ {
reg: "(qishui.douyin.com)", reg: "(qishui.douyin.com)",
fnc: "qishuiMusic" fnc: "qishuiMusic"
},
{
reg: "(t.me)",
fnc: "aircraft"
} }
], ],
}); });
@ -626,7 +634,7 @@ export class tools extends plugin {
// 检测是否开启BBDown // 检测是否开启BBDown
if (this.biliUseBBDown) { if (this.biliUseBBDown) {
// 检测环境的 BBDown // 检测环境的 BBDown
const isExistBBDown = await checkBBDown(); const isExistBBDown = await checkToolInCurEnv("BBDown");
// 存在 BBDown // 存在 BBDown
if (isExistBBDown) { if (isExistBBDown) {
// 删除之前的文件 // 删除之前的文件
@ -897,6 +905,10 @@ export class tools extends plugin {
// 使用现有api解析小蓝鸟 // 使用现有api解析小蓝鸟
async twitter_x(e) { 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 reg = /https?:\/\/x.com\/[0-9-a-zA-Z_]{1,20}\/status\/([0-9]*)/;
const twitterUrl = reg.exec(e.msg)[0]; const twitterUrl = reg.exec(e.msg)[0];
@ -1340,28 +1352,6 @@ export class tools extends plugin {
return true 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) { async sy2b(e) {
const isOversea = await this.isOverseasServer(); const isOversea = await this.isOverseasServer();
@ -1382,7 +1372,7 @@ export class tools extends plugin {
await checkAndRemoveFile(path + "/temp.mp4") await checkAndRemoveFile(path + "/temp.mp4")
const title = execSync(`yt-dlp --get-title ${ url } ${ isOversea ? "" : `--proxy ${ this.myProxy }` }`) const title = execSync(`yt-dlp --get-title ${ url } ${ isOversea ? "" : `--proxy ${ this.myProxy }` }`)
e.reply(`识别:油管,视频下载中请耐心等待 \n${ title }`); e.reply(`识别:油管,视频下载中请耐心等待 \n${ title }`);
await this.dy2b(path, url, isOversea); await dy2b(path, url, isOversea);
this.sendVideoToUpload(e, `${ path }/temp.mp4`); this.sendVideoToUpload(e, `${ path }/temp.mp4`);
} catch (error) { } catch (error) {
console.error(error); console.error(error);
@ -1697,7 +1687,7 @@ export class tools extends plugin {
.setModel(this.aiModel) .setModel(this.aiModel)
.setPrompt(SUMMARY_PROMPT) .setPrompt(SUMMARY_PROMPT)
.build(); .build();
e.reply(`识别:${ name },正在为您总结,请稍等...`, true, { recallMsg: 60 }); e.reply(`识别:${ name },正在为您总结,请稍等...`, true, { recallMsg: MESSAGE_RECALL_TIME });
const { ans: kimiAns, model } = await builder.kimi(summaryLink); const { ans: kimiAns, model } = await builder.kimi(summaryLink);
// 计算阅读时间 // 计算阅读时间
const stats = estimateReadingTime(kimiAns); const stats = estimateReadingTime(kimiAns);
@ -1771,6 +1761,48 @@ export class tools extends plugin {
return true; 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 * @param title
@ -2021,17 +2053,14 @@ export class tools extends plugin {
*/ */
async isOverseasServer() { async isOverseasServer() {
// 如果第一次使用没有值就设置 // 如果第一次使用没有值就设置
if (!(await redis.exists(REDIS_YUNZAI_ISOVERSEA))) { if (!(await redisExistKey(REDIS_YUNZAI_ISOVERSEA))) {
await redis.set( await redisSetKey(REDIS_YUNZAI_ISOVERSEA, {
REDIS_YUNZAI_ISOVERSEA,
JSON.stringify({
os: false, os: false,
}), })
);
return true; 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() { async isLagRangeDriver() {
// 如果第一次使用没有值就设置 // 如果第一次使用没有值就设置
if (!(await redis.exists(REDIS_YUNZAI_LAGRANGE))) { if (!(await redisExistKey(REDIS_YUNZAI_LAGRANGE))) {
await redis.set( await redisSetKey(REDIS_YUNZAI_LAGRANGE, {
REDIS_YUNZAI_LAGRANGE,
JSON.stringify({
driver: 0, driver: 0,
}), });
);
return true; 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);
} }
/** /**

View File

@ -80,6 +80,9 @@
- icon: spotify - icon: spotify
title: "Spotify" title: "Spotify"
desc: 解析Spotify音乐 desc: 解析Spotify音乐
- icon: telegram
title: "小飞机(学习版)"
desc: 解析小飞机
- group: 其他指令 - group: 其他指令
list: list:
- icon: update - icon: update

View File

@ -1,10 +1,10 @@
- { - {
version: 1.7.4, version: 1.8.0-beta,
data: data:
[ [
新增<span class="cmd">小飞机解析 Beta</span>功能,
新增<span class="cmd">BBDown更换CDN</span>功能, 新增<span class="cmd">BBDown更换CDN</span>功能,
新增<span class="cmd">Aria2下载选项</span>功能, 新增<span class="cmd">Aria2下载选项</span>功能,
新增<span class="cmd">最大上传限制选项</span>功能,
支持<span class="cmd">锅巴</span>插件,方便查看和修改配置, 支持<span class="cmd">锅巴</span>插件,方便查看和修改配置,
输入<span class="cmd">#R帮助</span>获取插件帮助, 输入<span class="cmd">#R帮助</span>获取插件帮助,
输入<span class="cmd">#R更新</span>更新插件, 输入<span class="cmd">#R更新</span>更新插件,

View File

@ -80,6 +80,12 @@ export const REDIS_YUNZAI_ISOVERSEA = "Yz:rconsole:tools:oversea";
*/ */
export const REDIS_YUNZAI_LAGRANGE = "Yz:rconsole:tools:lagrange"; 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 = ""; export const TWITTER_BEARER_TOKEN = "";
/** /**
@ -133,3 +139,9 @@ export const BILI_DOWNLOAD_METHOD = Object.freeze([
{ label: '性能Aria2', value: 1 }, { label: '性能Aria2', value: 1 },
{ label: '轻量axel/wget', value: 2 } { label: '轻量axel/wget', value: 2 }
]); ]);
/**
* 消息撤回时间
* @type {number}
*/
export const MESSAGE_RECALL_TIME = 60;

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@ -1,25 +1,4 @@
import { exec } from 'child_process'; 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下载 * 使用BBDown下载

View File

@ -1,12 +1,13 @@
import schedule from "node-schedule";
import common from "../../../lib/common/common.js";
import axios from "axios"; 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 { exec } from "child_process";
import { HttpsProxyAgent } from 'https-proxy-agent'; 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";
/** /**
* 请求模板 * 请求模板
@ -455,3 +456,25 @@ export function cleanFilename(filename) {
return filename; 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);
});
});
}

View File

@ -139,3 +139,40 @@ function getMimeType(filePath) {
const ext = filePath.substring(filePath.lastIndexOf('.')).toLowerCase(); const ext = filePath.substring(filePath.lastIndexOf('.')).toLowerCase();
return mimeTypes[ext] || 'application/octet-stream'; 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
View 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
View 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);
})
})
}

View File

@ -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
View 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);
}
});
});
}