/** * Series search functionality for FS7 */ // Handle series search async function handleSeriesSearch() { const searchInput = document.getElementById('seriesSearchInput'); const resultsContainer = document.getElementById('seriesSearchResults'); if (!searchInput || !resultsContainer) return; const query = searchInput.value.trim(); if (!query) { alert('Veuillez entrer un nom de série'); return; } try { resultsContainer.innerHTML = '
Recherche de séries TV en cours...
'; // Search on series providers using the dedicated endpoint const response = await fetch(`${API_BASE}/series/search?q=${encodeURIComponent(query)}&lang=vf`); const data = await response.json(); if (data.results && data.results['fs7'] && data.results['fs7'].length > 0) { const series = data.results['fs7']; let html = `

Résultats pour "${escapeHtml(query)}"

`; series.forEach(s => { let coverImage = s.cover_image || ''; // Convert relative poster.php URLs to absolute URLs if (coverImage.startsWith('/poster.php?url=')) { const actualUrl = coverImage.replace('/poster.php?url=', ''); coverImage = actualUrl; } else if (coverImage.startsWith('/')) { coverImage = 'https://fs7.lol' + coverImage; } html += `

${escapeHtml(s.title)}

French Stream
${coverImage ? `
` : ''}
`; }); html += '
'; resultsContainer.innerHTML = html; } else { resultsContainer.innerHTML = `

Aucune série trouvée pour "${escapeHtml(query)}"

Essayez avec un autre titre ou vérifiez l'orthographe

`; } } catch (error) { console.error('Error searching series:', error); resultsContainer.innerHTML = `

Erreur lors de la recherche

${error.message}

`; } } // Load series episodes directly — shows an inline episode list with download buttons async function loadSeriesEpisodesDirect(url, title) { const episodesContainer = document.getElementById(`episodes-fs7-${encodeURIComponent(url)}`); if (!episodesContainer) return; try { episodesContainer.innerHTML = `
Chargement des épisodes...
`; const response = await fetch(`${API_BASE}/anime/episodes?url=${encodeURIComponent(url)}&lang=vf`); const data = await response.json(); if (data.episodes && data.episodes.length > 0) { const totalEps = data.episodes.length; let html = `
${totalEps} épisodes disponibles
`; episodesContainer.innerHTML = html; } else { episodesContainer.innerHTML = `
Aucun épisode disponible
`; } } catch (error) { console.error('Error loading episodes:', error); episodesContainer.innerHTML = `
Erreur: ${error.message}
`; } } // Download all series episodes async function downloadAllSeriesEpisodes(button, url, title) { const container = button.closest('.mt-3'); const episodeBtns = container.querySelectorAll('ul button[hx-post*="/api/anime/download"]'); // Visual feedback: disable button, show spinner button.disabled = true; const originalHtml = button.innerHTML; button.innerHTML = ' En cours...'; let completed = 0; const total = episodeBtns.length; const results = await Promise.allSettled( [...episodeBtns].map(btn => { const hxPost = btn.getAttribute('hx-post'); const epUrl = hxPost.split('url=')[1]; return fetch(`${API_BASE}/anime/download?url=${encodeURIComponent(epUrl)}`, { method: 'POST' }) .then(r => { completed++; // Visual: mark episode button as done btn.innerHTML = ''; btn.disabled = true; btn.classList.remove('btn-outline', 'btn-success'); btn.classList.add('btn-ghost', 'pointer-events-none'); return r; }); }) ); button.innerHTML = ' Terminé'; showToast(`${completed} épisodes de "${title}" mis en file`); // Reset button after delay setTimeout(() => { button.innerHTML = originalHtml; button.disabled = false; }, 5000); } // Download series episode (single - kept for compatibility) async function downloadSeriesEpisode(url, title) { const select = document.getElementById(`select-episodes-${encodeURIComponent(url)}`); if (!select || !select.value) { showToast('Veuillez sélectionner un épisode', 'warning'); return; } const episodeUrl = select.value; try { const response = await fetch(`${API_BASE}/anime/download?url=${encodeURIComponent(episodeUrl)}`, { method: 'POST' }); if (response.ok) { showToast(`Téléchargement démarré pour "${title}"`); if (typeof loadDownloads === 'function') { loadDownloads(); } } else { const error = await response.json(); const errorMessage = error.detail ? (typeof error.detail === 'string' ? error.detail : JSON.stringify(error.detail)) : 'Impossible de démarrer le téléchargement'; showToast(`Erreur : ${errorMessage}`, 'error'); } } catch (error) { console.error('Download error:', error); showToast(`Erreur lors du téléchargement : ${error.message}`, 'error'); } } // Make functions available globally window.handleSeriesSearch = handleSeriesSearch; window.loadSeriesEpisodesDirect = loadSeriesEpisodesDirect; window.downloadSeriesEpisode = downloadSeriesEpisode; window.downloadAllSeriesEpisodes = downloadAllSeriesEpisodes;