288 lines
9.4 KiB
JavaScript
288 lines
9.4 KiB
JavaScript
/**
|
|
* 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 = `
|
|
<div class="empty-state">
|
|
<p>🔗 Aucun flux RSS configuré</p>
|
|
<p>Ajoutez votre premier flux ci-dessus pour commencer</p>
|
|
</div>
|
|
`;
|
|
return;
|
|
}
|
|
|
|
container.innerHTML = feeds.map(feed => `
|
|
<div class="feed-card ${feed.enabled ? '' : 'disabled'}" data-id="${feed.id}">
|
|
<div class="feed-header">
|
|
<div class="feed-info">
|
|
<h3>${escapeHtml(feed.name)}</h3>
|
|
<span class="feed-category badge-${feed.category}">${getCategoryLabel(feed.category)}</span>
|
|
${feed.use_flaresolverr ? '<span class="feed-badge flaresolverr">🛡️ Flaresolverr</span>' : ''}
|
|
${feed.has_cookies ? '<span class="feed-badge cookies">🍪 Cookies</span>' : ''}
|
|
</div>
|
|
<div class="feed-actions">
|
|
<button class="btn-icon" onclick="toggleFeed('${feed.id}')" title="${feed.enabled ? 'Désactiver' : 'Activer'}">
|
|
${feed.enabled ? '✅' : '⏸️'}
|
|
</button>
|
|
<button class="btn-icon" onclick="testExistingFeed('${feed.id}')" title="Tester">🧪</button>
|
|
<button class="btn-icon btn-danger" onclick="deleteFeed('${feed.id}')" title="Supprimer">🗑️</button>
|
|
</div>
|
|
</div>
|
|
<div class="feed-url">
|
|
<code>${maskUrl(feed.url)}</code>
|
|
</div>
|
|
${feed.passkey ? '<div class="feed-passkey">🔑 Passkey configuré</div>' : ''}
|
|
</div>
|
|
`).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 = '<p class="loading">🔄 Test en cours...</p>';
|
|
|
|
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 = `
|
|
<div class="test-success">
|
|
<h4>✅ Test réussi ! ${data.count} résultats trouvés</h4>
|
|
<div class="test-samples">
|
|
${data.sample.map(item => `
|
|
<div class="test-item">
|
|
<span class="test-title">${escapeHtml(item.Title)}</span>
|
|
<span class="test-meta">${item.SizeFormatted} • ${item.Seeders} seeders</span>
|
|
</div>
|
|
`).join('')}
|
|
</div>
|
|
</div>
|
|
`;
|
|
} else {
|
|
resultDiv.innerHTML = `
|
|
<div class="test-error">
|
|
<h4>❌ Aucun résultat trouvé</h4>
|
|
<p>Vérifiez l'URL et les cookies. Si erreur 403, activez Flaresolverr et ajoutez vos cookies.</p>
|
|
</div>
|
|
`;
|
|
}
|
|
} catch (error) {
|
|
console.error('Erreur:', error);
|
|
resultDiv.innerHTML = `
|
|
<div class="test-error">
|
|
<h4>❌ Erreur lors du test</h4>
|
|
<p>${error.message}</p>
|
|
</div>
|
|
`;
|
|
}
|
|
}
|
|
|
|
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);
|
|
} |