grooveshark 0.2.10 → 0.2.11

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: 4d602ca3fbcfdc5d9812fb69bd45e890f25f5b36
4
- data.tar.gz: fd049697921040644c38404c77374c2b625622fe
3
+ metadata.gz: 8b22e2adb61445f3b5c0253a93cd2a8e012a6c8b
4
+ data.tar.gz: f93bd8afcc2b20b0de542127067226228b5a1014
5
5
  SHA512:
6
- metadata.gz: e6d345fbb7bf7e58eaf8ceb38c9c2b32d604f8e5e60be3461acacb4dc1028d9f23c31b46f766d64b6ca2b2501dcd4e904a2940f727163841991ef03a0dfdca84
7
- data.tar.gz: 5c1a411ae739e3c352ab7c0df69eff39e7234644860619cce1221edf0aa1b19cb48616adf90f194c50540b64fc67bf21452346437699838d26401f985d99d44c
6
+ metadata.gz: c0538198b0cf8a836731ca3c467a9ad455d68d7a3c61368fd768c6cd5080d0b6490e79156ba4341b7027c1a132c82e0e28fc6596393eb24e393b615b2129358b
7
+ data.tar.gz: b1fecfb1371885c65b9bb0a09c641b1a6e1fc217074de4f44a5fa88f7c14b973c9a322dd84996acc82506ab4303111baabd6de0cfdf6241456a5ccb841436f12
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Grooveshark API
2
2
 
3
- Unofficial grooveshark API ruby library gives your ability to search and stream songs,
3
+ Unofficial grooveshark API ruby library gives your ability to search and stream songs,
4
4
  manage playlists, media library and favorites.
5
5
  API was discovered using http proxy and does not pretend to be always valid due to website API changes.
6
6
 
@@ -23,10 +23,10 @@ And install bundle:
23
23
  ```
24
24
  bundle install
25
25
  ```
26
-
26
+
27
27
  ## Usage
28
28
 
29
- First, you'll need to create a session. Grooveshark's session is a
29
+ First, you'll need to create a session. Grooveshark's session is a
30
30
  regular PHP session with expiration date of 7 days.
31
31
 
32
32
  ```ruby
@@ -34,24 +34,24 @@ require 'grooveshark'
34
34
 
35
35
  client = Grooveshark::Client.new
36
36
  ```
37
-
37
+
38
38
  To get session key just call
39
39
 
40
40
  ```
41
41
  session = client.session
42
42
  ```
43
-
43
+
44
44
  You can store this key for 7 days after creation and use it like this:
45
45
 
46
46
  ```
47
47
  client = Grooveshark::Client.new(SESSION_KEY)
48
48
  ```
49
-
49
+
50
50
  Now we can find some songs:
51
-
51
+
52
52
  ```ruby
53
53
  songs = client.search_songs('Nirvana')
54
-
54
+
55
55
  songs.each do |s|
56
56
  s.id # Song ID
57
57
  s.name # Song name
@@ -60,7 +60,7 @@ songs.each do |s|
60
60
  s.duration # Song duration in seconds (not always present, 0 by default)
61
61
  end
62
62
  ```
63
-
63
+
64
64
  We got collection of songs. Check Song object for additional attributes.
65
65
  In order to stream song we need to get the authorization
66
66
 
@@ -71,7 +71,7 @@ url = client.get_song_url(song)
71
71
 
72
72
  Given url is valid only for current session and cannot be shared or stored permanently.
73
73
  Also, it probably violates terms of service.
74
-
74
+
75
75
  ### User Authentication
76
76
 
77
77
  To get your user account you need to provide username and password.
@@ -79,7 +79,7 @@ If username or password is not valid InvalidAuthentication exception will be rai
79
79
 
80
80
  ```ruby
81
81
  client = Grooveshark::Client.new
82
-
82
+
83
83
  begin
84
84
  user = client.login('username', 'password')
85
85
  rescue InvalidAuthentication
@@ -98,15 +98,15 @@ user.playlists.each do |p|
98
98
  p.about # Playlist description (empty by default)
99
99
  end
100
100
  ```
101
-
101
+
102
102
  Get user playlist:
103
103
 
104
104
  ```ruby
105
105
  playlist = user.get_playlist(PLAYLIST_ID)
106
106
  ```
107
-
107
+
108
108
  Get all playlist songs:
109
-
109
+
110
110
  ```ruby
111
111
  playlist = user.get_playlist(ID)
112
112
  playlist.load_songs
@@ -126,21 +126,21 @@ Delete existing user playlist
126
126
  playlist = user.get_playlist(ID)
127
127
  playlist.delete
128
128
  ```
129
-
129
+
130
130
  Create a new playlist. First parameter is mandatory, description and songs are optional.
131
131
  For songs you can provide array of Song objects or array of IDs.
132
-
133
- ```ruby
132
+
133
+ ```ruby
134
134
  songs = client.search_songs('Joe Satriani')
135
135
  p = user.create_playlist('NAME', 'DESCRIPTION', songs)
136
136
  ```
137
-
137
+
138
138
  Get user favorite songs:
139
139
 
140
140
  ```ruby
141
141
  songs = user.favorites
142
142
  ```
143
-
143
+
144
144
  Add song to favorites:
145
145
 
146
146
  ```ruby
@@ -152,7 +152,40 @@ Remove song from favorites:
152
152
  ```ruby
153
153
  user.remove_favorite(song) # Song object or song ID
154
154
  ```
155
-
155
+
156
+ ### Broadcasts
157
+
158
+ Get top broadcasts:
159
+
160
+ ```ruby
161
+ client.top_broadcasts.each do |b|
162
+ b.id # Broadcast ID
163
+ b.name # Broadcast Name
164
+ end
165
+ ```
166
+
167
+ To reload the current status of the broadcast (e.g. currently playing song,
168
+ next song, etc.), call `reload_status` method:
169
+
170
+ ```ruby
171
+ broadcast.reload_status
172
+ ```
173
+
174
+ Get the current and next song for a broadcast:
175
+
176
+ ```ruby
177
+ current_song = broadcast.active_song
178
+ next_song = broadcast.next_song
179
+ ```
180
+
181
+ Check whether the broadcast is currently playing:
182
+
183
+ ```ruby
184
+ if broadcast.is_playing
185
+ # Do something e.g. get the currently playing song.
186
+ end
187
+ ```
188
+
156
189
  ### User library
157
190
 
158
191
  Get all songs from library as a collection of Song objects
@@ -160,23 +193,23 @@ Get all songs from library as a collection of Song objects
160
193
  ```ruby
161
194
  songs = user.library
162
195
  ```
163
-
196
+
164
197
  Add songs to library:
165
198
 
166
199
  ```ruby
167
200
  songs = client.search_songs('The Beatles')
168
201
  user.library_add(songs)
169
202
  ```
170
-
171
- Remove selected songs from library.
172
- Unfortunately mass-deletion is not supported by Grooveshark API.
203
+
204
+ Remove selected songs from library.
205
+ Unfortunately mass-deletion is not supported by Grooveshark API.
173
206
  You will have to delete each song via separate method call.
174
207
 
175
208
  ```ruby
176
209
  song = user.library.first # Lest pick a first song in the library
177
210
  user.library_remove(song)
178
211
  ```
179
-
212
+
180
213
  ### Explore community
181
214
 
182
215
  Get all recently active users:
@@ -184,35 +217,25 @@ Get all recently active users:
184
217
  ```ruby
185
218
  client.recent_users
186
219
  ```
187
-
220
+
188
221
  Find user by ID:
189
222
 
190
223
  ```ruby
191
224
  client.get_user_by_id('ID')
192
225
  ```
193
-
226
+
194
227
  Find user by username:
195
228
 
196
229
  ```ruby
197
230
  client.get_user_by_username('username')
198
231
  ```
199
-
232
+
200
233
  Fetch recent user activity:
201
234
 
202
235
  ```ruby
203
236
  user = client.get_user_by_username('user')
204
237
  user.feed
205
238
  ```
206
-
207
- ## Known issues
208
-
209
- - Communication token gets rejected after some time. This timeframe is always different. Additional research didnt show any results.
210
-
211
- ## TODO
212
-
213
- - Testing
214
- - Library management coverage
215
- - More methods
216
239
 
217
240
  ## Testing
218
241
 
@@ -1,5 +1,5 @@
1
1
  # -*- encoding: utf-8 -*-
2
- require File.expand_path('../lib/grooveshark/version', __FILE__)
2
+ require File.expand_path("../lib/grooveshark/version", __FILE__)
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "grooveshark"
@@ -14,12 +14,12 @@ Gem::Specification.new do |s|
14
14
  s.files = `git ls-files`.split("\n")
15
15
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
16
16
  s.executables = `git ls-files -- bin/*`.split("\n").map{|f| File.basename(f)}
17
- s.require_paths = ['lib']
17
+ s.require_paths = ["lib"]
18
18
 
19
- s.add_development_dependency 'rspec', '~> 2.12'
20
- s.add_development_dependency 'rake', '~> 10.0'
19
+ s.add_development_dependency "rspec", "~> 2.12"
20
+ s.add_development_dependency "rake", "~> 10.0"
21
21
 
22
- s.add_runtime_dependency 'json', '>= 1.4.6'
23
- s.add_runtime_dependency 'rest-client', '>= 1.5.1'
24
- s.add_runtime_dependency 'uuid', '~> 2.0'
22
+ s.add_runtime_dependency "json", ">= 1.4.6"
23
+ s.add_runtime_dependency "rest-client", ">= 1.5.1"
24
+ s.add_runtime_dependency "uuid", "~> 2.0"
25
25
  end
@@ -3,9 +3,11 @@ require 'json'
3
3
  require 'rest-client'
4
4
  require 'uuid'
5
5
 
6
+ require 'grooveshark/version'
6
7
  require 'grooveshark/utils'
7
8
  require 'grooveshark/errors'
8
9
  require 'grooveshark/client'
9
10
  require 'grooveshark/user'
10
11
  require 'grooveshark/playlist'
11
12
  require 'grooveshark/song'
13
+ require 'grooveshark/broadcast'
@@ -0,0 +1,38 @@
1
+ module Grooveshark
2
+ class Broadcast
3
+ attr_reader :id, :user_ids
4
+ attr_reader :is_active, :is_playing
5
+ attr_reader :name, :usernames
6
+ attr_reader :active_song, :next_song
7
+
8
+ def initialize(client, broadcast_id=nil, data=nil)
9
+ @client = client
10
+
11
+ if broadcast_id
12
+ @id = broadcast_id
13
+ reload_status()
14
+ elsif data
15
+ @id = data['broadcast_id'] || broadcast_id
16
+ @name = data['name']
17
+ @is_playing = data['is_playing'] == 1 ? true : false
18
+ @is_active = data['is_active']
19
+ @active_song = Song.new(data['active_song'])
20
+ @next_song = Song.new(data['next_song'])
21
+ @usernames = data['usernames']
22
+ @user_ids = data['owner_user_i_ds']
23
+ end
24
+ end
25
+
26
+ # Reload broadcast status
27
+ # Returns true on success. Otherwise false.
28
+ def reload_status
29
+ initialize(
30
+ @client, nil,
31
+ @client.request('broadcastStatusPoll', {:broadcastID => id})
32
+ )
33
+ true
34
+ rescue
35
+ false
36
+ end
37
+ end
38
+ end
@@ -2,13 +2,13 @@ module Grooveshark
2
2
  class Client
3
3
  attr_accessor :session, :comm_token
4
4
  attr_reader :user, :comm_token_ttl, :country
5
-
5
+
6
6
  def initialize(params = {})
7
7
  @ttl = params[:ttl] || 120 # 2 minutes
8
8
  @uuid = UUID.new.generate.upcase
9
9
  get_token_data
10
10
  end
11
-
11
+
12
12
  # Authenticate user
13
13
  def login(user, password)
14
14
  data = request('authenticateUser', {:username => user, :password => password}, true)
@@ -16,47 +16,62 @@ module Grooveshark
16
16
  raise InvalidAuthentication, 'Wrong username or password!' if @user.id == 0
17
17
  return @user
18
18
  end
19
-
19
+
20
20
  # Find user by ID
21
21
  def get_user_by_id(id)
22
22
  resp = request('getUserByID', {:userID => id})['user']
23
23
  resp['username'].empty? ? nil : User.new(self, resp)
24
24
  end
25
-
25
+
26
26
  # Find user by username
27
27
  def get_user_by_username(name)
28
28
  resp = request('getUserByUsername', {:username => name})['user']
29
29
  resp['username'].empty? ? nil : User.new(self, resp)
30
30
  end
31
-
31
+
32
32
  # Get recently active users
33
33
  def recent_users
34
34
  request('getRecentlyActiveUsers', {})['users'].map { |u| User.new(self, u) }
35
35
  end
36
-
36
+
37
37
  # Get popular songs
38
38
  # type => daily, monthly
39
39
  def popular_songs(type='daily')
40
40
  raise ArgumentError, 'Invalid type' unless ['daily', 'monthly'].include?(type)
41
41
  request('popularGetSongs', {:type => type})['songs'].map { |s| Song.new(s) }
42
42
  end
43
-
43
+
44
+ # Get top broadcasts
45
+ # count => specifies how many broadcasts to get
46
+ def top_broadcasts(count=10)
47
+ top_broadcasts = []
48
+ request('getTopBroadcastsCombined').each do |key,val|
49
+ broadcast_id = key.split(':')[1]
50
+ top_broadcasts.push(Broadcast.new(self, broadcast_id))
51
+ count -= 1
52
+ if count == 0
53
+ break
54
+ end
55
+ end
56
+ return top_broadcasts
57
+ end
58
+
44
59
  # Perform search request for query
45
60
  def search(type, query)
46
61
  results = request('getResultsFromSearch', {:type => type, :query => query})['result']
47
62
  results.map { |song| Song.new song }
48
63
  end
49
-
64
+
50
65
  # Perform songs search request for query
51
66
  def search_songs(query)
52
67
  search('Songs', query)
53
68
  end
54
-
69
+
55
70
  # Return raw response for songs search request
56
71
  def search_songs_pure(query)
57
72
  request('getSearchResultsEx', {:type => 'Songs', :query => query})
58
73
  end
59
-
74
+
60
75
  # Get stream authentication by song ID
61
76
  def get_stream_auth_by_songid(song_id)
62
77
  result = request('getStreamKeyFromSongIDEx', {
@@ -71,7 +86,7 @@ module Grooveshark
71
86
  end
72
87
  result
73
88
  end
74
-
89
+
75
90
  # Get stream authentication for song object
76
91
  def get_stream_auth(song)
77
92
  get_stream_auth_by_songid(song.id)
@@ -82,7 +97,7 @@ module Grooveshark
82
97
  resp = get_stream_auth_by_songid(id)
83
98
  "http://#{resp['ip']}/stream.php?streamKey=#{resp['stream_key']}"
84
99
  end
85
-
100
+
86
101
  # Get song stream
87
102
  def get_song_url(song)
88
103
  get_song_url_by_id(song.id)
@@ -105,7 +120,7 @@ module Grooveshark
105
120
  @country = config['country']
106
121
  @session = config['sessionID']
107
122
  end
108
-
123
+
109
124
  # Sign method
110
125
  def create_token(method)
111
126
  rnd = get_random_hex_chars(6)
@@ -153,7 +168,7 @@ module Grooveshark
153
168
  data['result']
154
169
  end
155
170
  end
156
-
171
+
157
172
  # Refresh communications token on ttl
158
173
  def refresh_token
159
174
  get_token_data if Time.now.to_i - @comm_token_ttl > @ttl
@@ -2,15 +2,15 @@ module Grooveshark
2
2
  class InvalidAuthentication < Exception ; end
3
3
  class ReadOnlyAccess < Exception ; end
4
4
  class GeneralError < Exception ; end
5
-
5
+
6
6
  class ApiError < Exception
7
7
  attr_reader :code
8
-
8
+
9
9
  def initialize(fault)
10
10
  @code = fault['code']
11
11
  @message = fault['message']
12
12
  end
13
-
13
+
14
14
  def to_s
15
15
  "#{@code} - #{@message}"
16
16
  end
@@ -3,11 +3,11 @@ module Grooveshark
3
3
  attr_reader :id, :user_id
4
4
  attr_reader :name, :about, :picture, :username
5
5
  attr_reader :songs
6
-
6
+
7
7
  def initialize(client, data=nil, user_id=nil)
8
8
  @client = client
9
9
  @songs = []
10
-
10
+
11
11
  if data
12
12
  @id = data['playlist_id']
13
13
  @name = data['name']
@@ -23,7 +23,7 @@ module Grooveshark
23
23
  @songs = @client.request('getPlaylistByID', :playlistID => @id)['songs']
24
24
  @songs.map! { |s| Song.new(s) }
25
25
  end
26
-
26
+
27
27
  # Rename playlist
28
28
  def rename(name, description)
29
29
  begin
@@ -35,7 +35,7 @@ module Grooveshark
35
35
  return false
36
36
  end
37
37
  end
38
-
38
+
39
39
  # Delete existing playlist
40
40
  def delete
41
41
  @client.request('deletePlaylist', {:playlistID => @id, :name => @name})
@@ -4,7 +4,7 @@ module Grooveshark
4
4
  attr_reader :id, :artist_id, :album_id
5
5
  attr_reader :name, :artist, :album, :track, :year
6
6
  attr_reader :duration, :artwork, :playcount
7
-
7
+
8
8
  def initialize(data=nil)
9
9
  unless data.nil?
10
10
  @data = data
@@ -21,12 +21,12 @@ module Grooveshark
21
21
  @year = data['year']
22
22
  end
23
23
  end
24
-
24
+
25
25
  # Presentable format
26
26
  def to_s
27
27
  [@id, @name, @artist].join(' - ')
28
28
  end
29
-
29
+
30
30
  # Hash export for API usage
31
31
  def to_hash
32
32
  {
@@ -18,64 +18,64 @@ module Grooveshark
18
18
  end
19
19
  @client = client
20
20
  end
21
-
21
+
22
22
  # Get user avatar URL
23
23
  def avatar
24
24
  "http://images.grooveshark.com/static/userimages/#{@id}.jpg"
25
25
  end
26
-
26
+
27
27
  # Get user activity for the date (COMES AS RAW RESPONSE)
28
28
  def feed(date=nil)
29
29
  date = Time.now if date.nil?
30
30
  @client.request('getProcessedUserFeedData', {:userID => @id, :day => date.strftime("%Y%m%d")})
31
31
  end
32
-
32
+
33
33
  # --------------------------------------------------------------------------
34
34
  # User Library
35
35
  # --------------------------------------------------------------------------
36
-
37
- # Fetch songs from library
36
+
37
+ # Fetch songs from library
38
38
  def library(page=0)
39
39
  resp = @client.request('userGetSongsInLibrary', {:userID => @id, :page => page.to_s})['songs']
40
40
  resp.map { |s| Song.new(s) }
41
41
  end
42
-
42
+
43
43
  # Add songs to user's library
44
44
  def library_add(songs=[])
45
45
  @client.request('userAddSongsToLibrary', {:songs => songs.map { |s| s.to_hash }})
46
46
  end
47
-
47
+
48
48
  # Remove song from user library
49
49
  def library_remove(song)
50
50
  raise ArgumentError, 'Song object required' unless song.kind_of?(Song)
51
51
  req = {:userID => @id, :songID => song.id, :albumID => song.album_id, :artistID => song.artist_id}
52
52
  @client.request('userRemoveSongFromLibrary', req)
53
53
  end
54
-
54
+
55
55
  # Get library modification time
56
56
  def library_ts_modified
57
57
  @client.request('userGetLibraryTSModified', {:userID => @id})
58
58
  end
59
-
59
+
60
60
  # --------------------------------------------------------------------------
61
61
  # User Playlists
62
62
  # --------------------------------------------------------------------------
63
-
63
+
64
64
  # Fetch user playlists
65
65
  def playlists
66
66
  return @playlists if @playlists
67
67
  results = @client.request('userGetPlaylists', :userID => @id)
68
68
  @playlists = results['playlists'].map { |list| Playlist.new(@client, list, @id) }
69
69
  end
70
-
70
+
71
71
  # Get playlist by ID
72
72
  def get_playlist(id)
73
73
  result = playlists.select { |p| p.id == id }
74
74
  result.nil? ? nil : result.first
75
75
  end
76
-
76
+
77
77
  alias :playlist :get_playlist
78
-
78
+
79
79
  # Create new user playlist
80
80
  def create_playlist(name, description='', songs=[])
81
81
  @client.request('createPlaylist', {
@@ -84,24 +84,24 @@ module Grooveshark
84
84
  'songIDs' => songs.map { |s| s.kind_of?(Song) ? s.id : s.to_s }
85
85
  })
86
86
  end
87
-
87
+
88
88
  # --------------------------------------------------------------------------
89
89
  # User Favorites
90
90
  # --------------------------------------------------------------------------
91
-
91
+
92
92
  # Get user favorites
93
93
  def favorites
94
94
  return @favorites if @favorites
95
95
  resp = @client.request('getFavorites', :ofWhat => 'Songs', :userID => @id)
96
96
  @favorites = resp.map { |s| Song.new(s) }
97
97
  end
98
-
98
+
99
99
  # Add song to favorites
100
100
  def add_favorite(song)
101
101
  song_id = song.kind_of?(Song) ? song.id : song
102
102
  @client.request('favorite', {:what => 'Song', :ID => song_id})
103
103
  end
104
-
104
+
105
105
  # Remove song from favorites
106
106
  def remove_favorite(song)
107
107
  song_id = song.kind_of?(Song) ? song.id : song
@@ -1,3 +1,3 @@
1
1
  module Grooveshark
2
- VERSION = "0.2.10"
2
+ VERSION = "0.2.11"
3
3
  end
@@ -0,0 +1,39 @@
1
+ require File.expand_path("./helper", File.dirname(__FILE__))
2
+
3
+ describe Grooveshark::Broadcast do
4
+ let(:client) { Grooveshark::Client.new }
5
+
6
+ describe "search" do
7
+ let(:result) { client.top_broadcasts(10) }
8
+
9
+ it "returns an array" do
10
+ expect(result).to be_an Array
11
+ expect(result.size).to eq 10
12
+ end
13
+
14
+ it "includes brodcasts" do
15
+ all = result.all? { |item| item.kind_of?(Grooveshark::Broadcast) }
16
+ expect(all).to be_true
17
+ end
18
+ end
19
+
20
+ describe "broadcast" do
21
+ let(:broadcast) { client.top_broadcasts.first }
22
+
23
+ it "has a valid id" do
24
+ expect(broadcast.id).to match /^[abcdef\d]{24}$/i
25
+ end
26
+
27
+ describe "#active_song" do
28
+ it "is a song instance" do
29
+ expect(broadcast.active_song).to be_a Grooveshark::Song
30
+ end
31
+ end
32
+
33
+ describe "#next_song" do
34
+ it "is a song instance" do
35
+ expect(broadcast.active_song).to be_a Grooveshark::Song
36
+ end
37
+ end
38
+ end
39
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: grooveshark
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.10
4
+ version: 0.2.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dan Sosedoff
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-11-05 00:00:00.000000000 Z
11
+ date: 2013-11-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -94,6 +94,7 @@ files:
94
94
  - Rakefile
95
95
  - grooveshark.gemspec
96
96
  - lib/grooveshark.rb
97
+ - lib/grooveshark/broadcast.rb
97
98
  - lib/grooveshark/client.rb
98
99
  - lib/grooveshark/errors.rb
99
100
  - lib/grooveshark/playlist.rb
@@ -101,6 +102,7 @@ files:
101
102
  - lib/grooveshark/user.rb
102
103
  - lib/grooveshark/utils.rb
103
104
  - lib/grooveshark/version.rb
105
+ - spec/broadcast_spec.rb
104
106
  - spec/client_spec.rb
105
107
  - spec/helper.rb
106
108
  - spec/utils_spec.rb
@@ -129,6 +131,7 @@ signing_key:
129
131
  specification_version: 4
130
132
  summary: Grooveshark API
131
133
  test_files:
134
+ - spec/broadcast_spec.rb
132
135
  - spec/client_spec.rb
133
136
  - spec/helper.rb
134
137
  - spec/utils_spec.rb