UNPKG

koishi-plugin-x-video

Version:

A Koishi plugin for parsing videos from multiple platforms using RapidAPI.

90 lines (89 loc) 3.82 kB
"use strict"; 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(); }); }