Back to Home
Gistify Snippet
kyiov
Sep 5·1 file(s)
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
Raw
mediafiretrend.jsjavascript
101 lines
1#!/usr/bin/env node
2// mediafiretrend.js — cari file di mediafiretrend.com (search engine MediaFire)
3
4const BASE = 'https://mediafiretrend.com'
5const 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
7async 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
14function clean(s) {
15 if (s == null) return ''
16 return String(s).replace(/<[^>]+>/g, ' ').replace(/&amp;/g, '&').replace(/&nbsp;/g, ' ').replace(/&quot;/g, '"').replace(/&#39;/g, "'").replace(/\s+/g, ' ').trim()
17}
18
19// parse halaman hasil search.php
20function 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
41function 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
50async 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
101run().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.