songbirdsh 0.0.4 → 0.0.5

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.rdoc CHANGED
@@ -1,3 +1,18 @@
1
+ = 0.0.5
2
+
3
+ Bug fixes, code cleanup and some colour
4
+
5
+ * Sorted out crash when listing queue while not playing
6
+ * Added help to all commands
7
+ * Added rainbow and added colour to the track display
8
+ * Changed shuffle behaviour - it now just shuffles current queue
9
+ * Added flush command
10
+ * Switched to using bundler to manage gem
11
+
12
+ = 0.0.4
13
+
14
+ Some minor bug fixes
15
+
1
16
  = 0.0.3
2
17
 
3
18
  Introduced testing, lastfm support and a few other useful commands
data/Rakefile CHANGED
@@ -1,10 +1,6 @@
1
- begin
2
- require 'gemesis/rake'
3
- rescue Exception
4
- puts "gemesis related tasks will only be available if you 'gem install gemesis'"
5
- end
1
+ require 'bundler/gem_tasks'
6
2
 
7
3
  desc 'execute specifications'
8
4
  task :test do
9
- sh 'rspec spec'
5
+ sh 'bundle exec rspec spec'
10
6
  end
@@ -28,7 +28,7 @@ module Songbirdsh
28
28
  with :show_properties, 'show'
29
29
  with :restart, 'next'
30
30
  with :enqueue, '+'
31
- with_all *%w{reload search start stop scrobbling shuffle list setup_scrobbling}
31
+ with_all *%w{reload search start stop scrobbling shuffle list setup_scrobbling recent flush}
32
32
  end
33
33
  end
34
34
  end
@@ -1,5 +1,11 @@
1
1
  module Songbirdsh
2
- class Command
2
+ module Command
3
+ attr_reader :usage, :help
4
+
5
+ def self.included cls
6
+ cls.extend ClassMethods
7
+ end
8
+
3
9
  def self.load name, *args
4
10
  require "songbirdsh/command/#{name}"
5
11
  classname = name.to_s.split('_').map{|s|s.capitalize}.join
@@ -8,6 +14,22 @@ module Songbirdsh
8
14
 
9
15
  def initialize player
10
16
  @player = player
17
+ @usage = ''
18
+ @help = ''
19
+ end
20
+
21
+ module ClassMethods
22
+ def usage usage
23
+ define_method(:usage) { usage }
24
+ end
25
+
26
+ def help help
27
+ define_method(:help) { help }
28
+ end
29
+
30
+ def execute &block
31
+ define_method :execute, block
32
+ end
11
33
  end
12
34
  end
13
35
  end
@@ -1,16 +1,13 @@
1
1
  require 'yaml'
2
+ require 'songbirdsh/range_expander'
2
3
  require 'songbirdsh/command'
3
4
 
4
- class Songbirdsh::Command::Enqueue < Songbirdsh::Command
5
- def execute text
6
- text.split(/[^0-9a-z]/).select {|s| s and !s.empty?}.each {|id| @player.enqueue id.to_i(36) }
5
+ class Songbirdsh::Command::Enqueue
6
+ include Songbirdsh::Command
7
+ usage '*<id>'
8
+ help 'enqueues the list of songs with the specified ids'
9
+ execute do |text|
10
+ @expander ||= Songbirdsh::RangeExpander.new
11
+ @expander.expand(text).each {|id| @player.enqueue id }
7
12
  end
8
-
9
- def usage
10
- '*<id>'
11
- end
12
-
13
- def help
14
- 'enqueues the list of songs with the specified ids'
15
- end
16
- end
13
+ end
@@ -0,0 +1,7 @@
1
+ require 'songbirdsh/command'
2
+
3
+ class Songbirdsh::Command::Flush
4
+ include Songbirdsh::Command
5
+ help 'flushes the current queue'
6
+ execute {|ignored| loop { break unless @player.dequeue } }
7
+ end
@@ -1,24 +1,24 @@
1
1
  require 'songbirdsh/command'
2
2
 
3
- class Songbirdsh::Command::List < Songbirdsh::Command
4
- def execute text
3
+ class Songbirdsh::Command::List
4
+ include Songbirdsh::Command
5
+ help 'lists the contents of the track queue (and approximate times for when each track will be played)'
6
+ execute do |text|
5
7
  @terms = text.split(/\W/)
6
8
  current = @player.current
7
- next_start_time = Time.at current.started
8
- show next_start_time, current
9
- next_start_time += current.duration
9
+ if current
10
+ next_start_time = Time.at current.started
11
+ show next_start_time, current
12
+ end
13
+ next_start_time += current.duration if next_start_time
10
14
  @player.each do |track|
11
15
  show next_start_time, track
12
- next_start_time += track.duration
16
+ next_start_time += track.duration if next_start_time
13
17
  end
14
18
  end
15
19
 
16
20
  def show time, track
17
21
  return unless @terms.empty? or @terms.all? {|term| track.search_string.include? term }
18
- puts "#{time}\n\t#{track}"
19
- end
20
-
21
- def help
22
- 'lists the contents of the track queue (and approximate times for when each track will be played)'
22
+ puts time ? "#{time.to_s.foreground(:blue)}\n\t#{track}" : track
23
23
  end
24
24
  end
@@ -0,0 +1,31 @@
1
+ require 'songbirdsh/command'
2
+
3
+ class Songbirdsh::Command::Recent
4
+ include Songbirdsh::Command
5
+ usage '<count>'
6
+ help 'lists the specified number of recently added albums'
7
+ execute do |text|
8
+ @player.library.reload unless @player.library.tracks
9
+ maximum, current_album, tracks, total_count = text.to_i, nil, [], 0
10
+ @player.library.tracks.reverse.each do |track|
11
+ unless current_album
12
+ current_album = track.album
13
+ tracks = [track]
14
+ next
15
+ end
16
+ if current_album==track.album
17
+ tracks << track
18
+ else
19
+ puts "#{current_album} - #{extract_artist tracks} - #{tracks.size} tracks (#{tracks.last.search_id}-#{tracks.first.search_id})"
20
+ current_album = track.album
21
+ tracks = [track]
22
+ total_count += 1
23
+ end
24
+ break if total_count >= maximum
25
+ end
26
+ end
27
+ private
28
+ def extract_artist tracks
29
+ tracks.map{|t| t.artist}.uniq.size == 1 ? tracks.first.artist : 'various artists'
30
+ end
31
+ end
@@ -1,15 +1,7 @@
1
1
  require 'songbirdsh/command'
2
2
 
3
- class Songbirdsh::Command::Reload < Songbirdsh::Command
4
- def execute ignored=nil
5
- @player.library.reload
6
- end
7
-
8
- def usage
9
- ''
10
- end
11
-
12
- def help
13
- 'reloads the contents of the music library for fast searching'
14
- end
3
+ class Songbirdsh::Command::Reload
4
+ include Songbirdsh::Command
5
+ help 'reloads the contents of the music library for fast searching'
6
+ execute {|ignored| @player.library.reload }
15
7
  end
@@ -1,7 +1,7 @@
1
1
  require 'songbirdsh/command'
2
2
 
3
- class Songbirdsh::Command::Restart < Songbirdsh::Command
4
- def execute ignored=nil
5
- @player.restart
6
- end
3
+ class Songbirdsh::Command::Restart
4
+ include Songbirdsh::Command
5
+ help 'stops and restarts the player (which will kill the current track)'
6
+ execute {|ignored| @player.restart }
7
7
  end
@@ -1,19 +1,14 @@
1
1
  require 'songbirdsh/command'
2
2
 
3
- class Songbirdsh::Command::Scrobbling < Songbirdsh::Command
4
- def execute text
3
+ class Songbirdsh::Command::Scrobbling
4
+ include Songbirdsh::Command
5
+ usage '<on|off>'
6
+ help 'turns interaction with lastfm on or off'
7
+ execute do |text|
5
8
  scrobbling = (text == 'on')
6
9
  return if @player.scrobbling == scrobbling
7
10
  puts scrobbling ? 'Turning scrobbling on' : 'Turning scrobbling off'
8
11
  @player.scrobbling = scrobbling
9
12
  @player.restart
10
13
  end
11
-
12
- def usage
13
- '<on|off>'
14
- end
15
-
16
- def help
17
- 'turns interaction with lastfm on or off'
18
- end
19
14
  end
@@ -1,7 +1,13 @@
1
1
  require 'songbirdsh/command'
2
2
 
3
- class Songbirdsh::Command::Search < Songbirdsh::Command
4
- def execute text
3
+ class Songbirdsh::Command::Search
4
+ include Songbirdsh::Command
5
+ usage '*<word>'
6
+ help <<EOF
7
+ searches for tracks containing the specified words (in artist, title or album)
8
+ ids are placed on the clipboard for convenient use with +
9
+ EOF
10
+ execute do |text|
5
11
  terms = text.split(/\W/)
6
12
  matches = []
7
13
  @player.library.reload unless @player.library.tracks
@@ -1,11 +1,7 @@
1
1
  require 'songbirdsh/command'
2
2
 
3
- class Songbirdsh::Command::SetupScrobbling < Songbirdsh::Command
4
- def execute text
5
- @player.scrobbler.setup
6
- end
7
-
8
- def help
9
- 'runs through the steps required to get lastfm scrobbling working'
10
- end
3
+ class Songbirdsh::Command::SetupScrobbling
4
+ include Songbirdsh::Command
5
+ help 'runs through the steps required to get lastfm scrobbling working'
6
+ execute {|ignored| @player.scrobbler.setup }
11
7
  end
@@ -1,8 +1,9 @@
1
1
  require 'songbirdsh/command'
2
2
  require 'pp'
3
3
 
4
- class Songbirdsh::Command::ShowProperties < Songbirdsh::Command
5
- def execute id
6
- @player.library.with_track(id.to_i(36)) {|track| pp track }
7
- end
4
+ class Songbirdsh::Command::ShowProperties
5
+ include Songbirdsh::Command
6
+ usage '<id>'
7
+ help 'show the track details for a specified id'
8
+ execute {|id| @player.library.with_track(id.to_i(36)) {|track| pp track } }
8
9
  end
@@ -1,15 +1,13 @@
1
1
  require 'songbirdsh/command'
2
2
 
3
- class Songbirdsh::Command::Shuffle < Songbirdsh::Command
4
- def execute text
5
- if @player.matches
6
- @player.matches.sort_by { rand }.join(' ').to_clipboard
7
- else
8
- puts 'nothing to shuffle - please search for some tracks'
3
+ class Songbirdsh::Command::Shuffle
4
+ include Songbirdsh::Command
5
+ help 'shuffles the current queue'
6
+ execute do |ignored=nil|
7
+ ids = []
8
+ while id = @player.dequeue
9
+ ids << id
9
10
  end
10
- end
11
-
12
- def help
13
- 'shuffles the results from the last search and places them on the clipboard'
11
+ ids.sort_by { rand }.each {|id| @player.enqueue id }
14
12
  end
15
13
  end
@@ -1,7 +1,7 @@
1
1
  require 'songbirdsh/command'
2
2
 
3
- class Songbirdsh::Command::Start < Songbirdsh::Command
4
- def execute ignored=nil
5
- @player.start
6
- end
3
+ class Songbirdsh::Command::Start
4
+ include Songbirdsh::Command
5
+ help 'starts the player'
6
+ execute {|ignored| @player.start }
7
7
  end
@@ -1,12 +1,8 @@
1
1
  require 'yaml'
2
2
  require 'songbirdsh/command'
3
3
 
4
- class Songbirdsh::Command::Status < Songbirdsh::Command
5
- def execute text
6
- puts @player.status
7
- end
8
-
9
- def help
10
- 'shows the current playing status'
11
- end
4
+ class Songbirdsh::Command::Status
5
+ include Songbirdsh::Command
6
+ help 'shows the current player status'
7
+ execute {|ignored| puts @player.status }
12
8
  end
@@ -1,7 +1,7 @@
1
1
  require 'songbirdsh/command'
2
2
 
3
- class Songbirdsh::Command::Stop < Songbirdsh::Command
4
- def execute ignored=nil
5
- @player.stop
6
- end
3
+ class Songbirdsh::Command::Stop
4
+ include Songbirdsh::Command
5
+ help 'stops the player'
6
+ execute {|ignored| @player.stop }
7
7
  end
@@ -1,12 +1,11 @@
1
- require 'songbirdsh/queue'
2
- require 'songbirdsh/library'
3
-
4
1
  require 'cgi'
5
2
  require 'yaml'
6
3
  require 'fileutils'
7
4
  require 'splat'
8
5
 
6
+ require 'songbirdsh/queue'
9
7
  require 'songbirdsh/scrobbler'
8
+ require 'songbirdsh/library'
10
9
 
11
10
  module Songbirdsh
12
11
  class Player
@@ -20,19 +19,23 @@ module Songbirdsh
20
19
  @library = Library.new preferences
21
20
  end
22
21
 
22
+ def c text,colour
23
+ text.to_s.foreground colour
24
+ end
25
+
23
26
  def status
24
27
  if @pid
25
28
  track = self.current
26
- puts "Since #{Time.at(track.started)}\n\t#{track}"
29
+ puts "Since #{c Time.at(track.started), :cyan}\n\t#{track}"
27
30
  played = Time.now.to_i-track.started
28
- puts "#{played} seconds (#{track.duration-played} remaining)"
31
+ puts "#{c played, :yellow} seconds (#{c track.duration-played, :yellow} remaining)"
29
32
  else
30
- puts 'not playing'
33
+ puts 'not playing'.foreground(:yellow)
31
34
  end
32
35
  end
33
36
 
34
- def current
35
- YAML.load(File.read('current_song'))
37
+ def current
38
+ (@pid and File.exist?('current_song')) ? YAML.load_file('current_song') : nil
36
39
  end
37
40
 
38
41
  def register track
@@ -0,0 +1,30 @@
1
+ module Songbirdsh
2
+ class RangeExpander
3
+ def expand text
4
+ text.split(/[^0-9a-z-]/).inject([]) {|acc, term| acc + expand_term(term) }
5
+ end
6
+
7
+ def expand_to_ids text
8
+ expand(text).map {|number| from_number number }
9
+ end
10
+ private
11
+ def expand_term term
12
+ words = term.split '-'
13
+ words.empty? ? [] : range(words.first, words.last)
14
+ end
15
+
16
+ def range from, to
17
+ f, t = to_number(from), to_number(to)
18
+ t = to_number(from.slice(0...from.size-to.size)+to) if t < f
19
+ (f..t).to_a
20
+ end
21
+
22
+ def from_number term
23
+ term.to_s 36
24
+ end
25
+
26
+ def to_number term
27
+ term.to_i 36
28
+ end
29
+ end
30
+ end
@@ -1,3 +1,5 @@
1
+ require 'rainbow'
2
+
1
3
  module Songbirdsh
2
4
  class Track
3
5
  attr_accessor *%w{id track album artist duration genre number year disc disc_total track_total label started}
@@ -23,7 +25,11 @@ module Songbirdsh
23
25
  end
24
26
 
25
27
  def to_s
26
- "#{self.search_id}: #{self.artist} - #{self.album} - #{self.number} #{self.track} (#{self.duration})"
28
+ "#{my(:search_id,:white)}: #{my(:artist, :yellow)} - #{my(:album,:cyan)} - #{my(:number,:magenta)} #{my(:track,:green)} (#{my(:duration,:white)})"
29
+ end
30
+
31
+ def my field, colour
32
+ self.send(field).to_s.foreground(colour)
27
33
  end
28
34
  end
29
35
  end
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__)+'/../../spec_helper'
1
+ require_relative '../../spec_helper'
2
2
  require 'songbirdsh/command/enqueue'
3
3
 
4
4
  describe Songbirdsh::Command::Enqueue do
@@ -12,15 +12,13 @@ describe Songbirdsh::Command::Enqueue do
12
12
  @command = Songbirdsh::Command::Enqueue.new @player
13
13
  end
14
14
 
15
- it 'should enqueue a single track' do
16
- @player.should_receive(:enqueue).with(1371)
17
- @command.execute '123'
18
- end
15
+ it 'should enqueue whatever is returned from the expander' do
16
+ expander = stub('expander')
17
+ Songbirdsh::RangeExpander.should_receive(:new).and_return(expander)
18
+ expander.should_receive(:expand).with('some text').and_return([1,2,3])
19
+
20
+ [1,2,3].each {|id| @player.should_receive(:enqueue).with id}
19
21
 
20
- it 'should enqueue multiple tracks separated by any non digit' do
21
- %w{1371 5370 9369}.each do |id|
22
- @player.should_receive(:enqueue).with(id.to_i)
23
- end
24
- @command.execute "123 \t 456 , 789 "
22
+ @command.execute "some text"
25
23
  end
26
24
  end
@@ -0,0 +1,27 @@
1
+ require_relative '../../spec_helper'
2
+ require 'songbirdsh/command/list'
3
+
4
+ describe Songbirdsh::Command::List do
5
+ extend ShellShock::CommandSpec
6
+
7
+ with_help 'lists the contents of the track queue (and approximate times for when each track will be played)'
8
+
9
+ before do
10
+ @player = stub('player')
11
+ @command = Songbirdsh::Command::List.new @player
12
+ end
13
+
14
+ it 'should display nothing when there is no current track and nothing enqueued' do
15
+ @player.stub!(:current).and_return nil
16
+ @player.stub! :each
17
+ @command.execute ''
18
+ end
19
+
20
+ it 'should display queue contents with no times when there is no current track' do
21
+ track = stub 'track'
22
+ @player.stub!(:current).and_return nil
23
+ @player.stub!(:each).and_yield track
24
+ @command.should_receive(:puts).with track
25
+ @command.execute ''
26
+ end
27
+ end
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__)+'/../../spec_helper'
1
+ require_relative '../../spec_helper'
2
2
  require 'songbirdsh/command/reload'
3
3
 
4
4
  describe Songbirdsh::Command::Reload do
@@ -0,0 +1,27 @@
1
+ require_relative '../../spec_helper'
2
+ require 'songbirdsh/command/shuffle'
3
+
4
+ describe Songbirdsh::Command::Shuffle do
5
+ extend ShellShock::CommandSpec
6
+
7
+ with_usage ''
8
+ with_help 'shuffles the current queue'
9
+
10
+ before do
11
+ @player = stub 'player'
12
+ @command = Songbirdsh::Command::Shuffle.new @player
13
+ end
14
+
15
+ it 'should dequeue all tracks, shuffle then enqueue them' do
16
+ @player.should_receive(:dequeue).and_return(1)
17
+ @player.should_receive(:dequeue).and_return(2)
18
+ @player.should_receive(:dequeue).and_return(3)
19
+ @player.should_receive(:dequeue).and_return nil
20
+
21
+ @player.should_receive(:enqueue).with 3
22
+ @player.should_receive(:enqueue).with 2
23
+ @player.should_receive(:enqueue).with 1
24
+
25
+ @command.execute
26
+ end
27
+ end
@@ -0,0 +1,36 @@
1
+ require_relative '../spec_helper'
2
+ require 'songbirdsh/player'
3
+
4
+ describe Songbirdsh::Player do
5
+ let(:preferences) { {} }
6
+ let(:player) { Songbirdsh::Player.new preferences }
7
+
8
+ before do
9
+ scrobbler = mock 'scrobbler'
10
+ library = mock 'library'
11
+ Songbirdsh::Scrobbler.stub!(:new).and_return scrobbler
12
+ Songbirdsh::Library.stub!(:new).and_return library
13
+ end
14
+
15
+ describe '#current' do
16
+ it 'should return current_track when player has pid and file is present' do
17
+ player.instance_eval { @pid = 1 }
18
+ hash = stub 'hash'
19
+ File.stub!(:exist?).with('current_song').and_return true
20
+ YAML.stub!(:load_file).with('current_song').and_return hash
21
+ player.current.should == hash
22
+ end
23
+
24
+ it 'should return nil when player has no pid and file is present' do
25
+ player.instance_eval { @pid = nil }
26
+ File.stub!(:exist?).with('current_song').and_return true
27
+ player.current.should == nil
28
+ end
29
+
30
+ it 'should return nil when has pid and file is not present' do
31
+ player.instance_eval { @pid = 1 }
32
+ File.stub!(:exist?).with('current_song').and_return false
33
+ player.current.should == nil
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,28 @@
1
+ require_relative '../spec_helper'
2
+ require 'songbirdsh/range_expander'
3
+
4
+ describe Songbirdsh::RangeExpander do
5
+ before do
6
+ @expander = Songbirdsh::RangeExpander.new
7
+ end
8
+
9
+ it 'should expand single values' do
10
+ @expander.expand('123').should == [1371]
11
+ end
12
+
13
+ it 'should expand multiple values separated by any non digit' do
14
+ @expander.expand("123 \t 456 , 789 ").should == [1371, 5370, 9369]
15
+ end
16
+
17
+ it 'should expand a fully specified range' do
18
+ @expander.expand(" 456-45i ").should == (5370..5382).to_a
19
+ end
20
+
21
+ it 'should expand an abbreviated range' do
22
+ @expander.expand(" 456-i ").should == (5370..5382).to_a
23
+ end
24
+
25
+ it 'should expand ids for a range' do
26
+ @expander.expand_to_ids(" s-z ").should == %w{s t u v w x y z}
27
+ end
28
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,5 @@
1
- $: << File.dirname(__FILE__)+'/../lib'
1
+ $: << File.expand_path('../../lib', __FILE__)
2
2
 
3
+ require 'bundler/setup'
4
+ require 'rspec'
3
5
  require 'shell_shock/command_spec'
metadata CHANGED
@@ -1,12 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: songbirdsh
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 0
8
- - 4
9
- version: 0.0.4
4
+ prerelease:
5
+ version: 0.0.5
10
6
  platform: ruby
11
7
  authors:
12
8
  - Mark Ryall
@@ -14,7 +10,7 @@ autorequire:
14
10
  bindir: bin
15
11
  cert_chain: []
16
12
 
17
- date: 2011-02-20 00:00:00 +10:00
13
+ date: 2011-06-19 00:00:00 +10:00
18
14
  default_executable:
19
15
  dependencies:
20
16
  - !ruby/object:Gem::Dependency
@@ -25,8 +21,6 @@ dependencies:
25
21
  requirements:
26
22
  - - ~>
27
23
  - !ruby/object:Gem::Version
28
- segments:
29
- - 0
30
24
  version: "0"
31
25
  type: :runtime
32
26
  version_requirements: *id001
@@ -38,8 +32,6 @@ dependencies:
38
32
  requirements:
39
33
  - - ~>
40
34
  - !ruby/object:Gem::Version
41
- segments:
42
- - 0
43
35
  version: "0"
44
36
  type: :runtime
45
37
  version_requirements: *id002
@@ -51,49 +43,40 @@ dependencies:
51
43
  requirements:
52
44
  - - ~>
53
45
  - !ruby/object:Gem::Version
54
- segments:
55
- - 3
56
46
  version: "3"
57
47
  type: :runtime
58
48
  version_requirements: *id003
59
49
  - !ruby/object:Gem::Dependency
60
- name: splat
50
+ name: sqlite3
61
51
  prerelease: false
62
52
  requirement: &id004 !ruby/object:Gem::Requirement
63
53
  none: false
64
54
  requirements:
65
55
  - - ~>
66
56
  - !ruby/object:Gem::Version
67
- segments:
68
- - 0
69
- - 1
70
- version: "0.1"
57
+ version: "1"
71
58
  type: :runtime
72
59
  version_requirements: *id004
73
60
  - !ruby/object:Gem::Dependency
74
- name: sqlite3
61
+ name: simple_scrobbler
75
62
  prerelease: false
76
63
  requirement: &id005 !ruby/object:Gem::Requirement
77
64
  none: false
78
65
  requirements:
79
66
  - - ~>
80
67
  - !ruby/object:Gem::Version
81
- segments:
82
- - 1
83
- version: "1"
68
+ version: "0"
84
69
  type: :runtime
85
70
  version_requirements: *id005
86
71
  - !ruby/object:Gem::Dependency
87
- name: simple_scrobbler
72
+ name: rainbow
88
73
  prerelease: false
89
74
  requirement: &id006 !ruby/object:Gem::Requirement
90
75
  none: false
91
76
  requirements:
92
77
  - - ~>
93
78
  - !ruby/object:Gem::Version
94
- segments:
95
- - 0
96
- version: "0"
79
+ version: "1"
97
80
  type: :runtime
98
81
  version_requirements: *id006
99
82
  - !ruby/object:Gem::Dependency
@@ -104,9 +87,6 @@ dependencies:
104
87
  requirements:
105
88
  - - ~>
106
89
  - !ruby/object:Gem::Version
107
- segments:
108
- - 0
109
- - 8
110
90
  version: "0.8"
111
91
  type: :development
112
92
  version_requirements: *id007
@@ -118,8 +98,6 @@ dependencies:
118
98
  requirements:
119
99
  - - ~>
120
100
  - !ruby/object:Gem::Version
121
- segments:
122
- - 2
123
101
  version: "2"
124
102
  type: :development
125
103
  version_requirements: *id008
@@ -136,7 +114,9 @@ extra_rdoc_files: []
136
114
  files:
137
115
  - lib/songbirdsh/cli.rb
138
116
  - lib/songbirdsh/command/enqueue.rb
117
+ - lib/songbirdsh/command/flush.rb
139
118
  - lib/songbirdsh/command/list.rb
119
+ - lib/songbirdsh/command/recent.rb
140
120
  - lib/songbirdsh/command/reload.rb
141
121
  - lib/songbirdsh/command/restart.rb
142
122
  - lib/songbirdsh/command/scrobbling.rb
@@ -153,11 +133,16 @@ files:
153
133
  - lib/songbirdsh/player.rb
154
134
  - lib/songbirdsh/preferences.rb
155
135
  - lib/songbirdsh/queue.rb
136
+ - lib/songbirdsh/range_expander.rb
156
137
  - lib/songbirdsh/scrobbler.rb
157
138
  - lib/songbirdsh/track.rb
158
139
  - lib/songbirdsh.rb
159
140
  - spec/songbirdsh/command/enqueue_spec.rb
141
+ - spec/songbirdsh/command/list_spec.rb
160
142
  - spec/songbirdsh/command/reload_spec.rb
143
+ - spec/songbirdsh/command/shuffle_spec.rb
144
+ - spec/songbirdsh/player_spec.rb
145
+ - spec/songbirdsh/range_expander_spec.rb
161
146
  - spec/spec_helper.rb
162
147
  - bin/songbirdsh
163
148
  - README.rdoc
@@ -179,21 +164,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
179
164
  requirements:
180
165
  - - ">="
181
166
  - !ruby/object:Gem::Version
182
- segments:
183
- - 0
184
167
  version: "0"
185
168
  required_rubygems_version: !ruby/object:Gem::Requirement
186
169
  none: false
187
170
  requirements:
188
171
  - - ">="
189
172
  - !ruby/object:Gem::Version
190
- segments:
191
- - 0
192
173
  version: "0"
193
174
  requirements: []
194
175
 
195
176
  rubyforge_project:
196
- rubygems_version: 1.3.7
177
+ rubygems_version: 1.6.2
197
178
  signing_key:
198
179
  specification_version: 3
199
180
  summary: command line jukebox music player