Sir tv
export default {
async fetch(request, env, ctx) {
const referer = request.headers.get("Referer") || "";
const origin = request.headers.get("Origin") || "";
const allowedDomain = "123tv.fun";
if (
!referer.includes(allowedDomain) &&
!origin.includes(allowedDomain)
) {
return new Response("Forbidden", { status: 403 });
}
const target = new URL(request.url).searchParams.get("url");
if (!target) {
return new Response("Missing url", { status: 400 });
}
const cache = caches.default;
const cacheKey = new Request(request.url, request);
// البحث في الكاش أولاً (للـ TS فقط)
const cached = await cache.match(cacheKey);
if (cached) {
return cached;
}
const res = await fetch(target, {
headers: {
"Referer": "https://912acsss8af382.shootny.com/",
"Origin": "https://912acsss8af382.shootny.com/",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36"
}
});
const contentType = (res.headers.get("Content-Type") || "").toLowerCase();
const isM3U8 =
contentType.includes("application/vnd.apple.mpegurl") ||
contentType.includes("application/x-mpegurl") ||
contentType.includes("audio/mpegurl");
let response;
if (isM3U8) {
let text = await res.text();
const base = target.substring(0, target.lastIndexOf("/") + 1);
text = text.replace(/^(?!#)(.+)$/gm, (line) => {
if (!line.trim()) return line;
if (line.startsWith("http://") || line.startsWith("https://")) {
return request.url.split("?")[0] +
"?url=" +
encodeURIComponent(line);
}
return request.url.split("?")[0] +
"?url=" +
encodeURIComponent(base + line);
});
response = new Response(text, {
headers: {
"Content-Type": "application/vnd.apple.mpegurl",
"Access-Control-Allow-Origin": "*",
"Cache-Control": "no-store, no-cache, must-revalidate"
}
});
} else {
const data = new Uint8Array(await res.arrayBuffer());
let start = -1;
// البحث عن نهاية JPEG ثم بداية TS
for (let i = 0; i < data.length - 2; i++) {
if (
data[i] === 0xFF &&
data[i + 1] === 0xD9 &&
data[i + 2] === 0x47
) {
start = i + 2;
break;
}
}
// إذا لم نجد JPEG+TS نرجع الملف كما هو
const body = start !== -1 ? data.slice(start) : data;
const headers = new Headers(res.headers);
headers.set("Content-Type", "video/mp2t");
headers.set("Cache-Control", "public, max-age=180");
headers.set("Access-Control-Allow-Origin", "*");
response = new Response(body, {
status: res.status,
statusText: res.statusText,
headers
});
ctx.waitUntil(cache.put(cacheKey, response.clone()));
}
return response;
}
};