Often, people's taste in music varies, and that's good... except for cases such as long car rides. Being able to blend musical genres and styles can help make a centralized playlist that can be enjoyed by everyone in the room
What it does
Accesses listening data from a selection of Streaming services (Spotify, Google Play Music, Tidal, SoundCloud, Pandora, Hype Machine) utilizing Last.fm scrobbling and API capabilities. It then takes that listening data and looks at the top artists. Each top artist is given a set of genre tags based on there user ID on Musicbrainz (e.g. Queen = rock, hard rock, art rock, glam rock, pop rock, disco, progressive rock) and we narrow down relevant tags to consider. From there we get our specific genres, such as California Rap and 70's Classic Rock, and do our best to bridge the gap and create a balanced playlist that can then be played on Spotify.
How We built it
We used multiple API’s, such as last.fm and Spotify, as well as a whole lot of sponsored projects such as Google Cloud Platform and MongoDB. To use all this, we utilized Python (Flask) and HTML, hosted on Google Cloud Platform’s App Engine. Spotify’s API was used to create the playlist and last.fm was used to generate and parse the user’s listening data.
Challenges We ran into
Song_IDs -We had an issue with code identifying the music. This cause the program to not add songs to the mixed playlist. This was because of an issue with the API but we found a way around. Secret Key -Having an issue program lacking a secret key despite one existing. Turns out that our key was being overwritten while initializing something else. We just need another set of eyes on our program, and it turned out to be a quick fix. Missing songs - There was another issue where some songs would not get added to the playlist. It turns out that some Spotify song URIs contain special characters that need to be URI encoded, but that is not the case for all songs. POST request missing data -Some endpoints of our backend API would not receive the required POST data. It turns out that Python's request library has two variables to POST JSON data. Only one of which works correctly.
Accomplishments that We're proud of
Making our first playlist When we gave the program our playlists to work with, it merged our playlist. We were confident about the functionality of the program and we were right. The program worked didn't just work fine it worked very well. Our group's two people that input their playlist were happy to see their favorite songs put into the mixed playlist.
Working with Eric was very informative. Eric was able to help our team with many issues, including creating the web form, OAuth, the API calls, and linking the database to our backend. It would have been impossible to successfully complete the project without his assistance.
What We learned
There were many hurdles we ran into during the development of Uniaux. One of the biggest challenges we had to overcome was implementing OAuth authentication through HTTP requests. Prior to today, we had no idea that OAuth works exclusively through a series of HTTP requests, with many parameters that are customizable from the client application. We were able to utilize the OAuth authentication for our backend since there were no client libraries for Spotify’s web API for use with Flask (Python). This was the first app that we were able to successfully utilize MongoDB to store various information about the users and the song data for adding them to the aggregate playlist. We were able to host MongoDB easily using Google Cloud Platform and MongoDB Atlas.
For Edwin, this was his first ever program written in Python. Despite that, he was able to write many functions for the backend of the web app.
What's next for UniAux
We planned on integrating a mobile app to go along with our service, including a way to link to your Spotify app. We would want to really polish the front-end of the website since that, for us, was lacking. We want to make it easier for people to start “scrobbling” through their last.fm, but that would have required a lot more time messing with their api, which wasn’t optimal for a Hackathon.