For years, I had ideas collecting in the back of my mind of features I wished music apps had, but also recognized it would be a massive undertaking to develop my own music app. When Google killed Google Music in 2020, and every other cloud music library service I liked had also shut down, I could finally justify attempting this project.
On of my top goals was to be able to stream my Google Drive back-up of my music library without having to upload the files to any other service, so I initially prototyped just that. Next, I added preloading the next song in the queue to enable seamless song transitions.
After that, I began working on the main app UI, but also on the script that would import all my metadata from my Google Music Takeout. The latter proved challenging primarily due to the lack of organization of the Google Takeout folder. Most notably, songs had some metadata in CSVs and some in only in their MP3s' ID3 tags, but the CSV and MP3 files did not always have the same file names, so I had to do my best to reverse engineer the file name conventions and write a script that could retrieve the matching file names. That was further complicated when the new (at the time) file picker API was updated to not open files with certain characters in their names, so I had to remove some files from the Takeout and manually upload them after the import.
Finally, after months of trial and error, bug fixing, and manual checks for issues, I did the final import the following April. It was simultaneously terrifying and exhilarating to finally have my music library, which I had brought from Windows Media Player, to iTunes, to Google Music, and out through Google Takeout, in its (presumably) final home.
When I was not working on the import script, I was building out the main app UI. Though I had recently worked with Vue.js in my job at the time, I decided to build on top of Lit, primarily because it was closer to using native web components, and thus easier to make interoperable if I decided to use other frameworks down the road, though also because I decided to use Google's Material Web Components to build the initial UI more quickly, which were also made with Lit.
I wanted to keep things simple, with the tabbed interface of early mobile music apps, rather than the more complex interfaces of later ones. I put the queue of currently-playing songs in a persistent sidebar in wide windows, a UI pattern I have preferred since Windows Media Player. In narrow windows, I turned the three sections of the current song's play controls into a swipeable panel and then kept the play queue as a side drawer, which I preferred to the more common pattern of a panel pulled up from the bottom. That was the one component I used from Polymer instead of the newer Material Web Components, since the MWC drawer component does not (at time of writing) have touch gesture support.
By August, I had everything in the UI working well enough I had completely switched to using SongZ as my music app! In the following weeks and months, as I had time, I added additional features, such as 5-point ratings, lyrics in the sidebar. In December, when the year's Spotify Wrapped came out, I had enough data collected from my regular use of the app to generate my own top 100 playlist, and I subsequently updated that to be able to pull my top 100 songs for any range of time since SongZ became my primary music app.
I am still working toward adding other long-wanted features as I have time, but now the ground work has at least been laid. The ones I most wanted/want to have include:
Songs are streamed from Google Drive back-up 5-point song preference ratings
- See a person's artist and composer credits
Generate a list of most-played songs for a period of time
- Generate playlist of least-played liked songs
- Generate playlist of least-recently-played liked songs
- Generate playlist of unrated songs from albums with liked songs
- Weighted shuffle with any ±0 song able to appear, but +1 and +2 more likely
- Specify how far into a song to start if it is played as part of a playlist
- Specify a song that should immediately follow a given one even when shuffling
- Keep app color scheme synced with current song's album art
Beyond those features, the other reasons I decided to take on this project over just using Spotify are the freedom to control my library and include things like mashups, game soundtracks, obscure stuff, and personal edits; and that buying music from artists on their personal sites or Bandcamp pages instantly gives them a few hundred Spotify plays' worth of support.
I am not currently running an instance of SongZ for anyone else use, but the source code is available on GitHub for anyone to set up xer own instance!