// capcut-v2.js — bundle standalone. npm deps: node:url /** * Scraper: capcut-v2.js * Source : kyioapi/capcut-v2.js * * Input : Function parameters / CLI args (e.g. query: string, url: string, options: object) * Output : Promise (JSON formatted scraping response / stream URL / media metadata) * * CLI Run: * node kyioapi/capcut-v2.js [functionName] [args...] * node cli.js kyioapi/capcut-v2.js [functionName] [args...] */ import * as __ns_38 from 'node:url' const pathToFileURL = __ns_38.pathToFileURL /** * CapCut Downloader V2 Scraper */ async function capcutV2(videoUrl) { try { if (!videoUrl) throw new Error("URL CapCut wajib diisi."); const apiUrl = 'https://3bic.com/api/download'; const cfCookie = 'cf_clearance=V3clQTE3WhngwjJDn9BNjF2wKX.TGlcVpgUjrvwzsg-1784109792-1.2.1.1-F7CfGqjELi.TfD7Ml0jqGFKYFTz0oXYDyNo0khGjyUCN2Ew4L_BEMyFdbh2Y2I8F1rC07xWo2NhunTzzUaZAcTYfkTNVWD97lpGfnoLiSc.Vwa2.bk0MiRnFDK3SsE4yzf7GvMnqXH.V3E.XZnHMzy.PD_tx.8DuWcGA7iIH2HSaDjmXRb71q8novi7NqdPP_IwoF7Icl6gwSQThhNAf2f0y9Nc91RyZGejr2ttdnq2zVbgHzmGbQADD9W9CWL4YlJIOeQamnbd8UHd5083UfND78UH2TDf0RaY4fbMPUpve1KdjiEhfq8WztiIRAbeqLwDTW5jxhbBi_HiIVt;'; const res = await fetch(apiUrl, { method: 'POST', headers: { 'Accept': 'application/json, text/plain, */*', 'Content-Type': 'application/json', 'Cookie': cfCookie, 'Origin': 'https://3bic.com', 'Referer': 'https://3bic.com/id', 'User-Agent': 'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Mobile Safari/537.36' }, body: JSON.stringify({ url: videoUrl }) }); const resultData = await res.json(); if (resultData && resultData.originalVideoUrl) { if (resultData.originalVideoUrl.startsWith('/')) { resultData.originalVideoUrl = 'https://3bic.com' + resultData.originalVideoUrl; } } if (resultData.code !== 200 && !resultData.originalVideoUrl) { throw new Error(resultData.message || "Gagal memproses video CapCut."); } return { title: resultData.title || 'CapCut Video', author: resultData.authorName || 'Unknown', cover: resultData.coverUrl || null, video_url: resultData.originalVideoUrl, url: videoUrl }; } catch (error) { throw new Error(error.message); } } // ───────────────────────────────────────────────────────────────────── // Self-test: jalankan langsung dengan `node capcut-v2.js [args...]` // ───────────────────────────────────────────────────────────────────── if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) { const __exports = { capcutV2: capcutV2 } const __fns = Object.fromEntries(Object.entries(__exports).filter(([, v]) => typeof v === 'function')) const __names = Object.keys(__fns) if (__names.length === 0) { console.log('Tidak ada fungsi yang bisa di-demo. Import modul ini dari kode lain.') } else { const __search = __names.find((n) => /search|cari/i.test(n)) const __name = __search || __names[0] const __fn = __fns[__name] const __isClass = /^class\s/.test(Function.prototype.toString.call(__fn)) let __args = process.argv.slice(2).map((a) => { try { return JSON.parse(a) } catch { return a } }) if (__args.length === 0 && __search) __args.push('naruto') if (__args.length === 0 && !__search && !__isClass && __fn.length > 0) { console.log('Fungsi: ' + __names.join(', ')) console.log('Contoh: node ' + "capcut-v2.js" + ' ' + __name + ' ') } else { ;(async () => { try { const r = __isClass ? new __fn(...__args) : await __fn(...__args) console.log(JSON.stringify(r, null, 2)) } catch (e) { console.error('Error: ' + (e && e.message ? e.message : e)) process.exitCode = 1 } })() } } }