Back to Home
Gistify Snippet
Public
mediafiretrend.js — cari file MediaFire via search.php (pure JS)
mediafiretrend.js — cari file MediaFire via search.php (pure JS)
#github-gist#javascript#gist:cbcaee35fda461fc1ea2e082cd8737cb#gistsync:2026-09-04T03:12:37Z
4
Rawmediafiretrend.jsjavascript
101 lines| 1 | #!/usr/bin/env node |
| 2 | // mediafiretrend.js — cari file di mediafiretrend.com (search engine MediaFire) |
| 3 | |
| 4 | const BASE = 'https://mediafiretrend.com' |
| 5 | 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' |
| 6 | |
| 7 | async function get(url) { |
| 8 | const r = await fetch(url, { |
| 9 | headers: { 'User-Agent': UA, 'Accept': 'text/html,*/*', 'Accept-Language': 'en-US,en;q=0.9', 'Referer': BASE + '/' } |
| 10 | }) |
| 11 | return { status: r.status, raw: await r.text() } |
| 12 | } |
| 13 | |
| 14 | function clean(s) { |
| 15 | if (s == null) return '' |
| 16 | return String(s).replace(/<[^>]+>/g, ' ').replace(/&/g, '&').replace(/ /g, ' ').replace(/"/g, '"').replace(/'/g, "'").replace(/\s+/g, ' ').trim() |
| 17 | } |
| 18 | |
| 19 | // parse halaman hasil search.php |
| 20 | function parse(html) { |
| 21 | const items = [] |
| 22 | // pecah per baris hasil (blok <tr> yang berisi /f/ link) |
| 23 | const trs = html.split(/<tr[^>]*>/) |
| 24 | for (const tr of trs) { |
| 25 | const m = /<a href="\/(f\/[^"]+)"[^>]*>([\s\S]*?)<\/a>\s*\(([^)]*)\)/.exec(tr) |
| 26 | if (!m) continue |
| 27 | const span = /<span[^>]*>([\s\S]*?)<\/span>/.exec(tr) |
| 28 | const st = /Source title:\s*([^<]*)/i.exec(tr) |
| 29 | items.push({ |
| 30 | id: m[1].split('/')[1], |
| 31 | title: clean(m[2]), |
| 32 | size: clean(m[3]), |
| 33 | source: span ? clean(span[1]) : '', |
| 34 | sourceTitle: st ? clean(st[1]) : '', |
| 35 | link: `${BASE}/${m[1]}` |
| 36 | }) |
| 37 | } |
| 38 | return items |
| 39 | } |
| 40 | |
| 41 | function fmt(items) { |
| 42 | return items.map(r => ({ |
| 43 | title: r.title, |
| 44 | size: r.size, |
| 45 | source: r.source, |
| 46 | link: r.link |
| 47 | })) |
| 48 | } |
| 49 | |
| 50 | async function run() { |
| 51 | const args = process.argv.slice(2) |
| 52 | const asJson = args.includes('--json') |
| 53 | const outIdx = args.indexOf('--out') |
| 54 | const outFile = outIdx >= 0 ? (args[outIdx + 1] && !args[outIdx + 1].startsWith('--') ? args[outIdx + 1] : 'output/mediafiretrend.json') : null |
| 55 | let n = 25 |
| 56 | const ni = args.indexOf('--n') |
| 57 | if (ni >= 0) n = parseInt(args[ni + 1], 10) || 25 |
| 58 | const pi = args.indexOf('--page') |
| 59 | let start = 0 |
| 60 | if (pi >= 0) start = (parseInt(args[pi + 1], 10) || 1) * 25 |
| 61 | const q = args.find(a => !a.startsWith('--')) |
| 62 | if (!q) { |
| 63 | console.error('usage: node mediafiretrend.js <kata> [--n 50] [--page 2] [--json] [--out f]') |
| 64 | process.exit(1) |
| 65 | } |
| 66 | |
| 67 | const all = [] |
| 68 | let page = start |
| 69 | while (all.length < n) { |
| 70 | const url = `${BASE}/search.php?q=${encodeURIComponent(q)}${page ? '&start=' + page : ''}` |
| 71 | const { status, raw } = await get(url) |
| 72 | if (status !== 200) throw new Error(`HTTP ${status}`) |
| 73 | const items = parse(raw) |
| 74 | if (!items.length) break |
| 75 | all.push(...items) |
| 76 | if (items.length < 25) break |
| 77 | page += 25 |
| 78 | } |
| 79 | const shown = all.slice(0, n) |
| 80 | |
| 81 | const out = { query: q, shown: shown.length, results: fmt(shown) } |
| 82 | if (asJson) { |
| 83 | console.log(JSON.stringify(out, null, 2)) |
| 84 | } else { |
| 85 | console.log(`${q}: ${shown.length} hasil`) |
| 86 | shown.forEach((r, i) => { |
| 87 | console.log(`\n[${i + 1}] ${r.title} (${r.size})`) |
| 88 | console.log(` ${r.link}`) |
| 89 | if (r.source) console.log(` src: ${r.source}`) |
| 90 | }) |
| 91 | } |
| 92 | if (outFile) { |
| 93 | const { mkdir, writeFile } = await import('node:fs/promises') |
| 94 | const { dirname } = await import('node:path') |
| 95 | await mkdir(dirname(outFile), { recursive: true }) |
| 96 | await writeFile(outFile, JSON.stringify(out, null, 2)) |
| 97 | console.error(`\nsaved: ${outFile}`) |
| 98 | } |
| 99 | } |
| 100 | |
| 101 | run().catch(e => { console.error('error:', e.message); process.exit(1) }) |
Discussion & Comments0
No comments yet — be the first to leave feedback or start a code discussion.
Sign in with your GitHub account to write comments and join the discussion.