import axios from "axios"; import { sendSuccess, ErrorResponses } from "../../lib/response-helper.js"; class Youtube { constructor() { this.API_URL = "https://thesocialcat.com/api/youtube-download"; this.HEADERS = { "accept": "*/*", "accept-language": "id-ID", "content-type": "application/json", "Referer": "https://thesocialcat.com/tools/youtube-video-downloader", "Referrer-Policy": "strict-origin-when-cross-origin" }; this.CREATED_BY = "Ditzzy"; this.NOTE = "Thank you for using this scrape, I hope you appreciate me for making this scrape by not deleting wm"; } wrapResponse(data) { return { created_by: this.CREATED_BY, note: this.NOTE, results: data }; } async download(url, format) { try { const config = { url: this.API_URL, headers: this.HEADERS, method: "POST", data: { format, url } }; const { data } = await axios.request(config); return this.wrapResponse(data); } catch (e) { throw new Error(`Error downloading YouTube content: ${e}`); } } } /** @type {import("../../types/plugin").ApiPluginHandler} */ const handler = { name: "YouTube Downloader", description: "Download YouTube media with resolution up to 1080p and support audio", version: "1.0.0", method: "GET", category: ["downloader"], alias: ["youtube", "yt"], tags: ["social-media", "video", "downloader"], parameters: { query: [ { name: "url", type: "string", required: true, description: "Your YouTube URL", example: "https://youtu.be/zawDTvoXT8k?si=FgZnxXzMXJI8jfkB" }, { name: "format", type: "string", required: true, description: "Format to download", example: "720p", enum: ["144p", "240p", "360p", "480p", "720p", "1080p", "audio"], default: "720p" } ], body: [], headers: [] }, responses: { 200: { status: 200, description: "Successfully retrieved YouTube video data", example: { status: 200, author: "Ditzzy", note: "Thank you for using this API!", results: {} } }, 400: { status: 400, description: "Invalid YouTube URL provided", example: { status: 400, message: "Invalid URL - must be a valid YouTube URL" } }, 404: { status: 404, description: "Missing required parameter", example: { status: 404, message: "Missing required parameter: ..." } }, 500: { status: 500, description: "Server error or YouTube API unavailable", example: { status: 500, message: "An error occurred, please try again later." } } }, exec: async (req, res) => { const { url } = req.query const { format } = req.query if (!url) return ErrorResponses.missingParameter(res, "url"); if (!format) return ErrorResponses.missingParameter(res, "format"); const regex = /^(https?:\/\/)?((www\.|m\.)?youtube(-nocookie)?\.com|youtu\.be)(\/(embed\/|v\/|watch\?v=|watch\?.+&v=|shorts\/)?)([\w-]{11})(\S+)?$/; if (!regex.test(url)) return ErrorResponses.invalidUrl(res, "Invalid URL - must be a valid YouTube URL"); const yt = new Youtube(); try { const download = await yt.download(url, format); return sendSuccess(res, download.results); } catch (e) { console.error("Error:", e); return ErrorResponses.serverError(res); } } } export default handler;