Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
A Spotify music quiz, implemented in ruby.
#!/bin/ruby
#
# Implements a simple music quiz.
#
# With a list of correct
# answers and a button, attached via serial. When the button
# is pressed, the meta data of the currently playing song in
# Spotify is checked, and if the currently playing song is
# in the list of correct songs a 'winner' sound file is played
# using aplay. If the currenlty playing song is not correct, a
# sad trombone sounds, shaming the button presser for his or her
# lack of cultural knowledge, in public, which is, to date, the
# most favorable of shaming eeh modalities. The previous, sentence,
# might contain to much commas. I might be a bit drunk, perhaps.
require 'rubygems'
require 'serialport'
device = "/dev/tty.usbserial-A4001nL5"
baudrate = 9600
sp = SerialPort.new(device,baudrate)
now_playing_command="./now_playing.osascript"
#Wrong answer: sad trombone
sad_trombone="sad_trombone.wav"
#Congratulations you win!!
winner="winner.wav"
#Invalid answer
cheater="cheater.wav"
# A list of correct titles, this assumes no titles
# appear twice in your playlist, a reasonable assumption
correct_answer_list=[
"It's My Life",
"Forever Young",
"I Want To Break Free - 2011 Remaster",
"Shout - Edit",
"Wrapped Around Your Finger - 2003 Stereo Remastered Version",
"Purple Rain",
"The Killing Moon [Ocean Rain / Expanded]",
"Tonight",
"Owner Of A Lonely Heart",
"99 Luftballons",
"Here Comes The Rain Again"]
# Parse the meta data (| is the separator)
def parse_result(result)
result =~ /^(.+) \| (.+) \| (.+) \| .*$/
[$1,$2,$3]
end
#Play a wav file with aplay or afplay
def play(filename)
puts "play " + filename
spawn "afplay \"#{filename}\""
end
# Make the answer list a hash for quick lookup
# premature optimization, i know, but hey.
correct_answers= Hash.new
correct_answer_list.each do |correct|
correct_answers[correct] = true
end
# This stores if somebody has
# already answered for this song
responded_to = Hash.new
while true do
# Wait for a button press
data = sp.readline
# Fetch meta data about the currently
# playing song
result = `#{now_playing_command}`
# Parse the meta data
title,artist,album = parse_result(result)
#Title is hash key, should be unique within playlist
key = title
if responded_to.has_key? key
puts "Already answered: you cheater"
play cheater
elsif correct_answers.has_key? key
puts "Correct answers: woohoo"
responded_to[key]=true
play winner
else
puts "Incorrect answer: sad trombone"
responded_to[key]=true
play sad_trombone
end
puts key
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment