/** * search - download mp3&mp4 * base: https://v20.www-y2mate.com * Creator: ShanMolvyr * Jangan Hapus Kreator bang * * Sumber: https://whatsapp.com/channel/0029VbB4Kw8EFeXfeExaXc3Q */ const BASE = "https://cnv.cx/v2"; const HEADERS = { "Origin": "https://frame.y2meta-uk.com", "Referer": "https://frame.y2meta-uk.com/", "User-Agent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36" }; async function getKey() { const res = await fetch(`${BASE}/sanity/key`, { headers: HEADERS }); const data = await res.json(); return data.key; } async function search(query) { const form = new FormData(); form.append("search_query", query); const res = await fetch("https://search.nnmn.store/", { method: "POST", headers: { "Origin": "https://v20.www-y2mate.com", "Referer": "https://v20.www-y2mate.com/" }, body: form }); return await res.json(); } async function convertMp3(link, audioBitrate = "320") { const key = await getKey(); const params = new URLSearchParams({ link, format: "mp3", audioBitrate, videoQuality: "720", filenameStyle: "pretty", vCodec: "h264" }); const res = await fetch(`${BASE}/converter`, { method: "POST", headers: { ...HEADERS, "Content-Type": "application/x-www-form-urlencoded", "Key": key }, body: params.toString() }); return await res.json(); } async function convertMp4(link) { const qualities = ["2160", "1440", "1080", "720", "480", "360"]; const key = await getKey(); for (const q of qualities) { const params = new URLSearchParams({ link, format: "mp4", audioBitrate: "320", videoQuality: q, filenameStyle: "pretty", vCodec: "h264" }); const res = await fetch(`${BASE}/converter`, { method: "POST", headers: { ...HEADERS, "Content-Type": "application/x-www-form-urlencoded", "Key": key }, body: params.toString() }); const data = await res.json(); if (data.status === "tunnel") { return { ...data, quality: `${q}p` }; } } throw new Error("No MP4 quality available"); } async function getInfo(url) { process.stderr.write("Fetching MP3 and MP4...\n"); const [mp3, mp4] = await Promise.all([ convertMp3(url).catch(e => ({ error: e.message })), convertMp4(url).catch(e => ({ error: e.message })) ]); return { url, mp3: { filename: mp3.filename ?? null, url: mp3.url ?? null, error: mp3.error ?? null }, mp4: { filename: mp4.filename ?? null, quality: mp4.quality ?? null, url: mp4.url ?? null, error: mp4.error ?? null } }; } // CLI if (process.argv[1] === new URL(import.meta.url).pathname) { const arg = process.argv[2]; if (!arg) process.exit(1); if (arg === "search") { const query = process.argv.slice(3).join(" "); if (!query) process.exit(1); search(query).then(data => console.log(JSON.stringify(data, null, 2))); } else { getInfo(arg).then(data => console.log(JSON.stringify(data, null, 2))); } } export { search, convertMp3, convertMp4, getInfo };