jaynesmax commited on
Commit
905b99b
Β·
verified Β·
1 Parent(s): d8e0658

Upload index.html

Browse files
Files changed (1) hide show
  1. 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;