Commit Graph
80 Commits
Author SHA1 Message Date
MichaelandClaude Sonnet 4.6 ceafb24f1b style: remove premium labels + fix LU badge
- Remove all visible "premium" text labels across the app:
  Navigation sidebar: "Premium Audio" → "Your audio space"
  Header: "Premium Member" → "Membre"
  Login page badge: "Expérience Audio Premium" → "Votre espace audio"
  Dashboard hero badge: "Podcastic Premium" → "Podcastic"
  EpisodeCard fallback author: "Artiste Premium" → empty string

- LU badge: remove Check icon (was rendering as "?" in some envs),
  now shows clean "LU" text only

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 09:45:58 +02:00
Michael 05eaa96e75 feat: implement EpisodeCard component and integrate it into the dashboard view 2026-04-20 10:47:26 +02:00
MichaelandClaude Sonnet 4.6 01c179c68b fix: layout uniforme et max-width sur grand écran
- max-w-[1400px] mx-auto dans le wrapper global (App.tsx)
  pour que les cartes ne soient pas immenses sur 2K/4K
- padding cohérent lg:px-8 sur toutes les pages
- suppression du max-w-5xl parasites sur AddPodcast

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-17 21:50:16 +02:00
MichaelandClaude Sonnet 4.6 77f2a71efd feat: composant PodcastCard unifié pour Library, Trending, AddPodcast
Crée PodcastCard réutilisable avec le même design qu'EpisodeCard
(image carrée, auteur, titre, footer avec actions). Remplace les
3 designs inline différents par un seul composant cohérent.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-17 21:45:39 +02:00
MichaelandClaude Sonnet 4.6 00df4a39ff style: uniform grids, profile border, remove NOUVEAU badge
- Toutes les pages utilisent grid-cols-1 sm:2 lg:3 xl:4 gap-8
- Cadre gradient visible en permanence sur l'avatar profil
- Suppression du badge NOUVEAU sur les épisodes

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-17 21:36:55 +02:00
MichaelandClaude Sonnet 4.6 5a9a0904a1 fix: audio persistence across navigation + LU badge at 90% + filter continuer section
- AudioPlayer is now purely presentational — no internal <audio> element or state.
  All playback state (currentTime, duration, volume, speed, mute, error, isResuming)
  comes from AudioContext, which holds the persistent <audio> at provider level.
  This prevents audio from cutting when navigating between pages.

- userId is synced into AudioContext via setUserId() so progress saving/loading
  works without the player needing to manage it locally.

- EpisodeCard: isCompleted now triggers at ≥90% listened (progressPercent >= 0.9)
  in addition to the isCompleted flag, so the LU badge appears correctly.
  Progress bar also hidden when ≥90%.

- Dashboard: episodesInProgress now excludes episodes at ≥90% listened,
  removing them from the "Continuer l'écoute" section once effectively finished.
  setUserId() called after user loads to wire context progress saving.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-17 15:08:04 +02:00
MichaelandClaude Sonnet 4.6 842ead6518 style: unify floating player design across all pages
Replace the old compact floating bar (h-88px rounded-2rem with expand
button) with the same clean mini-bar design as the Dashboard sticky
sub-bar — artwork + title + seeks + play + time + speed/volume/expand/
close + thin progress bar. The Dashboard hero inline player is kept.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-17 11:41:25 +02:00
MichaelandClaude Sonnet 4.6 6786226a6c feat: hero player, LU/NOUVEAU badges, metadata resync, sticky mini-bar
- Refresh podcast title/author/imageUrl/description on RSS sync (fixes
  legacy 'Unknown Podcast' records)
- Always-visible Resync button on Library cards
- LU badge on completed episodes, NOUVEAU badge on <7-day-old episodes
- AudioPlayer gains mode='inline' that embeds in the Dashboard hero card
- Floating player suppressed on /dashboard to avoid dual audio
- Sticky mini-bar appears via IntersectionObserver when inline player
  scrolls out of view (shares the same <audio> element)
- Fix: 'Reprendre' button called undefined setSelectedEpisode; now calls
  playEpisode
- Add progress field to Episode TS interface

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-17 11:33:47 +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 e649a16620 feat: improve search UX and backend inclusivity on AddPodcast page 2026-04-16 21:06:54 +02:00
Michael e759cf9471 feat: add trending podcasts discovery page with genre filtering and subscription support 2026-04-16 16:24:43 +02:00
Michael dfd2cce761 feat: implement AudioPlayer component with playback controls, progress tracking, and persistence 2026-04-16 16:22:46 +02:00
Michael 5305f3e5f6 feat: add Trending page to display and subscribe to popular podcasts by genre 2026-04-16 16:18:47 +02:00
Michael f68989c228 feat: implement AudioPlayer component with playback controls, progress tracking, and persistence 2026-04-16 16:11:39 +02:00
Michael ad78a34cb4 feat: implement AudioPlayer component with playback controls, progress tracking, and persistence 2026-04-16 16:05:23 +02:00
Michael d8cb830570 feat: implement Library page with subscription management and synchronization features 2026-04-16 16:04:39 +02:00
Michael a670a4fe5d feat: add trending podcasts discovery page with genre filtering and subscription support 2026-04-16 15:46:35 +02:00
Michael ea4fdb38d5 feat: implement AddPodcast page with RSS subscription and discovery search functionality 2026-04-16 15:45:20 +02:00
Michael acd9a1a2c5 feat: initialize global styles with theme variables, Tailwind configuration, and custom UI components 2026-04-16 15:39:32 +02:00
Michael 030ddfba81 feat: implement AudioPlayer component with playback controls, progress tracking, and persistent settings 2026-04-16 15:34:34 +02:00
Michael 17f2496dda feat: implement global audio player with playback controls, progress tracking, and persistent settings 2026-04-16 15:34:09 +02:00
Michael c9127c70c1 feat: implement trending podcasts discovery page with genre filtering and subscription capabilities 2026-04-16 15:27:00 +02:00
Michael 67d45b72ee feat: initialize global styles with theme-aware CSS variables and utility components 2026-04-16 15:20:29 +02:00
Michael 3bb2dfc009 feat: implement authentication routing, episode details slide-over, and success notification modal 2026-04-16 15:15:28 +02:00
Michael 90ee8df9df feat: implement authenticated user dashboard with episode listing and pagination 2026-04-16 15:04:57 +02:00
Michael e01b661aa2 feat: implement podcastIndexService using iTunes API for search and trending podcasts 2026-04-16 15:03:10 +02:00
Michael a993e2d658 feat: implement podcast discovery and management controllers and services 2026-04-16 14:57:49 +02:00
Michael 7923f4cf09 feat: initialize backend project with dependencies and build scripts 2026-04-16 14:50:12 +02:00
Michael aa54304bf3 feat: implement backend episode management and progress tracking controllers and routes 2026-04-16 14:48:32 +02:00
MichaelandClaude Haiku 4.5 686c4d9007 feat: use episode-specific images instead of podcast images
EpisodeCard and AudioPlayer now display episode.imageUrl when available,
falling back to the podcast image only if the episode has none.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-04-16 14:29:45 +02:00
MichaelandClaude Sonnet 4.6 b73f06c2b2 Refonte thème + fixes lecteur + suppression faux stats
AudioPlayer:
- Supprime section vitesse de lecture
- -30s/+30s (compact et expanded), avec icônes RotateCcw/RotateCw
- Rewind compact passé de -15s à -30s

Thème:
- globals.css refait : animations slide-up/fade-in/reveal définies, glass card améliorée
- Background plus profond (#080d1a), glow/blur plus soignés
- Boutons neon-button avec hover translateY

Corrections:
- Supprime Settings2 (bouton sans action) dans Library
- Supprime stat "2.4k mins listened" inventée dans Navigation
- Stats Library passent de 3 à 2 colonnes (réelles uniquement)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-16 14:26:19 +02:00
MichaelandClaude Sonnet 4.6 d3b356ce26 Corrige ReferenceError: handleConfirmUnsubscribe is not defined
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-16 14:20:42 +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 ad1c65b1f5 feat: implement rssParserService to handle feed parsing, episode extraction, and podcast synchronization 2026-04-16 14:16:45 +02:00
Michael 1e3caea1ab feat: implement rssParserService to handle feed parsing, episode extraction, and database synchronization 2026-04-16 14:16:35 +02:00
Michael 0d9bffbc46 feat: implement rssParserService to handle feed parsing, episode extraction, and database synchronization 2026-04-16 14:15:18 +02:00
Michael 6e9da01488 feat: initialize frontend entry point with HTML boilerplate and custom fonts 2026-04-16 14:09:14 +02:00
Michael f441251bb1 feat: implement library page with subscription management and optimistic updates 2026-04-16 13:58:24 +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 ba376930b0 feat: implement RSS feed parsing service and add library page UI for podcast management 2026-04-16 13:50:10 +02:00
Michael 277d966e50 feat: implement AddPodcast and Trending pages for podcast discovery and subscription management 2026-04-16 13:46:29 +02:00
Michael aaf7b82985 feat: implement trending podcasts page and RSS parsing service for feed data extraction 2026-04-16 13:44:05 +02:00
Michael 2fbbf70ee0 feat: add Library page to display and manage user podcast subscriptions 2026-04-16 13:34:27 +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 8156b7b228 feat: implement AudioPlayer component with playback controls, speed adjustment, and progress tracking 2026-04-16 13:23:45 +02:00
Michael b2d0af639f feat: implement audio player component with progress tracking and add library page for managing subscriptions 2026-04-16 13:13:12 +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 38521c45dc feat: add AddPodcast and Trending pages for podcast discovery and subscription management 2026-04-16 13:01:53 +02:00
Michael f50d1072a9 feat: add Library page to manage and unsubscribe from podcast subscriptions 2026-04-16 13:00:10 +02:00
Michael 2b971f97b3 feat: implement main navigation component and integrate protected routing in App structure 2026-04-16 12:57:37 +02:00
Michael b06298d80e chore: upgrade MongoDB to v8 and implement health checks for database services with conditional startup dependencies 2026-04-16 12:51:14 +02:00
Michael 34db9e2542 feat: implement podcast controller for subscription management, discovery, and search functionality 2026-04-16 12:46:22 +02:00
Michael 7e3b43fb5c chore: update mongodb version, rename network, and parameterize app port in docker-compose 2026-04-16 12:42:49 +02:00
Michael 57da7ad50b refactor: rename app service to podcastic and remove explicit image tag in docker-compose.yml 2026-04-16 12:42:15 +02:00
Michael 2c2d7501e6 feat: add Discover page component and define image tag in docker-compose 2026-04-16 12:39:33 +02:00
Michael f356b82258 Please provide the changes or the files you would like me to summarize. 2026-04-16 12:37:22 +02:00
Michael 2d5e90a441 feat: add Trending and AddPodcast pages for podcast discovery and subscription management 2026-04-16 12:35:52 +02:00
Michael f48789dfde feat: implement application routing with protected routes and sidebar navigation component 2026-04-16 12:27:58 +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 84c5cd6363 Migre eslint v8 → v9 (flat config), supprime les dépréciations
- eslint 8 → 9, @typescript-eslint/* → typescript-eslint (package unifié)
- Remplace .eslintrc.json par eslint.config.mjs (backend) et eslint.config.js (frontend)
- Ajoute eslint-plugin-react, eslint-plugin-react-hooks, globals (frontend)
- Supprime rimraf@3, @humanwhocodes/* qui étaient des deps transitives d'eslint v8

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-16 11:27:46 +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 9a3171f640 Ajoute un champ RSS URL dans la page Découvrir
Permet d'abonner un podcast directement par son URL de flux RSS, sans passer par la recherche PodcastIndex.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-16 11:19:40 +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
MichaelandClaude Haiku 4.5 00d92fc668 fix: switch backend to CommonJS to fix ESM module resolution
Remove 'type: module' and use CommonJS output so Node.js resolves
imports without requiring explicit .js extensions.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-04-16 11:01:48 +02:00
MichaelandClaude Haiku 4.5 ffb85ade90 fix: add @types/cors and fix jwt expiresIn type
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-04-16 10:58:11 +02:00
MichaelandClaude Haiku 4.5 faec1f37b4 fix: use npm install instead of npm ci (no lockfile in repo)
Also unignore package-lock.json for future deterministic installs.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-04-16 10:55:28 +02:00
MichaelandClaude Haiku 4.5 1822ab1afe fix: single container without nginx — Express serves frontend
- Remove separate backend/ and frontend/ Dockerfiles
- Add root Dockerfile (3-stage: frontend build → backend build → runtime)
- Frontend static files served by Express from /public
- Simplify docker-compose to 3 services: mongodb, redis, app (port 3579)
- Fix vite proxy not to strip /api prefix from paths
- Default API URL to relative /api instead of hardcoded localhost

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-04-16 10:43:06 +02:00
Michael a8787857b5 fix: add proper Dockerfiles for backend and frontend, simplify docker-compose 2026-04-16 10:28:40 +02:00
Michael 547de27eed simplify: use official Docker images with clean docker-compose.yml - no complex Dockerfile needed 2026-04-16 10:22:04 +02:00
Michael 65d43c3afb fix: simplify docker-compose.unraid.yml for better Unraid compatibility 2026-04-16 10:15:15 +02:00
Michael 73585213ba feat: add Unraid single-container deployment with docker-compose and comprehensive setup guide 2026-04-16 10:13:08 +02:00
Michael 9bb61cc8a7 feat: implement podcast discovery with PodcastIndex API integration and Discover page 2026-04-16 10:01:05 +02:00
Michael d7f158a498 docs: add comprehensive getting started guide and linting configuration 2026-04-16 09:56:48 +02:00
Michael 068f4e7ef7 feat: implement React components - dashboard, auth pages, audio player UI 2026-04-16 09:56:17 +02:00
Michael 8c00a1b0f5 feat: implement authentication and core API endpoints - auth, podcasts, episodes 2026-04-16 09:55:15 +02:00
Michael 8df1161023 feat: initialize Podcastic project foundation - setup backend and frontend 2026-04-16 09:53:36 +02:00