/** * * By Zx * Source Kode: * https://whatsapp.com/channel/0029Vb6P2e1E50UZYaX4wI0W * Note: Kalau Mau Sher Lagi Pake Credit * **/ const axios = require('axios'); class Ytmp3Scraper { constructor() { this.baseUrl = 'https://a.ymcdn.org/api/v1'; this.headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36', 'Accept': 'application/json, text/plain, */*', 'Referer': 'https://id.ytmp3.mobi/' }; } extractVideoId(url) { let match; if (url.includes('youtube.com/shorts/') || url.includes('youtu.be/')) { match = /\/([a-zA-Z0-9\-_]{11})/.exec(url); } else if (url.includes('youtube.com')) { match = /v=([a-zA-Z0-9\-_]{11})/.exec(url); } return match ? match[1] : null; } async init() { const url = `${this.baseUrl}/init?p=y&23=1llum1n471&_=${Math.random()}`; const response = await axios.get(url, { headers: this.headers }); return response.data; } async convert(convertURL, videoId, format) { const url = `${convertURL}&v=${videoId}&f=${format}&_=${Math.random()}`; const response = await axios.get(url, { headers: this.headers }); return response.data; } async checkProgress(progressURL, maxRetries = 60) { let retries = 0; let lastResponse = null; while (retries < maxRetries) { const response = await axios.get(progressURL, { headers: this.headers }); lastResponse = response.data; if (lastResponse.error !== 0) { throw new Error(`Progress Error Code: ${lastResponse.error}`); } if (lastResponse.progress === 3) { return lastResponse; } await new Promise(resolve => setTimeout(resolve, 1000)); retries++; } throw new Error('Timeout: Konversi memakan waktu terlalu lama.'); } async scrape(youtubeUrl, format = 'mp3') { const startTime = Date.now(); try { if (!['mp3', 'mp4'].includes(format)) { return { success: false, error: 'FORMAT_INVALID', message: 'Format tidak valid. Gunakan "mp3" atau "mp4".' }; } const videoId = this.extractVideoId(youtubeUrl); if (!videoId) { return { success: false, error: 'INVALID_URL', message: 'URL YouTube tidak valid atau Video ID tidak ditemukan.' }; } const initResponse = await this.init(); if (initResponse.error !== 0) { return { success: false, error: 'INIT_FAILED', message: `Gagal inisialisasi. Error code: ${initResponse.error}`, raw: { init: initResponse } }; } const convertResponse = await this.convert(initResponse.convertURL, videoId, format); if (convertResponse.error !== 0) { return { success: false, error: 'CONVERT_FAILED', message: `Gagal memulai konversi. Error code: ${convertResponse.error}`, raw: { init: initResponse, convert: convertResponse } }; } const progressResponse = await this.checkProgress(convertResponse.progressURL); const result = { success: true, videoId: videoId, title: convertResponse.title, format: format, hash: convertResponse.hash, downloadUrl: convertResponse.downloadURL, duration: `${((Date.now() - startTime) / 1000).toFixed(2)}s`, metadata: { country: initResponse.country, convertURL: initResponse.convertURL, progressURL: convertResponse.progressURL, redirectURL: convertResponse.redirectURL || null, finalProgress: progressResponse } }; return result; } catch (error) { return { success: false, error: 'EXCEPTION', message: error.message, stack: error.stack }; } } } // ================= CARA SANGE ================= /*(async () => { const scraper = new Ytmp3Scraper(); const targetUrl = 'https://www.youtube.com/shorts/E0GhF4b_zVU'; const targetFormat = 'mp4'; // atau 'mp3' console.log(`[*] Scraping: ${targetUrl} (format: ${targetFormat})\n`); const result = await scraper.scrape(targetUrl, targetFormat); console.log(JSON.stringify(result, null, 2)); })(); CONTOH SEL PUTIH { "success": true, "videoId": "E0GhF4b_zVU", "title": "TUAN CRAB SEBENARNYA ANGKATAN LAUT #shorts", "format": "mp4", "hash": "4b9b719a55e6409c38cb15d9f860fe48", "downloadUrl": "https://ydl.ymcdn.org/api/v1/download/4b9b719a55e6409c38cb15d9f860fe48/E0GhF4b_zVU", "duration": "5.23s", "metadata": { "country": "ID", "convertURL": "https://a.ymcdn.org/api/v1/convert?sig=A6LRGZXZNvKyCCMUvIgoxphXDNupPE3PhyDJfrgyUgqLN3wkhjCHkvIISFTp8fLW8l6TcmNi", "progressURL": "https://a.ymcdn.org/api/v1/progress?id=4b9b719a55e6409c38cb15d9f860fe48", "redirectURL": null, "finalProgress": { "sid": 7, "error": 0, "progress": 3, "percent": 0, "title": "TUAN CRAB SEBENARNYA ANGKATAN LAUT #shorts" } } } */