Spaces:
Running
Running
Upload index.html
Browse files- index.html +0 -93
index.html
CHANGED
|
@@ -1491,77 +1491,8 @@ const PIXTVMAX_KEY = SUPABASE_ANON_KEY;
|
|
| 1491 |
const TRAILER_BASE = JM_CONFIG.CONTENT_URL + '/functions/v1/movie-trailer';
|
| 1492 |
const TRAILER_KEY = SUPABASE_ANON_KEY;
|
| 1493 |
|
| 1494 |
-
// movie-zilizotafsiriwa β mradi TOFAUTI (DJ movies/series), function ya umma pekee (GET)
|
| 1495 |
-
// movie-zilizotafsriwa2 β filamu zenye MP4 (draft/public kutoka admin); project ile ile ya CONTENT_URL.
|
| 1496 |
-
// Id zake zinaanza na 'n2-' ili zisigongane na za chanzo cha zamani.
|
| 1497 |
-
const TRANSLATED2_BASE = JM_CONFIG.CONTENT_URL + '/functions/v1/movie-zilizotafsriwa2';
|
| 1498 |
-
const TR2_PREFIX = 'n2-';
|
| 1499 |
-
// movie-public2 β Absalom Family (Season Zilizotafsiriwa). Project ile ile ya CONTENT_URL. Id zake zinaanza na 'ab-'.
|
| 1500 |
-
const ABSALOM_BASE = JM_CONFIG.CONTENT_URL + '/functions/v1/movie-zilizotafsriwa3';
|
| 1501 |
// Chanzo kimoja cha Zilizotafsiriwa: movie-translated-all (inaunganisha old + n2 + absalom)
|
| 1502 |
const TRANSLATED_ALL = JM_CONFIG.CONTENT_URL + '/functions/v1/movie-translated-all';
|
| 1503 |
-
const AB_PREFIX = 'ab-';
|
| 1504 |
-
const AB_MAX_POSTS = 1000; // posts zisizozidi 1000 kwenye orodha
|
| 1505 |
-
// Jina la kipindi: "EP1" / "Episode 1" / "1" -> "1" (ili ionekane kama Episode 1 na download iwe na namba); vinginevyo jina kamili
|
| 1506 |
-
function abEpKey(label, used) {
|
| 1507 |
-
const m = String(label || '').match(/^\s*(?:ep|episode|ep\.)?\s*(\d+)\s*$/i);
|
| 1508 |
-
let k = m ? m[1] : (String(label || '').trim() || 'EP');
|
| 1509 |
-
if (used.has(k)) { let n = 2; while (used.has(k + ' (' + n + ')')) n++; k = k + ' (' + n + ')'; }
|
| 1510 |
-
used.add(k);
|
| 1511 |
-
return k;
|
| 1512 |
-
}
|
| 1513 |
-
const TR_DJ_NOISE = /\b(movies?|filamu|zote|zilizotafsiriwa|zilizotafsiri|imetafsiriwa|iliyotafsiriwa|tafsiriwa|kiswahili|swahili|kwa|mpya|kali|translated|new|all|series|full)\b/gi;
|
| 1514 |
-
function normDj(raw) { // jina safi la DJ (bila maneno ya ziada na bila tofauti za herufi kubwa/ndogo)
|
| 1515 |
-
const s = String(raw || '').replace(/\(.*?\)|\[.*?\]/g, ' ').replace(TR_DJ_NOISE, ' ').replace(/[|_\-\u2013\u2014:,.]+/g, ' ').replace(/\s+/g, ' ').trim();
|
| 1516 |
-
if (!s || /^dj$/i.test(s)) return '';
|
| 1517 |
-
return s.split(' ').map(w => /^dj$/i.test(w) ? 'DJ' : w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()).join(' ');
|
| 1518 |
-
}
|
| 1519 |
-
// Model iliyofunzwa (train.py -> HF Model). Ikikosekana, app inafanya kazi kama kawaida (Trending = mpya zaidi).
|
| 1520 |
-
const TR_MODEL_URL = 'https://huggingface.co/jaynesmaxtv/translated-recommender/resolve/main/model.json';
|
| 1521 |
-
let trModelP = null;
|
| 1522 |
-
function loadTrModel() {
|
| 1523 |
-
if (!trModelP) trModelP = fetch(TR_MODEL_URL, { cache: 'no-cache' }).then(r => r.ok ? r.json() : null).catch(() => null);
|
| 1524 |
-
return trModelP;
|
| 1525 |
-
}
|
| 1526 |
-
function logTrPlay(id) { // rekodi uchezaji bila kuzuia player; kitambulisho cha kifaa ni cha nasibu (hakuna jina/email)
|
| 1527 |
-
if (!id || String(id).startsWith(AB_PREFIX) || String(id).startsWith('abm-')) return;
|
| 1528 |
-
let dev = '';
|
| 1529 |
-
try { dev = localStorage.getItem('jm_dev') || ''; if (!dev) { dev = (crypto.randomUUID && crypto.randomUUID()) || (Date.now() + '-' + Math.random().toString(36).slice(2)); localStorage.setItem('jm_dev', dev); } } catch (_) {}
|
| 1530 |
-
fetch(TRANSLATED2_BASE + '?action=play', { method: 'POST', keepalive: true,
|
| 1531 |
-
headers: { apikey: SUPABASE_ANON_KEY, 'Content-Type': 'application/json' },
|
| 1532 |
-
body: JSON.stringify({ movie_id: String(id), device_id: dev }) }).catch(() => {});
|
| 1533 |
-
}
|
| 1534 |
-
// Rails za mlalo: Trending Now (Top 10, kwa model au mpya zaidi) -> New Releases -> kila DJ (DJ Mack kwanza) -> Series -> More to Watch
|
| 1535 |
-
function buildTranslatedSections(items, model) {
|
| 1536 |
-
const pop = (model && model.popularity) || {}, sections = [], covered = new Set();
|
| 1537 |
-
const hot = items.filter(it => pop[it.id] > 0).sort((a, b) => pop[b.id] - pop[a.id]);
|
| 1538 |
-
// Trending halisi (Top 10) inaonekana tu pale model ina data ya kutosha; kabla ya hapo ni "New Releases" tu (si udanganyifu)
|
| 1539 |
-
if (hot.length >= 5) sections.push({ title: t('tr_trending'), items: hot.slice(0, 10).map((it, i) => ({ ...it, rank: i + 1 })) });
|
| 1540 |
-
if (hot.length < 5 || items.length > 6) sections.push({ title: t('tr_new'), items: items.slice(0, 20) }); // orodha tayari ni mpya -> zamani
|
| 1541 |
-
const byDj = {};
|
| 1542 |
-
items.forEach(it => {
|
| 1543 |
-
const dj = String(it.subtitle || '').trim();
|
| 1544 |
-
if (!dj || dj === 'Series' || dj === 'Movie') return;
|
| 1545 |
-
(byDj[dj.toLowerCase()] = byDj[dj.toLowerCase()] || { name: dj, list: [] }).list.push(it);
|
| 1546 |
-
});
|
| 1547 |
-
Object.values(byDj).filter(g => g.list.length >= 2)
|
| 1548 |
-
.sort((a, b) => (/mack/i.test(b.name) - /mack/i.test(a.name)) || b.list.length - a.list.length)
|
| 1549 |
-
.forEach(g => { g.list.forEach(it => covered.add(it.id)); sections.push({ title: g.name, items: g.list.slice(0, 40).map(it => ({ ...it, subtitle: '' })) }); });
|
| 1550 |
-
const series = items.filter(it => it.isSeries);
|
| 1551 |
-
if (series.length) { series.forEach(it => covered.add(it.id)); sections.push({ title: t('tr_series'), items: series }); }
|
| 1552 |
-
const more = items.filter(it => !covered.has(it.id));
|
| 1553 |
-
if (more.length) sections.push({ title: t('tr_more'), items: more.slice(0, 40) });
|
| 1554 |
-
return sections;
|
| 1555 |
-
}
|
| 1556 |
-
async function fetchAbsalomMovie(slug) { // -> { ok, error?, movie } ikiwa na video_urls kama series nyingine
|
| 1557 |
-
const r = await fetch(ABSALOM_BASE + '?slug=' + encodeURIComponent(slug), { headers: { apikey: SUPABASE_ANON_KEY } });
|
| 1558 |
-
const d = await r.json().catch(() => ({}));
|
| 1559 |
-
const p = (d.posts || [])[0];
|
| 1560 |
-
if (!r.ok || !d.ok || !p) return { ok: false, error: d.error || 'Haipatikani' };
|
| 1561 |
-
const used = new Set(), eps = {};
|
| 1562 |
-
(p.episodes || []).forEach(e => { if (e && e.mp4_url) eps[abEpKey(e.label, used)] = e.mp4_url; });
|
| 1563 |
-
return { ok: true, movie: { title: p.title, dj: p.dj, poster_url: p.poster, video_urls: { 'Season 1': eps } } };
|
| 1564 |
-
}
|
| 1565 |
async function fetchTranslatedMovie(id) { // -> { ok, error?, movie } kutoka movie-translated-all
|
| 1566 |
const r = await fetch(TRANSLATED_ALL + '?id=' + encodeURIComponent(id), { headers: { apikey: SUPABASE_ANON_KEY } });
|
| 1567 |
const d = await r.json().catch(() => ({}));
|
|
@@ -3795,29 +3726,6 @@ async function loadLive() {
|
|
| 3795 |
}
|
| 3796 |
|
| 3797 |
// ββ ZILIZOTAFSIRIWA (movies/series za DJ β mradi tofauti) ββ
|
| 3798 |
-
// Orodha ya Absalom: cards=1 (bila vipindi) + has_mp4=1; inahifadhiwa kwenye kumbukumbu dakika 10 ili tab/home zisipakie tena
|
| 3799 |
-
let absCardsCache = null, absCardsAt = 0, absCardsP = null;
|
| 3800 |
-
function absalomCardsCached() {
|
| 3801 |
-
if (absCardsCache && Date.now() - absCardsAt < 10 * 60 * 1000) return Promise.resolve(absCardsCache);
|
| 3802 |
-
if (!absCardsP) {
|
| 3803 |
-
absCardsP = (async () => {
|
| 3804 |
-
const out = [];
|
| 3805 |
-
for (let off = 0; off < AB_MAX_POSTS; off += 100) {
|
| 3806 |
-
const r = await fetch(ABSALOM_BASE + '?cards=1&has_mp4=1&limit=100&offset=' + off, { headers: { apikey: SUPABASE_ANON_KEY } });
|
| 3807 |
-
if (!r.ok) throw new Error(T('err_generic') + ' ' + r.status);
|
| 3808 |
-
const d = await r.json();
|
| 3809 |
-
if (!d.ok) throw new Error(d.error || 'Absalom imekataa ombi.');
|
| 3810 |
-
(d.posts || []).forEach(p => out.push({ id: String(p.slug || '').replace(/^absalom-/, ''), title: p.title, dj: p.dj,
|
| 3811 |
-
poster_url: p.poster, category: p.kind === 'series' ? 'series' : 'movie' }));
|
| 3812 |
-
if (d.done || !d.count) break;
|
| 3813 |
-
}
|
| 3814 |
-
absCardsCache = out; absCardsAt = Date.now();
|
| 3815 |
-
return out;
|
| 3816 |
-
})().finally(() => { absCardsP = null; });
|
| 3817 |
-
}
|
| 3818 |
-
return absCardsP;
|
| 3819 |
-
}
|
| 3820 |
-
|
| 3821 |
async function fetchTranslatedList() { // movie-translated-all: orodha moja iliyounganishwa
|
| 3822 |
const r = await fetch(TRANSLATED_ALL, { headers: { apikey: SUPABASE_ANON_KEY } });
|
| 3823 |
if (!r.ok) throw new Error(T('err_generic') + ' ' + r.status);
|
|
@@ -4063,7 +3971,6 @@ function playTranslatedUrl(url, title, playlist, meta) {
|
|
| 4063 |
v.addEventListener('ended', () => { const c = window.__pcPlaylist; if (c && typeof c.next === 'function') c.next(); });
|
| 4064 |
// Tangazo la video kwanza (likishindikana/likiruka, filamu inaanza mara moja)
|
| 4065 |
v.src = url;
|
| 4066 |
-
try { logTrPlay(currentTranslatedDetail && currentTranslatedDetail.id); } catch (_) {}
|
| 4067 |
// Route ya player: #/translated/ID/play?se=..&ep=..
|
| 4068 |
try {
|
| 4069 |
const id = currentTranslatedDetail && currentTranslatedDetail.id;
|
|
|
|
| 1491 |
const TRAILER_BASE = JM_CONFIG.CONTENT_URL + '/functions/v1/movie-trailer';
|
| 1492 |
const TRAILER_KEY = SUPABASE_ANON_KEY;
|
| 1493 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1494 |
// Chanzo kimoja cha Zilizotafsiriwa: movie-translated-all (inaunganisha old + n2 + absalom)
|
| 1495 |
const TRANSLATED_ALL = JM_CONFIG.CONTENT_URL + '/functions/v1/movie-translated-all';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1496 |
async function fetchTranslatedMovie(id) { // -> { ok, error?, movie } kutoka movie-translated-all
|
| 1497 |
const r = await fetch(TRANSLATED_ALL + '?id=' + encodeURIComponent(id), { headers: { apikey: SUPABASE_ANON_KEY } });
|
| 1498 |
const d = await r.json().catch(() => ({}));
|
|
|
|
| 3726 |
}
|
| 3727 |
|
| 3728 |
// ββ ZILIZOTAFSIRIWA (movies/series za DJ β mradi tofauti) ββ
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3729 |
async function fetchTranslatedList() { // movie-translated-all: orodha moja iliyounganishwa
|
| 3730 |
const r = await fetch(TRANSLATED_ALL, { headers: { apikey: SUPABASE_ANON_KEY } });
|
| 3731 |
if (!r.ok) throw new Error(T('err_generic') + ' ' + r.status);
|
|
|
|
| 3971 |
v.addEventListener('ended', () => { const c = window.__pcPlaylist; if (c && typeof c.next === 'function') c.next(); });
|
| 3972 |
// Tangazo la video kwanza (likishindikana/likiruka, filamu inaanza mara moja)
|
| 3973 |
v.src = url;
|
|
|
|
| 3974 |
// Route ya player: #/translated/ID/play?se=..&ep=..
|
| 3975 |
try {
|
| 3976 |
const id = currentTranslatedDetail && currentTranslatedDetail.id;
|