const { useState, useEffect, useRef } = React; /* ---------------- HOME ---------------- */ const TYPE_FILTERS = [ {id:'anime', label:'أنمي'}, {id:'tv', label:'مسلسلات'}, {id:'movie', label:'أفلام'} ]; function HomeScreen({ctx}){ const [filter,setFilter] = useState('anime'); const pool = MAT.all.filter(a=>a.type===filter); const continueList = ctx.continueList(); const latest = [...pool].sort((a,b)=>b.year-a.year).slice(0,10); return (
ctx.go('search')} />
f.id===filter)*-100}%)`}}> {TYPE_FILTERS.map(f=>
setFilter(f.id)}>{f.label}
)}
{continueList.length>0 &&
متابعة المشاهدة
{continueList.map((it,i)=>(
ctx.resume(it)}>
{it.anime.title}
{it.anime.type==='movie'?'استكمال':`م${it.season} ح${it.ep}`}
))}
} {filter!=='movie' && ctx.go('details',{item:a})} />}
{TYPE_FILTERS.find(f=>f.id===filter).label}
{[...pool].sort((a,b)=>b.year-a.year).map(a=>(
ctx.go('details',{item:a})}> {TYPE_LABEL[a.type]}
{a.title}
))}
); } /* ---------------- CATEGORIES ---------------- */ function CategoriesScreen({ctx}){ return (
{MAT.cats.map(c=>(
ctx.go('genre',{cat:c})} style={{borderRadius:16,padding:'22px 16px',background:`linear-gradient(135deg, ${c.hue}33, var(--surface2))`,border:'1px solid var(--border)',fontWeight:700,fontSize:15}}> {c.name}
))}
); } function GenreScreen({ctx, params}){ const c = params.cat; const items = MAT.all.filter(a=>a.genres.includes(c.g)); return (
{items.map(a=>(
ctx.go('details',{item:a})}> {TYPE_LABEL[a.type]}
{a.title}
))}
{!items.length &&
🔍
لا توجد نتائج
}
); } /* ---------------- LIBRARY (favorites + history) ---------------- */ function LibraryScreen({ctx}){ const [tab,setTab] = useState('fav'); const favItems = ctx.favorites.map(id=>ctx.byId(id)).filter(Boolean); const histItems = ctx.history; return (
{tab==='fav' && (favItems.length ? favItems.map(a=>(
ctx.go('details',{item:a})}>
{a.title}
{a.year} · {TYPE_LABEL[a.type]}
{e.stopPropagation();ctx.toggleFav(a.id);}}>
)) :
لا توجد عناصر في المفضلة
)} {tab==='hist' && (histItems.length ? histItems.map((h,i)=>{ const a = ctx.byId(h.animeId); if(!a) return null; return (
ctx.resume({anime:a,season:h.season,ep:h.ep,quality:h.quality})}>
{a.title}
{a.type==='movie'?'فيلم':`م${h.season} ح${h.ep}`}
); }) :
🕐
لا يوجد سجل مشاهدة
)}
); } /* ---------------- SEARCH ---------------- */ function SearchScreen({ctx}){ const [q,setQ] = useState(''); const results = q.trim() ? MAT.all.filter(a=>a.title.toLowerCase().includes(q.toLowerCase())) : []; return (
setQ(e.target.value)} /> {q &&
setQ('')}>
}
{!q &&
🔎
ابحث في كل المحتوى
} {q && !results.length &&
لا توجد نتائج لـ «{q}»
} {results.length>0 &&
{results.map(a=>(
ctx.go('details',{item:a})}> {TYPE_LABEL[a.type]}
{a.title}
))}
}
); } /* ---------------- DETAILS ---------------- */ function DetailsScreen({ctx, params}){ const a = params.item; const [openSeason,setOpenSeason] = useState(0); const isFav = ctx.isFav(a.id); const inProgress = ctx.history.find(h=>h.animeId===a.id && h.progress>0.01 && h.progress<0.98); return (
{a.title}
{a.rating} {a.year}· {a.type==='movie'?`${a.runtime} دقيقة`:`${a.seasons} مواسم`} ·{a.quality}
{a.genres.map(g=> {g})}
{a.desc}
{!(a.type==='movie') &&
{a.seasonsList.map((s,i)=>{ const isOpen = openSeason===i; return (
setOpenSeason(isOpen?-1:i)}> الموسم {s.s} {s.episodes.length} حلقة
{isOpen &&
{s.episodes.map(ep=>(
ctx.go('player',{item:a, season:s.s, episode:ep.n, quality:a.quality})}>
{ep.watched? : ep.n}
{ep.title}
{ep.dur} دقيقة
{ep.progress>0 &&
}
))}
}
); })}
}
); } /* ---------------- PLAYER ---------------- */ function PlayerScreen({ctx, params}){ const a = params.item; const seasonNum = params.season, epNum = params.episode; const [quality,setQuality] = useState(params.quality || a.quality); const [progress,setProgress] = useState(()=> ctx.savedPos(a.id, seasonNum, epNum)); const [playing,setPlaying] = useState(true); const [showQ,setShowQ] = useState(false); const [fullscreen,setFullscreen] = useState(false); const season = a.seasonsList.find(s=>s.s===seasonNum) || a.seasonsList[0]; const ep = season.episodes.find(e=>e.n===epNum) || season.episodes[0]; const durSec = (ep.dur||20)*60; useEffect(()=>{ if(!playing) return; const id = setInterval(()=>{ setProgress(p=>{ const np = Math.min(1, p + (3/durSec)); ctx.recordPlay(a, seasonNum, epNum, quality, np); if(np>=1){ clearInterval(id); } return np; }); },1000); return ()=>clearInterval(id); },[playing, seasonNum, epNum, quality]); const curSec = Math.floor(progress*durSec); const fmt = s=>`${Math.floor(s/60)}:${String(Math.floor(s%60)).padStart(2,'0')}`; const nextEp = season.episodes.find(e=>e.n===epNum+1); const prevEp = season.episodes.find(e=>e.n===epNum-1); return (
{a.title}
{a.type==='movie'? a.title : `الموسم ${seasonNum} · الحلقة ${epNum}`}
setFullscreen(f=>!f)}>
setShowQ(true)}>
{!(a.type==='movie') && } {!(a.type==='movie') && }
{fmt(curSec)}
{fmt(durSec)}
{!fullscreen &&
{a.type==='movie' ?
{a.desc}
:
الموسم {seasonNum}
{season.episodes.map(e=>(
ctx.go('player',{item:a, season:seasonNum, episode:e.n, quality})}>
{e.n}
{e.title}
{e.dur} دقيقة
{e.n===epNum &&
}
))}
}
} {showQ && setShowQ(false)}> {MAT.qualities.map(q=>(
{setQuality(q);setShowQ(false);}}> {q}{q===quality && }
))}
}
); } /* ---------------- SETTINGS ---------------- */ function SettingsScreen({ctx}){ const s = ctx.settings; return (
التشغيل
تشغيل تلقائي للحلقة التالية
ينتقل تلقائيًا عند الانتهاء
ctx.setSetting('autoPlay',!s.autoPlay)}>
استكمال المشاهدة
يبدأ من آخر نقطة توقف
ctx.setSetting('resume',!s.resume)}>
الجودة الافتراضية
{['تلقائي','1080p','720p','480p'].map(q=>( ctx.setSetting('defaultQuality',q)}>{q} ))}
البيانات
{ctx.clearHistory(); ctx.toast('تم مسح السجل');}}>
مسح سجل المشاهدة
{ctx.clearFavorites(); ctx.toast('تم مسح المفضلة');}}>
مسح قائمة المفضلة
حول التطبيق
الإصدار
MY TV Mobile 1.0
); } Object.assign(window, { HomeScreen, CategoriesScreen, GenreScreen, LibraryScreen, SearchScreen, DetailsScreen, PlayerScreen, SettingsScreen });