#!/usr/bin/env node // mediafiretrend.js — cari file di mediafiretrend.com (search engine MediaFire) const BASE = 'https://mediafiretrend.com' const UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36' async function get(url) { const r = await fetch(url, { headers: { 'User-Agent': UA, 'Accept': 'text/html,*/*', 'Accept-Language': 'en-US,en;q=0.9', 'Referer': BASE + '/' } }) return { status: r.status, raw: await r.text() } } function clean(s) { if (s == null) return '' return String(s).replace(/<[^>]+>/g, ' ').replace(/&/g, '&').replace(/ /g, ' ').replace(/"/g, '"').replace(/'/g, "'").replace(/\s+/g, ' ').trim() } // parse halaman hasil search.php function parse(html) { const items = [] // pecah per baris hasil (blok yang berisi /f/ link) const trs = html.split(/]*>/) for (const tr of trs) { const m = /]*>([\s\S]*?)<\/a>\s*\(([^)]*)\)/.exec(tr) if (!m) continue const span = /]*>([\s\S]*?)<\/span>/.exec(tr) const st = /Source title:\s*([^<]*)/i.exec(tr) items.push({ id: m[1].split('/')[1], title: clean(m[2]), size: clean(m[3]), source: span ? clean(span[1]) : '', sourceTitle: st ? clean(st[1]) : '', link: `${BASE}/${m[1]}` }) } return items } function fmt(items) { return items.map(r => ({ title: r.title, size: r.size, source: r.source, link: r.link })) } async function run() { const args = process.argv.slice(2) const asJson = args.includes('--json') const outIdx = args.indexOf('--out') const outFile = outIdx >= 0 ? (args[outIdx + 1] && !args[outIdx + 1].startsWith('--') ? args[outIdx + 1] : 'output/mediafiretrend.json') : null let n = 25 const ni = args.indexOf('--n') if (ni >= 0) n = parseInt(args[ni + 1], 10) || 25 const pi = args.indexOf('--page') let start = 0 if (pi >= 0) start = (parseInt(args[pi + 1], 10) || 1) * 25 const q = args.find(a => !a.startsWith('--')) if (!q) { console.error('usage: node mediafiretrend.js [--n 50] [--page 2] [--json] [--out f]') process.exit(1) } const all = [] let page = start while (all.length < n) { const url = `${BASE}/search.php?q=${encodeURIComponent(q)}${page ? '&start=' + page : ''}` const { status, raw } = await get(url) if (status !== 200) throw new Error(`HTTP ${status}`) const items = parse(raw) if (!items.length) break all.push(...items) if (items.length < 25) break page += 25 } const shown = all.slice(0, n) const out = { query: q, shown: shown.length, results: fmt(shown) } if (asJson) { console.log(JSON.stringify(out, null, 2)) } else { console.log(`${q}: ${shown.length} hasil`) shown.forEach((r, i) => { console.log(`\n[${i + 1}] ${r.title} (${r.size})`) console.log(` ${r.link}`) if (r.source) console.log(` src: ${r.source}`) }) } if (outFile) { const { mkdir, writeFile } = await import('node:fs/promises') const { dirname } = await import('node:path') await mkdir(dirname(outFile), { recursive: true }) await writeFile(outFile, JSON.stringify(out, null, 2)) console.error(`\nsaved: ${outFile}`) } } run().catch(e => { console.error('error:', e.message); process.exit(1) })