Plateforme de podcasts islamiques dédiée aux enseignements de Serigne Sam Mbaye.
Interface moderne, lecture audio avancée, gestion de playlists et authentification sécurisée.
- 🎧 Lecteur audio complet — lecture, pause, suivant, précédent, shuffle, repeat, vitesse variable
- 📊 Visualiseur de spectre — animation canvas temps réel synchronisée à l'audio
- 📋 Playlists personnalisées — créer, modifier, supprimer, ajouter des podcasts
- ❤️ Favoris — marquer et retrouver ses épisodes préférés
- 🕐 Historique — reprendre là où vous vous êtes arrêté, persisté en localStorage
- 🔐 Authentification sécurisée — JWT + refresh automatique + Google OAuth
- 🛡️ Routes protégées — accès conditionnel selon le rôle (utilisateur / admin)
- 📱 Responsive — expérience optimisée mobile et desktop
- 🌙 Dark mode — thème sombre natif
| Couche | Technologies |
|---|---|
| Framework | React 19, Vite 6 |
| UI | Material UI 7, Tailwind CSS 4 |
| État | Redux Toolkit, Redux Persist |
| Routing | React Router 7 |
| Auth | JWT, Google OAuth (@react-oauth/google) |
| HTTP | Axios |
| Utilitaires | Lodash, Day.js, Lucide React |
| Charts | Chart.js, React-Chartjs-2 |
| Fonts | Orbitron, Rajdhani (@fontsource) |
Chaque piste audio retournée par l'API respecte la structure suivante :
{
"id": 1,
"title": "Alkhourane1",
"duree": "3602",
"duree_format": "01:00:02",
"views": 16,
"auteur": "Bay sam mbaye - www.serignesam.com - mbaye@serignesam.com",
"audioFile": null,
"audioName": "01 - Alkhourane1.mp3",
"lieu": null,
"theme": null
}| Champ | Type | Description |
|---|---|---|
id |
number |
Identifiant unique de la piste |
title |
string |
Titre de l'enregistrement |
duree |
string |
Durée en secondes (format brut) |
duree_format |
string |
Durée formatée HH:mm:ss |
views |
number |
Nombre d'écoutes |
auteur |
string |
Auteur avec site et email de contact |
audioFile |
string | null |
Fichier audio (si upload direct) |
audioName |
string |
Nom du fichier MP3 sur le serveur |
lieu |
string | null |
Lieu de l'enregistrement |
theme |
string | null |
Thème / catégorie de l'épisode |
📁 Les fichiers audio sont servis depuis :
{VITE_BASE_URL}/conferences/{audioName}
Exemple :https://api.serignesam.com/conferences/01%20-%20Alkhourane1.mp3
- Node.js ≥ 18
- Yarn ou npm
- Un backend Symfony en cours d'exécution (API)
# Cloner le dépôt
git clone https://github.com/ton-user/serigne-sam-mbaye-podcast.git
cd serigne-sam-mbaye-podcast
# Installer les dépendances
yarn install
# ou
npm installCopier le fichier d'exemple et remplir les valeurs :
cp .env.example .env.development# .env.development
VITE_BASE_URL=http://localhost:8000
VITE_GOOGLE_CLIENT_ID=your_google_client_id_hereyarn devL'application sera disponible sur http://localhost:5173
yarn dev # Serveur de développement
yarn build # Build production
yarn build:staging # Build staging
yarn build:analyze # Build avec analyse du bundle
yarn preview # Prévisualiser le build production
yarn preview:staging # Prévisualiser le build stagingsrc/
├── auth/ # Authentification (login, register, profil)
│ ├── profile/
│ ├── AuthModal.jsx
│ └── router.jsx
├── components/
│ ├── auth/
│ │ ├── AuthInitializer.jsx # Boot session au démarrage
│ │ └── ProtectedRoute.jsx # Guard de routes
│ ├── Player/
│ │ ├── AudioEngine.jsx # Contrôleur audio unique
│ │ ├── MiniPlayer.jsx # Lecteur flottant (hors page d'accueil)
│ │ ├── musicPlayer.jsx # Lecteur principal
│ │ ├── SpectrumVisualizer.jsx
│ │ └── paylist/
│ │ ├── playlist.jsx
│ │ ├── TrackList.jsx
│ │ └── ModalAddToPlaylist.jsx
│ ├── ErrorBoundary.jsx # Capture d'erreurs React
│ ├── about.jsx
│ ├── contact.jsx
│ ├── favoris.jsx
│ ├── HistoryPanel.jsx
│ └── podcast.jsx
├── redux/
│ ├── features/
│ │ ├── auth/
│ │ │ ├── authSlice.js
│ │ │ ├── apiAuth.js
│ │ │ └── googleAuthSlice.js
│ │ ├── podcastSlice.js
│ │ ├── playlistSlice.js
│ │ └── uiSlice.js
│ └── stores.js
├── ui/ # Composants UI globaux
│ ├── navbar.jsx
│ ├── footer.jsx
│ ├── NotFoundPage.jsx
│ └── PageEnConstruction.jsx
├── utils/
│ └── index.js
├── globalErrorCatcher.js # Capture pré-React (window.onerror)
├── App.jsx
└── main.jsx
Créer un fichier .env.example (à commiter, sans valeurs) :
VITE_BASE_URL=
VITE_GOOGLE_CLIENT_ID=
⚠️ Ne jamais commiter.env,.env.developmentou.env.production— ils sont dans.gitignore.
L'audio est géré par un composant singleton AudioEngine monté une seule fois dans main.jsx. Il écoute le state Redux et pilote l'élément <audio> natif. Aucun autre composant ne touche directement l'audio.
Redux State (podcastSlice)
↕
AudioEngine.jsx ← unique, dans main.jsx
↕
<audio> natif ← un seul élément dans le DOM
↕
MusicPlayer / MiniPlayer ← UI seulement, dispatch des actions
// utils/index.js
export const getTrackSrc = (track) =>
encodeURIComponent(track?.audioName ?? "");
// Utilisation dans AudioEngine
const src = `${VITE_BASE_URL}/conferences/${getTrackSrc(currentTrack)}`;
// → https://api.serignesam.com/conferences/01%20-%20Alkhourane1.mp3AuthInitializermonte au démarrage et hydrate Redux depuis le token localStorage sans appel réseau si le token est encore valide- Si le token expire dans moins de 8 minutes → revalidation serveur automatique
- Refresh silencieux toutes les 4 minutes si l'onglet est actif
- Sync multi-onglet via
window.addEventListener("storage") - Routes protégées via
ProtectedRoute: non connecté → modal login + redirect/
| Route | Accès | Description |
|---|---|---|
/ |
Public | Lecteur principal + liste des podcasts |
/about |
Public | Page à propos |
/contact |
Public | Page de contact |
/themes/* |
Public | Pages thèmes (en construction) |
/playlist |
🔐 Connecté | Playlists personnalisées |
/favorites |
🔐 Connecté | Épisodes favoris |
/profile |
🔐 Connecté | Profil utilisateur |
/settings |
🔐 Connecté | Paramètres |
/visite |
🔐 Admin | Statistiques de visites |
Ce projet est à but non lucratif, dédié à la diffusion des enseignements de Serigne Sam Mbaye.
Les contributions sont les bienvenues :
- Fork le dépôt
- Crée une branche :
git checkout -b feature/ma-feature - Commit :
git commit -m 'feat: ajout de ma feature' - Push :
git push origin feature/ma-feature - Ouvre une Pull Request
Ce projet est distribué sous licence MIT.
Tous les contenus audio sont la propriété intellectuelle de Serigne Sam Mbaye et/ou de ses ayants droit.
Voir le fichier LICENSE pour plus de détails.
- Développeur : Amar Syll
- Email : amar05syll@gmail.com
- Localisation : Grenoble, France
- Site web : amarsyll.pro