/** * Lycostorrent - Admin Latest Categories * Configuration des catégories par tracker pour les nouveautés */ let allTrackers = []; let selectedTracker = null; let trackerCategories = {}; // Catégories disponibles par tracker let config = {}; // Configuration sauvegardée // Initialisation document.addEventListener('DOMContentLoaded', function() { loadTrackers(); loadConfig(); document.getElementById('saveConfigBtn').addEventListener('click', saveConfig); document.getElementById('resetConfigBtn').addEventListener('click', resetCurrentTracker); }); // ============================================================ // CHARGEMENT DES DONNÉES // ============================================================ async function loadTrackers() { try { const response = await fetch('/api/trackers'); const data = await response.json(); if (data.success) { allTrackers = data.trackers; displayTrackerSelector(allTrackers); } else { showMessage('Erreur lors du chargement des trackers', 'error'); } } catch (error) { console.error('Erreur:', error); showMessage('Impossible de charger les trackers', 'error'); } } async function loadConfig() { try { const response = await fetch('/api/admin/latest-config'); const data = await response.json(); if (data.success) { config = data.config || {}; displayConfigSummary(); } } catch (error) { console.error('Erreur chargement config:', error); config = {}; } } async function loadTrackerCategories(trackerId) { try { document.getElementById('availableCategories').innerHTML = '

Chargement des catégories...

'; const response = await fetch(`/api/admin/tracker-categories/${trackerId}`); const data = await response.json(); if (data.success) { trackerCategories[trackerId] = data.categories; displayAvailableCategories(data.categories); } else { document.getElementById('availableCategories').innerHTML = '

Impossible de charger les catégories

'; } } catch (error) { console.error('Erreur:', error); document.getElementById('availableCategories').innerHTML = '

Erreur de connexion

'; } } // ============================================================ // AFFICHAGE // ============================================================ function displayTrackerSelector(trackers) { const container = document.getElementById('trackerSelector'); if (trackers.length === 0) { container.innerHTML = '

Aucun tracker configuré dans Jackett

'; return; } container.innerHTML = trackers.map(tracker => ` `).join(''); // Event listeners container.querySelectorAll('.tracker-btn').forEach(btn => { btn.addEventListener('click', function() { selectTracker(this.dataset.trackerId, this.dataset.trackerName); }); }); } function selectTracker(trackerId, trackerName) { selectedTracker = trackerId; // Mettre à jour l'UI document.querySelectorAll('.tracker-btn').forEach(btn => btn.classList.remove('active')); document.querySelector(`[data-tracker-id="${trackerId}"]`).classList.add('active'); document.getElementById('selectedTrackerName').textContent = trackerName; document.getElementById('configTrackerName').textContent = trackerName; // Afficher les sections document.getElementById('categoriesSection').classList.remove('hidden'); document.getElementById('configSection').classList.remove('hidden'); // Charger les catégories du tracker loadTrackerCategories(trackerId); // Remplir les inputs avec la config existante fillConfigInputs(trackerId); } function displayAvailableCategories(categories) { const container = document.getElementById('availableCategories'); if (!categories || categories.length === 0) { container.innerHTML = '

Aucune catégorie trouvée pour ce tracker

'; return; } // Grouper par type (milliers) const grouped = {}; categories.forEach(cat => { const prefix = Math.floor(parseInt(cat.id) / 1000) * 1000; if (!grouped[prefix]) grouped[prefix] = []; grouped[prefix].push(cat); }); const prefixNames = { 1000: '🎮 Console/Jeux', 2000: '🎥 Films', 3000: '🎵 Audio/Musique', 4000: '💻 PC/Logiciels', 5000: '📺 TV/Séries', 6000: '📦 Autre', 7000: '📚 Livres', 8000: '📦 Autre' }; let html = '
'; for (const [prefix, cats] of Object.entries(grouped).sort((a, b) => a[0] - b[0])) { html += `

${prefixNames[prefix] || `Catégorie ${prefix}`}

${cats.map(cat => `
${cat.id} ${escapeHtml(cat.name)}
`).join('')}
`; } html += '
'; container.innerHTML = html; // Event listeners pour les boutons d'ajout container.querySelectorAll('.btn-add-cat').forEach(btn => { btn.addEventListener('click', function() { const catId = this.parentElement.dataset.id; showAddCategoryModal(catId); }); }); // Mettre à jour les quick-add buttons updateQuickAddButtons(categories); } function updateQuickAddButtons(categories) { const targets = ['movies', 'tv', 'anime', 'music']; targets.forEach(target => { const container = document.querySelector(`.quick-add[data-target="${target}"]`); if (!container) return; // Filtrer les catégories pertinentes let relevantCats = []; switch (target) { case 'movies': relevantCats = categories.filter(c => c.id.startsWith('2')); break; case 'tv': relevantCats = categories.filter(c => c.id.startsWith('5') && !c.name.toLowerCase().includes('anime')); break; case 'anime': relevantCats = categories.filter(c => c.name.toLowerCase().includes('anime')); break; case 'music': relevantCats = categories.filter(c => c.id.startsWith('3')); break; } if (relevantCats.length > 0) { container.innerHTML = `
Ajout rapide:
${relevantCats.slice(0, 6).map(cat => ` `).join('')} `; container.querySelectorAll('.quick-add-btn').forEach(btn => { btn.addEventListener('click', function() { addCategoryToInput(this.dataset.target, this.dataset.id); }); }); } else { container.innerHTML = ''; } }); } function addCategoryToInput(target, catId) { const input = document.getElementById(`config-${target}`); const currentValue = input.value.trim(); const categories = currentValue ? currentValue.split(',').map(c => c.trim()) : []; if (!categories.includes(catId)) { categories.push(catId); input.value = categories.join(','); } } function showAddCategoryModal(catId) { const target = prompt(`Ajouter la catégorie ${catId} à quel type ?\n\nOptions: movies, tv, anime, music`); if (target && ['movies', 'tv', 'anime', 'music'].includes(target.toLowerCase())) { addCategoryToInput(target.toLowerCase(), catId); showMessage(`Catégorie ${catId} ajoutée à ${target}`, 'success'); } } function fillConfigInputs(trackerId) { const trackerConfig = config[trackerId] || {}; document.getElementById('config-movies').value = trackerConfig.movies || ''; document.getElementById('config-tv').value = trackerConfig.tv || ''; document.getElementById('config-anime').value = trackerConfig.anime || ''; document.getElementById('config-music').value = trackerConfig.music || ''; } function displayConfigSummary() { const container = document.getElementById('configSummary'); if (Object.keys(config).length === 0) { container.innerHTML = '

Aucune configuration sauvegardée. Les catégories par défaut seront utilisées.

'; return; } let html = ''; for (const [trackerId, trackerConfig] of Object.entries(config)) { const tracker = allTrackers.find(t => t.id === trackerId); const trackerName = tracker ? tracker.name : trackerId; html += ` `; } html += '
TrackerFilmsSériesAnimeMusique
${escapeHtml(trackerName)} ${trackerConfig.movies || '-'} ${trackerConfig.tv || '-'} ${trackerConfig.anime || '-'} ${trackerConfig.music || '-'}
'; container.innerHTML = html; // Mettre à jour les badges "configuré" displayTrackerSelector(allTrackers); } // ============================================================ // SAUVEGARDE // ============================================================ async function saveConfig() { if (!selectedTracker) { showMessage('Veuillez sélectionner un tracker', 'error'); return; } const trackerConfig = { movies: document.getElementById('config-movies').value.trim(), tv: document.getElementById('config-tv').value.trim(), anime: document.getElementById('config-anime').value.trim(), music: document.getElementById('config-music').value.trim() }; // Supprimer les entrées vides Object.keys(trackerConfig).forEach(key => { if (!trackerConfig[key]) delete trackerConfig[key]; }); config[selectedTracker] = trackerConfig; try { const response = await fetch('/api/admin/latest-config', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ config }) }); const data = await response.json(); if (data.success) { showMessage('Configuration sauvegardée !', 'success'); displayConfigSummary(); } else { showMessage(data.error || 'Erreur lors de la sauvegarde', 'error'); } } catch (error) { console.error('Erreur:', error); showMessage('Erreur de connexion', 'error'); } } function resetCurrentTracker() { if (!selectedTracker) return; if (confirm('Réinitialiser la configuration de ce tracker ?')) { document.getElementById('config-movies').value = ''; document.getElementById('config-tv').value = ''; document.getElementById('config-anime').value = ''; document.getElementById('config-music').value = ''; delete config[selectedTracker]; showMessage('Configuration réinitialisée (pensez à sauvegarder)', 'info'); } } // ============================================================ // UTILITAIRES // ============================================================ function showMessage(message, type = 'info') { const messageBox = document.getElementById('messageBox'); messageBox.textContent = message; messageBox.className = `message-box ${type}`; messageBox.classList.remove('hidden'); setTimeout(() => messageBox.classList.add('hidden'), 4000); } function escapeHtml(text) { if (!text) return ''; const div = document.createElement('div'); div.textContent = text; return div.innerHTML; }