// code from goatstore // api: https://store.agi.bd const fs = require("fs-extra"); const axios = require("axios"); const yts = require("yt-search"); const { youtube } = require("btch-downloader"); const { getStreamFromURL, formatNumber } = global.utils; const MAX_VIDEO_SIZE = 83 * 1024 * 1024; const MAX_AUDIO_SIZE = 26 * 1024 * 1024; async function searchVideo(keyWord) { const result = await yts(keyWord); return (result.videos || []).slice(0, 6); } function videoUrlFromId(id) { return `https://www.youtube.com/watch?v=${id}`; } function extractVideoId(text) { if (!text) return null; const patterns = [ /(?:youtube\.com\/watch\?v=|youtu\.be\/|youtube\.com\/shorts\/|youtube\.com\/embed\/|youtube\.com\/v\/)([a-zA-Z0-9_-]{11})/, /^([a-zA-Z0-9_-]{11})$/ ]; for (const pattern of patterns) { const match = text.match(pattern); if (match) return match[1]; } return null; } async function getDownloadInfo(videoId) { const data = await youtube(videoUrlFromId(videoId)); if (!data || data.status === false) throw new Error(data?.message || "Cannot get download links"); return data; } async function getContentLength(url) { try { const response = await axios({ method: "HEAD", url, headers: { Range: "bytes=0-" }, timeout: 15000, validateStatus: () => true }); const size = Number(response.headers["content-length"]); return isNaN(size) ? null : size; } catch (err) { return null; } } async function downloadToFile(url, path) { const response = await axios({ method: "GET", url, responseType: "stream", headers: { Range: "bytes=0-" } }); await new Promise((resolve, reject) => { const writeStream = fs.createWriteStream(path); response.data.pipe(writeStream); response.data.on("error", reject); writeStream.on("error", reject); writeStream.on("finish", resolve); }); return fs.statSync(path).size; } module.exports = { config: { name: "ytb", version: "1.2", author: "Neoaz 🐊", countDown: 5, role: 0, description: { en: "download video, audio or view info of a YouTube video" }, category: "media", guide: { en: "{pn} [video|-v] [