hearken 0.0.6 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,11 @@
1
+ = 0.1.0
2
+
3
+ * removed several dependencies - simple_scrobbler and thor
4
+ * split hearken command into two
5
+ * added 'love' command (to mark current track as loved)
6
+ * added 'profile' command (to launch last.fm profile to see track history)
7
+ * replaced 'flush' with an 'rm' command that can remove tracks matches criteria
8
+
1
9
  = 0.0.5
2
10
 
3
11
  * fixed 'recent' command - the library is sorted on file modification date
@@ -24,17 +24,18 @@ Growl notification (as new tracks are played) will work but only if 'growlnotify
24
24
 
25
25
  == Indexing tracks
26
26
 
27
- hearken index DIRECTORY
27
+ hearken_index DIRECTORY
28
28
 
29
- Will create a track index at ~/.hearken/music. Note that this might take a while the first time you run it.
29
+ Will create a track index at ~/.hearken/music.
30
30
 
31
- Subsequent runs will only query tags for new or modified files so should be fairly fast.
31
+ Note that this will take a long time first time you run it if you have a large collection of music. Subsequent
32
+ runs will only query tags for new or modified files so will be very fast.
32
33
 
33
34
  The index can be regenerated while the console is running and reloaded using the 'reload' command.
34
35
 
35
36
  == Console
36
37
 
37
- hearken console
38
+ hearken
38
39
 
39
40
  This enters an interactive prompt where you can start/stop the player, search and enqueue tracks.
40
41
 
@@ -62,7 +63,7 @@ Results will be displayed and the ids will be added to the clipboard (for conven
62
63
 
63
64
  Enqueues tracks with ids abc, abd, abe, abf, 123 and 456
64
65
 
65
- start
66
+ play
66
67
 
67
68
  Starts the player
68
69
 
@@ -74,23 +75,28 @@ Stops the player
74
75
 
75
76
  Stops and restarts the player (which will kill the currently playing track)
76
77
 
78
+ love
79
+
80
+ Tells last.fm that you love the current track (this will do nothing if last.fm is not configured or the player is
81
+ stopped)
82
+
83
+ rm iver bon
84
+
85
+ Removes any enqueued track with 'bon' and 'iver' in the track, artist or album name
86
+
77
87
  setup_scrobbling
78
88
 
79
89
  Runs through a wizard to configure scrobbling to last.fm
80
90
 
81
- scrobbling on
91
+ scrobbling on
82
92
 
83
93
  Turns scrobbling on (has no effect if scrobbling has not been configured)
84
94
 
85
- scrobbling off
95
+ scrobbling off
86
96
 
87
97
  Turns scrobbling off
88
98
 
89
99
  = Future plans for world domination
90
100
 
91
- * add a '-' command to remove tracks from queue
92
- * add a command to launch last.fm profile (for track history)
93
- * put some content on wiki to explain usage (especially use of track ranges '+ eft-z')
94
- * eliminate last.fm setup command once setup and add lastfm commands only when setup
95
101
  * Get working on linux
96
102
  * Get working on windows
@@ -2,6 +2,6 @@
2
2
 
3
3
  $: << File.dirname(__FILE__)+'/../lib'
4
4
 
5
- require 'hearken/cli'
5
+ require 'hearken/console'
6
6
 
7
- Hearken::Cli.start
7
+ Hearken::Console.new.push
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $: << File.dirname(__FILE__)+'/../lib'
4
+
5
+ require 'hearken/indexing'
6
+
7
+ unless ARGV.size == 1
8
+ puts "usage: hearken_index path_to_directory_containing_music_collection"
9
+ exit
10
+ end
11
+
12
+ Hearken::Indexing::Indexer.new(ARGV.shift).execute
@@ -24,12 +24,10 @@ EOF
24
24
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
25
25
  s.require_paths = ["lib"]
26
26
 
27
- s.add_dependency 'thor', '~>0'
28
27
  s.add_dependency 'splat', '~>0'
29
28
  s.add_dependency 'shell_shock', '~>0'
30
- s.add_dependency 'simple_scrobbler', '~> 0'
31
29
  s.add_dependency 'rainbow', '~> 1'
32
- s.add_dependency 'ruby-growl', '~> 3.0'
30
+ s.add_dependency 'nokogiri', '~> 1'
33
31
 
34
32
  s.add_development_dependency 'rake', '~>0'
35
33
  s.add_development_dependency 'rspec', '~>2'
@@ -1,3 +1,3 @@
1
1
  module Hearken
2
- VERSION = '0.0.6'
2
+ VERSION = '0.1.0'
3
3
  end
@@ -0,0 +1,7 @@
1
+ require 'hearken/command'
2
+
3
+ class Hearken::Command::Love
4
+ include Hearken::Command
5
+ help 'sends love for the current track to last fm'
6
+ execute {|ignored| @player.love }
7
+ end
@@ -0,0 +1,7 @@
1
+ require 'hearken/command'
2
+
3
+ class Hearken::Command::Profile
4
+ include Hearken::Command
5
+ help 'launches last fm profile'
6
+ execute {|ignored| @player.profile }
7
+ end
@@ -0,0 +1,15 @@
1
+ require 'hearken/command'
2
+
3
+ class Hearken::Command::Remove
4
+ include Hearken::Command
5
+ usage '*<word>'
6
+ help 'removes all tracks that match the specified criteria - specifying no criteria will flush entire queue'
7
+ execute do |text|
8
+ @terms = text.split(/\W/)
9
+ ids = []
10
+ while track = @player.dequeue
11
+ ids << track.id unless @terms.all? {|term| track.search_string.include? term }
12
+ end
13
+ ids.each {|id| @player.enqueue id }
14
+ end
15
+ end
@@ -1,5 +1,6 @@
1
1
  require 'shell_shock/context'
2
2
 
3
+ require 'hearken'
3
4
  require 'hearken/player'
4
5
  require 'hearken/preferences'
5
6
  require 'hearken/command'
@@ -27,8 +28,10 @@ module Hearken
27
28
  with :status, "'"
28
29
  with :restart, 'next'
29
30
  with :list, 'ls'
30
- with :enqueue, '+'
31
- with_all *%w{reload search start stop scrobbling shuffle setup_scrobbling recent flush}
31
+ with :enqueue, 'add'
32
+ with :remove, 'rm'
33
+ with :start, 'play'
34
+ with_all *%w{reload search stop scrobbling shuffle setup_scrobbling recent love profile}
32
35
  end
33
36
  end
34
37
  end
@@ -34,6 +34,14 @@ module Hearken
34
34
  end
35
35
  end
36
36
 
37
+ def love
38
+ @scrobbler.love current
39
+ end
40
+
41
+ def profile
42
+ @scrobbler.profile
43
+ end
44
+
37
45
  def current
38
46
  in_base_dir do
39
47
  (@pid and File.exist?('current_song')) ? YAML.load_file('current_song') : nil
@@ -65,6 +73,11 @@ module Hearken
65
73
 
66
74
  def start
67
75
  return if @pid
76
+ if @library.count == 0
77
+ puts 'Player can not be started with an empty library'
78
+ puts 'Please run "hearken_index" in another shell and then \'reload\''
79
+ return
80
+ end
68
81
  @pid = fork do
69
82
  player_pid = nil
70
83
  Signal.trap('TERM') do
@@ -1,9 +1,12 @@
1
1
  require 'splat'
2
- require 'simple_scrobbler'
2
+ require 'hearken/simple_scrobbler'
3
3
  require 'hearken/debug'
4
4
 
5
+ # Modified version of simple_scrobbler gem from https://github.com/threedaymonk/simple_scrobbler
5
6
  module Hearken
6
7
  class Scrobbler
8
+ API_KEY = '21f8c75ad38637220b20a03ad61219a4'
9
+ SECRET = 'ab77019c84eef8bc16bcfd5ba8db0c5d'
7
10
  include Debug
8
11
 
9
12
  def initialize preferences
@@ -14,14 +17,15 @@ module Hearken
14
17
  @scrobbler = nil
15
18
  if @preferences['lastfm'] and tf
16
19
  debug "Configuring scrobbler with #{@preferences['lastfm'].inspect}"
17
- @scrobbler = SimpleScrobbler.new *%w{api_key secret user session_key}.map{|k| @preferences['lastfm'][k]}
20
+ user, session = *%w{user session_key}.map{|k| @preferences['lastfm'][k]}
21
+ @scrobbler = SimpleScrobbler.new API_KEY, SECRET, user, session
18
22
  end
19
23
  end
20
24
 
21
25
  def finished track
22
26
  return unless @scrobbler
23
27
  debug "Scrobbling to last fm: #{track}"
24
- send_to_scrobbler :submit, track
28
+ send_to_scrobbler :scrobble, track
25
29
  end
26
30
 
27
31
  def started track
@@ -30,36 +34,29 @@ module Hearken
30
34
  send_to_scrobbler :now_playing, track
31
35
  end
32
36
 
37
+ def love track
38
+ return unless @scrobbler and track
39
+ debug "Sending love to last fm: #{track}"
40
+ send_to_scrobbler :love, track
41
+ end
42
+
43
+ def profile
44
+ return unless @scrobbler
45
+ @scrobbler.with_profile_url {|url| url.to_launcher }
46
+ end
47
+
33
48
  def ask question
34
49
  print question
35
50
  $stdin.gets.chomp
36
51
  end
37
52
 
38
53
  def setup
39
- puts <<-EOF
40
- Because of the way lastfm authentication works, setting up lastfm involves two steps:
41
- Firstly, you need to register that you are developing an application. This will give you an api key and an associated 'secret'
42
- Secondly, you need to gives your application access your lastfm account. This will give a authenticated session.
43
-
44
- Step 1. Logging in to your lastfm account and register an application
45
- This will launch a browser. You need to log in and fill out the API registration form
46
- EOF
47
- answer = ask 'Are you ready ? '
48
- return unless answer.downcase.start_with? 'y'
49
- "http://www.last.fm/api/account".to_launcher
50
54
  preferences = {}
51
- preferences['api_key'] = ask 'What is your API key ? '
52
- preferences['secret'] = ask 'What is your secret ? '
53
- puts <<-EOF
54
- Now you've got you application details, you need to create an authentication session between your application and your lastfm account
55
- Step 2. Authorising your application to access your lastfm account
56
- This will launch another browser. You just need to give your application permission to access your account
57
- EOF
58
55
  preferences['user'] = ask 'What is your lastfm user name ? '
59
- @scrobbler = SimpleScrobbler.new preferences['api_key'], preferences['secret'], preferences['user']
56
+ @scrobbler = SimpleScrobbler.new API_KEY, SECRET, preferences['user']
60
57
  preferences['session_key'] = @scrobbler.fetch_session_key do |url|
61
58
  url.to_launcher
62
- ask 'Hit enter when you\'ve allowed your application access to your account'
59
+ ask 'Please hit enter when you\'ve allowed this application access to your account'
63
60
  end
64
61
  @preferences['lastfm'] = preferences
65
62
  end
@@ -69,9 +66,10 @@ private
69
66
  debug %w{artist title time album track}.map {|k| "#{k}=#{track.send(k)}"}.join(',')
70
67
  @scrobbler.send message, track.artist,
71
68
  track.title,
72
- :length => track.time,
69
+ :duration => track.time,
73
70
  :album => track.album,
74
- :track_number => track.track
71
+ :trackNumber => track.track.to_i,
72
+ :timestamp => Time.now.to_i
75
73
  rescue Exception => e
76
74
  puts "Failed to scrobble: #{e}"
77
75
  end
@@ -0,0 +1,94 @@
1
+ require "net/http"
2
+ require "digest/md5"
3
+ require "uri"
4
+ require "cgi"
5
+ require 'nokogiri'
6
+ require 'hearken/debug'
7
+
8
+ module Hearken; end
9
+
10
+ class Hearken::SimpleScrobbler
11
+ include Hearken::Debug
12
+
13
+ SCROBBLER_URL = 'http://ws.audioscrobbler.com/2.0/'
14
+
15
+ SubmissionError = Class.new(RuntimeError)
16
+ SessionError = Class.new(RuntimeError)
17
+
18
+ def initialize api_key, secret, user, session_key=nil
19
+ @api_key = api_key
20
+ @secret = secret
21
+ @user = user
22
+ @session_key = session_key
23
+ end
24
+
25
+ attr_reader :user, :api_key, :secret, :session_key
26
+
27
+ def session_key
28
+ @session_key or raise SessionError, "The session key must be set or fetched"
29
+ end
30
+
31
+ def fetch_session_key
32
+ doc = lfm :get, 'auth.gettoken'
33
+ request_token = doc.at('token').inner_text
34
+ yield "http://www.last.fm/api/auth/?api_key=#{api_key}&token=#{request_token}"
35
+ doc = lfm :get, 'auth.getsession', :token => request_token
36
+ @session_key = doc.at('key').inner_text
37
+ @user = doc.at('name').inner_text
38
+ @session_key
39
+ end
40
+
41
+ def with_profile_url
42
+ yield "http://www.last.fm/user/#{user}" if user
43
+ end
44
+
45
+ # http://www.last.fm/api/show?service=443
46
+ def scrobble artist, title, params={}
47
+ lfm_track 'track.scrobble', artist, title, params
48
+ end
49
+
50
+ # See http://www.last.fm/api/show?service=454 for more details
51
+ def now_playing artist, title, params={}
52
+ lfm_track 'track.updateNowPlaying', artist, title, params
53
+ end
54
+
55
+ # http://www.last.fm/api/show?service=260
56
+ def love artist, title, params={}
57
+ lfm_track 'track.love', artist, title, params
58
+ end
59
+ private
60
+ def lfm_track method, artist, title, params
61
+ doc = lfm :post, method, params.merge(:sk => session_key, :artist => artist, :track => title)
62
+ status = doc.at('lfm')['status']
63
+ raise SubmissionError, status unless status == 'ok'
64
+ end
65
+
66
+ def lfm get_or_post, method, parameters={}
67
+ p = signed_parameters parameters.merge :api_key => api_key, :method => method
68
+ debug p.inspect
69
+ xml = self.send get_or_post, SCROBBLER_URL, p
70
+ debug xml
71
+ Nokogiri::XML xml
72
+ end
73
+
74
+ def get url, parameters
75
+ query_string = sort_parameters(parameters).
76
+ map{ |k, v| "#{k}=#{CGI.escape(v)}" }.
77
+ join("&")
78
+ Net::HTTP.get_response(URI.parse(url + "?" + query_string)).body
79
+ end
80
+
81
+ def post url, parameters
82
+ Net::HTTP.post_form(URI.parse(url), parameters).body
83
+ end
84
+
85
+ def signed_parameters parameters
86
+ sorted = sort_parameters parameters
87
+ signature = Digest::MD5.hexdigest(sorted.flatten.join + secret)
88
+ parameters.merge :api_sig => signature
89
+ end
90
+
91
+ def sort_parameters parameters
92
+ parameters.map{ |k, v| [k.to_s, v.to_s] }.sort
93
+ end
94
+ end
metadata CHANGED
@@ -1,122 +1,100 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: hearken
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
4
5
  prerelease:
5
- version: 0.0.6
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Mark Ryall
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2011-08-07 00:00:00 +10:00
14
- default_executable:
15
- dependencies:
16
- - !ruby/object:Gem::Dependency
17
- name: thor
18
- prerelease: false
19
- requirement: &id001 !ruby/object:Gem::Requirement
20
- none: false
21
- requirements:
22
- - - ~>
23
- - !ruby/object:Gem::Version
24
- version: "0"
25
- type: :runtime
26
- version_requirements: *id001
27
- - !ruby/object:Gem::Dependency
12
+ date: 2011-09-10 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
28
15
  name: splat
29
- prerelease: false
30
- requirement: &id002 !ruby/object:Gem::Requirement
16
+ requirement: &70202662970320 !ruby/object:Gem::Requirement
31
17
  none: false
32
- requirements:
18
+ requirements:
33
19
  - - ~>
34
- - !ruby/object:Gem::Version
35
- version: "0"
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
36
22
  type: :runtime
37
- version_requirements: *id002
38
- - !ruby/object:Gem::Dependency
39
- name: shell_shock
40
23
  prerelease: false
41
- requirement: &id003 !ruby/object:Gem::Requirement
24
+ version_requirements: *70202662970320
25
+ - !ruby/object:Gem::Dependency
26
+ name: shell_shock
27
+ requirement: &70202662969820 !ruby/object:Gem::Requirement
42
28
  none: false
43
- requirements:
29
+ requirements:
44
30
  - - ~>
45
- - !ruby/object:Gem::Version
46
- version: "0"
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
47
33
  type: :runtime
48
- version_requirements: *id003
49
- - !ruby/object:Gem::Dependency
50
- name: simple_scrobbler
51
34
  prerelease: false
52
- requirement: &id004 !ruby/object:Gem::Requirement
53
- none: false
54
- requirements:
55
- - - ~>
56
- - !ruby/object:Gem::Version
57
- version: "0"
58
- type: :runtime
59
- version_requirements: *id004
60
- - !ruby/object:Gem::Dependency
35
+ version_requirements: *70202662969820
36
+ - !ruby/object:Gem::Dependency
61
37
  name: rainbow
62
- prerelease: false
63
- requirement: &id005 !ruby/object:Gem::Requirement
38
+ requirement: &70202662969360 !ruby/object:Gem::Requirement
64
39
  none: false
65
- requirements:
40
+ requirements:
66
41
  - - ~>
67
- - !ruby/object:Gem::Version
68
- version: "1"
42
+ - !ruby/object:Gem::Version
43
+ version: '1'
69
44
  type: :runtime
70
- version_requirements: *id005
71
- - !ruby/object:Gem::Dependency
72
- name: ruby-growl
73
45
  prerelease: false
74
- requirement: &id006 !ruby/object:Gem::Requirement
46
+ version_requirements: *70202662969360
47
+ - !ruby/object:Gem::Dependency
48
+ name: nokogiri
49
+ requirement: &70202662968900 !ruby/object:Gem::Requirement
75
50
  none: false
76
- requirements:
51
+ requirements:
77
52
  - - ~>
78
- - !ruby/object:Gem::Version
79
- version: "3.0"
53
+ - !ruby/object:Gem::Version
54
+ version: '1'
80
55
  type: :runtime
81
- version_requirements: *id006
82
- - !ruby/object:Gem::Dependency
83
- name: rake
84
56
  prerelease: false
85
- requirement: &id007 !ruby/object:Gem::Requirement
57
+ version_requirements: *70202662968900
58
+ - !ruby/object:Gem::Dependency
59
+ name: rake
60
+ requirement: &70202662968440 !ruby/object:Gem::Requirement
86
61
  none: false
87
- requirements:
62
+ requirements:
88
63
  - - ~>
89
- - !ruby/object:Gem::Version
90
- version: "0"
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
91
66
  type: :development
92
- version_requirements: *id007
93
- - !ruby/object:Gem::Dependency
94
- name: rspec
95
67
  prerelease: false
96
- requirement: &id008 !ruby/object:Gem::Requirement
68
+ version_requirements: *70202662968440
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: &70202662967980 !ruby/object:Gem::Requirement
97
72
  none: false
98
- requirements:
73
+ requirements:
99
74
  - - ~>
100
- - !ruby/object:Gem::Version
101
- version: "2"
75
+ - !ruby/object:Gem::Version
76
+ version: '2'
102
77
  type: :development
103
- version_requirements: *id008
104
- description: |
105
- A command line tool to enqueue and play music tracks.
106
-
78
+ prerelease: false
79
+ version_requirements: *70202662967980
80
+ description: ! 'A command line tool to enqueue and play music tracks.
81
+
82
+
107
83
  This also extracts the tags from a collection of folders.
108
-
109
- This replaces and combines the functionality from a couple of other gems (audio_library and songbirdsh).
110
84
 
111
- email:
85
+
86
+ This replaces and combines the functionality from a couple of other gems (audio_library
87
+ and songbirdsh).
88
+
89
+ '
90
+ email:
112
91
  - mark@ryall.name
113
- executables:
92
+ executables:
114
93
  - hearken
94
+ - hearken_index
115
95
  extensions: []
116
-
117
96
  extra_rdoc_files: []
118
-
119
- files:
97
+ files:
120
98
  - .gitignore
121
99
  - .rvmrc
122
100
  - Gemfile
@@ -125,16 +103,18 @@ files:
125
103
  - README.rdoc
126
104
  - Rakefile
127
105
  - bin/hearken
106
+ - bin/hearken_index
128
107
  - hearken.gemspec
129
108
  - lib/hearken.rb
130
- - lib/hearken/cli.rb
131
109
  - lib/hearken/colour.rb
132
110
  - lib/hearken/command.rb
133
111
  - lib/hearken/command/enqueue.rb
134
- - lib/hearken/command/flush.rb
135
112
  - lib/hearken/command/list.rb
113
+ - lib/hearken/command/love.rb
114
+ - lib/hearken/command/profile.rb
136
115
  - lib/hearken/command/recent.rb
137
116
  - lib/hearken/command/reload.rb
117
+ - lib/hearken/command/remove.rb
138
118
  - lib/hearken/command/restart.rb
139
119
  - lib/hearken/command/scrobbling.rb
140
120
  - lib/hearken/command/search.rb
@@ -163,6 +143,7 @@ files:
163
143
  - lib/hearken/queue.rb
164
144
  - lib/hearken/range_expander.rb
165
145
  - lib/hearken/scrobbler.rb
146
+ - lib/hearken/simple_scrobbler.rb
166
147
  - lib/hearken/tagged.rb
167
148
  - lib/hearken/track.rb
168
149
  - media/applause.mp3
@@ -174,35 +155,31 @@ files:
174
155
  - spec/hearken/player_spec.rb
175
156
  - spec/hearken/range_expander_spec.rb
176
157
  - spec/spec_helper.rb
177
- has_rdoc: true
178
158
  homepage: http://github.com/markryall/hearken
179
159
  licenses: []
180
-
181
160
  post_install_message:
182
161
  rdoc_options: []
183
-
184
- require_paths:
162
+ require_paths:
185
163
  - lib
186
- required_ruby_version: !ruby/object:Gem::Requirement
164
+ required_ruby_version: !ruby/object:Gem::Requirement
187
165
  none: false
188
- requirements:
189
- - - ">="
190
- - !ruby/object:Gem::Version
191
- version: "0"
192
- required_rubygems_version: !ruby/object:Gem::Requirement
166
+ requirements:
167
+ - - ! '>='
168
+ - !ruby/object:Gem::Version
169
+ version: '0'
170
+ required_rubygems_version: !ruby/object:Gem::Requirement
193
171
  none: false
194
- requirements:
195
- - - ">="
196
- - !ruby/object:Gem::Version
197
- version: "0"
172
+ requirements:
173
+ - - ! '>='
174
+ - !ruby/object:Gem::Version
175
+ version: '0'
198
176
  requirements: []
199
-
200
177
  rubyforge_project: hearken
201
- rubygems_version: 1.6.2
178
+ rubygems_version: 1.8.6
202
179
  signing_key:
203
180
  specification_version: 3
204
181
  summary: command line music player
205
- test_files:
182
+ test_files:
206
183
  - spec/hearken/command/enqueue_spec.rb
207
184
  - spec/hearken/command/list_spec.rb
208
185
  - spec/hearken/command/reload_spec.rb
@@ -1,22 +0,0 @@
1
- require 'thor'
2
-
3
- require 'hearken'
4
- require 'hearken/indexing'
5
- require 'hearken/console'
6
-
7
- class Hearken::Cli < Thor
8
- desc 'version', 'Prints the current version'
9
- def version
10
- puts "Current version is "+Hearken::VERSION
11
- end
12
-
13
- desc 'index DIRECTORY', 'Reindexes a music collection'
14
- def index directory
15
- Hearken::Indexing::Indexer.new(directory).execute
16
- end
17
-
18
- desc 'console', 'Enters console for queuing and playing tracks'
19
- def console
20
- Hearken::Console.new.push
21
- end
22
- end
@@ -1,7 +0,0 @@
1
- require 'hearken/command'
2
-
3
- class Hearken::Command::Flush
4
- include Hearken::Command
5
- help 'flushes the current queue'
6
- execute {|ignored| loop { break unless @player.dequeue } }
7
- end