Initial commit
This commit is contained in:
288
app/static/js/admin_rss.js
Normal file
288
app/static/js/admin_rss.js
Normal file
@@ -0,0 +1,288 @@
|
||||
/**
|
||||
* 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);
|
||||
}
|
||||
Reference in New Issue
Block a user