Poll /api/cache-ts every 30s; silently reload concerts if the
cache timestamp increased (background scrape finished).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
If DB has any concerts data (even expired), return it immediately and
refresh in background. Start pre-warming at container startup so the
scrape runs before the first user request.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Store subtitle/year/category in downloads table. On startup, re-queue
any download still in queued/downloading state (reset downloading → queued).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- tmdb.py: store release_date year in cache, expose as tmdb_year
- main.py + app.js: use tmdb_year when subtitle has no year
- Dockerfile: add gosu + abc user for PUID/PGID runtime privilege drop
- entrypoint.sh: new entrypoint handling PUID/PGID ownership of /app/data
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
asyncio.Queue dans DownloadManager + worker unique démarré dans le lifespan.
Les téléchargements s'exécutent un par un dans l'ordre d'arrivée.
Suppression de BackgroundTasks (plus nécessaire).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 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>
Format : Title.Event.Year.FRENCH.Resolution.WEBRip.x264|HEVC.AAC-ReMoRa.mp4
- build_release_name() : slugify avec strip accents, apostrophe→point,
déduplique l'année si présente dans le titre ET passée séparément,
détecte la résolution et le codec depuis les infos yt-dlp
- enqueue() : reçoit subtitle + year depuis l'API
- _run() : renomme le fichier après download, met à jour le filename en DB
- DownloadRequest : subtitle + year ajoutés
- app.js : extrait l'année du subtitle via regex avant d'envoyer la requête
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- arte_api.py : GENRE_PAGES devient une liste de (nom, url), chaque
concert reçoit un champ "categories" avec ses genres d'appartenance
- main.py : endpoint /api/categories + param ?category= sur /api/concerts
- index.html : barre de pills catégories (Tout + 10 genres)
- style.css : styles .cat-bar / .cat-pill avec pill active en or
- app.js : chargement dynamique des pills, filtre catégorie dans le state
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>