rscrobbler 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/lastfm/album.rb +63 -0
- data/lib/lastfm/artist.rb +116 -0
- data/lib/lastfm/auth.rb +24 -0
- data/lib/lastfm/chart.rb +39 -0
- data/lib/lastfm/event.rb +42 -0
- data/lib/lastfm/geo.rb +64 -0
- data/lib/lastfm/group.rb +39 -0
- data/lib/lastfm/library.rb +66 -0
- data/lib/lastfm/playlist.rb +26 -0
- data/lib/lastfm/radio.rb +27 -0
- data/lib/lastfm/tag.rb +54 -0
- data/lib/lastfm/tasteometer.rb +15 -0
- data/lib/lastfm/track.rb +121 -0
- data/lib/lastfm/user.rb +141 -0
- data/lib/lastfm/venue.rb +24 -0
- data/lib/rscrobbler.rb +161 -0
- metadata +72 -0
data/lib/lastfm/album.rb
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
module LastFM
|
2
|
+
class Album
|
3
|
+
class << self
|
4
|
+
|
5
|
+
TYPE = 'album'
|
6
|
+
|
7
|
+
# @see http://www.last.fm/api/show?service=302
|
8
|
+
def add_tags( artist, album, tags )
|
9
|
+
LastFM.requires_authentication
|
10
|
+
LastFM.post( "#{TYPE}.addTags", 'artist'=>artist, 'album'=>album, 'tags'=>tags )
|
11
|
+
end
|
12
|
+
|
13
|
+
# @see http://www.last.fm/api/show?service=429
|
14
|
+
def get_buylinks( country, artist = nil, album = nil, mbid = nil, autocorrect = nil )
|
15
|
+
raise ArgumentError unless artist && album || mbid
|
16
|
+
LastFM.get( "#{TYPE}.getBuylinks", !:secure, 'country'=>country, 'artist'=>artist, 'album'=>album, 'mbid'=>mbid, 'autocorrect'=>autocorrect )
|
17
|
+
end
|
18
|
+
|
19
|
+
# @see http://www.last.fm/api/show?service=290
|
20
|
+
def get_info( artist = nil, album = nil, mbid = nil, lang = nil, autocorrect = nil, username = nil )
|
21
|
+
raise ArgumentError unless artist && album || mbid
|
22
|
+
LastFM.get( "#{TYPE}.getInfo", !:secure, 'artist'=>artist, 'album'=>album, 'mbid'=>mbid, 'lang'=>lang, 'autocorrect'=>autocorrect, 'username'=>username )
|
23
|
+
end
|
24
|
+
|
25
|
+
# @see http://www.last.fm/api/show?service=450
|
26
|
+
def get_shouts( artist = nil, album = nil, mbid = nil, autocorrect = nil, limit = nil, page = nil )
|
27
|
+
raise ArgumentError unless artist && album || mbid
|
28
|
+
LastFM.get( "#{TYPE}.getShouts", !:secure, 'artist'=>artist, 'album'=>album, 'mbid'=>mbid, 'autocorrect'=>autocorrect, 'limit'=>limit, 'page'=>page )
|
29
|
+
end
|
30
|
+
|
31
|
+
# @see http://www.last.fm/api/show?service=317
|
32
|
+
def get_tags( artist = nil, album = nil, mbid = nil, autocorrect = nil )
|
33
|
+
raise ArgumentError unless artist && album || mbid
|
34
|
+
LastFM.requires_authentication
|
35
|
+
LastFM.get( "#{TYPE}.getTags", :secure, 'artist'=>artist, 'album'=>album, 'mbid'=>mbid, 'autocorrect'=>autocorrect )
|
36
|
+
end
|
37
|
+
|
38
|
+
# @see http://www.last.fm/api/show?service=438
|
39
|
+
def get_top_tags( artist = nil, album = nil, mbid = nil, autocorrect = nil )
|
40
|
+
raise ArgumentError unless artist && album || mbid
|
41
|
+
LastFM.get( "#{TYPE}.getTopTags", !:secure, 'artist'=>artist, 'album'=>album, 'mbid'=>mbid, 'autocorrect'=>autocorrect )
|
42
|
+
end
|
43
|
+
|
44
|
+
# @see http://www.last.fm/api/show?service=314
|
45
|
+
def remove_tag( artist, album, tag )
|
46
|
+
LastFM.requires_authentication
|
47
|
+
LastFM.post( "#{TYPE}.removeTag", 'artist'=>artist, 'album'=>album, 'tag'=>tag )
|
48
|
+
end
|
49
|
+
|
50
|
+
# @see http://www.last.fm/api/show?service=357
|
51
|
+
def search( album, limit = nil, page = nil )
|
52
|
+
LastFM.get( "#{TYPE}.search", !:secure, 'album'=>album, 'limit'=>limit, 'page'=>page )
|
53
|
+
end
|
54
|
+
|
55
|
+
# @see http://www.last.fm/api/show?service=436
|
56
|
+
def share( artist, album, recipient, message = nil, public = nil )
|
57
|
+
LastFM.requires_authentication
|
58
|
+
LastFM.post( "#{TYPE}.share", 'artist'=>artist, 'album'=>album, 'recipient'=>recipient, 'message'=>message, 'public'=>public )
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
module LastFM
|
2
|
+
class Artist
|
3
|
+
class << self
|
4
|
+
|
5
|
+
TYPE = 'artist'
|
6
|
+
|
7
|
+
# @see http://www.last.fm/api/show/?service=303
|
8
|
+
def add_tags( artist, tags )
|
9
|
+
LastFM.requires_authentication
|
10
|
+
LastFM.post( "#{TYPE}.addTags", 'artist'=>artist, 'tags'=>tags )
|
11
|
+
end
|
12
|
+
|
13
|
+
# @see http://www.last.fm/api/show/?service=446
|
14
|
+
def get_correction( artist )
|
15
|
+
LastFM.get( "#{TYPE}.getCorrection", !:secure, 'artist'=>artist )
|
16
|
+
end
|
17
|
+
|
18
|
+
# @see http://www.last.fm/api/show/?service=117
|
19
|
+
def get_events( artist = nil, mbid = nil, autocorrect = nil, festivals_only = nil, limit = nil, page = nil)
|
20
|
+
raise ArgumentError unless artist || mbid
|
21
|
+
LastFM.get( "#{TYPE}.getEvents", !:secure, 'artist'=>artist, 'mbid'=>mbid, 'autocorrect'=>autocorrect, 'festivalsonly'=>festivals_only, 'limit'=>limit, 'page'=>page )
|
22
|
+
end
|
23
|
+
|
24
|
+
# @see http://www.last.fm/api/show/?service=407
|
25
|
+
def get_images( artist = nil, mbid = nil, autocorrect = nil, order = nil, limit = nil, page = nil )
|
26
|
+
raise ArgumentError unless artist || mbid
|
27
|
+
LastFM.get( "#{TYPE}.getImages", !:secure, 'artist'=>artist, 'mbid'=>mbid, 'autocorrect'=>autocorrect, 'order'=>order, 'limit'=>limit, 'page'=>page )
|
28
|
+
end
|
29
|
+
|
30
|
+
# @see http://www.last.fm/api/show/?service=267
|
31
|
+
def get_info( artist = nil, mbid = nil, lang = nil, autocorrect = nil, username = nil )
|
32
|
+
raise ArgumentError unless artist || mbid
|
33
|
+
LastFM.get( "#{TYPE}.getInfo", !:secure, 'artist'=>artist, 'mbid'=>mbid, 'autocorrect'=>autocorrect, 'lang'=>lang, 'username'=>username )
|
34
|
+
end
|
35
|
+
|
36
|
+
# @see http://www.last.fm/api/show/?service=428
|
37
|
+
def get_past_events( artist = nil, mbid = nil, autocorrect = nil, limit = nil, page = nil )
|
38
|
+
raise ArgumentError unless artist || mbid
|
39
|
+
LastFM.get( "#{TYPE}.getPastEvents", !:secure, 'artist'=>artist, 'mbid'=>mbid, 'autocorrect'=>autocorrect, 'limit'=>limit, 'page'=>page )
|
40
|
+
end
|
41
|
+
|
42
|
+
# @see http://www.last.fm/api/show/?service=118
|
43
|
+
def get_podcast( artist = nil, mbid = nil, autocorrect = nil )
|
44
|
+
raise ArgumentError unless artist || mbid
|
45
|
+
LastFM.get( "#{TYPE}.getPodcast", !:secure, 'artist'=>artist, 'mbid'=>mbid, 'autocorrect'=>autocorrect )
|
46
|
+
end
|
47
|
+
|
48
|
+
# @see http://www.last.fm/api/show/?service=397
|
49
|
+
def get_shouts( artist = nil, mbid = nil, autocorrect = nil, limit = nil, page = nil )
|
50
|
+
raise ArgumentError unless artist || mbid
|
51
|
+
LastFM.get( "#{TYPE}.getShouts", !:secure, 'artist'=>artist, 'mbid'=>mbid, 'autocorrect'=>autocorrect, 'limit'=>limit, 'page'=>page )
|
52
|
+
end
|
53
|
+
|
54
|
+
# @see http://www.last.fm/api/show/?service=119
|
55
|
+
def get_similar( artist = nil, mbid = nil, autocorrect = nil, limit = nil )
|
56
|
+
raise ArgumentError unless artist || mbid
|
57
|
+
LastFM.get( "#{TYPE}.getSimilar", !:secure, 'artist'=>artist, 'mbid'=>mbid, 'autocorrect'=>autocorrect, 'limit'=>limit )
|
58
|
+
end
|
59
|
+
|
60
|
+
# @see http://www.last.fm/api/show/?service=318
|
61
|
+
def get_tags( artist = nil, mbid = nil, autocorrect = nil )
|
62
|
+
raise ArgumentError unless artist || mbid
|
63
|
+
LastFM.requires_authentication
|
64
|
+
LastFM.get( "#{TYPE}.getTags", :secure, 'artist'=>artist, 'mbid'=>mbid, 'autocorrect'=>autocorrect )
|
65
|
+
end
|
66
|
+
|
67
|
+
# @see http://www.last.fm/api/show/?service=287
|
68
|
+
def get_top_albums( artist = nil, mbid = nil, autocorrect = nil, limit = nil, page = nil )
|
69
|
+
raise ArgumentError unless artist || mbid
|
70
|
+
LastFM.get( "#{TYPE}.getTopAlbums", !:secure, 'artist'=>artist, 'mbid'=>mbid, 'autocorrect'=>autocorrect, 'limit'=>limit, 'page'=>page )
|
71
|
+
end
|
72
|
+
|
73
|
+
# @see http://www.last.fm/api/show/?service=310
|
74
|
+
def get_top_fans( artist = nil, mbid = nil, autocorrect = nil )
|
75
|
+
raise ArgumentError unless artist || mbid
|
76
|
+
LastFM.get( "#{TYPE}.getTopFans", !:secure, 'artist'=>artist, 'mbid'=>mbid, 'autocorrect'=>autocorrect )
|
77
|
+
end
|
78
|
+
|
79
|
+
# @see http://www.last.fm/api/show/?service=288
|
80
|
+
def get_top_tags( artist = nil, mbid = nil, autocorrect = nil )
|
81
|
+
raise ArgumentError unless artist || mbid
|
82
|
+
LastFM.get( "#{TYPE}.getTopTags", !:secure, 'artist'=>artist, 'mbid'=>mbid, 'autocorrect'=>autocorrect )
|
83
|
+
end
|
84
|
+
|
85
|
+
# @see http://www.last.fm/api/show/?service=277
|
86
|
+
def get_top_tracks( artist = nil, mbid = nil, autocorrect = nil, limit = nil, page = nil )
|
87
|
+
raise ArgumentError unless artist || mbid
|
88
|
+
LastFM.get( "#{TYPE}.getTopTracks", !:secure, 'artist'=>artist, 'mbid'=>mbid, 'autocorrect'=>autocorrect, 'limit'=>limit, 'page'=>page )
|
89
|
+
end
|
90
|
+
|
91
|
+
# @see http://www.last.fm/api/show/?service=315
|
92
|
+
def remove_tag( artist, tag )
|
93
|
+
LastFM.requires_authentication
|
94
|
+
LastFM.post( "#{TYPE}.removeTag", 'artist'=>artist, 'tag'=>tag )
|
95
|
+
end
|
96
|
+
|
97
|
+
# @see http://www.last.fm/api/show/?service=272
|
98
|
+
def search( artist, limit = nil, page = nil )
|
99
|
+
LastFM.get( "#{TYPE}.search", !:secure, 'artist'=>artist, 'limit'=>limit, 'page'=>page )
|
100
|
+
end
|
101
|
+
|
102
|
+
# @see http://www.last.fm/api/show/?service=306
|
103
|
+
def share( artist, recipient, message = nil, public = nil )
|
104
|
+
LastFM.requires_authentication
|
105
|
+
LastFM.post( "#{TYPE}.share", 'artist'=>artist, 'recipient'=>recipient, 'message'=>message, 'public'=>public )
|
106
|
+
end
|
107
|
+
|
108
|
+
# @see http://www.last.fm/api/show/?service=408
|
109
|
+
def shout( artist, message )
|
110
|
+
LastFM.requires_authentication
|
111
|
+
LastFM.post( "#{TYPE}.shout", 'artist'=>artist, 'message'=>message )
|
112
|
+
end
|
113
|
+
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
data/lib/lastfm/auth.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
module LastFM
|
2
|
+
class Auth
|
3
|
+
class << self
|
4
|
+
|
5
|
+
TYPE = 'auth'
|
6
|
+
|
7
|
+
# @see http://www.last.fm/api/show?service=266
|
8
|
+
def get_mobile_session( username, auth_token )
|
9
|
+
LastFM.get( "#{TYPE}.getMobileSession", :secure, 'username' => username, 'authToken' => auth_token )
|
10
|
+
end
|
11
|
+
|
12
|
+
# @see http://www.last.fm/api/show?service=125
|
13
|
+
def get_session( token )
|
14
|
+
LastFM.get( "#{TYPE}.getSession", :secure )
|
15
|
+
end
|
16
|
+
|
17
|
+
# @see http://www.last.fm/api/show?service=265
|
18
|
+
def get_token()
|
19
|
+
LastFM.get( "#{TYPE}.getToken", :secure )
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/lastfm/chart.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
module LastFM
|
2
|
+
class Chart
|
3
|
+
class << self
|
4
|
+
|
5
|
+
TYPE = 'chart'
|
6
|
+
|
7
|
+
# @see http://www.last.fm/api/show?service=493
|
8
|
+
def get_hyped_artists( limit = nil, page = nil )
|
9
|
+
LastFM.get( "#{TYPE}.getHypedArtists", !:secure, 'limit'=>limit, 'page'=>page )
|
10
|
+
end
|
11
|
+
|
12
|
+
# @see http://www.last.fm/api/show?service=494
|
13
|
+
def get_hyped_tracks( limit = nil, page = nil )
|
14
|
+
LastFM.get( "#{TYPE}.getHypedTracks", !:secure, 'limit'=>limit, 'page'=>page )
|
15
|
+
end
|
16
|
+
|
17
|
+
# @see http://www.last.fm/api/show?service=495
|
18
|
+
def get_loved_tracks( limit = nil, page = nil )
|
19
|
+
LastFM.get( "#{TYPE}.getLovedTracks", !:secure, 'limit'=>limit, 'page'=>page )
|
20
|
+
end
|
21
|
+
|
22
|
+
# @see http://www.last.fm/api/show?service=496
|
23
|
+
def get_top_artists( limit = nil, page = nil )
|
24
|
+
LastFM.get( "#{TYPE}.getTopArtists", !:secure, 'limit'=>limit, 'page'=>page )
|
25
|
+
end
|
26
|
+
|
27
|
+
# @see http://www.last.fm/api/show?service=497
|
28
|
+
def get_top_tags( limit = nil, page = nil )
|
29
|
+
LastFM.get( "#{TYPE}.getTopTags", !:secure, 'limit'=>limit, 'page'=>page )
|
30
|
+
end
|
31
|
+
|
32
|
+
# @see http://www.last.fm/api/show?service=498
|
33
|
+
def get_top_tracks( limit = nil, page = nil )
|
34
|
+
LastFM.get( "#{TYPE}.getTopTracks", !:secure, 'limit'=>limit, 'page'=>page )
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/lib/lastfm/event.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
module LastFM
|
2
|
+
class Event
|
3
|
+
class << self
|
4
|
+
|
5
|
+
TYPE = 'event'
|
6
|
+
|
7
|
+
# @see http://www.last.fm/api/show?service=307
|
8
|
+
def attend( event, status )
|
9
|
+
LastFM.requires_authentication
|
10
|
+
LastFM.post( "#{TYPE}.attend", 'event'=>event, 'status'=>status )
|
11
|
+
end
|
12
|
+
|
13
|
+
# @see http://www.last.fm/api/show?service=391
|
14
|
+
def get_attendees( event, limit = nil, page = nil )
|
15
|
+
LastFM.get( "#{TYPE}.getAttendees", !:secure, 'event'=>event, 'limit'=>limit, 'page'=>page )
|
16
|
+
end
|
17
|
+
|
18
|
+
# @see http://www.last.fm/api/show?service=292
|
19
|
+
def get_info( event )
|
20
|
+
LastFM.get( "#{TYPE}.getInfo", !:secure, 'event'=>event )
|
21
|
+
end
|
22
|
+
|
23
|
+
# @see http://www.last.fm/api/show?service=399
|
24
|
+
def get_shouts( event, limit = nil, page = nil )
|
25
|
+
LastFM.get( "#{TYPE}.getShouts", !:secure, 'event'=>event, 'limit'=>limit, 'page'=>page )
|
26
|
+
end
|
27
|
+
|
28
|
+
# @see http://www.last.fm/api/show?service=350
|
29
|
+
def share( event, recipient, message = nil, public = nil )
|
30
|
+
LastFM.requires_authentication
|
31
|
+
LastFM.post( "#{TYPE}.share", 'event'=>event, 'recipient'=>recipient, 'public'=>public, 'message'=>message )
|
32
|
+
end
|
33
|
+
|
34
|
+
# @see http://www.last.fm/api/show?service=409
|
35
|
+
def shout( event, message )
|
36
|
+
LastFM.requires_authentication
|
37
|
+
LastFM.post( "#{TYPE}.shout", 'event'=>event, 'message'=>message )
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/lib/lastfm/geo.rb
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
module LastFM
|
2
|
+
class Geo
|
3
|
+
class << self
|
4
|
+
|
5
|
+
TYPE = 'geo'
|
6
|
+
|
7
|
+
# @see http://www.last.fm/api/show?service=270
|
8
|
+
def get_events( location = nil, lat = nil, long = nil, distance = nil, limit = nil, page = nil )
|
9
|
+
LastFM.get( "#{TYPE}.getEvents", !:secure, 'location'=>location, 'lat'=>lat, 'long'=>long, 'distance'=>distance, 'limit'=>limit, 'page'=>page )
|
10
|
+
end
|
11
|
+
|
12
|
+
# @see http://www.last.fm/api/show?service=421
|
13
|
+
def get_metro_artist_chart( country, metro, time_start = nil, time_end = nil )
|
14
|
+
LastFM.get( "#{TYPE}.getMetroArtistChart", !:secure, 'country'=>country, 'metro'=>metro, 'start'=>time_start, 'end'=>time_end )
|
15
|
+
end
|
16
|
+
|
17
|
+
# @see http://www.last.fm/api/show?service=420
|
18
|
+
def get_metro_hype_artist_chart( country, metro, time_start = nil, time_end = nil )
|
19
|
+
LastFM.get( "#{TYPE}.getMetroHypeArtistChart", !:secure, 'country'=>country, 'metro'=>metro, 'start'=>time_start, 'end'=>time_end )
|
20
|
+
end
|
21
|
+
|
22
|
+
# @see http://www.last.fm/api/show?service=422
|
23
|
+
def get_metro_hype_track_chart( country, metro, time_start = nil, time_end = nil )
|
24
|
+
LastFM.get( "#{TYPE}.getMetroHypeTrackChart", !:secure, 'country'=>country, 'metro'=>metro, 'start'=>time_start, 'end'=>time_end )
|
25
|
+
end
|
26
|
+
|
27
|
+
# @see http://www.last.fm/api/show?service=423
|
28
|
+
def get_metro_track_chart( country, metro, time_start = nil, time_end = nil )
|
29
|
+
LastFM.get( "#{TYPE}.getMetroTrackChart", !:secure, 'country'=>country, 'metro'=>metro, 'start'=>time_start, 'end'=>time_end )
|
30
|
+
end
|
31
|
+
|
32
|
+
# @see http://www.last.fm/api/show?service=424
|
33
|
+
def get_metro_unique_artist_chart( country, metro, time_start = nil, time_end = nil )
|
34
|
+
LastFM.get( "#{TYPE}.getMetroUniqueArtistChart", !:secure, 'country'=>country, 'metro'=>metro, 'start'=>time_start, 'end'=>time_end )
|
35
|
+
end
|
36
|
+
|
37
|
+
# @see http://www.last.fm/api/show?service=425
|
38
|
+
def get_metro_unique_track_chart( country, metro, time_start = nil, time_end = nil )
|
39
|
+
LastFM.get( "#{TYPE}.getMetroUniqueTrackChart", !:secure, 'country'=>country, 'metro'=>metro, 'start'=>time_start, 'end'=>time_end )
|
40
|
+
end
|
41
|
+
|
42
|
+
# @see http://www.last.fm/api/show?service=426
|
43
|
+
def get_metro_weekly_chartlist( metro )
|
44
|
+
LastFM.get( "#{TYPE}.getMetroWeeklyChartlist", !:secure, 'metro'=>metro )
|
45
|
+
end
|
46
|
+
|
47
|
+
# @see http://www.last.fm/api/show?service=435
|
48
|
+
def get_metros( country = nil )
|
49
|
+
LastFM.get( "#{TYPE}.getMetros", !:secure, 'country'=>country )
|
50
|
+
end
|
51
|
+
|
52
|
+
# @see http://www.last.fm/api/show?service=297
|
53
|
+
def get_top_artists( country, limit = nil, page = nil )
|
54
|
+
LastFM.get( "#{TYPE}.getTopArtists", !:secure, 'country'=>country, 'limit'=>limit, 'page'=>page )
|
55
|
+
end
|
56
|
+
|
57
|
+
# @see http://www.last.fm/api/show?service=298
|
58
|
+
def get_top_tracks( country, location = nil, limit = nil, page = nil )
|
59
|
+
LastFM.get( "#{TYPE}.getTopTracks", !:secure, 'country'=>country, 'location'=>location, 'limit'=>limit, 'page'=>page )
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
data/lib/lastfm/group.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
module LastFM
|
2
|
+
class Group
|
3
|
+
class << self
|
4
|
+
|
5
|
+
TYPE = 'group'
|
6
|
+
|
7
|
+
# @see http://www.last.fm/api/show?service=259
|
8
|
+
def get_hype( group )
|
9
|
+
LastFM.get( "#{TYPE}.getHype", !:secure, 'group'=>group )
|
10
|
+
end
|
11
|
+
|
12
|
+
# @see http://www.last.fm/api/show/?service=379
|
13
|
+
def get_members( group, limit = nil, page = nil )
|
14
|
+
LastFM.get( "#{TYPE}.getMembers", !:secure, 'group'=>group, 'limit'=>limit, 'page'=>page )
|
15
|
+
end
|
16
|
+
|
17
|
+
# @see http://www.last.fm/api/show/?service=293
|
18
|
+
def get_weekly_album_chart( group, date_from = nil, date_to = nil )
|
19
|
+
LastFM.get( "#{TYPE}.getWeeklyAlbumChart", !:secure, 'group'=>group, 'from'=>date_from, 'to'=>date_to )
|
20
|
+
end
|
21
|
+
|
22
|
+
# @see http://www.last.fm/api/show/?service=294
|
23
|
+
def get_weekly_artist_chart( group, date_from = nil, date_to = nil )
|
24
|
+
LastFM.get( "#{TYPE}.getWeeklyArtistChart", !:secure, 'group'=>group, 'from'=>date_from, 'to'=>date_to )
|
25
|
+
end
|
26
|
+
|
27
|
+
# @see http://www.last.fm/api/show/?service=295
|
28
|
+
def get_weekly_chart_list( group )
|
29
|
+
LastFM.get( "#{TYPE}.getWeeklyChartList", !:secure, 'group'=>group )
|
30
|
+
end
|
31
|
+
|
32
|
+
# @see http://www.last.fm/api/show/?service=296
|
33
|
+
def get_weekly_track_chart( group, date_from = nil, date_to = nil )
|
34
|
+
LastFM.get( "#{TYPE}.getWeeklyTrackChart", !:secure, 'group'=>group, 'from'=>date_from, 'to'=>date_to )
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module LastFM
|
2
|
+
class Library
|
3
|
+
class << self
|
4
|
+
|
5
|
+
TYPE = 'library'
|
6
|
+
|
7
|
+
# see: http://www.last.fm/api/show?service=370
|
8
|
+
def add_album( artist, album )
|
9
|
+
LastFM.requires_authentication
|
10
|
+
LastFM.post( "#{TYPE}.addAlbum", 'artist'=>artist, 'album'=>album )
|
11
|
+
end
|
12
|
+
|
13
|
+
# see: http://www.last.fm/api/show?service=371
|
14
|
+
def add_artist( artist )
|
15
|
+
LastFM.requires_authentication
|
16
|
+
LastFM.post( "#{TYPE}.addArtist", 'artist'=>artist )
|
17
|
+
end
|
18
|
+
|
19
|
+
# see: http://www.last.fm/api/show?service=372
|
20
|
+
def add_track( track, artist )
|
21
|
+
LastFM.requires_authentication
|
22
|
+
LastFM.post( "#{TYPE}.addTrack", 'track'=>track, 'artist'=>artist )
|
23
|
+
end
|
24
|
+
|
25
|
+
# see: http://www.last.fm/api/show?service=321
|
26
|
+
def get_albums( user, artist = nil, limit = nil, page = nil )
|
27
|
+
LastFM.get( "#{TYPE}.getAlbums", !:secure, 'user'=>user, 'artist'=>artist, 'limit'=>limit, 'page'=>page )
|
28
|
+
end
|
29
|
+
|
30
|
+
# see: http://www.last.fm/api/show?service=322
|
31
|
+
def get_artists( user, limit = nil, page = nil )
|
32
|
+
LastFM.get( "#{TYPE}.getArtists", !:secure, 'user'=>user, 'limit'=>limit, 'page'=>page )
|
33
|
+
end
|
34
|
+
|
35
|
+
# see: http://www.last.fm/api/show?service=323
|
36
|
+
def get_tracks( user, artist = nil, album = nil, limit = nil, page = nil )
|
37
|
+
LastFM.get( "#{TYPE}.getTracks", !:secure, 'user'=>user, 'artist'=>artist, 'album'=>album, 'limit'=>limit, 'page'=>page )
|
38
|
+
end
|
39
|
+
|
40
|
+
# see: http://www.last.fm/api/show?service=523
|
41
|
+
def remove_album( artist, album )
|
42
|
+
LastFM.requires_authentication
|
43
|
+
LastFM.post( "#{TYPE}.removeAlbum", 'artist'=>artist, 'album'=>album )
|
44
|
+
end
|
45
|
+
|
46
|
+
# see: http://www.last.fm/api/show?service=524
|
47
|
+
def remove_artist( artist )
|
48
|
+
LastFM.requires_authentication
|
49
|
+
LastFM.post( "#{TYPE}.removeArtist", 'artist'=>artist )
|
50
|
+
end
|
51
|
+
|
52
|
+
# see: http://www.last.fm/api/show?service=525
|
53
|
+
def remove_scrobble( track, artist, timestamp )
|
54
|
+
LastFM.requires_authentication
|
55
|
+
LastFM.post( "#{TYPE}.removeScrobble", 'track'=>track, 'artist'=>artist, 'timestamp'=>timestamp )
|
56
|
+
end
|
57
|
+
|
58
|
+
# see: http://www.last.fm/api/show?service=526
|
59
|
+
def remove_track( track, artist )
|
60
|
+
LastFM.requires_authentication
|
61
|
+
LastFM.post( "#{TYPE}.removeTrack", 'track'=>track, 'artist'=>artist )
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module LastFM
|
2
|
+
class Playlist
|
3
|
+
class << self
|
4
|
+
|
5
|
+
TYPE = 'playlist'
|
6
|
+
|
7
|
+
# see: http://www.last.fm/api/show?service=337
|
8
|
+
def add_track( playlist_id, artist, track )
|
9
|
+
LastFM.requires_authentication
|
10
|
+
LastFM.post( "#{TYPE}.addTrack", 'playlistID'=>playlist_id, 'artist'=>artist, 'track'=>track )
|
11
|
+
end
|
12
|
+
|
13
|
+
# see: http://www.last.fm/api/show?service=365
|
14
|
+
def create( title = nil, description = nil )
|
15
|
+
LastFM.requires_authentication
|
16
|
+
LastFM.post( "#{TYPE}.create", 'title'=>title, 'description'=>description )
|
17
|
+
end
|
18
|
+
|
19
|
+
# see: http://www.last.fm/api/show?service=271
|
20
|
+
def fetch( playlist_url )
|
21
|
+
LastFM.get( "#{TYPE}.fetch", !:secure, 'playlistURL'=>playlist_url )
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/lastfm/radio.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
module LastFM
|
2
|
+
class Radio
|
3
|
+
class << self
|
4
|
+
|
5
|
+
TYPE = 'radio'
|
6
|
+
|
7
|
+
# see: http://www.last.fm/api/show?service=256
|
8
|
+
def get_playlist( discovery = nil, rtp = nil, buylinks = nil, speed_multiplier = nil, bitrate = nil )
|
9
|
+
raise ArgumentError unless [1.0, 2.0].include?(speed_multiplier) && [64, 128].include?(bitrate)
|
10
|
+
LastFM.requires_authentication
|
11
|
+
LastFM.get( "#{TYPE}.getPlaylist", :secure, 'discovery'=>discovery, 'rtp'=>rtp, 'buylinks'=>buylinks, 'speed_multiplier'=>speed_multiplier, 'bitrate'=>bitrate )
|
12
|
+
end
|
13
|
+
|
14
|
+
# see: http://www.last.fm/api/show?service=418
|
15
|
+
def search( name )
|
16
|
+
LastFM.get( "#{TYPE}.search", !:secure, 'name'=>name )
|
17
|
+
end
|
18
|
+
|
19
|
+
# see: http://www.last.fm/api/show?service=160
|
20
|
+
def tune( station, lang = nil )
|
21
|
+
LastFM.requires_authentication
|
22
|
+
LastFM.post( "#{TYPE}.tune", 'station'=>station, 'lang'=>lang )
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/lastfm/tag.rb
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
module LastFM
|
2
|
+
class Tag
|
3
|
+
class << self
|
4
|
+
|
5
|
+
TYPE = 'tag'
|
6
|
+
|
7
|
+
# @see http://www.last.fm/api/show?service=452
|
8
|
+
def get_info( tag, lang = nil )
|
9
|
+
LastFM.get( "#{TYPE}.getInfo", !:secure, 'tag'=>tag, 'lang'=>lang )
|
10
|
+
end
|
11
|
+
|
12
|
+
# @see http://www.last.fm/api/show?service=311
|
13
|
+
def get_similar( tag )
|
14
|
+
LastFM.get( "#{TYPE}.getSimilar", !:secure, 'tag'=>tag )
|
15
|
+
end
|
16
|
+
|
17
|
+
# @see http://www.last.fm/api/show?service=283
|
18
|
+
def get_top_albums( tag, limit = nil, page = nil )
|
19
|
+
LastFM.get( "#{TYPE}.getTopAlbums", !:secure, 'tag'=>tag, 'limit'=>limit, 'page'=>page )
|
20
|
+
end
|
21
|
+
|
22
|
+
# @see http://www.last.fm/api/show?service=284
|
23
|
+
def get_top_artists( tag, limit = nil, page = nil )
|
24
|
+
LastFM.get( "#{TYPE}.getTopArtists", !:secure, 'tag'=>tag, 'limit'=>limit, 'page'=>page )
|
25
|
+
end
|
26
|
+
|
27
|
+
# @see http://www.last.fm/api/show?service=276
|
28
|
+
def get_top_tags
|
29
|
+
LastFM.get( "#{TYPE}.getTopTags", !:secure )
|
30
|
+
end
|
31
|
+
|
32
|
+
# @see http://www.last.fm/api/show?service=285
|
33
|
+
def get_top_tracks( tag, limit = nil, page = nil )
|
34
|
+
LastFM.get( "#{TYPE}.getTopTracks", !:secure, 'tag'=>tag, 'limit'=>limit, 'page'=>page )
|
35
|
+
end
|
36
|
+
|
37
|
+
# @see http://www.last.fm/api/show?service=358
|
38
|
+
def get_weekly_artist_chart( tag, time_from = nil, time_to = nil, limit = nil )
|
39
|
+
LastFM.get( "#{TYPE}.getWeeklyArtistChart", !:secure, 'tag'=>tag, 'from'=>time_from, 'to'=>time_to, 'limit'=>limit )
|
40
|
+
end
|
41
|
+
|
42
|
+
# @see http://www.last.fm/api/show?service=359
|
43
|
+
def get_weekly_chart_list( tag )
|
44
|
+
LastFM.get( "#{TYPE}.getWeeklyChartList", !:secure, 'tag'=>tag )
|
45
|
+
end
|
46
|
+
|
47
|
+
# @see http://www.last.fm/api/show?service=273
|
48
|
+
def search( tag, limit = nil, page = nil )
|
49
|
+
LastFM.get( "#{TYPE}.search", !:secure, 'tag'=>tag, 'limit'=>limit, 'page'=>page )
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module LastFM
|
2
|
+
class Tasteometer
|
3
|
+
class << self
|
4
|
+
|
5
|
+
TYPE = 'tasteometer'
|
6
|
+
|
7
|
+
# @see http://www.last.fm/api/show?service=258
|
8
|
+
def compare( type_1, type_2, value_1, value_2, limit = nil )
|
9
|
+
raise ArgumentError unless [ 'user', 'artists', 'myspace' ].include?(type_1) && [ 'user', 'artists', 'myspace' ].include?(type_2)
|
10
|
+
LastFM.get( "#{TYPE}.compare", !:secure, 'type1'=>type_1, 'type2'=>type_2, 'value1'=>value_1, 'value2'=>value_2 )
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/lastfm/track.rb
ADDED
@@ -0,0 +1,121 @@
|
|
1
|
+
module LastFM
|
2
|
+
class Track
|
3
|
+
class << self
|
4
|
+
|
5
|
+
TYPE = 'track'
|
6
|
+
|
7
|
+
# @see http://www.last.fm/api/show?service=304
|
8
|
+
def add_tags( track, artist, tags )
|
9
|
+
LastFM.requires_authentication
|
10
|
+
LastFM.post( "#{TYPE}.addTags", 'track'=>track, 'artist'=>artist, 'tags'=>tags )
|
11
|
+
end
|
12
|
+
|
13
|
+
# @see http://www.last.fm/api/show?service=261
|
14
|
+
def ban( track, artist )
|
15
|
+
LastFM.requires_authentication
|
16
|
+
LastFM.post( "#{TYPE}.ban", 'track'=>track, 'artist'=>artist )
|
17
|
+
end
|
18
|
+
|
19
|
+
# @see http://www.last.fm/api/show?service=431
|
20
|
+
def get_buylinks( track = nil, artist = nil, mbid = nil, autocorrect = nil, country = nil )
|
21
|
+
raise ArgumentError unless artist && track || mbid
|
22
|
+
LastFM.get( "#{TYPE}.getBuylinks", !:secure, 'track'=>track, 'artist'=>artist, 'mbid'=>mbid, 'autocorrect'=>autocorrect, 'country'=>country )
|
23
|
+
end
|
24
|
+
|
25
|
+
# @see http://www.last.fm/api/show?service=447
|
26
|
+
def get_correction( track, artist )
|
27
|
+
LastFM.get( "#{TYPE}.getCorrection", !:secure, 'track'=>track, 'artist'=>artist )
|
28
|
+
end
|
29
|
+
|
30
|
+
# @see http://www.last.fm/api/show?service=441
|
31
|
+
def get_fingerprint_metadata( fingerprint_id )
|
32
|
+
LastFM.get( "#{TYPE}.getFingerPrintMetadata", !:secure, 'fingerprintid'=>fingerprint_id )
|
33
|
+
end
|
34
|
+
|
35
|
+
# @see http://www.last.fm/api/show?service=356
|
36
|
+
def get_info( track = nil, artist = nil, mbid = nil, autocorrect = nil, username = nil )
|
37
|
+
raise ArgumentError unless artist && track || mbid
|
38
|
+
LastFM.get( "#{TYPE}.getInfo", !:secure, 'track'=>track, 'artist'=>artist, 'mbid'=>mbid, 'autocorrect'=>autocorrect, 'username'=>username )
|
39
|
+
end
|
40
|
+
|
41
|
+
# @see http://www.last.fm/api/show?service=453
|
42
|
+
def get_shouts( track = nil, artist = nil, mbid = nil, autocorrect = nil, limit = nil, page = nil )
|
43
|
+
raise ArgumentError unless artist && track || mbid
|
44
|
+
LastFM.get( "#{TYPE}.getShouts", !:secure, 'track'=>track, 'artist'=>artist, 'mbid'=>mbid, 'autocorrect'=>autocorrect, 'limit'=>limit, 'page'=>page )
|
45
|
+
end
|
46
|
+
|
47
|
+
# @see http://www.last.fm/api/show?service=319
|
48
|
+
def get_similar( track = nil, artist = nil, mbid = nil, autocorrect = nil, limit = nil )
|
49
|
+
raise ArgumentError unless artist && track || mbid
|
50
|
+
LastFM.get( "#{TYPE}.getSimilar", !:secure, 'track'=>track, 'artist'=>artist, 'mbid'=>mbid, 'autocorrect'=>autocorrect, 'limit'=>limit )
|
51
|
+
end
|
52
|
+
|
53
|
+
# @see http://www.last.fm/api/show?service=320
|
54
|
+
def get_tags( track = nil, artist = nil, mbid = nil, autocorrect = nil )
|
55
|
+
raise ArgumentError unless artist && track || mbid
|
56
|
+
LastFM.requires_authentication
|
57
|
+
LastFM.post( "#{TYPE}.getTags", 'track'=>track, 'artist'=>artist, 'mbid'=>mbid, 'autocorrect'=>autocorrect )
|
58
|
+
end
|
59
|
+
|
60
|
+
# @see http://www.last.fm/api/show?service=312
|
61
|
+
def get_top_fans( track = nil, artist = nil, mbid = nil, autocorrect = nil )
|
62
|
+
raise ArgumentError unless artist && track || mbid
|
63
|
+
LastFM.get( "#{TYPE}.getTopFans", !:secure, 'track'=>track, 'artist'=>artist, 'mbid'=>mbid, 'autocorrect'=>autocorrect )
|
64
|
+
end
|
65
|
+
|
66
|
+
# @see http://www.last.fm/api/show?service=289
|
67
|
+
def get_top_tags( track = nil, artist = nil, mbid = nil, autocorrect = nil )
|
68
|
+
raise ArgumentError unless artist && track || mbid
|
69
|
+
LastFM.get( "#{TYPE}.getTopTags", !:secure, 'track'=>track, 'artist'=>artist, 'mbid'=>mbid, 'autocorrect'=>autocorrect )
|
70
|
+
end
|
71
|
+
|
72
|
+
# @see http://www.last.fm/api/show?service=260
|
73
|
+
def love( track, artist )
|
74
|
+
LastFM.requires_authentication
|
75
|
+
LastFM.post( "#{TYPE}.love", 'track'=>track, 'artist'=>artist )
|
76
|
+
end
|
77
|
+
|
78
|
+
# @see http://www.last.fm/api/show?service=316
|
79
|
+
def remove_tag( track, artist, tag )
|
80
|
+
LastFM.requires_authentication
|
81
|
+
LastFM.post( "#{TYPE}.removeTag", 'track'=>track, 'artist'=>artist, 'tag'=>tag )
|
82
|
+
end
|
83
|
+
|
84
|
+
# @see http://www.last.fm/api/show?service=443
|
85
|
+
def scrobble( tracks, artists, timestamps, albums = nil, album_artists = nil, contexts = nil, stream_ids = nil, track_numbers = nil, mbids = nil, durations = nil )
|
86
|
+
LastFM.requires_authentication
|
87
|
+
# Requires complicated logic & HTTP POST
|
88
|
+
end
|
89
|
+
|
90
|
+
# @see http://www.last.fm/api/show?service=286
|
91
|
+
def search( track, artist = nil, limit = nil, page = nil )
|
92
|
+
LastFM.get( "#{TYPE}.search", !:secure, 'track'=>track, 'artist'=>artist, 'limit'=>limit, 'page'=>page )
|
93
|
+
end
|
94
|
+
|
95
|
+
# @see http://www.last.fm/api/show?service=305
|
96
|
+
def share( track, artist, recipient, message = nil, public = nil )
|
97
|
+
LastFM.requires_authentication
|
98
|
+
LastFM.post( "#{TYPE}.share", 'track'=>track, 'artist'=>artist, 'recipient'=>recipient, 'message'=>message, 'public'=>public )
|
99
|
+
end
|
100
|
+
|
101
|
+
# @see http://www.last.fm/api/show?service=449
|
102
|
+
def unban( track, artist )
|
103
|
+
LastFM.requires_authentication
|
104
|
+
LastFM.post( "#{TYPE}.unban", 'track'=>track, 'artist'=>artist )
|
105
|
+
end
|
106
|
+
|
107
|
+
# @see http://www.last.fm/api/show?service=440
|
108
|
+
def unlove( track, artist )
|
109
|
+
LastFM.requires_authentication
|
110
|
+
LastFM.post( "#{TYPE}.unlove", 'track'=>track, 'artist'=>artist )
|
111
|
+
end
|
112
|
+
|
113
|
+
# @see http://www.last.fm/api/show?service=454
|
114
|
+
def update_now_playing( track, artist, album = nil, album_artist = nil, context = nil, track_number = nil, mbid = nil, duration = nil )
|
115
|
+
LastFM.requires_authentication
|
116
|
+
LastFM.post( "#{TYPE}.updateNowPlaying", 'track'=>track, 'artist'=>artist, 'album'=>album, 'albumArtist'=>album_artist, 'context'=>context, 'trackNumber'=>track_number, 'mbid'=>mbid, 'duration'=>duration )
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
data/lib/lastfm/user.rb
ADDED
@@ -0,0 +1,141 @@
|
|
1
|
+
module LastFM
|
2
|
+
class User
|
3
|
+
class << self
|
4
|
+
|
5
|
+
TYPE = 'user'
|
6
|
+
|
7
|
+
# @see http://www.last.fm/api/show?service=432
|
8
|
+
def get_artist_tracks( user, artist, start_timestamp = nil, end_timestamp = nil, page = nil )
|
9
|
+
LastFM.get( "#{TYPE}.getArtistTracks", !:secure, 'user'=>user, 'artist'=>artist, 'startTimestamp'=>start_timestamp, 'endTimestamp'=>end_timestamp, 'page'=>page )
|
10
|
+
end
|
11
|
+
|
12
|
+
# @see http://www.last.fm/api/show?service=448
|
13
|
+
def get_banned_tracks( user, limit = nil, page = nil )
|
14
|
+
LastFM.get( "#{TYPE}.getBannedTracks", !:secure, 'user'=>user, 'limit'=>limit, 'page'=>page )
|
15
|
+
end
|
16
|
+
|
17
|
+
# @see http://www.last.fm/api/show?service=291
|
18
|
+
def get_events( user, limit = nil, page = nil )
|
19
|
+
LastFM.get( "#{TYPE}.getEvents", !:secure, 'user'=>user, 'limit'=>limit, 'page'=>page )
|
20
|
+
end
|
21
|
+
|
22
|
+
# @see http://www.last.fm/api/show?service=263
|
23
|
+
def get_friends( user, recent_tracks = nil, limit = nil, page = nil )
|
24
|
+
LastFM.get( "#{TYPE}.getFriends", !:secure, 'user'=>user, 'recenttracks'=>recent_tracks, 'limit'=>limit, 'page'=>page )
|
25
|
+
end
|
26
|
+
|
27
|
+
# @see http://www.last.fm/api/show?service=344
|
28
|
+
def get_info( user = nil )
|
29
|
+
LastFM.get( "#{TYPE}.getInfo", !:secure, 'user'=>user )
|
30
|
+
end
|
31
|
+
|
32
|
+
# @see http://www.last.fm/api/show?service=329
|
33
|
+
def get_loved_tracks( user, limit = nil, page = nil )
|
34
|
+
LastFM.get( "#{TYPE}.getLovedTracks", !:secure, 'user'=>user, 'limit'=>limit, 'page'=>page )
|
35
|
+
end
|
36
|
+
|
37
|
+
# @see http://www.last.fm/api/show?service=264
|
38
|
+
def get_neighbors( user, limit = nil )
|
39
|
+
LastFM.get( "#{TYPE}.getNeighbonrs", !:secure, 'user'=>user, 'limit'=>limit )
|
40
|
+
end
|
41
|
+
|
42
|
+
# @see http://www.last.fm/api/show?service=444
|
43
|
+
def get_new_releases( user, useresc = nil )
|
44
|
+
LastFM.get( "#{TYPE}.getNewReleases", !:secure, 'user'=>user, 'useresc'=>useresc )
|
45
|
+
end
|
46
|
+
|
47
|
+
# @see http://www.last.fm/api/show?service=343
|
48
|
+
def get_past_events( user, limit = nil, page = nil )
|
49
|
+
LastFM.get( "#{TYPE}.getPastEvents", !:secure, 'user'=>user, 'limit'=>limit, 'page'=>page )
|
50
|
+
end
|
51
|
+
|
52
|
+
@tagging_types = [ 'artist', 'album', 'track' ]
|
53
|
+
|
54
|
+
# @see http://www.last.fm/api/show?service=455
|
55
|
+
def get_personal_tags( user, tag, tagging_type, limit = nil, page = nil )
|
56
|
+
raise ArgumentError unless @tagging_types.include?(tagging_type)
|
57
|
+
LastFM.get( "#{TYPE}.getPersonalTags", !:secure, 'user'=>user, 'tag'=>tag, 'limit'=>limit, 'page'=>page )
|
58
|
+
end
|
59
|
+
|
60
|
+
# @see http://www.last.fm/api/show?service=313
|
61
|
+
def get_playlists( user )
|
62
|
+
LastFM.get( "#{TYPE}.getPlaylists", !:secure, 'user'=>user )
|
63
|
+
end
|
64
|
+
|
65
|
+
# @see http://www.last.fm/api/show?service=414
|
66
|
+
def get_recent_stations( user, limit = nil, page = nil )
|
67
|
+
LastFM.requires_authentication
|
68
|
+
LastFM.get( "#{TYPE}.getRecentStations", :secure, 'user'=>user, 'limit'=>limit, 'page'=>page )
|
69
|
+
end
|
70
|
+
|
71
|
+
# @see http://www.last.fm/api/show?service=278
|
72
|
+
def get_recent_tracks( user, time_from = nil, time_to = nil, limit = nil, page = nil )
|
73
|
+
LastFM.get( "#{TYPE}.getRecentTracks", !:secure, 'user'=>user, 'from'=>time_from, 'to'=>time_to, 'limit'=>limit, 'page'=>page )
|
74
|
+
end
|
75
|
+
|
76
|
+
# @see http://www.last.fm/api/show?service=388
|
77
|
+
def get_recommended_artists( limit = nil, page = nil )
|
78
|
+
LastFM.requires_authentication
|
79
|
+
LastFM.get( "#{TYPE}.getRecommendedArtists", :secure, 'limit'=>limit, 'page'=>page )
|
80
|
+
end
|
81
|
+
|
82
|
+
# @see http://www.last.fm/api/show?service=375
|
83
|
+
def get_recommended_events( limit = nil, page = nil )
|
84
|
+
LastFM.requires_authentication
|
85
|
+
LastFM.get( "#{TYPE}.getRecommendedEvents", :secure, 'limit'=>limit, 'page'=>page )
|
86
|
+
end
|
87
|
+
|
88
|
+
# @see http://www.last.fm/api/show?service=401
|
89
|
+
def get_shouts( user, limit = nil, page = nil )
|
90
|
+
LastFM.get( "#{TYPE}.getShouts", !:secure, 'user'=>user, 'limit'=>limit, 'page'=>page )
|
91
|
+
end
|
92
|
+
|
93
|
+
# @see http://www.last.fm/api/show?service=299
|
94
|
+
def get_top_albums( user, period = nil, limit = nil, page = nil )
|
95
|
+
LastFM.get( "#{TYPE}.getTopAlbums", !:secure, 'user'=>user, 'period'=>period, 'limit'=>limit, 'page'=>page )
|
96
|
+
end
|
97
|
+
|
98
|
+
# @see http://www.last.fm/api/show?service=300
|
99
|
+
def get_top_artists( user, period = nil, limit = nil, page = nil )
|
100
|
+
LastFM.get( "#{TYPE}.getTopArtists", !:secure, 'user'=>user, 'period'=>period, 'limit'=>limit, 'page'=>page )
|
101
|
+
end
|
102
|
+
|
103
|
+
# @see http://www.last.fm/api/show?service=123
|
104
|
+
def get_top_tags( user, limit = nil )
|
105
|
+
LastFM.get( "#{TYPE}.getTopTags", !:secure, 'user'=>user, 'limit'=>limit )
|
106
|
+
end
|
107
|
+
|
108
|
+
# @see http://www.last.fm/api/show?service=301
|
109
|
+
def get_top_tracks( user, period, limit = nil, page = nil )
|
110
|
+
LastFM.get( "#{TYPE}.getTopTracks", !:secure, 'user'=>user, 'period'=>period, 'limit'=>limit, 'page'=>page )
|
111
|
+
end
|
112
|
+
|
113
|
+
# @see http://www.last.fm/api/show?service=279
|
114
|
+
def get_weekly_album_chart( user, time_from = nil, time_to = nil )
|
115
|
+
LastFM.get( "#{TYPE}.getWeeklyAlbumChart", !:secure, 'user'=>user, 'from'=>time_from, 'to'=>time_to )
|
116
|
+
end
|
117
|
+
|
118
|
+
# @see http://www.last.fm/api/show?service=281
|
119
|
+
def get_weekly_artist_chart( user, time_from = nil, time_to = nil )
|
120
|
+
LastFM.get( "#{TYPE}.getWeeklyArtistChart", !:secure, 'user'=>user, 'from'=>time_from, 'to'=>time_to )
|
121
|
+
end
|
122
|
+
|
123
|
+
# @see http://www.last.fm/api/show?service=280
|
124
|
+
def get_weekly_chart_list( user )
|
125
|
+
LastFM.get( "#{TYPE}.getWeeklyChartList", !:secure, 'user'=>user )
|
126
|
+
end
|
127
|
+
|
128
|
+
# @see http://www.last.fm/api/show?service=282
|
129
|
+
def get_weekly_track_chart( user, time_from = nil, time_to = nil )
|
130
|
+
LastFM.get( "#{TYPE}.getWeeklyTrackChart", !:secure, 'user'=>user, 'from'=>time_from, 'to'=>time_to )
|
131
|
+
end
|
132
|
+
|
133
|
+
# @see http://www.last.fm/api/show?service=411
|
134
|
+
def shout( user, message )
|
135
|
+
LastFM.requires_authentication
|
136
|
+
LastFM.post( "#{TYPE}.shout", 'user'=>user, 'message'=>message )
|
137
|
+
end
|
138
|
+
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
data/lib/lastfm/venue.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
module LastFM
|
2
|
+
class Venue
|
3
|
+
class << self
|
4
|
+
|
5
|
+
TYPE = 'venue'
|
6
|
+
|
7
|
+
# @see http://www.last.fm/api/show?service=394
|
8
|
+
def get_events( venue, festivals_only = nil )
|
9
|
+
LastFM.get( "#{TYPE}.getEvents", !:secure, 'venue'=>venue, 'festivalsonly'=>festivals_only )
|
10
|
+
end
|
11
|
+
|
12
|
+
# @see http://www.last.fm/api/show?service=395
|
13
|
+
def get_past_events( venue, festivals_only = nil, limit = nil, page = nil )
|
14
|
+
LastFM.get( "#{TYPE}.getPastEvents", !:secure, 'venue'=>venue, 'festivalsonly'=>festivals_only, 'limit'=>limit, 'page'=>page )
|
15
|
+
end
|
16
|
+
|
17
|
+
# @see http://www.last.fm/api/show?service=396
|
18
|
+
def search( venue, country = nil, limit = nil, page = nil )
|
19
|
+
LastFM.get( "#{TYPE}.search", !:secure, 'venue'=>venue, 'country'=>country, 'limit'=>limit, 'page'=>page )
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/rscrobbler.rb
ADDED
@@ -0,0 +1,161 @@
|
|
1
|
+
require 'digest/md5'
|
2
|
+
require 'libxml'
|
3
|
+
require 'net/http'
|
4
|
+
require 'uri'
|
5
|
+
|
6
|
+
$:.unshift(File.dirname(__FILE__))
|
7
|
+
|
8
|
+
require 'lastfm/album'
|
9
|
+
require 'lastfm/artist'
|
10
|
+
require 'lastfm/auth'
|
11
|
+
require 'lastfm/chart'
|
12
|
+
require 'lastfm/event'
|
13
|
+
require 'lastfm/geo'
|
14
|
+
require 'lastfm/group'
|
15
|
+
require 'lastfm/library'
|
16
|
+
require 'lastfm/playlist'
|
17
|
+
require 'lastfm/radio'
|
18
|
+
require 'lastfm/tag'
|
19
|
+
require 'lastfm/tasteometer'
|
20
|
+
require 'lastfm/track'
|
21
|
+
require 'lastfm/user'
|
22
|
+
require 'lastfm/venue'
|
23
|
+
|
24
|
+
module LastFM
|
25
|
+
VERSION = '0.0.1'
|
26
|
+
|
27
|
+
HOST = 'ws.audioscrobbler.com'
|
28
|
+
POST_URI = URI.parse("http://#{HOST}/2.0/")
|
29
|
+
|
30
|
+
class RequestError < StandardError; end
|
31
|
+
class AuthenticationError < StandardError; end
|
32
|
+
|
33
|
+
class << self
|
34
|
+
|
35
|
+
attr_accessor :api_key, :api_secret, :username, :auth_token
|
36
|
+
attr_reader :session_key, :logger
|
37
|
+
|
38
|
+
# Authenticate the service with provided login credentials. Use mobile
|
39
|
+
# authentication to avoid redirecting to the website to log in.
|
40
|
+
#
|
41
|
+
# @see http://www.last.fm/api/authspec last.fm auth spec
|
42
|
+
# @return [String] session key provided from authentication
|
43
|
+
def authenticate!
|
44
|
+
%w[api_key api_secret username auth_token].each do |cred|
|
45
|
+
raise AuthenticationError, "Missing credential: #{cred}" unless LastFM.send(cred)
|
46
|
+
end
|
47
|
+
@session_key = Auth.get_mobile_session( username, auth_token ).find_first('session/key').content
|
48
|
+
end
|
49
|
+
|
50
|
+
# Has the service been authenticated?
|
51
|
+
#
|
52
|
+
# @return [Boolean] whether the service has been authenticated
|
53
|
+
def authenticated?
|
54
|
+
!!session_key
|
55
|
+
end
|
56
|
+
|
57
|
+
# Ensure the service has been authenticated; raise an error if it hasn't.
|
58
|
+
#
|
59
|
+
# @raise [AuthenticationError] if the service hasn't been authenticated.
|
60
|
+
def requires_authentication
|
61
|
+
raise AuthenticationError, 'LastFM Authentication Required' unless authenticated?
|
62
|
+
end
|
63
|
+
|
64
|
+
# Generate auth token from username and given password.
|
65
|
+
#
|
66
|
+
# @param [String] password password to use
|
67
|
+
# @return [String] md5 digest of the username and password
|
68
|
+
def generate_auth_token( password )
|
69
|
+
self.auth_token = Digest::MD5.hexdigest( username.dup << Digest::MD5.hexdigest(password) )
|
70
|
+
end
|
71
|
+
|
72
|
+
# Construct an HTTP GET call from params, and load the response into a LibXML Document.
|
73
|
+
#
|
74
|
+
# @param [String] method last.fm api method to call
|
75
|
+
# @param [optional, Boolean] secure whether sign the request with a method signature and session key
|
76
|
+
# (one exception being auth methods, which require a method signature but no session key)
|
77
|
+
# @param [Hash] params parameters to send, excluding method, api_key, api_sig, and sk
|
78
|
+
# @return [LibXML::XML::Document] xml document of the data contained in the response
|
79
|
+
# @raise [LastFMError] if the request fails
|
80
|
+
def get( method, secure = false, params = {} )
|
81
|
+
path = generate_path(method, secure, params)
|
82
|
+
logger.debug( "Last.fm HTTP GET: #{HOST+path}" ) if logger
|
83
|
+
response = Net::HTTP.get_response( HOST, path )
|
84
|
+
check_status( LibXML::XML::Parser.string( response.body ).parse )
|
85
|
+
end
|
86
|
+
|
87
|
+
# Construct an HTTP POST call from params, and check the response status.
|
88
|
+
#
|
89
|
+
# @param [String] method last.fm api method to call
|
90
|
+
# @param [Hash] params parameters to send, excluding method, api_key, api_sig, and sk
|
91
|
+
# @return [LibXML::XML::Document] xml document of the data contained in the response
|
92
|
+
# @raise [LastFMError] if the request fails
|
93
|
+
def post( method, params )
|
94
|
+
params = construct_params( method, :secure, params )
|
95
|
+
logger.debug( "Last.fm HTTP POST: #{POST_URI}, #{params.to_s}" ) if logger
|
96
|
+
response = Net::HTTP.post_form( POST_URI, params )
|
97
|
+
check_status( LibXML::XML::Parser.string( response.body ).parse )
|
98
|
+
end
|
99
|
+
|
100
|
+
private
|
101
|
+
|
102
|
+
# Check an XML document for status = failed, and throw a descriptive error if it's found.
|
103
|
+
#
|
104
|
+
# @param [LibXML::XML::Document] xml xml document to check for errors
|
105
|
+
# @return [LibXML::XML::Document] the xml document if no errors were found
|
106
|
+
# @raise [LastFMError] if an error is found
|
107
|
+
# @private
|
108
|
+
def check_status( xml )
|
109
|
+
raise RequestError, xml.find_first('error').content if xml.root.attributes['status'] == 'failed'
|
110
|
+
xml
|
111
|
+
end
|
112
|
+
|
113
|
+
# Normalize the parameter list by converting values to a string and removing any nils. Add method,
|
114
|
+
# api key, session key, and api signature parameters where necessary.
|
115
|
+
#
|
116
|
+
# @param [String] method last.fm api method
|
117
|
+
# @param [Boolean] secure whether to include session key and api signature in the parameters
|
118
|
+
# @param [Hash] params parameters to normalize and add to
|
119
|
+
# @return [Hash] complete, normalized parameters
|
120
|
+
def construct_params( method, secure, params )
|
121
|
+
params.delete_if{|k,v| v.nil? }
|
122
|
+
params.each{|k,v| params[k] = params[k].to_s }
|
123
|
+
params['method'] = method
|
124
|
+
params['api_key'] = api_key
|
125
|
+
params['sk'] = session_key if authenticated? && secure
|
126
|
+
params['api_sig'] = generate_method_signature( params ) if secure
|
127
|
+
params
|
128
|
+
end
|
129
|
+
|
130
|
+
# Generate the path for a particular method call given params.
|
131
|
+
#
|
132
|
+
# @param [String] method last.fm method to call
|
133
|
+
# @param [Boolean] secure whether to include session key and api signature in the call
|
134
|
+
# @param [optional, Hash] params parameters to include in the api call
|
135
|
+
# @return [String] path for the api call
|
136
|
+
# @private
|
137
|
+
def generate_path( method, secure, params={} )
|
138
|
+
params = construct_params( method, secure, params )
|
139
|
+
url = "/2.0/?method=#{params.delete('method')}"
|
140
|
+
params.keys.each do |key|
|
141
|
+
url << "&#{key}=#{params[key]}"
|
142
|
+
end
|
143
|
+
URI.encode(url)
|
144
|
+
end
|
145
|
+
|
146
|
+
# Generate a method signature based on given parameters.
|
147
|
+
#
|
148
|
+
# @param [Hash] parameters to combine into a method signature
|
149
|
+
# @return [String] method signature based on all the parameters
|
150
|
+
# @see http://www.last.fm/api/authspec#8
|
151
|
+
# @private
|
152
|
+
def generate_method_signature( params )
|
153
|
+
str = ''
|
154
|
+
params.keys.sort.each do |key|
|
155
|
+
str << key << params[key]
|
156
|
+
end
|
157
|
+
Digest::MD5.hexdigest( str << api_secret )
|
158
|
+
end
|
159
|
+
|
160
|
+
end
|
161
|
+
end
|
metadata
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rscrobbler
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Gabe Smith
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-10-25 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: libxml-ruby
|
16
|
+
requirement: &2160394600 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *2160394600
|
25
|
+
description: rscrobbler is a Ruby gem for accessing Last.fm's API (http://www.last.fm/api).
|
26
|
+
email:
|
27
|
+
- sgt.floydpepper@gmail.com
|
28
|
+
executables: []
|
29
|
+
extensions: []
|
30
|
+
extra_rdoc_files: []
|
31
|
+
files:
|
32
|
+
- lib/lastfm/album.rb
|
33
|
+
- lib/lastfm/artist.rb
|
34
|
+
- lib/lastfm/auth.rb
|
35
|
+
- lib/lastfm/chart.rb
|
36
|
+
- lib/lastfm/event.rb
|
37
|
+
- lib/lastfm/geo.rb
|
38
|
+
- lib/lastfm/group.rb
|
39
|
+
- lib/lastfm/library.rb
|
40
|
+
- lib/lastfm/playlist.rb
|
41
|
+
- lib/lastfm/radio.rb
|
42
|
+
- lib/lastfm/tag.rb
|
43
|
+
- lib/lastfm/tasteometer.rb
|
44
|
+
- lib/lastfm/track.rb
|
45
|
+
- lib/lastfm/user.rb
|
46
|
+
- lib/lastfm/venue.rb
|
47
|
+
- lib/rscrobbler.rb
|
48
|
+
homepage: https://github.com/sgtFloyd/rscrobbler
|
49
|
+
licenses: []
|
50
|
+
post_install_message:
|
51
|
+
rdoc_options: []
|
52
|
+
require_paths:
|
53
|
+
- lib
|
54
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
55
|
+
none: false
|
56
|
+
requirements:
|
57
|
+
- - ! '>='
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '0'
|
60
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
66
|
+
requirements: []
|
67
|
+
rubyforge_project:
|
68
|
+
rubygems_version: 1.8.12
|
69
|
+
signing_key:
|
70
|
+
specification_version: 3
|
71
|
+
summary: Last.fm API wrapper
|
72
|
+
test_files: []
|