Edit: testeve
Nama Worker
Kode Sumber
addEventListener('fetch', event => { event.respondWith(handleRequest(event.request)); }); async function handleRequest(request) { // 1. Definisikan User-Agent yang diizinkan untuk mengakses. const allowedUserAgent = 'Puki Navigator/njateli.peli (Linux;Android 12) ExoPlayerLib/2.13.2'; // Ambil User-Agent dari pengunjung. const userAgent = request.headers.get('User-Agent'); // ============================================================================= // --- ANDA HANYA PERLU MENGEDIT BAGIAN DI BAWAH INI --- // ============================================================================= // Masukkan semua URL Playlist yang ingin ANDA GABUNGKAN ke dalam daftar ini. // Skrip akan mengambil isinya secara berurutan. const daftarUrlUntukDigabung = [ 'https://tvking6282.cloud/payllist/ervantvking.php', // Playlist pertama // '', // Playlist kedua yang mau ditambahkan // Tambahkan URL lain di sini, dipisahkan dengan koma ]; // ============================================================================= // --- JANGAN UBAH KODE DI BAWAH INI --- // ============================================================================= // Langkah A: Periksa izin akses berdasarkan User-Agent. if (userAgent !== allowedUserAgent) { // Jika User-Agent salah, kirim halaman error dan hentikan proses. return getHtmlErrorPage(); } // Langkah B: Jika User-Agent benar, lanjutkan proses penggabungan. try { // Ambil semua playlist secara bersamaan (paralel) untuk efisiensi. const fetchPromises = daftarUrlUntukDigabung.map(url => fetch(url, { headers: { 'User-Agent': 'Puki Navigator/njateli.peli (Linux;Android 12) ExoPlayerLib/2.13.2' } }) // Beberapa server butuh User-Agent standar ); const responses = await Promise.all(fetchPromises); // Periksa apakah semua link berhasil diakses. for (const response of responses) { if (!response.ok) { // Jika salah satu link gagal, beritahu link mana yang error. return new Response(`Error: Salah satu URL playlist tidak bisa diakses. URL: ${response.url}, Status: ${response.status}`, { status: 502 }); } } // Ambil isi (content) dalam bentuk teks dari semua playlist. const textPromises = responses.map(response => response.text()); const playlistContents = await Promise.all(textPromises); // Proses penggabungan teks playlist. let combinedPlaylist = ""; playlistContents.forEach((content, index) => { let processedContent = content.trim(); if (index === 0) { // Untuk playlist pertama, gunakan seluruh isinya sebagai dasar. combinedPlaylist += processedContent; } else { // Untuk playlist berikutnya, hapus baris header #EXTM3U agar tidak duplikat. // Ini penting agar playlist valid. const contentWithoutHeader = processedContent.replace(/#EXTM3U/gi, '').trim(); if (contentWithoutHeader) { combinedPlaylist += "\n" + contentWithoutHeader; } } }); // Kirim hasil akhir playlist yang sudah digabung. return new Response(combinedPlaylist, { headers: { 'Content-Type': 'application/vnd.apple.mpegurl; charset=utf-8', 'Access-Control-Allow-Origin': '*', }, }); } catch (e) { // Tangani jika ada error tak terduga selama proses. return new Response(`Gagal menggabungkan playlist. Error: ${e.message}`, { status: 500 }); } } /** * Fungsi untuk membuat halaman HTML error jika akses ditolak. * Tidak ada yang perlu diubah di sini. */ function getHtmlErrorPage() { const errorHtml = ` <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Error Bitch</title> <style> body { background: black; color: #00ff00; font-family: 'Courier New', Courier, monospace; text-align: center; margin: 0; height: 100vh; display: flex; flex-direction: column; justify-content: center; align-items: center; overflow: hidden; position: relative; } h1 { font-size: 5em; color: rgba(255, 0, 0, 0.8); margin: 0; position: relative; display: inline-block; animation: glitch 1s infinite; } p { font-size: 1.5em; margin: 10px 0; color: rgba(255, 255, 255, 0.9); } .matrix { position: absolute; top: 0; left: 0; width: 100%; height: 100%; pointer-events: none; /* Prevent interaction with background */ overflow: hidden; } .matrix span { color: #00ff00; white-space: nowrap; display: inline-block; animation: fall linear infinite; } @keyframes fall { 0% { transform: translateY(-100%); } 100% { transform: translateY(100vh); } } @keyframes glitch { 0% { text-shadow: 1px 1px 0 rgba(255, 0, 0, 0.8), -1px -1px 0 rgba(0, 255, 255, 0.8); } 20% { text-shadow: -1px -1px 0 rgba(255, 0, 0, 0.8), 1px 1px 0 rgba(0, 255, 255, 0.8); } 40% { text-shadow: 1px -1px 0 rgba(255, 0, 0, 0.8), -1px 1px 0 rgba(0, 255, 255, 0.8); } 60% { text-shadow: -1px 1px 0 rgba(255, 0, 0, 0.8), 1px -1px 0 rgba(0, 255, 255, 0.8); } 80% { text-shadow: 1px 1px 0 rgba(255, 0, 0, 0.8), -1px -1px 0 rgba(0, 255, 255, 0.8); } 100% { text-shadow: -1px -1px 0 rgba(255, 0, 0, 0.8), 1px 1px 0 rgba(0, 255, 255, 0.8); } } </style> </head> <body> <div class="matrix"></div> <h1>404 Not Found</h1> <p>Oops! The requested resource was not found.</p> <p>Please check the URL or contact support.</p> <p><b><u>ONWER ARIV</u></b></p> <script> const matrix = document.querySelector('.matrix'); const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; const numChars = 100; for (let i = 0; i < numChars; i++) { const span = document.createElement('span'); span.textContent = characters.charAt(Math.floor(Math.random() * characters.length)); span.style.animationDuration = (Math.random() * 3 + 2) + 's'; // Random speed span.style.left = (Math.random() * 100) + 'vw'; span.style.fontSize = (Math.random() * 20 + 10) + 'px'; // Random size matrix.appendChild(span); } </script> </body> </html> `; return new Response(errorHtml, { headers: { 'Content-Type': 'text/html; charset=utf-8' }, status: 403 }); }
Bindings
Tambah KV
Tambah R2
Tambah D1
← Kembali
Simpan & Deploy
Hapus Script Worker Ini