lastfm 1.0.1 → 1.1.0

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/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