## VibeCheck – Mood-based Spotify Song Recommender Backend + mobile app for an AI agent that: - **Shows Vicoka songs on the home screen** (using Vicoka's Spotify artist ID) - **Takes mood as input** via text or facial scan - **Infers emotion** using Hugging Face models - **Maps emotion → music** and suggests a **Nigerian playlist** on Spotify - (Optionally) **logs interactions** in PostgreSQL. ### Tech stack - **Language**: Python - **Web framework**: FastAPI - **AI models**: Hugging Face `transformers` (text & image pipelines) - **Database**: PostgreSQL (via SQLAlchemy) - **Music**: Spotify Web API (`spotipy`) ### Quick start 1. Create and activate a virtualenv. 2. Install dependencies: ```bash pip install -r requirements.txt ``` 3. Set environment variables (or a `.env` file): - `DATABASE_URL` – e.g. `postgresql+psycopg2://user:password@localhost:5432/vicoka` - `SPOTIFY_CLIENT_ID` - `SPOTIFY_CLIENT_SECRET` - `SPOTIFY_REDIRECT_URI` (for OAuth, if you later build a full user-auth flow) 4. Run the API: ```bash uvicorn app.main:app --reload ``` ### System flow (end-to-end) #### 1. Spotify & data sources - VibeCheck uses the **Spotify Web API** for: - Vicoka artist data (ID: `4IqQ3ooH5vvzRl3c3vBfwN`) - Vicoka **top tracks** for the home screen - Nigerian playlists and tracks for recommendations - Hugging Face models provide: - **Text emotion** detection (`/mood/text`) - **Face emotion** detection (`/mood/face`) #### 2. Backend (FastAPI, `app/main.py`) - Exposes API endpoints: - `POST /mood/text` → detect mood from text and return a **playlist recommendation** - `POST /mood/face` → detect mood from face image and return a **playlist recommendation** - `GET /spotify/artists/id/4IqQ3ooH5vvzRl3c3vBfwN/top-tracks` → Vicoka's **top tracks** - Additional helpers: `/spotify/me`, `/spotify/playlists/*`, etc. - Flow for mood: 1. Receive text or image. 2. Run the appropriate Hugging Face pipeline to get `mood_label` and `mood_score`. 3. Use the label (e.g. `sadness`, `joy`) to build Afrobeats/Naija-focused **search queries**. 4. Call Spotify Search API to pick a **playlist** (not a single track). 5. Return mood + playlist fields to clients. - Flow for Vicoka top tracks: 1. Use artist ID to call `GET /v1/artists/{id}/top-tracks` with `market=NG`. 2. Normalize to simple track objects (id, name, uri, album, image, external URL). #### 3. Mobile app (Expo / React Native, `mobile/`) - Home screen shows: - **Vicoka songs (top tracks)**: - Grid of song cards (cover art, name, artist, album). - Tapping a card opens Spotify via `spotify:track:...` or track URL. - **Mood Check**: - Tabs for **Text** and **Face** input. - Calls `POST /mood/text` or `POST /mood/face`. - **Latest playlist suggestion** for the detected mood. - Users log in with Spotify (PKCE flow) before interacting: - Mobile app uses Spotify **Authorization Code with PKCE** (no client secret on device). - Access token is stored securely (SecureStore). - Backend `/spotify/me` can be used to show basic profile info. #### 4. Database (optional) - PostgreSQL (or Neon) stores: - `MoodLog` – user_id (optional), source (`text`/`face`), raw input, emotion label/score. - `RecommendationLog` – which track/playlist was suggested for which mood. - This logging is **non-critical**: if the DB is unavailable, the API still returns the recommendation. ### Next steps - Polish mobile UI/UX for the VibeCheck home screen: - Strong visual section for **Vicoka top tracks**. - Clear “Login with Spotify” state and error handling. - Iterate on mood → playlist mapping (more genres/queries per mood). - Add lightweight analytics (which moods and playlists are most frequent).