An analysis of the evolution of the Emo musical genre for the Seminars UC @ FEUP
Final grade: 19.3/20.0
Final report under /report.pdf
List of songs used can be found here for: 1st Wave, 2nd Wave, 3rd Wave, 4th Wave, 5th Wave and Screamo.
To run the project, you need uv. You can follow the installation process here.
Remove the extension .example from .env.example.
A Genius Access Token is needed in order to use the library LyricsGenius, which will retrieve the song lyrics into our dataset. Further explanation can be seen here.
Go to Genius' API Clients and generate a Client Access Token and place it inside .env in GENIUS_ACCESS_TOKEN.
A Spotify Client ID and Secret are needed in order to use the library Spotipy, which simplifies the usage of Spotify's Web API, removing the need to use requests.
Go to Spotify's Developer Dashboard and create an app in order to retrieve Client ID and Secret and place them inside .env under the correct fields. It's obligatory to include a Redirect URI, but this can be to anything as we won't use it. In APIs used be sure to check Web API.
A Last.FM API Key and Shared Secret are needed in order to use the library pylast, which simplifies the usage of Last.fm's API, like Spotipy.
They can be created here and later seen here. Place the given strings inside .env.
The hot100fixed.csv contains all the information needed, therefore this step is only needed if you wish to run setupBillboard() with the original dataset.
In order to get the information on if a song was featured on Billboard Hot 100 or not, we use a dataset from Kaggle, which contains the entire history from the Hot 100. Since there is a lot of information and no API which let's us verify if a given song was featured on the Top 100, this is the optimal choice.
The dataset can be found here and should be placed under resources/datasets/.
First, to create/update your virtual environment with the desired packages, run:
uv syncThen run:
uv run main.pyInside root/resources there is a folder for each wave and screamo: w1, w2, w3, w4, w5 and screamo.
Each folder should have the songs with the file name following the format: artist - song title, if the artist has a - in it's name (e.g., Blink-182) than it should not be included and later added manually or the separation should be changed and the code adapted.
Artist- String: The name of the artist/band who made the songSong- String: Song titleWave- Int: Wave 1 = 1, ..., Screamo = 0Lyrics- String: Full text of the song's lyricsGenres- List of Strings: Aside from Emo, what other genres this song belongs to. Data from RYMPopularity- Int: Last.FM scrobbles of the songBillboard- Boolean: If it was ever featured on Billboard Hot 100- (...) Audio Features retrieved from APIs - #TODO