spot_tracks 0.0.1 → 0.0.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c29f96934a558b8b35c7908c36673091e5aa0780
4
- data.tar.gz: cd1bd699b5df6052fcb191ebf71d563d1f1dd46a
3
+ metadata.gz: 836a29e21cf32e9c681f3c699e3c61fd73e94445
4
+ data.tar.gz: 26685ca6cd55114faf3d774ee152b68a279d33f7
5
5
  SHA512:
6
- metadata.gz: 34e6c9092096196faa0993e64f9415b0a90f38f1b92bd4eee897c29d5f416c7581537de501ba1258988968e7f4c8fa36d2fafda675d070844c5dc55f6851e425
7
- data.tar.gz: 75cb56b98bcb30d2f796a30530d6f6012f549f937da458c40910882735290a99b01f4df4f3897fb6fb0a14822729731e6f8d307ddffd82c24db2c84f8377d50f
6
+ metadata.gz: ff1e9f09539a926dc2a07639bb333968dc626ca9dbdf8267585f6cb686a642a82848b26c48205b90786e1101956bc087466bfe26035291c496adbf11ecaf43cf
7
+ data.tar.gz: 8e40593814c1267ac0bfe1db098bf7b9eba15126da25ad0c10b77ee02ccff9987a62767c3bfcfdd5f08a4ea38023a2463d7bbacb3d2b7afdb32c3894fbb7fc96
data/CHANGELOG.md ADDED
@@ -0,0 +1,8 @@
1
+ ### v0.0.2
2
+
3
+ **New**
4
+ - Add Track model
5
+ - Include Images
6
+
7
+ **Fixed**
8
+ - Handle no Spotify results
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # SpotTracks
2
2
 
3
- TODO: Write a gem description
3
+ SpotTracks is an easy way to get spotify play links from your recently played tracks.
4
4
 
5
5
  ## Installation
6
6
 
@@ -18,7 +18,28 @@ Or install it yourself as:
18
18
 
19
19
  ## Usage
20
20
 
21
- TODO: Write usage instructions here
21
+ SpotTracks pulls your Last.fm RSS feed, and looks up those tracks on Spotify. It returns a json hash with your data:
22
+
23
+ SpotTracks::Feed.new('mttwrnr').to_json
24
+ #=> {
25
+ "title":"mttwrnr's Recently Played Tracks",
26
+ "url":"http://www.last.fm/user/mttwrnr",
27
+ "entries":[{
28
+ "title":"Duck Sauce – NRG - Radio Edit",
29
+ "urls":{
30
+ "lastfm":"http://www.last.fm/music/Duck+Sauce/_/NRG+-+Radio+Edit",
31
+ "spotify":"spotify:track:6MbFmc3lDtnlihb7DEabRA"
32
+ }
33
+ },{
34
+ "title":"The Magician – When The Night Is Over - Clancy Remix [feat. Newtimers]",
35
+ "urls":{
36
+ "lastfm":"http://www.last.fm/music/The+Magician/_/When+The+Night+Is+Over+-+Clancy+Remix+%5Bfeat.+Newtimers%5D",
37
+ "spotify":"spotify:track:58ScEoCoWkICs0HD7xHYKI"
38
+ }
39
+ }]
40
+ }
41
+
42
+ Enjoy!
22
43
 
23
44
  ## Contributing
24
45
 
@@ -18,15 +18,9 @@ module SpotTracks
18
18
  client.url
19
19
  end
20
20
 
21
- def entries
21
+ def tracks
22
22
  client.entries.map do |entry|
23
- {
24
- title: entry.title,
25
- urls: {
26
- lastfm: entry.url,
27
- spotify: player.spotify_uri(entry.title)
28
- }
29
- }
23
+ SpotTracks::Track.search entry.title
30
24
  end
31
25
  end
32
26
 
@@ -34,7 +28,7 @@ module SpotTracks
34
28
  {
35
29
  title: title,
36
30
  url: url,
37
- entries: entries
31
+ tracks: tracks.map(&:to_h)
38
32
  }.to_json
39
33
  end
40
34
 
@@ -47,9 +41,5 @@ module SpotTracks
47
41
  def rss_url
48
42
  "#{HOST}/1.0/user/#{username}/recenttracks.rss"
49
43
  end
50
-
51
- def player
52
- @player ||= SpotTracks::Player.new
53
- end
54
44
  end
55
45
  end
@@ -5,19 +5,9 @@ module SpotTracks
5
5
  class Player
6
6
  HOST = 'https://api.spotify.com'
7
7
 
8
- def spotify_uri(title)
9
- data = search(title)
10
- return unless data.is_a?(Hash)
11
-
12
- tracks = data['tracks'] || {}
13
- items = tracks['items'] || [{}]
14
-
15
- items.first['uri']
16
- end
17
-
18
8
  def search(term)
19
9
  path = "v1/search?q=#{CGI.escape(term)}&type=track"
20
- api_data("#{HOST}/#{path}")
10
+ SpotTracks::Track.parse api_data("#{HOST}/#{path}")
21
11
  end
22
12
 
23
13
  private
@@ -0,0 +1,43 @@
1
+ module SpotTracks
2
+ class Track
3
+ attr_reader :name, :artist, :image, :uri
4
+
5
+ def initialize(params = {})
6
+ @name = params[:name]
7
+ @artist = params[:artist]
8
+ @image = params[:image]
9
+ @uri = params[:uri]
10
+ end
11
+
12
+ def self.search(title)
13
+ SpotTracks::Player.new.search(title)
14
+ end
15
+
16
+ def self.parse(data = {})
17
+ tracks = data.fetch('tracks', {})
18
+ item = tracks.fetch('items', []).first
19
+
20
+ album = item['album']
21
+ artist = item['artists'].first
22
+ image = album['images'].first
23
+
24
+ new({
25
+ name: item['name'],
26
+ artist: artist['name'],
27
+ image: image['url'],
28
+ uri: item['uri']
29
+ })
30
+ end
31
+
32
+ def title
33
+ "#{artist} - #{name}"
34
+ end
35
+
36
+ def to_h
37
+ {
38
+ title: title, name: name, artist: artist,
39
+ urls: { image: image, uri: uri }
40
+ }
41
+ end
42
+ end
43
+ end
@@ -1,3 +1,3 @@
1
1
  module SpotTracks
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
data/lib/spot_tracks.rb CHANGED
@@ -3,4 +3,5 @@ require "spot_tracks/version"
3
3
  module SpotTracks
4
4
  autoload :Feed, 'spot_tracks/feed'
5
5
  autoload :Player, 'spot_tracks/player'
6
+ autoload :Track, 'spot_tracks/track'
6
7
  end
@@ -0,0 +1,16 @@
1
+ api:
2
+ tracks:
3
+ href: https://api.spotify.com/v1/search?query=Major+Lazer+-+Get+Free
4
+ items:
5
+ - name: Get Free
6
+ album:
7
+ name: Get Free
8
+ images:
9
+ - height: 640
10
+ width: 640
11
+ url: https://i.scdn.co/image/8c0c53664893cbce7f579b819d39d0e19d729710
12
+ artists:
13
+ - name: Major Lazer
14
+ external_urls:
15
+ uri: spotify:track:6nVEdIiB3h5b2TbQhFnQUk
16
+
@@ -0,0 +1,5 @@
1
+ track:
2
+ title: baz
3
+ urls:
4
+ image: imgurl
5
+ spotify: spotify:track:qux
data/spec/spec_helper.rb CHANGED
@@ -2,4 +2,11 @@ require 'simplecov'
2
2
  SimpleCov.start
3
3
 
4
4
  require 'rspec'
5
+ require 'yaml'
5
6
  require 'spot_tracks'
7
+
8
+ RSpec.configure do |config|
9
+ def fixture(name)
10
+ YAML.load_file("./spec/fixtures/#{name}.yml")[name.to_s]
11
+ end
12
+ end
@@ -1,25 +1,14 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe SpotTracks::Feed do
4
- let(:user){ 'mttwrnr' }
5
- let(:subject){ SpotTracks::Feed.new(user) }
6
- let(:data){
7
- {
8
- title: 'baz',
9
- urls: {
10
- lastfm: 'qux',
11
- spotify: 'spotify:track:qux'
12
- }
13
- }
14
- }
15
- let(:entry){ double(title: 'baz', url: 'qux')}
16
- let(:player){ double(spotify_uri: 'spotify:track:qux') }
17
- let(:client){ double(title: 'foo', url: 'http://bar', entries: [entry]) }
18
- let(:rss_url){ "http://ws.audioscrobbler.com/1.0/user/#{user}/recenttracks.rss" }
4
+ let(:entry){ double(title: 'baz', url: 'qux') }
5
+ let(:feedjira){ double(title: 'foo', url: 'http://bar', entries: [entry]) }
6
+ let(:subject){ SpotTracks::Feed.new('mttwrnr') }
19
7
 
20
8
  before do
21
- Feedjira::Feed.stub(:fetch_and_parse).with(rss_url){ client }
22
- SpotTracks::Player.stub(:new){ player }
9
+ param = "http://ws.audioscrobbler.com/1.0/user/mttwrnr/recenttracks.rss"
10
+ Feedjira::Feed.stub(:fetch_and_parse).with(param){ feedjira }
11
+ SpotTracks::Player.stub(:new){ double(search: {}) }
23
12
  end
24
13
 
25
14
  context 'attributes' do
@@ -36,15 +25,15 @@ describe SpotTracks::Feed do
36
25
  end
37
26
  end
38
27
 
39
- context '#entries' do
40
- it 'should return a mapped set of values' do
41
- subject.entries.should eq([data])
28
+ context '#tracks' do
29
+ it 'should return an array of tracks' do
30
+ subject.tracks.should be_a_kind_of(Array)
42
31
  end
43
32
  end
44
33
 
45
34
  context '#to_json' do
46
- it 'should return a json version of entries values' do
47
- result = "{\"title\":\"foo\",\"url\":\"http://bar\",\"entries\":[{\"title\":\"baz\",\"urls\":{\"lastfm\":\"qux\",\"spotify\":\"spotify:track:qux\"}}]}"
35
+ it 'should return a json version of tracks values' do
36
+ result = "{\"title\":\"foo\",\"url\":\"http://bar\",\"tracks\":[{}]}"
48
37
  subject.to_json.should eq(result)
49
38
  end
50
39
  end
@@ -1,33 +1,15 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe SpotTracks::Player do
4
- let(:json){ "{\"tracks\":{\"items\":[{\"uri\":\"spotify:track:foo\"}]}}" }
5
4
  let(:subject){ SpotTracks::Player.new }
6
5
 
7
- context '#spotify_uri' do
8
- it 'should return a spotify uri' do
9
- subject.stub(:open){ double(read: json) }
10
- subject.spotify_uri('track').should match(/^spotify:.*/)
11
- end
12
-
13
- it 'should handle a missing uri' do
14
- subject.stub(:get){ "{\"tracks\":{\"items\":[{}]}}" }
15
- subject.spotify_uri('track').should be_nil
16
- end
17
-
18
- it 'should handle missing items' do
19
- subject.stub(:get){ "{\"tracks\":{}}" }
20
- subject.spotify_uri('track').should be_nil
21
- end
22
-
23
- it 'should handle missing tracks' do
24
- subject.stub(:get){ "{}" }
25
- subject.spotify_uri('track').should be_nil
26
- end
6
+ before do
7
+ subject.stub(:open){ double(read: fixture(:api).to_json ) }
8
+ end
27
9
 
28
- it 'should handle missing data' do
29
- subject.stub(:get){ "[]" }
30
- subject.spotify_uri('track').should be_nil
10
+ context '#search' do
11
+ it 'returns a ticket' do
12
+ subject.search('foo').should be_a_kind_of(SpotTracks::Track)
31
13
  end
32
14
  end
33
15
  end
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+
3
+ describe SpotTracks::Track do
4
+ let(:data){ fixture(:api) }
5
+ let(:subject){ SpotTracks::Track.new({
6
+ name: 'foo', artist: 'bar',
7
+ image: 'baz', uri: 'qux'
8
+ }) }
9
+
10
+ context 'attributes' do
11
+ it 'accepts a hash of attributes' do
12
+ subject.name.should eq('foo')
13
+ subject.artist.should eq('bar')
14
+ subject.image.should eq('baz')
15
+ subject.uri.should eq('qux')
16
+ end
17
+ end
18
+
19
+ context '#search' do
20
+ it 'uses the player search' do
21
+ SpotTracks::Player.any_instance.should_receive(:search).with('bar - foo').once
22
+ SpotTracks::Track.search('bar - foo')
23
+ end
24
+ end
25
+
26
+ context '#parse' do
27
+ let(:track){ SpotTracks::Track.parse(data) }
28
+ it 'converts json data' do
29
+ track.name.should eq('Get Free')
30
+ track.artist.should eq('Major Lazer')
31
+ track.image.should eq('https://i.scdn.co/image/8c0c53664893cbce7f579b819d39d0e19d729710')
32
+ track.uri.should eq('spotify:track:6nVEdIiB3h5b2TbQhFnQUk')
33
+ end
34
+ end
35
+
36
+ context '#title' do
37
+ it 'should combine the track and artist' do
38
+ subject.title.should eq('bar - foo')
39
+ end
40
+ end
41
+
42
+ context '#to_h' do
43
+ let(:formatted){
44
+ { title: 'bar - foo',
45
+ name: 'foo', artist: 'bar',
46
+ urls: { image: 'baz', uri: 'qux' } }
47
+ }
48
+
49
+ it 'returns the data in hash format' do
50
+ subject.to_h.should eq(formatted)
51
+ end
52
+ end
53
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spot_tracks
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew Werner
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-01 00:00:00.000000000 Z
11
+ date: 2014-08-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: simplecov
@@ -89,6 +89,7 @@ extra_rdoc_files: []
89
89
  files:
90
90
  - ".gitignore"
91
91
  - ".rspec"
92
+ - CHANGELOG.md
92
93
  - Gemfile
93
94
  - LICENSE.txt
94
95
  - README.md
@@ -97,10 +98,14 @@ files:
97
98
  - lib/spot_tracks.rb
98
99
  - lib/spot_tracks/feed.rb
99
100
  - lib/spot_tracks/player.rb
101
+ - lib/spot_tracks/track.rb
100
102
  - lib/spot_tracks/version.rb
103
+ - spec/fixtures/api.yml
104
+ - spec/fixtures/track.yml
101
105
  - spec/spec_helper.rb
102
106
  - spec/spot_tracks/feed_spec.rb
103
107
  - spec/spot_tracks/player_spec.rb
108
+ - spec/spot_tracks/track_spec.rb
104
109
  - spot_tracks.gemspec
105
110
  homepage: ''
106
111
  licenses:
@@ -127,6 +132,9 @@ signing_key:
127
132
  specification_version: 4
128
133
  summary: A small gem to get recent spotify tracks
129
134
  test_files:
135
+ - spec/fixtures/api.yml
136
+ - spec/fixtures/track.yml
130
137
  - spec/spec_helper.rb
131
138
  - spec/spot_tracks/feed_spec.rb
132
139
  - spec/spot_tracks/player_spec.rb
140
+ - spec/spot_tracks/track_spec.rb