Spaces:
Running
Running
Upload index.html
Browse files- index.html +39 -7
index.html
CHANGED
|
@@ -1481,6 +1481,42 @@ const TRANSLATED_KEY = JM_CONFIG.TRANSLATED_KEY;
|
|
| 1481 |
// Id zake zinaanza na 'n2-' ili zisigongane na za chanzo cha zamani.
|
| 1482 |
const TRANSLATED2_BASE = JM_CONFIG.CONTENT_URL + '/functions/v1/movie-zilizotafsriwa2';
|
| 1483 |
const TR2_PREFIX = 'n2-';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1484 |
async function fetchTranslatedMovie(id) { // -> { ok, error?, movie } kutoka chanzo sahihi
|
| 1485 |
const isNew = String(id).startsWith(TR2_PREFIX);
|
| 1486 |
const url = isNew ? TRANSLATED2_BASE + '?id=' + encodeURIComponent(String(id).slice(TR2_PREFIX.length))
|
|
@@ -3619,13 +3655,8 @@ async function loadTranslated() {
|
|
| 3619 |
heroWrap.innerHTML = ''; tabsEl.style.display = 'none';
|
| 3620 |
renderSkeletonRails(2);
|
| 3621 |
try {
|
| 3622 |
-
const items = await fetchTranslatedList();
|
| 3623 |
-
|
| 3624 |
-
const movies = items.filter(it => !(it.subtitle === 'Series'));
|
| 3625 |
-
const sections = [];
|
| 3626 |
-
if (movies.length) sections.push({ title: t('tr_movies'), items: movies });
|
| 3627 |
-
if (series.length) sections.push({ title: t('tr_series'), items: series });
|
| 3628 |
-
renderRails(sections, true);
|
| 3629 |
} catch (e) {
|
| 3630 |
railsEl.innerHTML = '';
|
| 3631 |
railsEl.appendChild(stateBox(t('err_failed', { e: esc(e.message || t('err_generic')) }), true, loadTranslated));
|
|
@@ -3857,6 +3888,7 @@ function playTranslatedUrl(url, title, playlist, meta) {
|
|
| 3857 |
v.addEventListener('ended', () => { const c = window.__pcPlaylist; if (c && typeof c.next === 'function') c.next(); });
|
| 3858 |
// Tangazo la video kwanza (likishindikana/likiruka, filamu inaanza mara moja)
|
| 3859 |
v.src = url;
|
|
|
|
| 3860 |
// Route ya player: #/translated/ID/play?se=..&ep=..
|
| 3861 |
try {
|
| 3862 |
const id = currentTranslatedDetail && currentTranslatedDetail.id;
|
|
|
|
| 1481 |
// Id zake zinaanza na 'n2-' ili zisigongane na za chanzo cha zamani.
|
| 1482 |
const TRANSLATED2_BASE = JM_CONFIG.CONTENT_URL + '/functions/v1/movie-zilizotafsriwa2';
|
| 1483 |
const TR2_PREFIX = 'n2-';
|
| 1484 |
+
// Model iliyofunzwa (train.py -> HF Model). Ikikosekana, app inafanya kazi kama kawaida (Trending = mpya zaidi).
|
| 1485 |
+
const TR_MODEL_URL = 'https://huggingface.co/jaynesmaxtv/translated-recommender/resolve/main/model.json';
|
| 1486 |
+
let trModelP = null;
|
| 1487 |
+
function loadTrModel() {
|
| 1488 |
+
if (!trModelP) trModelP = fetch(TR_MODEL_URL, { cache: 'no-cache' }).then(r => r.ok ? r.json() : null).catch(() => null);
|
| 1489 |
+
return trModelP;
|
| 1490 |
+
}
|
| 1491 |
+
function logTrPlay(id) { // rekodi uchezaji bila kuzuia player; kitambulisho cha kifaa ni cha nasibu (hakuna jina/email)
|
| 1492 |
+
if (!id) return;
|
| 1493 |
+
let dev = '';
|
| 1494 |
+
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 (_) {}
|
| 1495 |
+
fetch(TRANSLATED2_BASE + '?action=play', { method: 'POST', keepalive: true,
|
| 1496 |
+
headers: { apikey: SUPABASE_ANON_KEY, 'Content-Type': 'application/json' },
|
| 1497 |
+
body: JSON.stringify({ movie_id: String(id), device_id: dev }) }).catch(() => {});
|
| 1498 |
+
}
|
| 1499 |
+
// Safu: 🔥 Trending (kwa model, au mpya zaidi kama data haitoshi) -> kila DJ (Dj Mack kwanza) -> Movie -> Series
|
| 1500 |
+
function buildTranslatedSections(items, model) {
|
| 1501 |
+
const pop = (model && model.popularity) || {}, sections = [];
|
| 1502 |
+
const hot = items.filter(it => pop[it.id] > 0).sort((a, b) => pop[b.id] - pop[a.id]);
|
| 1503 |
+
const trending = (hot.length >= 3 ? hot : items).slice(0, 12); // orodha tayari ni mpya -> zamani
|
| 1504 |
+
if (trending.length) sections.push({ title: '🔥 Trending', items: trending });
|
| 1505 |
+
const byDj = {};
|
| 1506 |
+
items.forEach(it => {
|
| 1507 |
+
const dj = String(it.subtitle || '').trim();
|
| 1508 |
+
if (!dj || dj === 'Series' || dj === 'Movie') return;
|
| 1509 |
+
const k = dj.toLowerCase();
|
| 1510 |
+
(byDj[k] = byDj[k] || { name: dj, list: [] }).list.push(it);
|
| 1511 |
+
});
|
| 1512 |
+
Object.values(byDj).filter(g => g.list.length >= 2)
|
| 1513 |
+
.sort((a, b) => (/mack/i.test(b.name) - /mack/i.test(a.name)) || b.list.length - a.list.length)
|
| 1514 |
+
.forEach(g => sections.push({ title: '🎙 ' + g.name, items: g.list }));
|
| 1515 |
+
const series = items.filter(it => it.subtitle === 'Series'), movies = items.filter(it => it.subtitle !== 'Series');
|
| 1516 |
+
if (movies.length) sections.push({ title: t('tr_movies'), items: movies });
|
| 1517 |
+
if (series.length) sections.push({ title: t('tr_series'), items: series });
|
| 1518 |
+
return sections;
|
| 1519 |
+
}
|
| 1520 |
async function fetchTranslatedMovie(id) { // -> { ok, error?, movie } kutoka chanzo sahihi
|
| 1521 |
const isNew = String(id).startsWith(TR2_PREFIX);
|
| 1522 |
const url = isNew ? TRANSLATED2_BASE + '?id=' + encodeURIComponent(String(id).slice(TR2_PREFIX.length))
|
|
|
|
| 3655 |
heroWrap.innerHTML = ''; tabsEl.style.display = 'none';
|
| 3656 |
renderSkeletonRails(2);
|
| 3657 |
try {
|
| 3658 |
+
const [items, model] = await Promise.all([fetchTranslatedList(), loadTrModel()]);
|
| 3659 |
+
renderRails(buildTranslatedSections(items, model), true);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3660 |
} catch (e) {
|
| 3661 |
railsEl.innerHTML = '';
|
| 3662 |
railsEl.appendChild(stateBox(t('err_failed', { e: esc(e.message || t('err_generic')) }), true, loadTranslated));
|
|
|
|
| 3888 |
v.addEventListener('ended', () => { const c = window.__pcPlaylist; if (c && typeof c.next === 'function') c.next(); });
|
| 3889 |
// Tangazo la video kwanza (likishindikana/likiruka, filamu inaanza mara moja)
|
| 3890 |
v.src = url;
|
| 3891 |
+
try { logTrPlay(currentTranslatedDetail && currentTranslatedDetail.id); } catch (_) {}
|
| 3892 |
// Route ya player: #/translated/ID/play?se=..&ep=..
|
| 3893 |
try {
|
| 3894 |
const id = currentTranslatedDetail && currentTranslatedDetail.id;
|