# License:: GPL v2
require 'rexml/document'
+require 'cgi'
class ::LastFmEvent
def initialize(hash)
if @artists.length > 10 #more than 10 artists and it floods
diff = @artists.length - 10
- @artist_string = @artists[0..10].join(', ')
+ @artist_string = Bold + @artists[0..10].join(', ') + Bold
@artist_string << _(" and %{n} more...") % {:n => diff}
else
- @artist_string = @artists.join(', ')
+ @artist_string = Bold + @artists.join(', ') + Bold
end
end
_("lastfm artist <name> => show information on artist <name> from last.fm")
when :album
_("lastfm album <name> => show information on album <name> from last.fm [not implemented yet]")
+ when :track
+ _("lastfm track <name> => search tracks matching <name> on last.fm")
when :now, :np
_("lastfm now [<user>] => show the now playing track from last.fm. np [<user>] does the same.")
when :set
_("lastfm set nick <user> => associate your current irc nick with a last.fm user. lastfm set verb <present> <past> => set your preferred now playing verb. default \"listening\" and \"listened\".")
when :who
_("lastfm who [<nick>] => show who <nick> is at last.fm. if <nick> is empty, show who you are at lastfm.")
+ when :compare
+ _("lastfm compare <nick1> <nick2> => show musical taste compatibility between nick1 and nick2.")
else
- _("lastfm [<user>] => show your or <user>'s now playing track at lastfm. np [<user>] => same as 'lastfm'. other topics: events, artist, album, now, set, who")
+ _("lastfm [<user>] => show your or <user>'s now playing track at lastfm. np [<user>] => same as 'lastfm'. other topics: events, artist, album, track, now, set, who, compare")
end
end
uri = nil
if artist == nil
- uri = URI.escape("#{APIURL}method=geo.getevents&location=#{location}")
+ uri = "#{APIURL}method=geo.getevents&location=#{CGI.escape location}"
else
- uri = URI.escape("#{APIURL}method=artist.getevents&artist=#{artist}")
+ uri = "#{APIURL}method=artist.getevents&artist=#{CGI.escape artist}"
end
xml = @bot.httputil.get_response(uri)
doc = Document.new xml.body
if xml.class == Net::HTTPInternalServerError
- if doc.root.attributes["status"] == "failed"
+ if doc.root and doc.root.attributes["status"] == "failed"
m.reply doc.root.elements["error"].text
else
m.reply _("Could not retrieve events")
venue = e.elements["venue"].elements["name"].text
city = e.elements["venue"].elements["location"].elements["city"].text
country = e.elements["venue"].elements["location"].elements["country"].text
- h[:location] = Bold + venue + Bold + " #{city}, #{country}"
+ h[:location] = Underline + venue + Underline + " #{Bold + city + Bold}, #{country}"
date = e.elements["startDate"].text.split
h[:date] = Time.utc(date[3].to_i, date[2], date[1].to_i)
h[:desc] = e.elements["description"].text
opts = { :cache => false }
user1 = params[:user1].to_s
user2 = params[:user2].to_s
- xml = @bot.httputil.get_response("#{APIURL}method=tasteometer.compare&type1=user&type2=user&value1=#{user1}&value2=#{user2}", opts)
+ xml = @bot.httputil.get_response("#{APIURL}method=tasteometer.compare&type1=user&type2=user&value1=#{CGI.escape user1}&value2=#{CGI.escape user2}", opts)
doc = Document.new xml.body
unless doc
m.reply _("last.fm parsing failed")
else
user = m.sourcenick
end
- xml = @bot.httputil.get_response("#{APIURL}method=user.getrecenttracks&user=#{user}", opts)
+ xml = @bot.httputil.get_response("#{APIURL}method=user.getrecenttracks&user=#{CGI.escape user}", opts)
doc = Document.new xml.body
unless doc
m.reply _("last.fm parsing failed")
end
def find_artist(m, params)
- xml = @bot.httputil.get(URI.escape("#{APIURL}method=artist.getinfo&artist=#{params[:artist]}"))
+ xml = @bot.httputil.get("#{APIURL}method=artist.getinfo&artist=#{CGI.escape params[:artist].to_s}")
unless xml
m.reply _("I had problems getting info for %{a}.") % {:a => params[:artist]}
return
playcount = first.elements["stats"].elements["plays"].text
listeners = first.elements["stats"].elements["listeners"].text
summary = first.elements["bio"].elements["summary"].text
- m.reply _("\"%{a}\" has been played %{c} times and is being listened to by %{l} people.") % {:a => artist, :c => playcount, :l => listeners}
- m.reply summary.strip
+ m.reply _("%{b}%{a}%{b} has been played %{c} times and is being listened to by %{l} people.") % {:b => Bold, :a => artist, :c => playcount, :l => listeners}
+ m.reply summary.ircify_html
+ end
+
+ def find_track(m, params)
+ track = params[:track].to_s
+ xml = @bot.httputil.get("#{APIURL}method=track.search&track=#{CGI.escape track}")
+ unless xml
+ m.reply _("I had problems getting info for %{a}.") % {:a => track}
+ return
+ end
+ debug xml
+ doc = Document.new xml
+ unless doc
+ m.reply _("last.fm parsing failed")
+ return
+ end
+ debug doc.root
+ results = doc.root.elements["results/opensearch:totalResults"].text.to_i rescue 0
+ if results > 0
+ begin
+ hits = []
+ doc.root.each_element("results/trackmatches/track") do |track|
+ hits << _("%{bold}%{t}%{bold} by %{bold}%{a}%{bold} (%{n} listeners)") % {
+ :t => track.elements["name"].text,
+ :a => track.elements["artist"].text,
+ :n => track.elements["listeners"].text,
+ :bold => Bold
+ }
+ end
+ m.reply hits.join(' -- '), :split_at => ' -- '
+ rescue
+ error $!
+ m.reply _("last.fm parsing failed")
+ end
+ else
+ m.reply _("track %{a} not found") % {:a => track}
+ end
end
def get_album(artist, album)
- xml = @bot.httputil.get(URI.escape("#{APIURL}method=album.getinfo&artist=#{artist}&album=#{album}"))
+ xml = @bot.httputil.get("#{APIURL}method=album.getinfo&artist=#{CGI.escape artist}&album=#{CGI.escape album}")
unless xml
return [_("I had problems getting album info")]
end
plugin.map 'np :who', :action => :now_playing, :thread => true
plugin.map 'lastfm artist *artist', :action => :find_artist, :thread => true
plugin.map 'lastfm album *album [by *artist]', :action => :find_album
+plugin.map 'lastfm track *track', :action => :find_track, :thread => true
plugin.map 'lastfm set nick :who', :action => :set_user, :thread => true
plugin.map 'lastfm set verb :present :past', :action => :set_verb, :thread => true
plugin.map 'lastfm who :who', :action => :get_user, :thread => true