lastfm12 0.0.1

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/History.txt ADDED
@@ -0,0 +1,4 @@
1
+ == 0.0.1 2008-12-28
2
+
3
+ * 1 major enhancement:
4
+ * Initial release
data/Manifest.txt ADDED
@@ -0,0 +1,24 @@
1
+ History.txt
2
+ Manifest.txt
3
+ PostInstall.txt
4
+ README.rdoc
5
+ Rakefile
6
+ config/hoe.rb
7
+ config/requirements.rb
8
+ lib/lastfm12.rb
9
+ lib/lastfm12/version.rb
10
+ script/console
11
+ script/destroy
12
+ script/generate
13
+ script/txt2html
14
+ setup.rb
15
+ tasks/deployment.rake
16
+ tasks/environment.rake
17
+ tasks/website.rake
18
+ test/test_helper.rb
19
+ test/test_lastfm12.rb
20
+ website/index.html
21
+ website/index.txt
22
+ website/javascripts/rounded_corners_lite.inc.js
23
+ website/stylesheets/screen.css
24
+ website/template.html.erb
data/PostInstall.txt ADDED
@@ -0,0 +1,7 @@
1
+
2
+ For more information on lastfm12, see http://lastfm12.rubyforge.org
3
+
4
+ NOTE: Change this information in PostInstall.txt
5
+ You can also delete it if you don't want it.
6
+
7
+
data/README.rdoc ADDED
@@ -0,0 +1,48 @@
1
+ = lastfm12
2
+
3
+ * http://lastfm12.rubyforge.org/
4
+
5
+ == DESCRIPTION:
6
+
7
+ FIX (describe your package)
8
+
9
+ == FEATURES/PROBLEMS:
10
+
11
+ * FIX (list of features or problems)
12
+
13
+ == SYNOPSIS:
14
+
15
+ FIX (code sample of usage)
16
+
17
+ == REQUIREMENTS:
18
+
19
+ * FIX (list of requirements)
20
+
21
+ == INSTALL:
22
+
23
+ * FIX (sudo gem install, anything else)
24
+
25
+ == LICENSE:
26
+
27
+ (The MIT License)
28
+
29
+ Copyright (c) 2008 FIXME full name
30
+
31
+ Permission is hereby granted, free of charge, to any person obtaining
32
+ a copy of this software and associated documentation files (the
33
+ 'Software'), to deal in the Software without restriction, including
34
+ without limitation the rights to use, copy, modify, merge, publish,
35
+ distribute, sublicense, and/or sell copies of the Software, and to
36
+ permit persons to whom the Software is furnished to do so, subject to
37
+ the following conditions:
38
+
39
+ The above copyright notice and this permission notice shall be
40
+ included in all copies or substantial portions of the Software.
41
+
42
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
43
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
44
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
45
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
46
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
47
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
48
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,4 @@
1
+ require 'config/requirements'
2
+ require 'config/hoe' # setup Hoe + all gem configuration
3
+
4
+ Dir['tasks/**/*.rake'].each { |rake| load rake }
data/config/hoe.rb ADDED
@@ -0,0 +1,77 @@
1
+ require 'lastfm12/version'
2
+
3
+ AUTHOR = 'Keiichiro Ui' # can also be an array of Authors
4
+ EMAIL = "keiichiro.ui@gmail.com"
5
+ DESCRIPTION = "lastfm12 is a wrapper around the Last.fm protocol version 1.2. This library can manipulate the last.fm radio streams. So, you can implement easily the last.fm radio."
6
+ GEM_NAME = 'lastfm12' # what ppl will type to install your gem
7
+ RUBYFORGE_PROJECT = 'lastfm12' # The unix name for your project
8
+ HOMEPATH = "http://#{RUBYFORGE_PROJECT}.rubyforge.org"
9
+ DOWNLOAD_PATH = "http://rubyforge.org/projects/#{RUBYFORGE_PROJECT}"
10
+ EXTRA_DEPENDENCIES = [
11
+ # ['activesupport', '>= 1.3.1']
12
+ ] # An array of rubygem dependencies [name, version]
13
+ EXTRA_DEV_DEPENDENCIES = [
14
+ # ['rspec', '>= 1.1.5']
15
+ ] # An array of rubygem dependencies [name, version]
16
+
17
+ @config_file = "~/.rubyforge/user-config.yml"
18
+ @config = nil
19
+ RUBYFORGE_USERNAME = "kui"
20
+ def rubyforge_username
21
+ unless @config
22
+ begin
23
+ @config = YAML.load(File.read(File.expand_path(@config_file)))
24
+ rescue
25
+ puts <<-EOS
26
+ ERROR: No rubyforge config file found: #{@config_file}
27
+ Run 'rubyforge setup' to prepare your env for access to Rubyforge
28
+ - See http://newgem.rubyforge.org/rubyforge.html for more details
29
+ EOS
30
+ exit
31
+ end
32
+ end
33
+ RUBYFORGE_USERNAME.replace @config["username"]
34
+ end
35
+
36
+
37
+ REV = nil
38
+ # UNCOMMENT IF REQUIRED:
39
+ # REV = YAML.load(`svn info`)['Revision']
40
+ VERS = Lastfm12::VERSION::STRING + (REV ? ".#{REV}" : "")
41
+ RDOC_OPTS = ['--quiet', '--title', 'lastfm12 documentation',
42
+ "--opname", "index.html",
43
+ "--line-numbers",
44
+ "--main", "README",
45
+ "--inline-source"]
46
+
47
+ class Hoe
48
+ def extra_deps
49
+ @extra_deps.reject! { |x| Array(x).first == 'hoe' }
50
+ @extra_deps
51
+ end
52
+ end
53
+
54
+ # Generate all the Rake tasks
55
+ # Run 'rake -T' to see list of generated tasks (from gem root directory)
56
+ $hoe = Hoe.new(GEM_NAME, VERS) do |p|
57
+ p.developer(AUTHOR, EMAIL)
58
+ p.description = DESCRIPTION
59
+ p.summary = DESCRIPTION
60
+ p.url = HOMEPATH
61
+ p.rubyforge_name = RUBYFORGE_PROJECT if RUBYFORGE_PROJECT
62
+ p.test_globs = ["test/**/test_*.rb"]
63
+ p.clean_globs |= ['**/.*.sw?', '*.gem', '.config', '**/.DS_Store'] #An array of file patterns to delete on clean.
64
+
65
+ # == Optional
66
+ p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
67
+ p.extra_deps = EXTRA_DEPENDENCIES
68
+ p.extra_dev_deps = EXTRA_DEV_DEPENDENCIES
69
+
70
+ p.spec_extras = {} # A hash of extra values to set in the gemspec.
71
+ end
72
+
73
+ CHANGES = $hoe.paragraphs_of('History.txt', 0..1).join("\\n\\n")
74
+ PATH = (RUBYFORGE_PROJECT == GEM_NAME) ? RUBYFORGE_PROJECT : "#{RUBYFORGE_PROJECT}/#{GEM_NAME}"
75
+ $hoe.remote_rdoc_dir = File.join(PATH.gsub(/^#{RUBYFORGE_PROJECT}\/?/,''), 'rdoc')
76
+ $hoe.rsync_args = '-av --delete --ignore-errors'
77
+ $hoe.spec.post_install_message = File.open(File.dirname(__FILE__) + "/../PostInstall.txt").read rescue ""
@@ -0,0 +1,15 @@
1
+ require 'fileutils'
2
+ include FileUtils
3
+
4
+ require 'rubygems'
5
+ %w[rake hoe newgem rubigen].each do |req_gem|
6
+ begin
7
+ require req_gem
8
+ rescue LoadError
9
+ puts "This Rakefile requires the '#{req_gem}' RubyGem."
10
+ puts "Installation: gem install #{req_gem} -y"
11
+ exit
12
+ end
13
+ end
14
+
15
+ $:.unshift(File.join(File.dirname(__FILE__), %w[.. lib]))
@@ -0,0 +1,10 @@
1
+ module Lastfm12
2
+ module VERSION #:nodoc:
3
+ MAJOR = 0
4
+ MINOR = 0
5
+ TINY = 1
6
+
7
+ STRING = [MAJOR, MINOR, TINY].join('.')
8
+ self
9
+ end
10
+ end
data/lib/lastfm12.rb ADDED
@@ -0,0 +1,491 @@
1
+ #
2
+ #=lastfm12
3
+ #
4
+ #Author:: {Keiichiro Ui}[http://k-ui.jp] (keiichiro.ui[at]gmail.com)
5
+ #Version:: 0.1
6
+ #License:: MIT License
7
+ #
8
+ #==Simplest Example
9
+ #
10
+ #Playing Queen's similar tracks with mpg123
11
+ #
12
+ # require "lastfm12"
13
+ # hash = {
14
+ # :user_name => "username",
15
+ # :password => "password",
16
+ # :station => ["artist", "queen"]
17
+ # }
18
+ # loop do
19
+ # LastFM12.get_tracks(hash).each do |t|
20
+ # `mpg123 #{t.location}`
21
+ # end
22
+ # end
23
+ #
24
+ #==Basic Example
25
+ #
26
+ #Downloading tracks tagged as "electoronic"
27
+ #
28
+ # require "lastfm12"
29
+ #
30
+ # lastfm = LastFM12.new("username", "password")
31
+ #
32
+ # # Adjusting the electoronic tag radio station
33
+ # lastfm.adjust_station("tag", "electoronic")
34
+ #
35
+ # # Downloading tracks
36
+ # loop do
37
+ # lastfm.get_tracks.each do |track|
38
+ # puts "-------------------------------------------"
39
+ # puts "artist: #{track.artist}"
40
+ # puts "title: #{track.title}"
41
+ # puts "album: #{track.album}"
42
+ # puts "length: #{track.length/1000}[sec]"
43
+ # `wget #{track.location}`
44
+ # end
45
+ # end
46
+ #
47
+ #
48
+ #==Reference
49
+ #
50
+ #* {LastFM12UnofficialDocumentation}[http://code.google.com/p/thelastripper/wiki/LastFM12UnofficialDocumentation]
51
+ #
52
+ #==Change Log
53
+ #
54
+ #- Ver.0.1 Sun Oct 19 2008
55
+ # - Create lastfm12.rb
56
+ #
57
+
58
+ require "net/http"
59
+ require "uri"
60
+ require "cgi"
61
+ require "digest/md5"
62
+ require "rexml/document"
63
+
64
+ #main class
65
+ class LastFM12
66
+
67
+ HANDSHAKE_HOST='ws.audioscrobbler.com'
68
+ HANDSHAKE_PATH='/radio'
69
+ HANDSHAKE_SCRIPT='handshake.php'
70
+ ADJUST_SCRIPT='adjust.php'
71
+ PLAYLIST_SCRIPT='xspf.php'
72
+
73
+ DEFAULT_USER_AGENT='Ruby-Lastfm12'
74
+
75
+ #Handshake with ws.audioscrobbler.com
76
+ #[_username_]
77
+ # an account name on last.fm
78
+ #[_password_]
79
+ # an password for the account
80
+ #[_opt_]
81
+ # a hash as Fig.A
82
+ #
83
+ #===Fig.A
84
+ #_key_:: _value_
85
+ #:user_agent or "user_agent":: an string used as an user agent name for handshake, ajusting radio station and playlist requests
86
+ #:station or "staion":: an array of strings such as ["tag","electoro"]. refer _adjust_station_ method
87
+ #:verbose or "verbose":: true: output oparations, false: no output
88
+
89
+ def initialize(username,password,opt=nil)
90
+
91
+ @user_name = username.to_s
92
+ @password = password.to_s
93
+
94
+ @user_agent=DEFAULT_USER_AGENT
95
+ @station = nil
96
+ @verbose = $DEBUG
97
+ if opt.class == Hash
98
+ opt.each do |k,v|
99
+ case k
100
+ when "user_agent",:user_agent
101
+ @user_agent = v.to_s
102
+ when "station", :station
103
+ @station = _make_lastfm_url(*(v.to_a))
104
+ when "verbose", :verbose
105
+ @verbose = true
106
+ end
107
+ end
108
+ end
109
+
110
+ @session = nil
111
+ @base_url = nil
112
+ @base_path = nil
113
+ _handshake
114
+
115
+ if @station
116
+ _adjust_station(@station)
117
+ end
118
+
119
+ @@instance=self
120
+
121
+ end
122
+ attr_reader :user_name, :user_agent, :station, :verbose
123
+
124
+ #Adjusting a station specified as arguments
125
+ #===Arguments
126
+ #These argments class should be Symbol class or String class.
127
+ #_param_name_:: Discription
128
+ #personal:: _param_'s personal radio station
129
+ #artist:: _param_'s similar radio station
130
+ #tag or globaltags:: a radio station having tracks tagged as _param_
131
+ #group:: a radio statio for _param_ group
132
+ #neighbours:: _param_'s neighbours radio station
133
+ #recommended:: _param_'s recommended radio station
134
+ def adjust_station(param_name,param)
135
+
136
+ station = _make_lastfm_url(param_name, param)
137
+
138
+ if @station == station
139
+ puts "Already Adjusted The Station" if @verbose
140
+ return station
141
+ else
142
+ @station = station
143
+ end
144
+
145
+ _adjust_station(@station)
146
+
147
+ end
148
+
149
+ #Getting tracks
150
+ #Return a array of tracks.
151
+ #[_num_] the minimun number of tracks
152
+ #===Note
153
+ #The length of the returned array is vary. So, sometime, _get_tracks_ get no track.
154
+ #Give _min_num_tracks_, if you want to get tracks more than _min_num_tracks_.
155
+ def get_tracks(min_num_tracks=nil)
156
+
157
+ ret = []
158
+ count = 0
159
+
160
+ if min_num_tracks
161
+
162
+ while ret.length < min_num_tracks
163
+
164
+ ret = ret + _get_tracks
165
+
166
+ if @verbose
167
+ z = ret.length.zero?
168
+ puts "#{z ? '' : 'Success'} Getting #{z ? 'No' : ret.length } Tracks"
169
+ end
170
+
171
+ end
172
+
173
+ else
174
+ ret = _get_tracks
175
+ end
176
+
177
+ ret
178
+
179
+ end
180
+
181
+ def play_loop(&block)
182
+
183
+ loop do
184
+ self.get_tracks(1).each(&block)
185
+ end
186
+
187
+ end
188
+
189
+ def LastFM12.play_loop(*args,&block)
190
+
191
+ if args.length == 1 and args[0].kind_of?(Hash)
192
+ hash = args[0]
193
+ elsif args.length == 3 and args[2].kind_of?(Hash)
194
+ hash = args[2]
195
+ hash[:user_name] = args[0]
196
+ hash[:password] = args[1]
197
+ end
198
+
199
+ new_hash = Hash.new
200
+ hash.each{|k,v|new_hash[k.to_sym]=new_hash[k.to_s]=v}
201
+ hash = new_hash
202
+
203
+ if @@instance.nil? or @@instance.user_name != hash[:user_name]
204
+ @@instance = LastFM12.new(hash[:user_name],hash[:password],hash)
205
+ else
206
+ puts "Skip Handshake" if @@instance.verbose
207
+ end
208
+
209
+ @@instance.play_loop(&block)
210
+
211
+ end
212
+ @@instance=nil
213
+
214
+ #a class for tracks
215
+ class Track
216
+
217
+ def initialize(hash)
218
+ if hash.class != Hash
219
+ raise ArgumentError
220
+ end
221
+ @hash = hash
222
+ end
223
+
224
+ def [](key)
225
+ @hash[key]
226
+ end
227
+
228
+ #A redirection URL to another URL
229
+ #* Cannot make multi-connetion with the URL.
230
+ #* Cannot make a connection after second with the URL.
231
+ def location
232
+ @hash[:location]
233
+ end
234
+
235
+ # a title of the track
236
+ def title
237
+ @hash[:title]
238
+ end
239
+ #alias _title_
240
+ def name
241
+ title
242
+ end
243
+
244
+ # a album name of the track
245
+ def album
246
+ @hash[:album]
247
+ end
248
+
249
+ # a creator name of the track
250
+ def creator
251
+ @hash[:creator]
252
+ end
253
+ # alias _creator_
254
+ def artist
255
+ creator
256
+ end
257
+
258
+ # seconds of the track
259
+ def duration
260
+ @hash[:duration].to_i
261
+ end
262
+
263
+ # alias _duration_
264
+ def length
265
+ duration
266
+ end
267
+
268
+ # an URL of the track image
269
+ def image_url
270
+ @hash[:image]
271
+ end
272
+
273
+ # a station name
274
+ def station
275
+ @hash[:station]
276
+ end
277
+
278
+ #execute a given block against the mp3 stream
279
+ #the block is given a segument data of mp3
280
+ def play(&block)
281
+
282
+ uri = URI(@hash[:location])
283
+ ret = nil
284
+ redirect_flag = true
285
+
286
+ while redirect_flag
287
+
288
+ host = uri.host
289
+ path = uri.path
290
+ path = path + "?" + uri.query if uri.query
291
+ redirect_flag = false
292
+
293
+ header = {
294
+ 'Host' => host,
295
+ 'User-Agent' => @hash[:user_agent],
296
+ }
297
+ Net::HTTP.new(host).request_get(path,header) do |res|
298
+
299
+ if res.code.match(/^30[0-3]$/)
300
+ uri = URI(res['location'])
301
+ redirect_flag = true
302
+ next
303
+ end
304
+
305
+ res.read_body(&block)
306
+
307
+ end
308
+ end # of "begin"
309
+
310
+ ret
311
+
312
+ end # of "def play(&block)"
313
+
314
+
315
+ end # of "class Track"
316
+
317
+ #General exception for Lastfm12
318
+ class Error < Exception; end
319
+
320
+ #Exception class for errors of handshake
321
+ class HandshakeError < Error; end
322
+
323
+ #Exception class for errors of adjusting radion station
324
+ #There ar 9 exception messages:
325
+ #* There is not enough content to play the station. Due to restrictions imposed by the music labels, a radio station must have more than 15 tracks; each by different artists.
326
+ #* The group does not have enough members to have a radio station.
327
+ #* The stream has stopped. Please try again later, or try another station.
328
+ #* The user does not have enough neighbors to have a radio station.
329
+ #* The station is available to subscribers only.
330
+ #* The station is not available for streaming.
331
+ #* The artist does not have enough fans to have a radio station.
332
+ #* An unknown error occurred.
333
+ #referred to on {adjust.php error codes}[http://www.lastfm.de/forum/21716/_/380495/1#f5829616]
334
+ class AdjustingError < Error;
335
+ Messages = ['There is not enough content to play the station. Due to restrictions imposed by the music labels, a radio station must have more than 15 tracks; each by different artists.',
336
+ 'The group does not have enough members to have a radio station.',
337
+ 'The artist does not have enough fans to have a radio station.',
338
+ 'The station is not available for streaming.',
339
+ 'The station is available to subscribers only.',
340
+ 'The user does not have enough neighbors to have a radio station.',
341
+ 'An unknown error occurred.']
342
+ end
343
+
344
+ #Exception class of getting tracks
345
+ class GettingTracksError < Error; end
346
+
347
+ private
348
+
349
+ def _handshake
350
+
351
+ ret = nil
352
+
353
+ h = {
354
+ 'version' => '1.3.1.1',
355
+ 'platform' => 'linux',
356
+ 'username' => @user_name,
357
+ 'passwordmd5' => Digest::MD5.hexdigest(@password),
358
+ }
359
+ query = _make_http_query(h)
360
+ path = "%s/%s?%s" % [HANDSHAKE_PATH,HANDSHAKE_SCRIPT,query]
361
+ header = {
362
+ 'Host' => HANDSHAKE_HOST,
363
+ 'User-Agent' => @user_agent,
364
+ }
365
+ Net::HTTP.new(HANDSHAKE_HOST).request_get(path,header) do |res|
366
+ #ph res
367
+ ret = Hash[*res.body.split("\n").map{|i|i.split('=',2)}.flatten]
368
+ #ph ret
369
+ @session = ret['session']
370
+ @base_url = ret['base_url']
371
+ @base_path = ret['base_path']
372
+ if @session.nil? or @base_url.nil? or @base_path.nil?
373
+ raise HandshakeError, "handshake error(session: #{@session}, base_url#{@base_url}, base_path: #{@base_path})"
374
+ else
375
+ puts "Success Handshake" if @verbose
376
+ end
377
+ end
378
+
379
+ ret
380
+
381
+ end
382
+
383
+ def _adjust_station(url)
384
+
385
+ ret = nil
386
+
387
+ h = {
388
+ 'session' => @session,
389
+ 'url' => @station,
390
+ 'lang' => 'en'
391
+ }
392
+ query = _make_http_query(h)
393
+ path = "%s/%s?%s" % [@base_path,ADJUST_SCRIPT,query]
394
+ header = {
395
+ 'Host' => @base_url,
396
+ 'User-Agent' => @user_agent,
397
+ }
398
+ Net::HTTP.new(@base_url).request_get(path,header) do |res|
399
+ #ph res
400
+ ret = Hash[*res.body.split("\n").map{|i|i.split('=',2)}.flatten]
401
+ #ph ret
402
+ if ret['response'] == 'FAILED'
403
+ raise AdjustingError, AdjustingError::Messages[ret['error'].to_i-1]
404
+ else
405
+ puts "Success Adjusting #{ret[%[stationname]]} Station" if @verbose
406
+ end
407
+ end
408
+
409
+ ret['stationname']
410
+
411
+ end
412
+
413
+ def _get_tracks
414
+
415
+ ret = nil
416
+
417
+ h = {
418
+ 'sk' => @session,
419
+ 'desktop' => '1.4.2.58376',
420
+ }
421
+ query = _make_http_query(h)
422
+ path = "%s/%s?%s" % [@base_path,PLAYLIST_SCRIPT,query]
423
+ header = {
424
+ 'Host' => @base_url,
425
+ 'User-Agent' => @user_agent,
426
+ }
427
+ tracks = Array.new
428
+
429
+ xpath = '/playlist/trackList/track'
430
+ Net::HTTP.new(@base_url).request_get(path+query) do |res|
431
+
432
+ xspf = REXML::Document.new(res.body)
433
+ station = xspf.elements['/playlist/title']
434
+ if station.nil? or station.text.nil?
435
+ puts "Failure of Getting the Playlist Title" if @verbose
436
+ return []
437
+ end
438
+
439
+ station = station.text
440
+ station = CGI.unescape(station)
441
+ xspf.each_element(xpath) do |ele|
442
+ tr = Hash.new
443
+ ele.each_element do |child|
444
+ tr[child.name.to_sym] = child.text
445
+ end
446
+ tr[:station] = station
447
+ tr[:user_agent] = @user_agent
448
+ tracks << Track.new(tr)
449
+ end
450
+ end # End of "Net::HTTP.new(@base_url).request_get(..."
451
+
452
+ tracks
453
+ end
454
+
455
+ def _make_http_query(hash)
456
+ hash.to_a.map{|a|a.join('=')}.join('&')
457
+ end
458
+
459
+ def ph(h)
460
+ puts "-"*20 + h.class.to_s + "-"*20
461
+ h.each{|k,v|puts " #{k}\t=> #{v}"}
462
+ end
463
+
464
+ # make a last.fm url
465
+ def _make_lastfm_url(param_name,param)
466
+ tmp = "lastfm://%s/%s"
467
+ param_name = param_name.to_sym
468
+ param = URI.encode(param.to_s)
469
+ case param_name
470
+ when :personal
471
+ tmp % ["user", "#{param}/personal"]
472
+ when :tag, :tags, :globaltags
473
+ tmp % ["globaltags", param]
474
+ when :creator, :artist
475
+ tmp % ["artist", param]
476
+ when :group
477
+ tmp % ["group", param]
478
+ when :neighbours
479
+ tmp % ["user", "#{param}/neighbours"]
480
+ when :recommended
481
+ tmp % ["user", "#{param}/recommended/100"]
482
+ end
483
+ end
484
+
485
+ end
486
+
487
+ if $0 == __FILE__
488
+ Lastfm12.new("daftbeats","iamcrz4b",:station => ["tag","bossa"]).get_tracks.each do |tr|
489
+ puts tr
490
+ end
491
+ end
data/script/console ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+ # File: script/console
3
+ irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
4
+
5
+ libs = " -r irb/completion"
6
+ # Perhaps use a console_lib to store any extra methods I may want available in the cosole
7
+ # libs << " -r #{File.dirname(__FILE__) + '/../lib/console_lib/console_logger.rb'}"
8
+ libs << " -r #{File.dirname(__FILE__) + '/../lib/lastfm12.rb'}"
9
+ puts "Loading lastfm12 gem"
10
+ exec "#{irb} #{libs} --simple-prompt"