Skip to content

Instantly share code, notes, and snippets.

@tliff
Created May 30, 2014 19:38
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tliff/44a22b376a6bb65a91ce to your computer and use it in GitHub Desktop.
Save tliff/44a22b376a6bb65a91ce to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby
require 'pp'
require 'spotify'
require 'io/console'
USERNAME='tliff'
PLAYLIST='spotify:user:1121758979:playlist:1ohNJvub3eoB86tKumCC7U'
CONFIG = Spotify::SessionConfig.new({
api_version: Spotify::API_VERSION.to_i,
application_key: File.binread(File.expand_path("~/.spotify/spotify_appkey.key")),
cache_location: File.expand_path("~/.spotify/"),
settings_location: File.expand_path("~/.spotify/"),
user_agent: "spotify for ruby",
callbacks: Spotify::SessionCallbacks.new
})
def prompt(message, default = nil)
if default
print "\n#{message} [#{default}]: "
input = gets.chomp
if input.empty?
default
else
input
end
else
print "\n#{message}: "
gets.chomp
end
end
def initialize_spotify!
$session = FFI::MemoryPointer.new(Spotify::Session) do |ptr|
Spotify.try(:session_create, CONFIG, ptr)
break Spotify::Session.new(ptr.read_pointer)
end
remembered_user_length = Spotify.session_remembered_user($session, nil, 0)
if remembered_user_length > 0
username = FFI::MemoryPointer.new(:int, remembered_user_length + 1) do |username_ptr|
Spotify.session_remembered_user($session, username_ptr, username_ptr.size)
break username_ptr.read_string.force_encoding("UTF-8")
end
Spotify.try(:session_relogin, $session)
else
username = prompt("Spotify username, or Facebook e-mail")
password = $stdin.noecho { prompt("Spotify password, or Facebook password") }
Spotify.try(:session_login, $session, username, password, true, nil)
end
poll { Spotify.session_connectionstate($session) == :logged_in }
# puts "a"
at_exit do
Spotify.session_logout($session)
poll { Spotify.session_connectionstate($session) != :logged_in }
end
end
def poll
until yield
#puts '.'
process_events
sleep(0.05)
end
end
def process_events
FFI::MemoryPointer.new(:int) do |ptr|
Spotify.session_process_events($session, ptr)
end
end
track_id=`osascript -e 'tell Application "Spotify" to get the spotify url of current track'`.strip
exit 1 unless track_id =~ /^spotify:track:\w+/
$session = nil
initialize_spotify!
user_link = "spotify:user:#{USERNAME}"
link = Spotify.link_create_from_string(user_link)
user = Spotify.link_as_user(link)
poll { Spotify.user_is_loaded(user) }
playlist_link = Spotify.link_create_from_string(PLAYLIST)
playlist = Spotify.playlist_create($session, playlist_link)
poll { Spotify.playlist_is_loaded(playlist) }
track_link = Spotify.link_create_from_string(track_id)
track = Spotify.link_as_track(track_link)
poll { Spotify.track_is_loaded(track) }
tracks = [track]
tracks_pointer = FFI::MemoryPointer.new(Spotify::Track, tracks.length)
tracks_pointer.write_array_of_pointer(tracks)
Spotify.playlist_add_tracks(playlist, tracks_pointer, tracks.length, Spotify.playlist_num_tracks(playlist), $session)
sleep 1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment