* I installed Raspberry Pi OS Lite as my OS. I figured I'd be conservative by not installing a full desktop environment, not sure if that was actually necessary in retrospect. The Pi Zero is more capable than I originally figured.
* Streaming from Spotify was surprisingly simple. I installed Raspotify, which just runs as a daemon and handles everything once you've authenticated. When it's running, the Pi appears as a "Spotify Connect" device on your account, and you can instruct it to takeover playback via an HTTP request (or using the UI of another authenticated Spotify client!).
* I used the Spotipy Python library to authenticate, search Spotify's catalog, fetch my saved artists/albums/playlists, and send playback commands to Spotify's servers.
* I wrote the UI as a Python application using tkinter. It was honestly pretty great to work with - front-end frameworks are hard to pick up! And this project was the first time I put any real effort into learning (and trying to love) Python. Forgive me, I spend most of my time in JVM-land.
* Referencing Jason Garr's blog post, I wrote a C program to the bitbang the click wheel's serial data into the Pi. I used pigpio to control the GPIO pins. Once I parse out the button presses and finger position, I send the data to the UI application via UDP. Jason - THANK you, wherever you are. This project would have been nothing without the original click wheel, and I would not have been brave enough to try to figure out the pinout myself. I will - hopefully - on future projects.
* ^ I snuck the haptic control into the C program that reads the click wheel. When the user's finger position changes, I quickly pulse the GPIO pin that's hooked up to the haptic motor. This was super easy, but the downside is that the haptics don't sync perfectly with the UI. For example, if you reach the bottom of a list, the haptics will continue even when the scrolling stops. It syncs perfectly while actively scrolling, so I didn't think it was worth changing.
* I use Redis (via Python library) to persist/cache user's Spotify data.
* I use Openbox to host the UI Application, which starts automatically once the PI boots up.
* I use pi-btaudio to get Bluetooth audio out of the Pi.
All of my source code will eventually be available here.
Issues / TODOs:
* At some point the Pi started emitting a high-pitch whine. Big spike at 16khz and a little something at 8khz. What could this be? Doesn't bother me too much but I'd be scared to bring this thing around dogs...
* Haven't provided any UI to change the WiFi/Spotify credentials. It's hot-spotted to my phone so I never really have to change the WiFi.
* Haven't provided UI to shut the Pi down safely. I've been SSHing in to power down. : P
* Forgot to add numbers to the search screen :facepalm:
* Fully refreshing user's Spotify data takes a while, so I don't do bother with it at boot time. Again, I SSH in and pull manually.
* Definitely want to add UI to choose between user's "Spotify Connect" playback devices.
* The headphone jack doesn't work currently! I think if I switch to a smaller boost module, I can fit a small USB DAC and hook it back up.
* Didn't add UI to control volume. I just do it via Bluetooth hardware. Not sure I care enough.
* Looks like I can get hooks into Bluetooth play/pause/volume changes. Would love to hook those up.