koishi-plugin-x-video
Version:
A Koishi plugin for parsing videos from multiple platforms using RapidAPI.
90 lines (89 loc) • 3.82 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Config = exports.usage = exports.name = void 0;
exports.apply = apply;
const koishi_1 = require("koishi");
const fs_1 = require("fs");
const path_1 = require("path");
exports.name = 'x-video';
exports.usage = (0, fs_1.readFileSync)((0, path_1.resolve)(__dirname, '../readme.md'), 'utf-8');
exports.Config = koishi_1.Schema.object({
host: koishi_1.Schema.string().default('snap-video3.p.rapidapi.com').description('API 主机地址,通常不需要修改。'),
key: koishi_1.Schema.string().required().description('请填写从 RapidAPI 获取的 key。'),
});
function apply(ctx, config) {
const logger = ctx.logger(exports.name);
async function fetchFromAPI(url) {
const headers = {
'x-rapidapi-key': config.key,
'x-rapidapi-host': config.host,
'Content-Type': 'application/x-www-form-urlencoded',
};
const data = new URLSearchParams({ url });
return await ctx.http.post(`https://${config.host}/download`, data, { headers });
}
async function parseAndSend(session, url) {
try {
const result = await fetchFromAPI(url);
logger.info('API response: %o', result);
if (result?.message?.includes('Invalid API key')) {
return 'API Key 无效。请检查插件配置中的 key 是否正确,或前往 RapidAPI 检查您的订阅状态。';
}
let videoUrl;
if (Array.isArray(result?.medias)) {
const video = result.medias.find(m => m.videoAvailable && m.extension === 'mp4');
if (video)
videoUrl = video.url;
}
else if (result?.data?.[0]?.url) {
videoUrl = result.data[0].url;
}
else if (result?.result?.media?.[0]?.url) {
videoUrl = result.result.media[0].url;
}
else if (result?.url) {
videoUrl = result.url;
}
if (!videoUrl) {
const responseString = JSON.stringify(result);
const mp4Match = responseString.match(/"(https?:\/\/[^"]+\.mp4)"/);
if (mp4Match?.[1]) {
videoUrl = mp4Match[1];
}
}
if (videoUrl) {
await session.send(koishi_1.h.video(videoUrl));
}
else {
logger.warn('Could not find video URL in response: %o', result);
return '解析成功,但未在返回数据中找到视频链接。';
}
}
catch (err) {
logger.error(err);
if (err.response) {
const { status, statusText } = err.response;
return `解析视频时出错: API 请求失败 (${status} ${statusText})。请检查您的 API Key 是否有效。`;
}
return `解析视频时出错: 无法连接到 API 服务器。请检查您服务器的网络、DNS 或防火墙设置。(${err.message})`;
}
}
ctx.command('xvideo <url:string>', '解析视频链接')
.action(async ({ session }, url) => {
if (!session)
return '无法获取会话。';
if (!url)
return '请输入有效的视频链接。';
return parseAndSend(session, url);
});
ctx.middleware(async (session, next) => {
if (!session.content)
return next();
const urlRegex = /(https?:\/\/(?:www\.)?(?:twitter|x)\.com\/[a-zA-Z0-9_]+\/status\/[0-9]+)/;
const urlMatch = session.content.match(urlRegex);
if (!urlMatch)
return next();
await parseAndSend(session, urlMatch[0]);
return next();
});
}