/** * CINESUBZ (ZETAFLIX) ENGINE * Base : https://cinesubz.lk * Author : Gienetic * Fitur : Auto-Bypass Nonce WP, Search Extractor, Direct MP4 Resolver */ const axios = require('axios'); const readline = require('readline'); const fs = require('fs'); const BASE_URL = 'https://cinesubz.net'; const getHeaders = (isAjax = false) => { const headers = { 'user-agent': 'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Mobile Safari/537.36', 'accept': 'application/json, text/javascript, */*; q=0.01', 'referer': `${BASE_URL}/` }; if (isAjax) { headers['x-requested-with'] = 'XMLHttpRequest'; headers['content-type'] = 'application/x-www-form-urlencoded; charset=UTF-8'; headers['origin'] = BASE_URL; } return headers; }; // Mengambil security token (nonce) dari homepage WordPress const fetchNonce = async () => { try { const res = await axios.get(BASE_URL, { headers: getHeaders(), timeout: 10000 }); const match = res.data.match(/"nonce":"([a-z0-9]+)"/); return match ? match[1] : null; } catch (err) { return null; } }; // Mencari film/series berdasarkan keyword const searchMovie = async (keyword) => { const nonce = await fetchNonce(); if (!nonce) throw new Error("Gagal mendapatkan security nonce."); const targetUrl = `${BASE_URL}/wp-json/zetaflix/search/?keyword=${encodeURIComponent(keyword)}&nonce=${nonce}`; try { const res = await axios.get(targetUrl, { headers: getHeaders(), timeout: 10000 }); const rawData = res.data; if (!rawData || typeof rawData !== 'object' || Object.keys(rawData).length === 0) return []; // Parsing JSON Object (ID sebagai key) menjadi JSON Array standar return Object.keys(rawData).map(postId => ({ id: postId, title: rawData[postId].title, url: rawData[postId].url, img: rawData[postId].img, genres: rawData[postId].extra?.genres || '', year: rawData[postId].extra?.date || '', imdb: rawData[postId].extra?.imdb || '', runtime: rawData[postId].extra?.runtime || '' })); } catch (err) { throw err; } }; const extractVideoLink = async (postId, serverNum = 1, type = 'mv') => { const targetUrl = `${BASE_URL}/wp-admin/admin-ajax.php`; // Payload harus URL-Encoded untuk admin-ajax.php const payload = new URLSearchParams({ action: 'zeta_player_ajax', post: postId.toString(), nume: serverNum.toString(), type: type }); try { const res = await axios.post(targetUrl, payload.toString(), { headers: getHeaders(true), timeout: 15000 }); const data = res.data; if (data && data.embed_url) { try { // Mengambil parameter 'source' dari URL embed JWPlayer const urlObj = new URL(data.embed_url); const directMp4 = urlObj.searchParams.get('source'); return { success: true, type: data.type, url: directMp4 || data.embed_url, // Fallback jika parameter source tidak ada is_direct: !!directMp4 }; } catch (e) { return { success: true, type: 'iframe', url: data.embed_url, is_direct: false }; } } return { success: false, error: 'Server kosong' }; } catch (err) { return { success: false, error: err.message }; } }; module.exports = { fetchNonce, searchMovie, extractVideoLink }; // ========================================== // CLI ENGINE // ========================================== if (require.main === module) { const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); const ask = (q) => new Promise((resolve) => rl.question(`? ${q}`, resolve)); const saveAndPrintJSON = (filename, data) => { const jsonString = JSON.stringify(data, null, 2); console.log(`\n=== OUTPUT JSON ===\n${jsonString}\n===================`); try { fs.writeFileSync(filename, jsonString); console.log(`[+] File tersimpan: ${filename}`); } catch (e) { console.log(`[-] Gagal menyimpan file: ${e.message}`); } }; const handleSearch = async () => { const kw = await ask('Masukkan Kata Kunci: '); if (!kw.trim()) return; process.stdout.write(`\n[~] Mem-bypass keamanan & mencari "${kw}"... `); try { const data = await searchMovie(kw); if (data.length === 0) return console.log('KOSONG\n[-] Tidak ada hasil.'); console.log(`OK (${data.length} hasil)`); // Tampilkan list singkat beserta ID console.log('\n--- Hasil Pencarian ---'); data.forEach((item, index) => { console.log(`[${index + 1}] ID: ${item.id} | ${item.title}`); }); saveAndPrintJSON(`cinesubz_search_${kw.replace(/\s/g, '_').toLowerCase()}.json`, data); } catch (error) { console.log(`GAGAL\n[-] Error: ${error.message}`); } }; const handleExtract = async () => { console.log('\n--- Ekstraksi Link Video ---'); const postId = await ask('Masukkan Post ID (Dapatkan dari menu Search): '); if (!postId.trim()) return; const type = await ask('Tipe Video (mv = Movie, tv = TV Show) [default: mv]: '); const vType = type.trim().toLowerCase() === 'tv' ? 'tv' : 'mv'; console.log(`\n[*] Memindai Server 1 hingga 3...`); let extractedLinks = []; for (let i = 1; i <= 3; i++) { process.stdout.write(`[~] Mengecek Server ${i}... `); const result = await extractVideoLink(postId, i, vType); if (result.success) { console.log(`OK`); extractedLinks.push({ server: i, type: result.type, is_direct_mp4: result.is_direct, link: result.url }); } else { console.log(`KOSONG / GAGAL`); } } if (extractedLinks.length > 0) { saveAndPrintJSON(`cinesubz_video_${postId}.json`, extractedLinks); } else { console.log('\n[-] Tidak ada link video yang berhasil diekstrak.'); } }; const runCLI = async () => { console.clear(); console.log("==================================="); console.log(" CINESUBZ ENGINE CLI "); console.log("==================================="); while (true) { console.log('\n[ MAIN DASHBOARD ]'); console.log('1. Cari Film/Series (Mendapatkan Post ID)'); console.log('2. Ekstrak Link Video (Berdasarkan Post ID)'); console.log('0. Keluar'); const menu = await ask('\nPilihan: '); switch (menu.trim()) { case '1': await handleSearch(); break; case '2': await handleExtract(); break; case '0': console.log('\n[!] Terminated.'); rl.close(); return; default: console.log('[-] Pilihan tidak valid.'); } } }; runCLI(); }