feat: auto-téléchargement par catégorie avec souscription persistante
Docker / docker (push) Has been cancelled

- Bouton ⬇ sur chaque pill de catégorie pour activer/désactiver l'auto-DL
- Souscriptions sauvegardées en SQLite (table auto_dl_categories)
- Boucle background toutes les AUTO_DL_INTERVAL secondes (défaut 1h)
- Déduplication via already_enqueued() (évite re-queue si déjà queued/done)
- POST /api/auto-dl/check pour déclencher un check immédiat
- GET/POST/DELETE /api/auto-dl/{category} pour gérer les souscriptions

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
dev
2026-05-02 19:23:57 +02:00
parent f07352bd04
commit 189b65bd6d
5 changed files with 220 additions and 10 deletions
+32 -2
View File
@@ -50,18 +50,48 @@ function debounce(fn, ms) {
// ── Categories ───────────────────────────────────────────────────────────────
async function loadCategories() {
try {
const cats = await fetch('/api/categories').then(r => r.json());
const [cats, watched] = await Promise.all([
fetch('/api/categories').then(r => r.json()),
fetch('/api/auto-dl').then(r => r.json()),
]);
const watchedSet = new Set(watched);
cats.forEach(cat => {
const btn = document.createElement('button');
btn.className = 'cat-pill';
btn.dataset.cat = cat;
btn.textContent = cat;
const label = document.createElement('span');
label.textContent = cat;
btn.appendChild(label);
const icon = document.createElement('span');
icon.className = 'auto-icon' + (watchedSet.has(cat) ? ' active' : '');
icon.title = watchedSet.has(cat) ? 'Auto-DL actif — cliquer pour désactiver' : 'Activer le téléchargement automatique';
icon.dataset.cat = cat;
icon.textContent = '⬇';
btn.appendChild(icon);
catBar.appendChild(btn);
});
} catch {}
}
async function toggleAutoDl(cat, iconEl) {
const isActive = iconEl.classList.contains('active');
try {
await fetch(`/api/auto-dl/${encodeURIComponent(cat)}`, { method: isActive ? 'DELETE' : 'POST' });
iconEl.classList.toggle('active', !isActive);
iconEl.title = !isActive ? 'Auto-DL actif — cliquer pour désactiver' : 'Activer le téléchargement automatique';
} catch {}
}
catBar.addEventListener('click', e => {
const icon = e.target.closest('.auto-icon');
if (icon) {
e.stopPropagation();
toggleAutoDl(icon.dataset.cat, icon);
return;
}
const pill = e.target.closest('.cat-pill');
if (!pill) return;
catBar.querySelectorAll('.cat-pill').forEach(p => p.classList.remove('active'));