SongZ (temporary name)

Source code

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.

A bare-bones interface has a section to add a Google Drive file and a list of 5 songs that could be played.

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.

The, Import from Google Play Music Takeout, screen lists the steps of the import process.

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.

Keep Coming Back To The Start by Duplex Heart with Judith Rindeskog, is on the queue and playing in a narrow window. Inside by Bo Burnham is open and queued, and Welcome To The Internet is currently playing.

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.

1 throgh 26 of Zachary's top 100 songs for 2021. 27 through 51 of Zachary's top 100 songs for 2021. 52 through 76 of Zachary's top 100 songs for 2021. 77 through 100 of Zachary's top 100 songs for 2021.

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 include:

While using SongZ as my daily listening app, I identified additional features worth prioritizing on the roadmap, including:

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!

The Tick Tick Boom movie soundtrack plays.  The sidebar includes a tab for lyrics.