Voting on the Songs
The text your name feature from 2018 worked so well, that we
wanted to add an additional interactive element in 2019. After some thought, we got the idea of
allowing viewers to vote for the next song. After considering a few different implementations,
we decided upon a simple website designed for the moble phone and that is how
vote-now.org was born.
How it works
- The front end website is a simple single page website with four tabs. It was developed using vue.js to be both reactive and mobile friendly. The source code for the frontend is public.
- The backend is written in node.js and provides the basic endpoints for voting and getting information about the queue. (Source Code)
- Each visitor is allowed to have at 8 votes cast at any given time. Once a song he/she has voted for begins to play, any votes he/she had on that song are returned. In addition, a new vote is granted every few minutes up to a maximum of 8 available votes.
- To ensure the voters don't keep repeating the same song over and over again, once a song has played, it isn't available for voting for around 6 minutes.
- We use the Falcon Player to actually play the songs on the display. This will send periodic updates via MQTT on which song is playing and how many seconds are left. These details are transmitted to each active web client via the web server. (Greg actually contributed some source code to the Falcon Player project to allow for this capability.)
- The webserver is responsible for scheduling. The schedule is mostly driven by songs, but also by the number of names in the queue, the shows hours, and how long it has been since specific sequences were played (intro, radio station, etc.) When it has detected the falcon isn't playing a song, it send the next scheduled playlist name to the Falcon Player via an MQTT request.
- Finally, there is another set of docker containers that records all the stats (names submitted, votes casts, songs played) and periodically reports a summary of those statistics to the webserver for distribution to browsers. (Source Code)