Commit Graph

13 Commits

Author SHA1 Message Date
dev eac520bc8e feat: use EMAC zone API for paginated genre scraping
Docker / docker (push) Successful in 1m29s
Previously only ~17 IDs were extracted from initial HTML per genre page
(before the "voir plus" button). The EMAC API at api.arte.tv exposes all
concerts with full pagination (e.g. 131 Metal, 187 Pop Rock).

Also reuses metadata from EMAC response (title, subtitle, thumbnail,
expiry) — skipping redundant player API calls for genre concerts.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 17:24:27 +02:00
dev d3ce89f228 perf: stale-while-revalidate cache + startup pre-warm
Docker / docker (push) Successful in 1m58s
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>
2026-05-15 17:02:09 +02:00
dev e1a2dd1685 feat: VOSTFR/VO/FRENCH detection and subtitle embedding
Docker / docker (push) Successful in 1m32s
Query Arte Player API before each download to determine available stream
versions. Select lang tag (VOSTFR > VO, FRENCH if audio is fr). Embed
French subtitles as default MKV track when VOSTFR. All output now .mkv.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 12:01:48 +02:00
dev a4ffd6d63e fix: DB sur volume persistant + verrou anti-scrapes parallèles
Docker / docker (push) Successful in 3m1s
- DB_PATH → data/arte_dl.db (mappé sur /mnt/user/appdata/arte-dl)
- mkdir data/ au démarrage dans downloader.py et arte_api.py
- asyncio.Lock sur get_all_concerts() : une seule scrape à la fois,
  les requêtes concurrentes attendent le résultat au lieu de relancer

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-02 20:43:01 +02:00
dev d729334c9b perf: persistance du cache concerts en SQLite (survit aux redémarrages)
Docker / docker (push) Successful in 3m31s
Le cache en mémoire (6h TTL) est désormais sauvegardé dans concerts_cache.
Au redémarrage, si le cache SQLite est récent, aucune requête réseau n'est faite.
Le bouton Rafraîchir vide aussi le cache SQLite pour forcer un re-scrape.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-02 20:29:17 +02:00
dev 189b65bd6d 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>
2026-05-02 19:23:57 +02:00
dev 9a5e356238 feat: intégration TMDB — poster, backdrop, lien fiche
Docker / docker (push) Successful in 1m21s
- tmdb.py : recherche TMDB par title+subtitle, matching fuzzy,
  cache SQLite 30 jours (table tmdb_cache dans arte_dl.db)
- arte_api.py : enrichissement concurrent (5 workers) après résolution
  des IDs ; ajoute tmdb_id, tmdb_poster, tmdb_backdrop au concert
- app.js : backdrop TMDB utilisé comme thumbnail de carte quand dispo ;
  subtitle affiché sous le titre de carte ; poster dans la modal ;
  lien direct vers la fiche TMDB
- docker-compose.yml : passage de TMDB_API_KEY au container

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-26 13:15:27 +02:00
dev 16736e2e7a feat: filtre par catégorie dans la GUI
Docker / docker (push) Successful in 1m15s
- 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>
2026-04-26 13:03:52 +02:00
dev 1815a4e8c2 feat: ajout des catégories Arts de la scène, Hip-hop, Metal, Baroque, World
Docker / docker (push) Successful in 1m18s
Remplace les pages arte-concert par les pages /fr/p/ qui couvrent
toutes les catégories demandées. Passe de 97 à 208 concerts indexés.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-26 12:58:17 +02:00
dev ca3ab37f19 feat: recherche hybride — cache local + API search Arte
Docker / docker (push) Successful in 1m18s
Quand la recherche ne trouve rien en local (ex: rock-pop chargé
côté client), interroge l'API search d'Arte, récupère les IDs
manquants et les résout via le player API en parallèle.
Permet de trouver n'importe quel concert présent sur arte-concert.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-25 18:53:17 +02:00
dev 47ba12b8ec fix: gérer les valeurs None dans les champs de recherche
Docker / docker (push) Successful in 1m14s
co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-25 18:50:40 +02:00
dev 6bf6af4c73 fix: réécrire arte_api avec l'API player Arte et les pages RSC
Docker / docker (push) Successful in 1m21s
Abandon de l'approche yt-dlp playlist (URL non supportée).
Scrape les pages genre Arte Concert en RSC pour extraire les
programme IDs, puis fetch les métadonnées (titre, thumbnail,
durée, expiry) via l'API player v2 en parallèle (10 workers).
96 concerts disponibles.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-25 18:47:36 +02:00
dev eadc242173 feat: initial implementation — Arte Concert web GUI
Docker / docker (push) Successful in 2m50s
FastAPI backend + HTML/JS frontend pour parcourir et télécharger les
concerts Arte Concert. Cache 6h, recherche live, historique SQLite,
suivi de progression SSE, design sombre Playfair Display + Inter.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-25 18:36:00 +02:00