/** * Lycostorrent - Admin RSS * Gestion des flux RSS pour les nouveautés */ document.addEventListener('DOMContentLoaded', () => { loadFeeds(); setupEventListeners(); }); function setupEventListeners() { // Formulaire d'ajout document.getElementById('add-feed-form').addEventListener('submit', addFeed); // Bouton test document.getElementById('test-feed-btn').addEventListener('click', testFeed); } // ============================================================ // CHARGEMENT DES FLUX // ============================================================ async function loadFeeds() { try { const response = await fetch('/api/admin/rss'); const data = await response.json(); if (data.success) { renderFeeds(data.feeds); } else { showError('Erreur lors du chargement des flux RSS'); } } catch (error) { console.error('Erreur:', error); showError('Impossible de charger les flux RSS'); } } function renderFeeds(feeds) { const container = document.getElementById('feeds-list'); if (feeds.length === 0) { container.innerHTML = `

🔗 Aucun flux RSS configuré

Ajoutez votre premier flux ci-dessus pour commencer

`; return; } container.innerHTML = feeds.map(feed => `

${escapeHtml(feed.name)}

${getCategoryLabel(feed.category)} ${feed.use_flaresolverr ? '🛡️ Flaresolverr' : ''} ${feed.has_cookies ? '🍪 Cookies' : ''}
${maskUrl(feed.url)}
${feed.passkey ? '
🔑 Passkey configuré
' : ''}
`).join(''); } function getCategoryLabel(category) { const labels = { 'movies': '🎬 Films', 'tv': '📺 Séries', 'anime': '🎌 Anime', 'music': '🎵 Musique', 'all': '📦 Toutes' }; return labels[category] || category; } function maskUrl(url) { // Masquer le passkey dans l'URL pour l'affichage return url.replace(/passkey=[^&]+/gi, 'passkey=***') .replace(/apikey=[^&]+/gi, 'apikey=***') .replace(/key=[^&]+/gi, 'key=***'); } // ============================================================ // AJOUT DE FLUX // ============================================================ async function addFeed(e) { e.preventDefault(); const feed = { name: document.getElementById('feed-name').value.trim(), url: document.getElementById('feed-url').value.trim(), category: document.getElementById('feed-category').value, passkey: document.getElementById('feed-passkey').value.trim(), use_flaresolverr: document.getElementById('feed-flaresolverr').checked, cookies: document.getElementById('feed-cookies').value.trim() }; if (!feed.name || !feed.url || !feed.category) { showError('Veuillez remplir tous les champs obligatoires'); return; } try { const response = await fetch('/api/admin/rss', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(feed) }); const data = await response.json(); if (data.success) { // Réinitialiser le formulaire document.getElementById('add-feed-form').reset(); document.getElementById('test-result').classList.add('hidden'); // Recharger la liste loadFeeds(); showSuccess('Flux RSS ajouté avec succès !'); } else { showError(data.error || 'Erreur lors de l\'ajout'); } } catch (error) { console.error('Erreur:', error); showError('Erreur de connexion au serveur'); } } // ============================================================ // TEST DE FLUX // ============================================================ async function testFeed() { const url = document.getElementById('feed-url').value.trim(); const passkey = document.getElementById('feed-passkey').value.trim(); const use_flaresolverr = document.getElementById('feed-flaresolverr').checked; const cookies = document.getElementById('feed-cookies').value.trim(); if (!url) { showError('Veuillez entrer une URL'); return; } const resultDiv = document.getElementById('test-result'); resultDiv.classList.remove('hidden'); resultDiv.innerHTML = '

🔄 Test en cours...

'; try { const response = await fetch('/api/admin/rss/test', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ url, passkey, use_flaresolverr, cookies }) }); const data = await response.json(); if (data.success && data.count > 0) { resultDiv.innerHTML = `

✅ Test réussi ! ${data.count} résultats trouvés

${data.sample.map(item => `
${escapeHtml(item.Title)} ${item.SizeFormatted} • ${item.Seeders} seeders
`).join('')}
`; } else { resultDiv.innerHTML = `

❌ Aucun résultat trouvé

Vérifiez l'URL et les cookies. Si erreur 403, activez Flaresolverr et ajoutez vos cookies.

`; } } catch (error) { console.error('Erreur:', error); resultDiv.innerHTML = `

❌ Erreur lors du test

${error.message}

`; } } async function testExistingFeed(feedId) { try { const response = await fetch(`/api/admin/rss/${feedId}/test`, { method: 'POST' }); const data = await response.json(); if (data.success && data.count > 0) { alert(`✅ Test réussi !\n${data.count} résultats trouvés\n\nExemple: ${data.sample[0]?.Title || 'N/A'}`); } else { alert('❌ Aucun résultat trouvé.\nVérifiez que le flux est toujours valide.'); } } catch (error) { console.error('Erreur:', error); alert('❌ Erreur lors du test'); } } // ============================================================ // GESTION DES FLUX // ============================================================ async function toggleFeed(feedId) { try { const response = await fetch(`/api/admin/rss/${feedId}/toggle`, { method: 'POST' }); const data = await response.json(); if (data.success) { loadFeeds(); } else { showError(data.error || 'Erreur lors de la modification'); } } catch (error) { console.error('Erreur:', error); showError('Erreur de connexion'); } } async function deleteFeed(feedId) { if (!confirm('Supprimer ce flux RSS ?')) { return; } try { const response = await fetch(`/api/admin/rss/${feedId}`, { method: 'DELETE' }); const data = await response.json(); if (data.success) { loadFeeds(); showSuccess('Flux RSS supprimé'); } else { showError(data.error || 'Erreur lors de la suppression'); } } catch (error) { console.error('Erreur:', error); showError('Erreur de connexion'); } } // ============================================================ // UTILITAIRES // ============================================================ function escapeHtml(text) { if (!text) return ''; const div = document.createElement('div'); div.textContent = text; return div.innerHTML; } function showError(message) { alert('❌ ' + message); } function showSuccess(message) { // Simple alert pour l'instant console.log('✅ ' + message); }