musix_match 0.1.2 → 0.1.3

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/README.rdoc CHANGED
@@ -4,7 +4,7 @@
4
4
  | | _ _ | |
5
5
  | | | | | | | |
6
6
  | | _ _ | | | | _ _ | |
7
- | || || || | MusixMatch is wrapper for the musixmatch.com API's. | || || || |
7
+ | || || || | MusixMatch is a wrapper for the musixmatch.com API's. | || || || |
8
8
  | || || || | With this library you can search for lyrics and tracks | || || || |
9
9
  | | || || | using the http://musixmatch.com service. | | || || |
10
10
  | | | |
data/lib/musix_match.rb CHANGED
@@ -19,7 +19,8 @@ musix_match_path = File.dirname(__FILE__)
19
19
  'lyrics_find_result',
20
20
  'track_find_result',
21
21
  'api/finder',
22
- 'models/track'].each do |lib|
22
+ 'models/track',
23
+ 'instant_lyrics'].each do |lib|
23
24
  require musix_match_path + '/musix_match/' + lib
24
25
  end
25
26
 
@@ -39,4 +40,9 @@ module MusixMatch
39
40
  def self.search_track(*args)
40
41
  Models::Track.search(*args)
41
42
  end
43
+
44
+ def self.i_m_feeling_lucky(q)
45
+ result = MusixMatch::InstantLyrics::Search.search(q)
46
+ result.found? ? result.lyrics.lyrics_body : 'Lyrics not found'
47
+ end
42
48
  end
@@ -1,5 +1,6 @@
1
1
  module MusixMatch
2
2
  module API
3
+ class AuthenticationFailedException < Exception; end
3
4
  class APIKeyNotSpecifiedException < Exception; end
4
5
 
5
6
  class Base
@@ -24,12 +25,14 @@ module MusixMatch
24
25
  def self.get(method, params={})
25
26
  raise APIKeyNotSpecifiedException.new('You must specify the API key. MusixMatch::API::Base.api_key = "YOUR_API_KEY"') if api_key.nil?
26
27
  response = HTTParty.get(url_for(method, params))
27
- case response.parsed_response
28
+ parsed_response = case response.parsed_response
28
29
  when Hash
29
30
  response.parsed_response
30
31
  when String
31
32
  JSON.parse(response.parsed_response)
32
33
  end
34
+ raise AuthenticationFailedException.new('Authentication failed, probably because of a bad API key') if parsed_response['message']['header']['status_code'] == 401
35
+ parsed_response
33
36
  end
34
37
 
35
38
  def api_key
@@ -0,0 +1,45 @@
1
+ module MusixMatch
2
+ module InstantLyrics
3
+ class Result
4
+ attr_reader :lyrics
5
+
6
+ def initialize(lyrics)
7
+ @lyrics = lyrics
8
+ end
9
+
10
+ def found?
11
+ @lyrics.is_a?(MusixMatch::Models::Lyrics)
12
+ end
13
+ end
14
+
15
+ class Search
16
+ def initialize(q)
17
+ @q = q
18
+ end
19
+
20
+ def start
21
+ lyrics_id = search_lyrics
22
+ lyrics = find_lyrics(lyrics_id) if lyrics_id
23
+ Result.new(lyrics)
24
+ end
25
+
26
+ def search_lyrics
27
+ result = MusixMatch.search_lyrics(:q => @q)
28
+ if result.status_code == 200 && lyrics = result.lyrics_list.first
29
+ lyrics.lyrics_id
30
+ end
31
+ end
32
+
33
+ def find_lyrics(lyrics_id)
34
+ result = MusixMatch.get_lyrics(lyrics_id)
35
+ if result.status_code == 200 && lyrics = result.lyrics
36
+ lyrics
37
+ end
38
+ end
39
+
40
+ def self.search(q)
41
+ s = Search.new(q).start
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,47 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'API::Base' do
4
+ it "should always use JSON as format" do
5
+ expected_url = MusixMatch::API::Base::API_URL + '/lyrics.get?apikey=&format=json'
6
+ MusixMatch::API::Base.url_for('lyrics.get', :format => 'xml').should == expected_url
7
+ end
8
+
9
+ it "should use JSON as format even if the format key is a string" do
10
+ expected_url = MusixMatch::API::Base::API_URL + '/lyrics.get?apikey=&format=json'
11
+ MusixMatch::API::Base.url_for('lyrics.get', 'format' => 'xml').should == expected_url
12
+ end
13
+
14
+ it "should raise an exception if api_key is not set" do
15
+ lambda do
16
+ MusixMatch::API::Base.get('http://localhost')
17
+ end.should raise_error(MusixMatch::API::APIKeyNotSpecifiedException)
18
+ end
19
+
20
+ it "should call get on HTTParty" do
21
+ MusixMatch::API::Base.api_key = 'API_KEY'
22
+ method = 'lyrics.search'
23
+ params = {:q_artist => 'artist name'}
24
+ url = MusixMatch::API::Base.url_for(method, params)
25
+ response = mock(HTTParty::Response)
26
+ parsed_response = {'message' => {'header' => {'status_code' => 200}}}
27
+ response.should_receive(:parsed_response).twice.and_return(parsed_response)
28
+ HTTParty.should_receive(:get).with(url).and_return(response)
29
+ result = MusixMatch::API::Base.get(method, params)
30
+ result.should == parsed_response
31
+ end
32
+
33
+ it "should raise an error" do
34
+ lambda do
35
+ MusixMatch::API::Base.api_key = 'API_KEY'
36
+ method = 'lyrics.search'
37
+ params = {:q_artist => 'artist name'}
38
+ url = MusixMatch::API::Base.url_for(method, params)
39
+ response = mock(HTTParty::Response)
40
+ parsed_response = {'message' => {'header' => {'status_code' => 401}}}
41
+ response.should_receive(:parsed_response).twice.and_return(parsed_response)
42
+ HTTParty.should_receive(:get).with(url).and_return(response)
43
+ result = MusixMatch::API::Base.get(method, params)
44
+ result.should == parsed_response
45
+ end.should raise_error(MusixMatch::API::AuthenticationFailedException)
46
+ end
47
+ end
@@ -24,4 +24,15 @@ describe 'MusixMatch' do
24
24
  MusixMatch::Models::Track.should_receive(:search).with(params)
25
25
  MusixMatch.search_track(params)
26
26
  end
27
+
28
+ it "should call search on InstantLyrics::Search" do
29
+ q = 'artist name track name'
30
+ result = mock(MusixMatch::InstantLyrics::Result)
31
+ lyrics = mock(MusixMatch::Models::Lyrics)
32
+ lyrics.should_receive(:lyrics_body).and_return('lyrics body')
33
+ result.should_receive(:found?).and_return(true)
34
+ result.should_receive(:lyrics).and_return(lyrics)
35
+ MusixMatch::InstantLyrics::Search.should_receive(:search).with(q).and_return(result)
36
+ MusixMatch.i_m_feeling_lucky(q)
37
+ end
27
38
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: musix_match
3
3
  version: !ruby/object:Gem::Version
4
- hash: 31
4
+ hash: 29
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 2
10
- version: 0.1.2
9
+ - 3
10
+ version: 0.1.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - Andrea Franz
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-09-20 00:00:00 +02:00
18
+ date: 2010-09-26 00:00:00 +02:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -65,6 +65,7 @@ files:
65
65
  - lib/musix_match/api/base.rb
66
66
  - lib/musix_match/api/finder.rb
67
67
  - lib/musix_match/api/search.rb
68
+ - lib/musix_match/instant_lyrics.rb
68
69
  - lib/musix_match/lyrics_find_result.rb
69
70
  - lib/musix_match/lyrics_search_result.rb
70
71
  - lib/musix_match/models/lyrics.rb
@@ -72,7 +73,7 @@ files:
72
73
  - lib/musix_match/models/track.rb
73
74
  - lib/musix_match/track_find_result.rb
74
75
  - lib/musix_match/track_search_result.rb
75
- - spec/base_model_spec.rb
76
+ - spec/api_base_spec.rb
76
77
  - spec/finder_spec.rb
77
78
  - spec/lyrics_spec.rb
78
79
  - spec/musix_match_spec.rb
@@ -115,7 +116,7 @@ signing_key:
115
116
  specification_version: 3
116
117
  summary: API wrapper for musixmatch.com API's
117
118
  test_files:
118
- - spec/base_model_spec.rb
119
+ - spec/api_base_spec.rb
119
120
  - spec/finder_spec.rb
120
121
  - spec/lyrics_spec.rb
121
122
  - spec/musix_match_spec.rb
@@ -1,13 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe 'Base Model' do
4
- it "should always use JSON as format" do
5
- expected_url = MusixMatch::API::Base::API_URL + '/lyrics.get?apikey=&format=json'
6
- MusixMatch::API::Base.url_for('lyrics.get', :format => 'xml').should == expected_url
7
- end
8
-
9
- it "should use JSON as format even if the format key is a string" do
10
- expected_url = MusixMatch::API::Base::API_URL + '/lyrics.get?apikey=&format=json'
11
- MusixMatch::API::Base.url_for('lyrics.get', 'format' => 'xml').should == expected_url
12
- end
13
- end