Commit Graph
17 Commits
Author SHA1 Message Date
MichaelandClaude Haiku 4.5 5497c89a99 security: SSRF protection on user-supplied RSS URLs
Validate every RSS URL submitted via /api/podcasts/subscribe before
fetching. Rejects non-http(s), localhost, private IPv4/IPv6 ranges,
link-local, and cloud metadata endpoints (169.254.169.254). Resolves
hostnames via DNS and re-checks every returned address.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-04-18 07:25:33 +02:00
MichaelandClaude Sonnet 4.5 a3225cb4c4 feat: light/dark theme (cream+gold+grey), reduced radii, stagger animations, search fallback
- globals.css: full dual-theme system via .light-theme/.dark-theme classes
  → Dark: deep navy with indigo/cyan glow gradients
  → Light: warm cream #f7f3eb with gold top-left & grey bottom-right gradients
  → Radius tokens: --radius-card 1rem, --radius-panel 1.25rem (sharper cards)
  → New animations: float, scale-in, shimmer skeleton, ping-slow, spin-slow,
    glow-beat, gold-shimmer + stagger-grid cascade (up to 20 items)
- tailwind.config.js: reduce 2xl/3xl/4xl radii to match CSS vars; add accent-gold
- Navigation.tsx: add Sun/Moon toggle button using useTheme()
- Dashboard.tsx: shimmer skeletons, stagger-grid on episode grid
- Trending.tsx: stagger-grid on podcast grid
- podcastController.ts: iTunes search fallback → local DB regex search

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-04-17 10:51:21 +02:00
Michael a993e2d658 feat: implement podcast discovery and management controllers and services 2026-04-16 14:57:49 +02:00
MichaelandClaude Sonnet 4.6 177917c06e Résout tous les conflits de merge
- podcastController: createPodcastFromRss sans feedData (parse le RSS réel)
- Discover.tsx: stub vide (remplacé par /trending et /add)
- App.tsx + Navigation.tsx: conflits déjà résolus

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-16 14:19:55 +02:00
Michael 1028774a65 feat: implement podcast controller with subscription, search, and sync functionality 2026-04-16 13:56:48 +02:00
Michael e075434dd7 feat: implement RSS parsing service and podcast controller for feed ingestion and episode synchronization 2026-04-16 13:55:18 +02:00
Michael cdc0a4671c feat: implement podcast controller for subscription management, search, and discovery functionality 2026-04-16 13:32:26 +02:00
Michael d81b3a6516 feat: implement podcast subscription management, library page, and associated service methods 2026-04-16 13:28:23 +02:00
Michael 872ef5c31a feat: implement backend podcast subscription controllers and frontend library page with optimistic updates 2026-04-16 13:07:46 +02:00
Michael 34db9e2542 feat: implement podcast controller for subscription management, discovery, and search functionality 2026-04-16 12:46:22 +02:00
MichaelandClaude Sonnet 4.6 a8cef14226 Rend l'abonnement idempotent (409 → 200)
Abonner deux fois au même podcast retourne 200 au lieu de 409.
Tous les messages d'erreur traduits en français.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-16 11:40:22 +02:00
MichaelandClaude Sonnet 4.6 eb6821ca76 Corrige TypeError dans subscribeFromDiscovery
result.podcast est un plain object (toJSON()), appeler .toJSON() dessus crashe.
Fix: refetch le podcast depuis MongoDB après création pour avoir un vrai Document Mongoose.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-16 11:29:55 +02:00
MichaelandClaude Sonnet 4.6 3914f28e19 Corrige subscribe 500 et trending 500
- subscribe: passe undefined à createPodcastFromRss pour qu'il parse vraiment le flux RSS (bug: on passait feedData avec episodes:[] vide)
- trending/discover: retournent [] au lieu de 500 si l'API iTunes échoue
- trending: utilise l'iTunes RSS officiel (itunes.apple.com/fr/rss/toppodcasts) au lieu de l'API Marketing Tools instable

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-16 11:24:44 +02:00
MichaelandClaude Sonnet 4.6 59144e9ce6 Remplace PodcastIndex par iTunes Search API (gratuit, sans clé)
- Réécriture complète de podcastIndexService avec l'API iTunes d'Apple
- Recherche de podcasts : itunes.apple.com/search (gratuit, pas d'auth)
- Tendances : top podcasts France via rss.applemarketingtools.com + lookup RSS URLs
- Suppression des vérifications isConfigured() dans le contrôleur

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-16 11:21:26 +02:00
MichaelandClaude Sonnet 4.6 c7a5c171d1 Traduit l'UI en français et corrige les bugs de recherche/abonnement
- Traduit toutes les pages et composants en français (Dashboard, Login, Discover, Navigation, Header, EpisodeCard, AudioPlayer)
- Corrige l'erreur 500 sur /api/podcasts/discover : z.coerce.number() au lieu de z.number() pour limit/offset (paramètres query string)
- Corrige l'abonnement manuel via URL RSS : crée le podcast depuis le flux RSS au lieu de renvoyer 400

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-16 11:15:42 +02:00
Michael 9bb61cc8a7 feat: implement podcast discovery with PodcastIndex API integration and Discover page 2026-04-16 10:01:05 +02:00
Michael 8c00a1b0f5 feat: implement authentication and core API endpoints - auth, podcasts, episodes 2026-04-16 09:55:15 +02:00