#!/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) })