Commit Graph

28 Commits

Author SHA1 Message Date
dev 0173681786 feat: auto-reload grid when background cache refresh completes
Docker / docker (push) Successful in 1m49s
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>
2026-05-15 17:03:30 +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 09457868e4 fix: resume interrupted downloads after container restart
Docker / docker (push) Successful in 1m22s
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>
2026-05-11 14:03:31 +02:00
dev ec61b1684a feat: set MKV internal title to "Artist - Concert (year)"
Docker / docker (push) Successful in 1m23s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 12:05:10 +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 3f17203976 fix: use named columns in tmdb_cache INSERT to handle migration column order
Docker / docker (push) Successful in 3m37s
ALTER TABLE ADD COLUMN appends at the end of existing tables, but CREATE TABLE
defines year before cached_at — positional VALUES mapped year→cached_at (NOT NULL).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-09 16:07:08 +02:00
dev 0866a875ba feat: TMDB year fallback + PUID/PGID support
Docker / docker (push) Successful in 2m58s
- 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>
2026-05-05 18:02:18 +02:00
dev 9cc8bb771d fix: enqueue_direct → enqueue dans _run_auto_dl_check
Docker / docker (push) Successful in 1m59s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-03 11:58:57 +02:00
dev a4273557ad feat: queue de téléchargement séquentielle (un à la fois)
Docker / docker (push) Successful in 1m38s
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>
2026-05-03 11:30:07 +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 4fe24af251 fix: auto-DL déclenche un check immédiat à l'activation avec feedback
Docker / docker (push) Successful in 1m40s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-02 20:24:41 +02:00
dev f49ca71868 fix: icône auto-DL plus visible (opacité 0.3 → 0.55)
Docker / docker (push) Successful in 1m55s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-02 19:53:45 +02:00
dev 90c2c53e20 docs: déploiement Docker et Unraid dans le README
Docker / docker (push) Successful in 1m36s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-02 19:25:49 +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 f07352bd04 feat: téléchargement dans sous-dossiers par catégorie
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-02 19:16:36 +02:00
dev 978a54a25f fix: WEBRip → WEB-DL (HLS direct download, no re-encode)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-02 19:15:40 +02:00
dev b751b2e51c fix: suppression de FRENCH du nom de release (concerts)
Docker / docker (push) Successful in 1m11s
2026-04-26 13:50:10 +02:00
dev 124afb6d20 feat: nommage UNFR -ReMoRa automatique après téléchargement
Docker / docker (push) Has been cancelled
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>
2026-04-26 13:48:56 +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 1b8833fbd3 fix: téléchargement et progression
Docker / docker (push) Successful in 1m16s
- Format yt-dlp corrigé : Arte sert l'audio en mp4 pas m4a, l'ancien
  sélecteur échouait immédiatement avec ExtractorError
- Progression basée sur downloaded_bytes/total_bytes_estimate (plus
  fiable pour HLS que _percent_str)
- finished_once : empêche le flux audio de remettre la progression à 0%
  après que le flux vidéo soit terminé

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-26 12:48:29 +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
laurent 8b841950b4 Initial commit 2026-04-25 18:25:30 +02:00