lastfm 1.0.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile ADDED
@@ -0,0 +1,11 @@
1
+ source 'http://rubygems.org'
2
+
3
+ gem 'httparty'
4
+ gem 'xml-simple'
5
+ gem 'activesupport', '>= 3.0.3'
6
+
7
+ group :development do
8
+ gem 'rspec', '~> 2.3.0'
9
+ gem 'jeweler', '~> 1.6.4'
10
+ gem 'rdoc'
11
+ end
@@ -0,0 +1,42 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ activesupport (3.2.0)
5
+ i18n (~> 0.6)
6
+ multi_json (~> 1.0)
7
+ diff-lcs (1.1.3)
8
+ git (1.2.5)
9
+ httparty (0.8.1)
10
+ multi_json
11
+ multi_xml
12
+ i18n (0.6.0)
13
+ jeweler (1.6.4)
14
+ bundler (~> 1.0)
15
+ git (>= 1.2.5)
16
+ rake
17
+ json (1.6.5)
18
+ multi_json (1.0.4)
19
+ multi_xml (0.4.1)
20
+ rake (0.9.2.2)
21
+ rdoc (3.12)
22
+ json (~> 1.4)
23
+ rspec (2.3.0)
24
+ rspec-core (~> 2.3.0)
25
+ rspec-expectations (~> 2.3.0)
26
+ rspec-mocks (~> 2.3.0)
27
+ rspec-core (2.3.1)
28
+ rspec-expectations (2.3.0)
29
+ diff-lcs (~> 1.1.2)
30
+ rspec-mocks (2.3.0)
31
+ xml-simple (1.1.1)
32
+
33
+ PLATFORMS
34
+ ruby
35
+
36
+ DEPENDENCIES
37
+ activesupport (>= 3.0.3)
38
+ httparty
39
+ jeweler (~> 1.6.4)
40
+ rdoc
41
+ rspec (~> 2.3.0)
42
+ xml-simple
@@ -23,6 +23,7 @@ It supports methods which require {authentication}[http://www.last.fm/api/authen
23
23
 
24
24
  === Auth
25
25
 
26
+ * {auth.getMobileSession}[http://www.lastfm.jp/api/show?service=266]
26
27
  * {auth.getToken}[http://www.lastfm.jp/api/show?service=265]
27
28
  * {auth.getSession}[http://www.lastfm.jp/api/show?service=125]
28
29
 
@@ -66,6 +67,7 @@ It supports methods which require {authentication}[http://www.last.fm/api/authen
66
67
  === Library
67
68
 
68
69
  * {library.getArtists}[http://www.lastfm.jp/api/show?service=322]
70
+ * {library.getTracks}[http://www.last.fm/api/show/library.getTracks]
69
71
 
70
72
  == Installation
71
73
 
@@ -91,6 +93,8 @@ It supports methods which require {authentication}[http://www.last.fm/api/authen
91
93
  * {dbolson}[https://github.com/dbolson]
92
94
  * {webs}[https://github.com/webs]
93
95
  * {magnolia-fan}[https://github.com/magnolia-fan]
96
+ * {garyadamshannon}[https://github.com/garyadamshannon]
97
+ * {Garthex}[https://github.com/Garthex]
94
98
 
95
99
  == Note on Patches/Pull Requests
96
100
 
data/Rakefile CHANGED
@@ -1,36 +1,35 @@
1
+ # encoding: utf-8
2
+
1
3
  require 'rubygems'
4
+ require 'bundler'
5
+ begin
6
+ Bundler.setup(:default, :development)
7
+ rescue Bundler::BundlerError => e
8
+ $stderr.puts e.message
9
+ $stderr.puts "Run `bundle install` to install missing gems"
10
+ exit e.status_code
11
+ end
2
12
  require 'rake'
3
13
 
4
- begin
5
- require 'jeweler'
6
- Jeweler::Tasks.new do |gem|
7
- gem.name = "lastfm"
8
- gem.summary = %Q{A Ruby interface for Last.fm Web Services}
9
- gem.description = %Q{A ruby interface for Last.fm web services version 2.0}
10
- gem.email = "youpy@buycheapviagraonlinenow.com"
11
- gem.homepage = "http://github.com/youpy/ruby-lastfm"
12
- gem.authors = ["youpy"]
13
- gem.add_development_dependency "rspec", ">= 2.0.0"
14
- gem.add_dependency "httparty"
15
- gem.add_dependency "xml-simple"
16
- gem.add_dependency "activesupport", ">= 3.0.3"
17
- # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
18
- end
19
- Jeweler::GemcutterTasks.new
20
- rescue LoadError
21
- puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
14
+ require 'jeweler'
15
+ Jeweler::Tasks.new do |gem|
16
+ gem.name = "lastfm"
17
+ gem.summary = %Q{A Ruby interface for Last.fm Web Services}
18
+ gem.description = %Q{A ruby interface for Last.fm web services version 2.0}
19
+ gem.email = "youpy@buycheapviagraonlinenow.com"
20
+ gem.homepage = "http://github.com/youpy/ruby-lastfm"
21
+ gem.authors = ["youpy"]
22
22
  end
23
23
 
24
+ require 'rspec/core'
24
25
  require 'rspec/core/rake_task'
25
-
26
- RSpec::Core::RakeTask.new(:core) do |spec|
27
- spec.pattern = 'spec/**/*_spec.rb'
26
+ RSpec::Core::RakeTask.new(:spec) do |spec|
27
+ spec.pattern = FileList['spec/**/*_spec.rb']
28
28
  end
29
29
 
30
- task :core => :check_dependencies
31
- task :default => :core
30
+ task :default => :spec
32
31
 
33
- require 'rake/rdoctask'
32
+ require 'rdoc/task'
34
33
  Rake::RDocTask.new do |rdoc|
35
34
  version = File.read('VERSION')
36
35
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.1
1
+ 1.1.0
@@ -23,7 +23,14 @@ class Lastfm
23
23
  attr_accessor :session
24
24
 
25
25
  class Error < StandardError; end
26
- class ApiError < Error; end
26
+ class ApiError < Error
27
+ attr_reader :code
28
+
29
+ def initialize(message, code = nil)
30
+ super(message)
31
+ @code = code
32
+ end
33
+ end
27
34
 
28
35
  def initialize(api_key, api_secret)
29
36
  @api_key = api_key
@@ -76,7 +83,7 @@ class Lastfm
76
83
 
77
84
  response = Response.new(self.class.send(http_method, '/', (http_method == :post ? :body : :query) => params).body)
78
85
  unless response.success?
79
- raise ApiError.new(response.message)
86
+ raise ApiError.new(response.message, response.error)
80
87
  end
81
88
 
82
89
  response
@@ -8,6 +8,10 @@ class Lastfm
8
8
  method_for_authentication :get_session, [:token], [] do |response|
9
9
  response.xml['session']
10
10
  end
11
+
12
+ method_for_authentication :get_mobile_session, [:username, :authToken], [] do |response|
13
+ response.xml['session']
14
+ end
11
15
  end
12
16
  end
13
17
  end
@@ -2,7 +2,11 @@ class Lastfm
2
2
  module MethodCategory
3
3
  class Library < Base
4
4
  regular_method :get_artists, [:user], [[:limit, nil], [:page, nil]] do |response|
5
- response.xml['artists']['artist']
5
+ Util.force_array(response.xml['artists']['artist'])
6
+ end
7
+
8
+ regular_method :get_tracks, [:user], [[:artist, nil], [:album, nil], [:page, nil], [:limit, nil]] do |response|
9
+ Util.force_array(response.xml['tracks']['track'])
6
10
  end
7
11
  end
8
12
  end
@@ -1,5 +1,9 @@
1
1
  class Lastfm
2
2
  class Util
3
+ def self.force_array(array_or_something)
4
+ array_or_something.kind_of?(Array) ? array_or_something : [array_or_something]
5
+ end
6
+
3
7
  def self.build_options(args, mandatory, optional)
4
8
  options = {}
5
9
 
@@ -0,0 +1,20 @@
1
+ <lfm status="ok">
2
+ <tracks user="RJ" page="1" perPage="50" totalPages="20">
3
+ <track rank="1">
4
+ <name>Learning to Live</name>
5
+ <playcount>44</playcount>
6
+ <tagcount>0</tagcount>
7
+ <mbid></mbid>
8
+ <url>http://www.last.fm/music/Dream+Theater/_/Learning+to+Live</url>
9
+ <streamable fulltrack="0">1</streamable>
10
+ <artist>
11
+ <name>Dream Theater</name>
12
+ <mbid>28503ab7-8bf2-4666-a7bd-2644bfc7cb1d</mbid>
13
+ <url>http://www.last.fm/music/Dream+Theater</url>
14
+ </artist>
15
+ <image size="small">...</image>
16
+ <image size="medium">...</image>
17
+ <image size="large">...</image>
18
+ </track>
19
+ </tracks>
20
+ </lfm>
@@ -107,7 +107,9 @@ XML
107
107
 
108
108
  lambda {
109
109
  @lastfm.request('xxx.yyy', { :foo => 'bar' }, :post)
110
- }.should raise_error(Lastfm::ApiError, 'Invalid API key - You must be granted a valid key by last.fm')
110
+ }.should raise_error(Lastfm::ApiError, 'Invalid API key - You must be granted a valid key by last.fm') {|error|
111
+ error.code.should == 10
112
+ }
111
113
  end
112
114
  end
113
115
 
@@ -145,6 +147,24 @@ XML
145
147
  session['name'].should eql('MyLastFMUsername')
146
148
  session['key'].should eql('zzzyyyxxx')
147
149
  end
150
+
151
+ it 'should get mobile session' do
152
+ @lastfm.should_receive(:request).
153
+ with('auth.getMobileSession', { :username => 'xxxyyyzzz', :authToken => 'xxxxAuthTokenxxxx' }, :get, true).
154
+ and_return(make_response(<<XML))
155
+ <?xml version="1.0" encoding="utf-8"?>
156
+ <lfm status="ok">
157
+ <session>
158
+ <name>MyLastFMUsername</name>
159
+ <key>zzzyyyxxx</key>
160
+ <subscriber>0</subscriber>
161
+ </session>
162
+ </lfm>
163
+ XML
164
+ session = @lastfm.auth.get_mobile_session('xxxyyyzzz', 'xxxxAuthTokenxxxx')
165
+ session['name'].should eql('MyLastFMUsername')
166
+ session['key'].should eql('zzzyyyxxx')
167
+ end
148
168
  end
149
169
 
150
170
  describe '#track' do
@@ -497,6 +517,21 @@ XML
497
517
  @lastfm.library.should be_an_instance_of(Lastfm::MethodCategory::Library)
498
518
  end
499
519
 
520
+ describe '#get_tracks' do
521
+ it 'should get the tracks\' info' do
522
+ @lastfm.should_receive(:request).with('library.getTracks', {
523
+ :user => 'test',
524
+ :artist => 'foo',
525
+ :album => 'bar',
526
+ :limit => nil,
527
+ :page => nil
528
+ }).and_return(make_response('library_get_tracks'))
529
+ tracks = @lastfm.library.get_tracks('test', 'foo', 'bar')
530
+ tracks[0]['name'].should eql('Learning to Live')
531
+ tracks.size.should == 1
532
+ end
533
+ end
534
+
500
535
  describe '#get_artists' do
501
536
  it 'should get the artists\' info' do
502
537
  @lastfm.should_receive(:request).with('library.getArtists', {
metadata CHANGED
@@ -4,9 +4,10 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 1
7
- - 0
8
7
  - 1
9
- version: 1.0.1
8
+ - 0
9
+ segments_generated: true
10
+ version: 1.1.0
10
11
  platform: ruby
11
12
  authors:
12
13
  - youpy
@@ -14,61 +15,93 @@ autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2012-01-11 00:00:00 +09:00
18
+ date: 2012-01-23 00:00:00 +09:00
18
19
  default_executable:
19
20
  dependencies:
20
21
  - !ruby/object:Gem::Dependency
21
- name: rspec
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
22
+ version_requirements: &id001 !ruby/object:Gem::Requirement
24
23
  requirements:
25
24
  - - ">="
26
25
  - !ruby/object:Gem::Version
27
26
  segments:
28
- - 2
29
- - 0
30
27
  - 0
31
- version: 2.0.0
32
- type: :development
33
- version_requirements: *id001
34
- - !ruby/object:Gem::Dependency
28
+ segments_generated: true
29
+ version: "0"
30
+ requirement: *id001
35
31
  name: httparty
36
32
  prerelease: false
37
- requirement: &id002 !ruby/object:Gem::Requirement
33
+ type: :runtime
34
+ - !ruby/object:Gem::Dependency
35
+ version_requirements: &id002 !ruby/object:Gem::Requirement
38
36
  requirements:
39
37
  - - ">="
40
38
  - !ruby/object:Gem::Version
41
39
  segments:
42
40
  - 0
41
+ segments_generated: true
43
42
  version: "0"
44
- type: :runtime
45
- version_requirements: *id002
46
- - !ruby/object:Gem::Dependency
43
+ requirement: *id002
47
44
  name: xml-simple
48
45
  prerelease: false
49
- requirement: &id003 !ruby/object:Gem::Requirement
46
+ type: :runtime
47
+ - !ruby/object:Gem::Dependency
48
+ version_requirements: &id003 !ruby/object:Gem::Requirement
50
49
  requirements:
51
50
  - - ">="
52
51
  - !ruby/object:Gem::Version
53
52
  segments:
53
+ - 3
54
54
  - 0
55
- version: "0"
55
+ - 3
56
+ segments_generated: true
57
+ version: 3.0.3
58
+ requirement: *id003
59
+ name: activesupport
60
+ prerelease: false
56
61
  type: :runtime
57
- version_requirements: *id003
58
62
  - !ruby/object:Gem::Dependency
59
- name: activesupport
63
+ version_requirements: &id004 !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ~>
66
+ - !ruby/object:Gem::Version
67
+ segments:
68
+ - 2
69
+ - 3
70
+ - 0
71
+ segments_generated: true
72
+ version: 2.3.0
73
+ requirement: *id004
74
+ name: rspec
75
+ prerelease: false
76
+ type: :development
77
+ - !ruby/object:Gem::Dependency
78
+ version_requirements: &id005 !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ~>
81
+ - !ruby/object:Gem::Version
82
+ segments:
83
+ - 1
84
+ - 6
85
+ - 4
86
+ segments_generated: true
87
+ version: 1.6.4
88
+ requirement: *id005
89
+ name: jeweler
60
90
  prerelease: false
61
- requirement: &id004 !ruby/object:Gem::Requirement
91
+ type: :development
92
+ - !ruby/object:Gem::Dependency
93
+ version_requirements: &id006 !ruby/object:Gem::Requirement
62
94
  requirements:
63
95
  - - ">="
64
96
  - !ruby/object:Gem::Version
65
97
  segments:
66
- - 3
67
98
  - 0
68
- - 3
69
- version: 3.0.3
70
- type: :runtime
71
- version_requirements: *id004
99
+ segments_generated: true
100
+ version: "0"
101
+ requirement: *id006
102
+ name: rdoc
103
+ prerelease: false
104
+ type: :development
72
105
  description: A ruby interface for Last.fm web services version 2.0
73
106
  email: youpy@buycheapviagraonlinenow.com
74
107
  executables: []
@@ -81,6 +114,8 @@ extra_rdoc_files:
81
114
  files:
82
115
  - .document
83
116
  - .rspec
117
+ - Gemfile
118
+ - Gemfile.lock
84
119
  - LICENSE
85
120
  - README.rdoc
86
121
  - Rakefile
@@ -102,6 +137,7 @@ files:
102
137
  - spec/fixtures/artist_get_info.xml
103
138
  - spec/fixtures/geo_get_events.xml
104
139
  - spec/fixtures/library_get_artists.xml
140
+ - spec/fixtures/library_get_tracks.xml
105
141
  - spec/fixtures/ng.xml
106
142
  - spec/fixtures/ok.xml
107
143
  - spec/fixtures/track_get_correction.xml
@@ -135,6 +171,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
135
171
  - !ruby/object:Gem::Version
136
172
  segments:
137
173
  - 0
174
+ segments_generated: true
138
175
  version: "0"
139
176
  required_rubygems_version: !ruby/object:Gem::Requirement
140
177
  requirements:
@@ -142,6 +179,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
142
179
  - !ruby/object:Gem::Version
143
180
  segments:
144
181
  - 0
182
+ segments_generated: true
145
183
  version: "0"
146
184
  requirements: []
147
185