const STREAM_URL = "https://live.btvlive.gov.bd/live/ec96f0a0-84ff-4dff-a0df-a76ca47442b4/BD/355ba051-9a60-48aa-adcf-5a6c64da8c5c/index.m3u8"; const HEADERS = { "http-referrer": "https://www.btvlive.gov.bd/", "http-origin": "https://www.btvlive.gov.bd", "http-user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" }; export default { async fetch(request) { const url = new URL(request.url); const targetUrl = url.searchParams.get("url") || STREAM_URL; // Set up request headers to match required EXTVLCOPT values const reqHeaders = new Headers(request.headers); reqHeaders.set("Referer", HEADERS["http-referrer"]); reqHeaders.set("Origin", HEADERS["http-origin"]); reqHeaders.set("User-Agent", HEADERS["http-user-agent"]); const response = await fetch(targetUrl, { method: request.method, headers: reqHeaders, }); // Handle standard stream data or segment requests const contentType = response.headers.get("content-type") || ""; const isPlaylist = targetUrl.includes(".m3u8") || contentType.includes("mpegurl") || contentType.includes("apple"); if (!isPlaylist) { // Direct pass-through for TS media segments / key files const newHeaders = new Headers(response.headers); newHeaders.set("Access-Control-Allow-Origin", "*"); return new Response(response.body, { status: response.status, headers: newHeaders }); } // Rewrite internal playlist links so segments also proxy through this worker let playlistText = await response.text(); const baseUrl = targetUrl.substring(0, targetUrl.lastIndexOf("/") + 1); const rewrittenPlaylist = playlistText.replace(/^(?!#)(.+)$/gm, (line) => { const trimmed = line.trim(); if (!trimmed) return line; let absoluteUrl; if (trimmed.startsWith("http://") || trimmed.startsWith("https://")) { absoluteUrl = trimmed; } else { absoluteUrl = new URL(trimmed, baseUrl).toString(); } // Route sub-playlists/segments back through worker return `\({url.origin}\){url.pathname}?url=${encodeURIComponent(absoluteUrl)}`; }); const resHeaders = new Headers(response.headers); resHeaders.set("Access-Control-Allow-Origin", "*"); resHeaders.set("Content-Type", "application/vnd.apple.mpegurl"); return new Response(rewrittenPlaylist, { status: response.status, headers: resHeaders, }); }, };