In celebration of the joy and community I experienced at KamiLimu, this project curates a living playlist for graduation day and the moments that follow. The idea is simple: every track captures a shared memory. When a song plays, it should instantly transport someone back to that moment in the ceremony—the laughter, the nerves, the pride—and let them relive how it felt.
- Pulls song and artist data from a shared Google Sheet where all cohort 9 mentees shared tracks.
- Fetches Spotify URIs in batches of 50, persisting results to
spotify_results.csv. - Builds a Spotify playlist from the saved URIs, so you can iterate on search results before publishing.
- Python 3.10+
- Spotify API credentials (client ID, client secret, redirect URI) with a registered app.
.envfile containing:SPOTIPY_CLIENT_ID=your_client_id SPOTIPY_CLIENT_SECRET=your_client_secret SPOTIPY_REDIRECT_URI=http://localhost:8888/callback SCOPE=playlist-modify-public playlist-modify-private- Access to the Google Sheet (update the URL in
track_uris.pyif needed).
Install dependencies:
pip install -r requirements.txt
track_uris.py: reads the sheet, searches Spotify in 50-song batches, writes/updatesspotify_results.csv. Skips songs without matches and logs each batch.main.py: full orchestration. Rebuilds the CSV (viatrack_uris) and immediately creates the playlist using the URIs.spotify_service.py: shared Spotify helpers (auth, load URIs, playlist creation).read_data.py: Google Sheet reader with column validation.
-
Generate or refresh URIs only
python track_uris.pyCheck
spotify_results.csvto review matches before playlist creation. -
End-to-end run (CSV + playlist)
python main.py- Re-queries Spotify for all songs (refreshes the CSV).
- Loads URIs from the CSV.
- Creates a playlist, adding tracks in 50-item batches and logging each addition.
- If you edit the Google Sheet, re-run
track_uris.py(ormain.py) to sync the CSV. - The playlist is created on the authenticated Spotify account; ensure the scopes in
.envmatch your needs (public vs private). - The scripts skip songs without a Spotify match so the run never stalls—those entries remain absent from the CSV until a URI is found.
This repository is open feel free to fork it for your own ceremonies or collective moments. May every track keep the memory of KamiLimu alive whenever the playlist plays. 🎓🎶