Files
Lycostorrent/app/static/js/admin_rss.js
2026-03-23 20:59:26 +01:00

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);
}