summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaine Virta <rane@kapsi.fi>2009-12-13 22:25:13 +0200
committerGiuseppe Bilotta <giuseppe.bilotta@gmail.com>2009-12-21 10:30:44 +0100
commitf83cf5ee37e960b6f873d29554e42a22e6957738 (patch)
tree6f736f3f4ac7ee9a64ac19b9979e51607dfbfc37
parent149d205ef773fad5412d1e80548e092509a42868 (diff)
add lib_spotify plugin
-rw-r--r--data/rbot/plugins/lib_spotify.rb83
1 files changed, 83 insertions, 0 deletions
diff --git a/data/rbot/plugins/lib_spotify.rb b/data/rbot/plugins/lib_spotify.rb
new file mode 100644
index 00000000..a30157c6
--- /dev/null
+++ b/data/rbot/plugins/lib_spotify.rb
@@ -0,0 +1,83 @@
+#-- vim:sw=2:et
+#++
+#
+# :title: spotify library used at least in spotify and lastfm plugins
+#
+# Author:: Raine Virta <raine.virta@gmail.com>
+#
+# Copyright:: (C) 2009 Raine Virta
+#
+# License:: GPL v2
+
+require 'rexml/document'
+require 'cgi'
+
+module ::Spotify
+ class SpotifyObject
+ def initialize(xml)
+ @spotify_id = xml.attributes["href"]
+ end
+
+ def url
+ id = @spotify_id[@spotify_id.rindex(':')+1..-1]
+ method = self.class.to_s.split('::').last.downcase
+ return "http://open.spotify.com/#{method}/#{id}"
+ end
+ end
+
+ class Album < SpotifyObject
+ attr_reader :name, :released, :artist
+
+ def initialize(xml)
+ super
+ @name = xml.elements["name"].text
+ if e = xml.elements["artist"]
+ @artist = Artist.new(xml.elements["artist"])
+ end
+ if e = xml.elements["released"]
+ @released = e.text.to_i
+ end
+ end
+ end
+
+ class Artist < SpotifyObject
+ attr_reader :name
+
+ def initialize(xml)
+ super
+ @name = xml.elements["name"].text
+ end
+ end
+
+ class Track < SpotifyObject
+ attr_reader :name, :artist, :album, :track_number
+
+ def initialize(xml)
+ super
+ @name = xml.elements["name"].text
+ @artist = Artist.new(xml.elements["artist"])
+ @album = Album.new(xml.elements["album"])
+ @track_number = xml.elements["track-number"].text.to_i
+ @length = xml.elements["length"].text.to_f
+ end
+
+ def to_s
+ str = "#{artist.name} – #{name} [#{album.name}"
+ str << ", #{album.released}" if album.released
+ str << "]"
+ end
+ end
+
+ def self.get(service, method, query, page=1)
+ query.tr!('-','')
+ url = "http://ws.spotify.com/#{service}/1/#{method}?q=#{CGI.escape(query)}&page=#{page}"
+ xml = Irc::Utils.bot.httputil.get_response(url).body
+ return REXML::Document.new(xml).root
+ end
+
+ def self.search(method, query, page=1)
+ doc = get(:search, method, query, page)
+ return nil if doc.elements["opensearch:totalResults"].text.to_i.zero?
+ return Spotify.const_get(method.to_s.capitalize).new(doc.elements[method.to_s])
+ end
+end