Plateforme complÚte d'analytics musicales et de recommandations personnalisées, intégrant l'API Spotify et MongoDB pour une expérience musicale enrichie.
- Ă propos
- Fonctionnalités
- Tech Stack
- Architecture
- Installation
- Utilisation
- API Endpoints
- Base de Données
- Captures d'écran
- Documentation
- Contributeurs
Statify est une application full-stack moderne de gestion et d'analyse musicale. Elle combine une interface web réactive avec une API REST puissante et une base de données MongoDB pour offrir :
- đ§ Gestion complĂšte de bibliothĂšque musicale (artistes, albums, tracks, playlists)
- đ€ Moteur de recommandations personnalisĂ©es basĂ© sur les prĂ©fĂ©rences utilisateur
- đ Tableaux de bord analytiques avec visualisations interactives
- đ RĂ©seau de collaborations entre artistes (focus rap français)
- đ Recherche full-text avancĂ©e avec filtres multiples
- đ€ IntĂ©gration complĂšte avec l'API Spotify
Le projet met particuliĂšrement l'accent sur les requĂȘtes MongoDB avancĂ©es (aggregation pipelines, expressions complexes) et dĂ©montre une maĂźtrise approfondie des concepts de base de donnĂ©es NoSQL.
-
BibliothĂšque Utilisateur
- Sauvegarder tracks, albums, et artistes favoris
- Synchronisation avec Spotify
- Gestion de playlists publiques/privées
- Playlists collaboratives
-
Recherche Avancée
- Recherche full-text case-insensitive
- Filtres multi-critÚres (genre, année, popularité)
- Recherche across 5 types de contenu (tracks, albums, artists, playlists, users)
- Pagination et tri par pertinence
Moteur de recommandations avec 6 sections personnalisées :
- Artistes Similaires - Basé sur l'affinité de genres
- Albums de Labels Favoris - Découverte par label
- Sorties Récentes - Nouveautés de l'année en cours
- Tracks d'Artistes Similaires - Exploration approfondie
- Tracks Tendance - Popularité >= 70
- Albums Classiques - Par décennie préférée
Algorithme :
- Analyse multi-dimensionnelle (genre, label, période, popularité)
- Scoring personnalisé basé sur la bibliothÚque utilisateur
- Cache serveur avec TTL (1 heure)
- KPIs en temps réel (total artists, albums, tracks)
- Top 10 artistes par popularité
- Statistiques de bibliothĂšque utilisateur
- Timeline des sorties par année/mois
- Distribution par type (album, single, compilation)
- Ăvolution de la popularitĂ© moyenne
- Statistiques par maison de disques
- Nombre d'albums, tracks, popularité moyenne
- Classement des labels les plus actifs
- Graphe interactif force-directed
- Visualisation des collaborations (focus rap français)
- Top collaborations et statistiques détaillées
- ParamĂštres ajustables (charge, distance, nombre de nĆuds)
- SystĂšme de comptes utilisateurs
- Hashage de mots de passe (bcrypt)
- Gestion de sessions via Context API
- Routes protégées
| Technologie | Version | Utilisation |
|---|---|---|
| Next.js | 15.5.5 | Framework React avec App Router & Turbopack |
| React | 19.1.0 | BibliothĂšque UI |
| TypeScript | 5.x | Typage statique |
| TanStack Query | 5.90.3 | Gestion d'état serveur & cache |
| Tailwind CSS | 4.x | Framework CSS utilitaire |
| Radix UI | Latest | Composants accessibles |
| Recharts | 3.2.1 | Graphiques & visualisations |
| react-force-graph-2d | 1.29.0 | Graphe de réseau interactif |
| Lucide React | 0.545.0 | IcĂŽnes |
| Motion | 12.23.24 | Animations |
| Technologie | Version | Utilisation |
|---|---|---|
| NestJS | 11.0.1 | Framework Node.js structuré |
| TypeScript | 5.7.3 | Langage principal |
| MongoDB | 8.19.1 | Base de données NoSQL |
| Mongoose | 11.0.3 | ODM pour MongoDB |
| Cache Manager | 7.2.4 | SystÚme de cache en mémoire |
| bcrypt | 6.0.0 | Hashage de mots de passe |
| Spotify SDK | 1.2.0 | Intégration API Spotify |
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â Frontend (Next.js) â
â Port 3001 â
â â
â ââââââââââââ ââââââââââââ ââââââââââââ ââââââââââââ â
â â Dashboardâ â Search â â Discover â â Network â â
â ââââââââââââ ââââââââââââ ââââââââââââ ââââââââââââ â
â â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â â React Query (Cache & State) â â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
âââââââââââââââââââââââââŹâââââââââââââââââââââââââââââââââââââââ
â
â HTTP Requests
â
âââââââââââââââââââââââââŒâââââââââââââââââââââââââââââââââââââââ
â Backend (NestJS) â
â Port 3000 â
â â
â âââââââââââ âââââââââââ ââââââââââââ âââââââââââââââ â
â â Albums â â Artists â â Tracks â â Search â â
â â Module â â Module â â Module â â Module â â
â âââââââââââ âââââââââââ ââââââââââââ âââââââââââââââ â
â â
â âââââââââââ âââââââââââ ââââââââââââ âââââââââââââââ â
â â Users â âPlaylistsâ â Stats â âRecommenda- â â
â â Module â â Module â â Module â âtions Module â â
â âââââââââââ âââââââââââ ââââââââââââ âââââââââââââââ â
â â
â ââââââââââââââââââââââââ ââââââââââââââââââââââââââââ â
â â Cache Manager â â Spotify Service â â
â â (In-Memory TTL) â â (External API) â â
â ââââââââââââââââââââââââ ââââââââââââââââââââââââââââ â
âââââââââââââââââââââââââŹâââââââââââââââââââââââââââââââââââââââ
â
â Mongoose ODM
â
âââââââââââââââââââââââââŒâââââââââââââââââââââââââââââââââââââââ
â MongoDB Database â
â â
â âââââââââââ âââââââââââ ââââââââââââ âââââââââââââââ â
â â Artists â â Albums â â Tracks â â Users â â
â âââââââââââ âââââââââââ ââââââââââââ âââââââââââââââ â
â â
â âââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â â Playlists â â
â âââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â â Indexes: Text indexes, References, Unique fields â â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
- User Interaction â Frontend (Next.js)
- API Call â React Query (cache check)
- HTTP Request â Backend API (NestJS)
- Cache Check â Cache Manager (si applicable)
- Database Query â MongoDB via Mongoose
- Aggregation/Processing â NestJS Services
- Response â Frontend â UI Update
- Node.js >= 18.x
- npm >= 9.x
- MongoDB >= 6.x (local ou Atlas)
- Compte Spotify Developer (pour les credentials API)
git clone https://github.com/fabyan09/Statify.git
cd Statifycd api
npm installCréer un fichier .env à la racine de api/ :
# MongoDB
MONGO_URL=mongodb://localhost:27017/statify
# Spotify API
SPOTIFY_CLIENT_ID=your_spotify_client_id
SPOTIFY_CLIENT_SECRET=your_spotify_client_secret
# CORS
CORS_ORIGINS=http://localhost:3001,http://localhost:3000
# Port
PORT=3000Obtenir les credentials Spotify :
- Aller sur Spotify Developer Dashboard
- Créer une nouvelle application
- Copier Client ID et Client Secret
cd ../web
npm installCréer un fichier .env.local à la racine de web/ :
NEXT_PUBLIC_API_URL=http://localhost:3000Si vous avez des fichiers JSON dans /data, vous pouvez les importer :
# Exemple avec MongoDB Compass ou mongoimport
mongoimport --db statify --collection artists --file data/artists.json --jsonArray
mongoimport --db statify --collection albums --file data/albums.json --jsonArray
mongoimport --db statify --collection tracks --file data/tracks.json --jsonArraycd api
npm run start:devLe serveur API démarre sur http://localhost:3000
cd web
npm run devL'application web démarre sur http://localhost:3001
cd api
npm run build
npm run start:prodcd web
npm run build
npm run start# Backend - Tests unitaires
cd api
npm run test
# Backend - Couverture de tests
npm run test:cov
# Backend - Tests e2e
npm run test:e2ePOST /users Créer un compte
POST /users/login Connexion
GET /users/:id Profil utilisateur
GET /users/:id/library BibliothĂšque complĂšte
PUT /users/:id/library/add Ajouter Ă la bibliothĂšque
PUT /users/:id/library/remove Retirer de la bibliothĂšque
PATCH /users/:id Mettre Ă jour le profil
DELETE /users/:id Supprimer le compte
GET /artists Liste des artistes
GET /artists/:id Détails d'un artiste
GET /artists/:id/albums Albums de l'artiste
GET /artists/:id/tracks Tracks de l'artiste
GET /artists/search-spotify Rechercher sur Spotify
POST /artists/add-from-spotify Importer depuis Spotify
POST /artists/:id/sync-albums Synchroniser les albums
POST /artists Créer un artiste
PATCH /artists/:id Mettre Ă jour
DELETE /artists/:id Supprimer
GET /albums Liste des albums
GET /albums/:id Détails d'un album
GET /albums/:id/tracks Tracks de l'album
GET /albums/analytics/cohorts Statistiques par période
GET /albums/analytics/labels Statistiques par label
POST /albums/:id/sync-tracks Synchroniser les tracks Spotify
POST /albums Créer un album
PATCH /albums/:id Mettre Ă jour
DELETE /albums/:id Supprimer
GET /tracks Liste des tracks (paginée)
GET /tracks/:id Détails d'une track
POST /tracks/by-ids Récupérer plusieurs tracks
POST /tracks Créer une track
PATCH /tracks/:id Mettre Ă jour
DELETE /tracks/:id Supprimer
GET /search?q=query&type=TYPE&page=1&limit=20
Types: tracks, albums, artists, playlists, users
Filtres: minPopularity, maxPopularity, genre, year, fromYear, toYear
GET /playlists Liste des playlists
GET /playlists/public Playlists publiques
GET /playlists/user/:userId Playlists d'un utilisateur
GET /playlists/:id Détails d'une playlist
GET /playlists/:id/tracks Tracks de la playlist
POST /playlists Créer une playlist
PUT /playlists/:id/tracks/add Ajouter des tracks
PUT /playlists/:id/tracks/remove Retirer des tracks
PUT /playlists/:id/tracks/reorder Réordonner les tracks
PATCH /playlists/:id Mettre Ă jour
DELETE /playlists/:id Supprimer
GET /recommendations/:userId Recommandations personnalisées
GET /collaborations?minCount=N Réseau de collaborations
GET /stats/dashboard Stats du dashboard
GET /stats/artists/top?limit=10 Top artistes
GET /stats/release-cohorts Données de timeline
GET /stats/labels Stats par label
GET /stats/collaborations Stats de collaborations
Documentation complÚte : Voir la collection Postman ou utiliser l'endpoint /api (si Swagger activé)
Le projet utilise 5 collections principales :
{
_id: "spotify_id", // String (Spotify ID)
name: "Ninho",
popularity: 85, // 0-100
followers: 5234567,
genres: ["french rap", "rap"],
images: [{ url, height, width }],
album_ids: ["album1", "album2"],
...
spotify_synced: true
}{
_id: "spotify_id",
name: "Destin",
album_type: "album", // album | single | compilation
release_date: "2023-03-10",
popularity: 78,
label: "Rec. 118",
artist_ids: ["artist1"],
track_ids: ["track1", "track2"],
genres: ["french rap"],
spotify_synced: true
}{
_id: "spotify_id",
name: "VVS",
album_id: "album_id",
artist_ids: ["artist1", "artist2"], // Collaborations
duration_ms: 234567,
popularity: 82,
explicit: true,
track_number: 5,
disc_number: 1
}{
_id: ObjectId,
username: "user123",
password: "$2b$10$...", // Bcrypt hash
liked_tracks: ["track1", "track2"],
liked_albums: ["album1"],
favorite_artists: ["artist1"],
recommendations: {
sections: [...],
lastUpdated: Date
}
}{
_id: ObjectId,
name: "Mes favoris",
description: "Ma playlist préférée",
owner_id: ObjectId,
collaborators: [ObjectId],
track_ids: ["track1", "track2"],
isPublic: true,
createdAt: Date,
updatedAt: Date
}- Artists: Index textuel sur
name+genres - Albums: Index textuel sur
name - Tracks: Index textuel sur
name - Users: Index textuel sur
username(unique) - Playlists: Index textuel sur
name+description
Le projet implĂ©mente 15+ types de requĂȘtes MongoDB incluant :
- â CRUD de base
- â
Recherche avec
$regexcase-insensitive - â
Opérateurs de comparaison (
$gte,$lte,$in) - â
Expressions avec
$expr,$size,$substr,$toInt - â
Aggregation pipelines complexes (
$group,$project,$addFields) - â
Accumulateurs (
$sum,$avg,$cond) - â
Opérations mathématiques (
$divide,$round) - â
Jointures avec
.populate() - â
Optimisations (
.lean(),.select(),distinct())
Documentation détaillée : Voir /README_BDD.md




-
README_BDD.md - Documentation complÚte sur l'aspect base de données MongoDB
- RequĂȘtes avancĂ©es expliquĂ©es
- Aggregation pipelines détaillées
- Exemples de code annotés
- Concepts MongoDB démontrés
-
Discover README - Documentation technique du moteur de recommandations
-
API Reference - Voir section API Endpoints
Ce projet a été réalisé dans le cadre d'un cours de Base de Données pour démontrer :
- â MaĂźtrise de MongoDB (NoSQL)
- â RequĂȘtes complexes et optimisĂ©es
- â Aggregation pipelines multi-Ă©tapes
- â ModĂ©lisation de donnĂ©es pour une application rĂ©elle
- â Architecture full-stack moderne
- â IntĂ©gration d'APIs externes (Spotify)
Points forts techniques :
- 15+ types de requĂȘtes MongoDB diffĂ©rentes
- 5 collections avec relations
- Indexes textuels pour la recherche
- Cache en mémoire avec TTL
- Recommandations personnalisées
- Visualisations interactives