summaryrefslogtreecommitdiff
path: root/data/rbot/plugins/lastfm.rb
blob: f2ecd053dcef480d565baa2a1114c2f7c33f69a0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#-- vim:sw=2:et
#++
#
# :title: lastfm plugin for rbot
#
# Author:: Jeremy Voorhis
# Author:: Giuseppe "Oblomov" Bilotta <giuseppe.bilotta@gmail.com>
#
# Copyright:: (C) 2005 Jeremy Voorhis
# Copyright:: (C) 2007 Giuseppe Bilotta
#
# License:: GPL v2

require 'open-uri'

class LastFmPlugin < Plugin

  LASTFM = "http://www.last.fm"

  def help(plugin, topic="")
    case topic.intern
    when :artist, :group
      "lastfm artist <name> => show information on artist/group <name> from last.fm"
    when :song, :track
      "lastfm track <name> => show information on track/song <name> from last.fm [not implemented yet]"
    when :album
      "lastfm album <name> => show information on album <name> from last.fm"
    else
      "lastfm <function> <user> => lastfm data for <user> on last.fm where <function> in [recenttracks, topartists, topalbums, toptracks, tags, friends, neighbors]. other topics: artist, group, song, track, album"
    end
  end

  def lastfm(m, params)
    action = params[:action].intern
    action = :neighbours if action == :neighbors
    what = params[:what]
    case action
    when :artist, :group
      artist = what.to_s
      begin
        esc = URI.escape(artist)
        page = @bot.httputil.get "#{LASTFM}/music/#{esc}"
        if page
          if page.match(/<h1 class="h1artist"><a href="([^"]+)">(.*?)<\/a><\/h1>/)
            url = LASTFM + $1
            title = $2.ircify_html
          else
            raise "No URL/Title found for #{artist}"
          end

          wiki = "This #{action} doesn't have a description yet. You can help by writing it: #{url}/+wiki?action=edit"
          if page.match(/<div class="wikiAbstract">(.*?)<\/div>/m)
            wiki = $1.ircify_html
          end

          m.reply "%s : %s\n%s" % [title, url, wiki]
        else
          m.reply "no data found on #{artist}"
        end
      rescue Exception => e
        m.reply "I had problems looking for #{artist}"
        error e.inspect
        debug e.backtrace.join("\n")
        debug page[0...10*1024]
        return
      end
    when :song, :track
      m.reply "not implemented yet, sorry"
    when :album
      m.reply "not implemented yet, sorry"
    else
      return usage(m) unless what.length == 1
      user = what.first
      begin
        data = open("http://ws.audioscrobbler.com/1.0/user/#{user}/#{action}.txt")
        m.reply "#{action} for #{user}:"
        m.reply data.to_a[0..3].map{|l| l.split(',',2)[-1].chomp}.join(", ")
      rescue
        m.reply "could not find #{action} for #{user} (is #{user} a user?)"
      end
    end
  end
end

plugin = LastFmPlugin.new
plugin.map 'lastfm :action *what'