ملخص المباراة رقم 1
addEventListener('fetch', event => {
event.respondWith(handleRequest(event))
})
async function handleRequest(event) {
const request = event.request
const url = new URL(request.url)
const allowedDomain = "123tv.fun"
const referer = request.headers.get("referer") || ""
const host = url.hostname
if (!referer.includes(allowedDomain) && !referer.includes(host)) {
return new Response("Access Denied",{status:403})
}
const windowsUA =
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36"
const fixedReferer="https://beinmatch11.com"
const fixedOrigin="https://beinmatch11.com"
// ============ MASTER ============
if(url.pathname==="/master.m3u8"){
const list=url.searchParams.get("list")
if(!list)
return new Response("No stream list",{status:400})
const streams=decodeURIComponent(list).split("|")
let master="#EXTM3U\n\n"
streams.forEach((s,i)=>{
let bw=450000
let res="426x240"
if(i==0){bw=1800000;res="1024x576"}
if(i==1){bw=900000;res="640x360"}
if(i==2){bw=450000;res="426x240"}
master+=`#EXT-X-STREAM-INF:BANDWIDTH=${bw},RESOLUTION=${res}\n`
master+=`${url.origin}?proxy=${encodeURIComponent(s)}&mode=1\n\n`
})
return new Response(master,{
headers:{
"Content-Type":"application/vnd.apple.mpegurl",
"Access-Control-Allow-Origin":"*",
"Cache-Control":"no-store, no-cache, must-revalidate"
}
})
}
// ============ SEGMENT ============
if(url.pathname.startsWith("/segment/")){
const segName=decodeURIComponent(
url.pathname.split("/segment/")[1]
)
const cache=caches.default
const cacheKey=new Request(url.toString())
let cached=await cache.match(cacheKey)
if(cached) return cached
const mapKey=new Request("https://segment-map")
const saved=await cache.match(mapKey)
if(!saved)
return new Response("No segment map",{status:500})
const map=await saved.json()
const originalUrl=map[segName]
if(!originalUrl)
return new Response("Segment not found",{status:404})
const r=await fetch(originalUrl,{
headers:{
"User-Agent":windowsUA,
"Referer":fixedReferer,
"Origin":fixedOrigin,
"Accept":"*/*"
}
})
const resp=new Response(r.body,{
status:r.status,
headers:{
"Content-Type":
originalUrl.includes(".js")
?"application/javascript"
:"video/mp2t",
"Access-Control-Allow-Origin":"*",
"Cache-Control":"public,max-age=180,s-maxage=180,stale-while-revalidate=60"
}
})
await cache.put(cacheKey,resp.clone())
return resp
}
// ============ PROXY (FIXED REDIRECT ISSUE) ============
if(url.searchParams.get("proxy")){
const target=url.searchParams.get("proxy")
const mode=url.searchParams.get("mode")
// 🔥 مهم: متابعة التحويلات
let response = await fetch(target, {
redirect: "follow",
cf: {
cacheEverything: false,
cacheTtl: 0
},
headers: {
"User-Agent": windowsUA,
"Referer": fixedReferer,
"Origin": fixedOrigin,
"Accept": "*/*"
}
})
// 🔥 حل 301/302 يدوي إذا لزم
if(response.status >= 300 && response.status < 400){
const location = response.headers.get("Location")
if(location){
response = await fetch(location, {
redirect: "follow",
headers: {
"User-Agent": windowsUA,
"Referer": fixedReferer,
"Origin": fixedOrigin,
"Accept": "*/*"
}
})
}
}
const type = response.headers.get("content-type") || ""
if((target.includes(".m3u8")||target.includes(".json")) && mode==="1"){
const text=await response.text()
const cache=caches.default
const mapKey=new Request("https://segment-map")
let map={}
const old=await cache.match(mapKey)
if(old) map=await old.json()
const rewritten=text.split("\n").map(line=>{
if(line.startsWith("#")||!line.trim())
return line
const full=line.startsWith("http")
?line
:new URL(line,target).href
let segName
const query=full.split("?")[1]
if(query && query.includes("/")){
segName=query.split("&")[0]
}else{
segName=
full.split("/")
.pop()
.split("?")[0]
.replace(/\.(js|ts)$/,"")
}
map[segName]=full
return `${url.origin}/segment/${segName}`
}).join("\n")
await cache.put(
mapKey,
new Response(JSON.stringify(map))
)
return new Response(rewritten,{
headers:{
"Content-Type":"application/vnd.apple.mpegurl",
"Access-Control-Allow-Origin":"*",
"Cache-Control":"no-store, no-cache, must-revalidate"
}
})
}
return new Response(response.body,{
status:response.status,
headers:{
"Content-Type":type,
"Access-Control-Allow-Origin":"*"
}
})
}
// ============ PLAYER ============
const video0Url=url.searchParams.get("video0")
const video1Url=url.searchParams.get("video1")
let proxiedUrl=""
let playerType="plyr"
if(video0Url){
playerType="videojs"
if(video0Url.includes("|")){
proxiedUrl=`${url.origin}/master.m3u8?list=${encodeURIComponent(video0Url)}`
}else{
proxiedUrl=`${url.origin}?proxy=${encodeURIComponent(video0Url)}&mode=1`
}
}else if(video1Url){
playerType="plyr"
if(video1Url.includes("|")){
proxiedUrl=`${url.origin}/master.m3u8?list=${encodeURIComponent(video1Url)}`
}else{
proxiedUrl=`${url.origin}?proxy=${encodeURIComponent(video1Url)}&mode=1`
}
}else{
proxiedUrl=`${url.origin}?proxy=${encodeURIComponent("https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8")}&mode=1`
}
// ============ HTML (بدون تغيير) ============
return new Response(`
`,{
headers:{
"Content-Type":"text/html;charset=UTF-8",
"Content-Security-Policy":
"frame-ancestors https://www.123tv.fun"
}
})
}