import { getItem, getSeriesSeasons, getSeriesEpisodes } from '../embyApi.js'; import { createParty } from '../party.js'; import { navigate } from '../router.js'; import { escapeHtml } from '../tiles.js'; export async function renderSeries(root, params) { const seriesId = params.id; root.innerHTML = '

Chargement...

'; let series; let seasons; try { [series, seasons] = await Promise.all([getItem(seriesId), getSeriesSeasons(seriesId)]); } catch (err) { root.innerHTML = '

Impossible de charger cette série.

'; return; } root.innerHTML = `

${escapeHtml(series.name)}${series.year ? ` (${series.year})` : ''}

${series.overview ? `

${escapeHtml(series.overview)}

` : ''} Voir sur Emby

Chargement...

`; root.querySelector('#back').addEventListener('click', () => history.back()); if (!seasons.length) { root.querySelector('#episodeList').innerHTML = '

Aucune saison trouvée.

'; return; } const tabsEl = root.querySelector('#seasonTabs'); tabsEl.innerHTML = seasons .map((s, i) => ``) .join(''); tabsEl.querySelectorAll('.tab').forEach((tab) => { tab.addEventListener('click', () => { if (tab.classList.contains('active')) return; tabsEl.querySelectorAll('.tab').forEach((t) => t.classList.remove('active')); tab.classList.add('active'); loadEpisodes(root, seriesId, tab.dataset.seasonId); }); }); loadEpisodes(root, seriesId, seasons[0].id); } async function loadEpisodes(root, seriesId, seasonId) { const listEl = root.querySelector('#episodeList'); listEl.innerHTML = '

Chargement...

'; let episodes; try { episodes = await getSeriesEpisodes(seriesId, seasonId); } catch (err) { listEl.innerHTML = '

Impossible de charger les épisodes.

'; return; } if (!episodes.length) { listEl.innerHTML = '

Aucun épisode dans cette saison.

'; return; } // Starting a party from any episode here queues the rest of the series // from that point on server-side (see server/src/index.js) - the host can // then use "Épisode suivant" in the player instead of restarting per episode. listEl.innerHTML = episodes.map((ep) => `
${ep.year ? ep.year + ' · ' : ''}${escapeHtml(ep.name)}

${escapeHtml(ep.overview || '')}

`).join(''); listEl.querySelectorAll('.startEpisodeBtn').forEach((btn) => { btn.addEventListener('click', async () => { btn.disabled = true; btn.textContent = 'Démarrage...'; try { const party = await createParty(btn.dataset.itemId); navigate(`/party/${party.partyId}`); } catch (err) { alert(err.message); btn.disabled = false; btn.textContent = 'Lancer une watch party'; } }); }); }