Cloudflare Worker Stream Proxy Code
Copia y pega este código dentro de tu panel de Cloudflare Workers.
/**
* Cloudflare Worker: Stream Proxy (MPD / M3U8 CORS & Header Bypass)
* Diseñado para reproducir streams restringidos en Smart TVs.
*/
addEventListener("fetch", (event) => {
event.respondWith(handleRequest(event.request));
});
async function handleRequest(request) {
// Manejar preflight OPTIONS para CORS
if (request.method === "OPTIONS") {
return new Response(null, {
status: 204,
headers: getCorsHeaders(),
});
}
const url = new URL(request.url);
const targetUrl = url.searchParams.get("url");
if (!targetUrl) {
return new Response("Missing 'url' parameter", {
status: 400,
headers: getCorsHeaders()
});
}
// Permitir la personalización opcional del Referer por parámetro
const customReferer = url.searchParams.get("referer") || "https://pelisjuanita.com/";
try {
// Configurar cabeceras solicitadas por los servidores de streaming
const customHeaders = new Headers();
customHeaders.set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36");
customHeaders.set("Referer", customReferer);
customHeaders.set("Origin", new URL(customReferer).origin);
customHeaders.set("Accept", "*/*");
// Reenviar Range headers para streaming de video por partes
const range = request.headers.get("Range");
if (range) {
customHeaders.set("Range", range);
}
// Realizar la petición al servidor origen
const response = await fetch(targetUrl, {
method: request.method,
headers: customHeaders,
redirect: "follow",
});
// Clonar cabeceras de respuesta y añadir CORS global
const responseHeaders = new Headers(response.headers);
getCorsHeaders().forEach((value, key) => responseHeaders.set(key, value));
// Desactivar restricciones de seguridad en las cabeceras entregadas a la Smart TV
responseHeaders.delete("X-Frame-Options");
responseHeaders.delete("Content-Security-Policy");
return new Response(response.body, {
status: response.status,
statusText: response.statusText,
headers: responseHeaders,
});
} catch (error) {
return new Response(JSON.stringify({ error: error.message }), {
status: 500,
headers: {
"Content-Type": "application/json",
...getCorsHeaders(),
},
});
}
}
function getCorsHeaders() {
return new Headers({
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "GET, HEAD, POST, OPTIONS",
"Access-Control-Allow-Headers": "Content-Type, Range, User-Agent, Referer, Authorization",
"Access-Control-Expose-Headers": "Content-Length, Content-Range, Content-Type",
});
}