hearken 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,2 @@
1
+ name
2
+ named queues (a 'cd' command)
@@ -0,0 +1,2 @@
1
+ name
2
+ get working on linux
@@ -0,0 +1,2 @@
1
+ name
2
+ make indexer create backup first (and perhaps keep a couple of old versions around)
@@ -0,0 +1,2 @@
1
+ name
2
+ save queue as a playlist ('save' and 'load' commands)
@@ -0,0 +1,2 @@
1
+ name
2
+ sort order (to support old ipods or disorganised collections)
@@ -0,0 +1,2 @@
1
+ name
2
+ get working on windows
@@ -0,0 +1,2 @@
1
+ name
2
+ fix scrobble on/off bug
@@ -0,0 +1,2 @@
1
+ name
2
+ support multiple libraries (some possibly unavailable such as external discs)
@@ -1,3 +1,10 @@
1
+ = 0.1.1
2
+
3
+ * added use of sox to play more audio file formats (now m4a and mp3 with afplay and sox for everything else)
4
+ * fixed some issues with the parsing of ffmpeg output to get correct tag information
5
+ * added logging of played tracks to history file
6
+ * removed splat dependency (because it is just silly)
7
+
1
8
  = 0.1.0
2
9
 
3
10
  * removed several dependencies - simple_scrobbler and thor
@@ -4,7 +4,7 @@ This is a command line shell for queuing and playing music tracks.
4
4
 
5
5
  It also extracts id3 tags from audio files for faster search.
6
6
 
7
- This will eventually be platform independent but at this stage has only been used on mac os x
7
+ This may may be platform independent but at this stage has only been used on mac os x
8
8
 
9
9
  = Usage
10
10
 
@@ -20,6 +20,10 @@ Tags are currently extracted using ffmpeg. On mac os x, this can be installed e
20
20
 
21
21
  brew install ffmpeg
22
22
 
23
+ Tracks are played using sox (afplay is preinstalled on a mac but does not support as many audio formats) which can also be installed with brew:
24
+
25
+ brew install sox
26
+
23
27
  Growl notification (as new tracks are played) will work but only if 'growlnotify' is detected on the path.
24
28
 
25
29
  == Indexing tracks
@@ -94,9 +98,4 @@ Turns scrobbling on (has no effect if scrobbling has not been configured)
94
98
 
95
99
  scrobbling off
96
100
 
97
- Turns scrobbling off
98
-
99
- = Future plans for world domination
100
-
101
- * Get working on linux
102
- * Get working on windows
101
+ Turns scrobbling off
@@ -17,6 +17,19 @@ This also extracts the tags from a collection of folders.
17
17
  This replaces and combines the functionality from a couple of other gems (audio_library and songbirdsh).
18
18
  EOF
19
19
 
20
+ s.post_install_message = <<EOF
21
+ Hey - thanks for installing hearken.
22
+
23
+ Before doing anything else, you should index your music collection by running:
24
+
25
+ hearken_index path_to_your_music_collection
26
+
27
+ This could take a while if you have a large collection - you should hear some applause when it's done
28
+
29
+ After that just run hearken to start playing, queueing and rocking out.
30
+ EOF
31
+
32
+ s.license = 'MIT'
20
33
  s.rubyforge_project = "hearken"
21
34
 
22
35
  s.files = `git ls-files`.split("\n")
@@ -24,7 +37,8 @@ EOF
24
37
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
25
38
  s.require_paths = ["lib"]
26
39
 
27
- s.add_dependency 'splat', '~>0'
40
+ s.required_ruby_version = '>= 1.9.2'
41
+
28
42
  s.add_dependency 'shell_shock', '~>0'
29
43
  s.add_dependency 'rainbow', '~> 1'
30
44
  s.add_dependency 'nokogiri', '~> 1'
@@ -1,3 +1,3 @@
1
1
  module Hearken
2
- VERSION = '0.1.0'
2
+ VERSION = '0.1.1'
3
3
  end
@@ -19,6 +19,6 @@ EOF
19
19
  end
20
20
  end
21
21
  puts "Found #{matches.size} matches (ids have been placed on clipboard)"
22
- matches.join(' ').to_clipboard
22
+ IO.popen('pbcopy','w') { |clipboard| clipboard.print matches.join ' ' }
23
23
  end
24
24
  end
@@ -3,7 +3,7 @@ require 'hearken/indexing/file'
3
3
 
4
4
  class Hearken::Indexing::AudioTraverser
5
5
  attr_reader :current
6
- EXTS = %w{m4a mp3 ogg wma}.map {|e| '.'+e }
6
+ EXTS = %w{m4a mp3 ogg wma flac aac}.map {|e| '.'+e }
7
7
 
8
8
  def initialize path
9
9
  @path = Pathname.new path
@@ -18,25 +18,34 @@ class Hearken::Indexing::FfmpegFile
18
18
  if state == :metadata
19
19
  begin
20
20
  m = / *: */.match l
21
- @meta[m.pre_match.strip] = m.post_match.strip if m
21
+ add_meta m.pre_match.strip.downcase.to_sym, m.post_match.strip if m
22
22
  rescue ArgumentError => e
23
23
  end
24
24
  end
25
25
  end
26
26
  end
27
27
 
28
- @title = @meta['TIT2'] || @meta['title']
29
- @album = @meta['TALB'] || @meta ['album']
30
- @artist = @meta['TPE1'] || @meta['TPE2'] || @meta['artist']
31
- @albumartist = @meta['TSO2'] || @meta['album_artist']
32
- @time = to_duration @meta['Duration']
33
- @date = @meta['TDRC'] || @meta['TYER'] || @meta['date']
34
- @track = @meta['TRCK'] || @meta['track']
35
- @puid = @meta['MusicIP PUID']
36
- @mbartistid = @meta['MusicBrainz Artist Id']
37
- @mbalbumid = @meta['MusicBrainz Album Id']
38
- @mbalbumartistid = @meta['MusicBrainz Album Artist Id']
39
- @asin = @meta['ASIN']
28
+ @title = tag :title, :tit2
29
+ @album = tag :album, :talb
30
+ @artist = tag :artist, :tpe1, :tpe2
31
+ @albumartist = tag :album_artist, :tso2
32
+ @time = to_duration tag :duration
33
+ @date = tag :date, :tdrc, :tyer
34
+ @track = tag :track, :trck
35
+ @puid = tag :"musicip puid"
36
+ @mbartistid = tag :musicbrainz_artistid, :"musicbrainz artist id"
37
+ @mbalbumid = tag :musicbrainz_albumid,:"musicbrainz album id"
38
+ @mbalbumartistid = tag :musicbrainz_albumartistid, :"musicbrainz album artist id"
39
+ @asin = tag :asin
40
+ end
41
+
42
+ def add_meta key, value
43
+ @meta[key] ||= value
44
+ end
45
+
46
+ def tag *names
47
+ names.each { |name| return @meta[name] if @meta[name] }
48
+ nil
40
49
  end
41
50
 
42
51
  def method_missing method
@@ -1,4 +1,3 @@
1
- require 'splat'
2
1
  require 'hearken/paths'
3
2
  require 'hearken/indexing/persistant_traverser'
4
3
 
@@ -22,7 +21,7 @@ class Hearken::Indexing::Indexer
22
21
 
23
22
  show_progress start, count
24
23
 
25
- (File.dirname(__FILE__)+'/../../../media/applause.mp3').to_player
24
+ system "play -q #{File.dirname(__FILE__)}/../../../media/applause.mp3"
26
25
  end
27
26
  private
28
27
  def show_progress start, count
@@ -4,18 +4,18 @@ class String
4
4
  end
5
5
 
6
6
  def escape char
7
- gsub(char, "\\#{char}")
7
+ gsub(char) { "\\#{char}" }
8
8
  end
9
9
 
10
- def escape2 char
11
- split(char).join("\\#{char}")
10
+ def escape_all chars
11
+ chars.inject(self) {|s,t| s.escape t }
12
12
  end
13
13
 
14
14
  def escape_for_sh
15
- self.escape2("\`").escape(" ").escape2("&").escape2(";").escape("!").escape("(").escape(")").escape2("'")
15
+ self.escape_all " `';&!()$".scan(/./)
16
16
  end
17
17
 
18
18
  def escape_for_sh_quoted
19
- self.escape2("\`")
19
+ self.escape '`'
20
20
  end
21
21
  end
@@ -1,4 +1,3 @@
1
- require 'splat'
2
1
  require 'fileutils'
3
2
 
4
3
  require 'hearken/queue'
@@ -52,6 +51,7 @@ module Hearken
52
51
  track.started = Time.now.to_i
53
52
  in_base_dir do
54
53
  File.open('current_song', 'w') {|f| f.print track.to_yaml }
54
+ File.open('history', 'a') {|f| f.puts "#{track.started},#{track.path}"}
55
55
  end
56
56
  end
57
57
 
@@ -67,7 +67,7 @@ module Hearken
67
67
  @scrobbler.enabled = tf
68
68
  end
69
69
 
70
- def random_track
70
+ def random_track
71
71
  @library.row (rand * @library.count).to_i
72
72
  end
73
73
 
@@ -93,16 +93,28 @@ module Hearken
93
93
  end
94
94
  notify_started track
95
95
  register track
96
- player_pid = track.path.escape2("\`").to_player
96
+ player_pid = spawn play_command track.path
97
97
  Process.wait player_pid
98
98
  notify_finished track
99
99
  end
100
100
  end
101
101
  end
102
102
 
103
+ def play_command path
104
+ if %w{m4a mp3}.include? path.split('.').last
105
+ "afplay \"#{path.escape("\`")}\""
106
+ else
107
+ "play -q \"#{path.escape("\`")}\""
108
+ end.tap do |command|
109
+ in_base_dir do
110
+ File.open('player', 'a') {|f| f.puts command }
111
+ end
112
+ end
113
+ end
114
+
103
115
  def stop
104
116
  return unless @pid
105
- Process.kill 'TERM', @pid
117
+ Process.kill 'TERM', @pid
106
118
  @pid = nil
107
119
  end
108
120
 
@@ -1,4 +1,3 @@
1
- require 'splat'
2
1
  require 'hearken/simple_scrobbler'
3
2
  require 'hearken/debug'
4
3
 
@@ -42,7 +41,7 @@ module Hearken
42
41
 
43
42
  def profile
44
43
  return unless @scrobbler
45
- @scrobbler.with_profile_url {|url| url.to_launcher }
44
+ @scrobbler.with_profile_url {|url| system "open #{url}" }
46
45
  end
47
46
 
48
47
  def ask question
@@ -55,7 +54,7 @@ module Hearken
55
54
  preferences['user'] = ask 'What is your lastfm user name ? '
56
55
  @scrobbler = SimpleScrobbler.new API_KEY, SECRET, preferences['user']
57
56
  preferences['session_key'] = @scrobbler.fetch_session_key do |url|
58
- url.to_launcher
57
+ system "open '#{url}'"
59
58
  ask 'Please hit enter when you\'ve allowed this application access to your account'
60
59
  end
61
60
  @preferences['lastfm'] = preferences
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hearken
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-09-10 00:00:00.000000000Z
12
+ date: 2012-12-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: splat
16
- requirement: &70202662970320 !ruby/object:Gem::Requirement
15
+ name: shell_shock
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,21 +21,15 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70202662970320
25
- - !ruby/object:Gem::Dependency
26
- name: shell_shock
27
- requirement: &70202662969820 !ruby/object:Gem::Requirement
24
+ version_requirements: !ruby/object:Gem::Requirement
28
25
  none: false
29
26
  requirements:
30
27
  - - ~>
31
28
  - !ruby/object:Gem::Version
32
29
  version: '0'
33
- type: :runtime
34
- prerelease: false
35
- version_requirements: *70202662969820
36
30
  - !ruby/object:Gem::Dependency
37
31
  name: rainbow
38
- requirement: &70202662969360 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
39
33
  none: false
40
34
  requirements:
41
35
  - - ~>
@@ -43,10 +37,15 @@ dependencies:
43
37
  version: '1'
44
38
  type: :runtime
45
39
  prerelease: false
46
- version_requirements: *70202662969360
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '1'
47
46
  - !ruby/object:Gem::Dependency
48
47
  name: nokogiri
49
- requirement: &70202662968900 !ruby/object:Gem::Requirement
48
+ requirement: !ruby/object:Gem::Requirement
50
49
  none: false
51
50
  requirements:
52
51
  - - ~>
@@ -54,10 +53,15 @@ dependencies:
54
53
  version: '1'
55
54
  type: :runtime
56
55
  prerelease: false
57
- version_requirements: *70202662968900
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '1'
58
62
  - !ruby/object:Gem::Dependency
59
63
  name: rake
60
- requirement: &70202662968440 !ruby/object:Gem::Requirement
64
+ requirement: !ruby/object:Gem::Requirement
61
65
  none: false
62
66
  requirements:
63
67
  - - ~>
@@ -65,10 +69,15 @@ dependencies:
65
69
  version: '0'
66
70
  type: :development
67
71
  prerelease: false
68
- version_requirements: *70202662968440
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
69
78
  - !ruby/object:Gem::Dependency
70
79
  name: rspec
71
- requirement: &70202662967980 !ruby/object:Gem::Requirement
80
+ requirement: !ruby/object:Gem::Requirement
72
81
  none: false
73
82
  requirements:
74
83
  - - ~>
@@ -76,7 +85,12 @@ dependencies:
76
85
  version: '2'
77
86
  type: :development
78
87
  prerelease: false
79
- version_requirements: *70202662967980
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: '2'
80
94
  description: ! 'A command line tool to enqueue and play music tracks.
81
95
 
82
96
 
@@ -95,8 +109,15 @@ executables:
95
109
  extensions: []
96
110
  extra_rdoc_files: []
97
111
  files:
112
+ - .cards/4d6da46f-8838-488f-997b-9ec873092d5d
113
+ - .cards/68695ed3-ef6c-4c65-939e-48695a4511c8
114
+ - .cards/6ed72945-35a4-4372-97d8-13b357d8c7c0
115
+ - .cards/91de072e-4427-48dc-89ad-0b03756eb689
116
+ - .cards/9242c879-a66f-4144-8f24-b05f7c5a49f3
117
+ - .cards/94f23de2-4e0c-417a-aa82-3147908e2481
118
+ - .cards/a5be50c4-2117-4ecf-bc64-e9977f4d52c1
119
+ - .cards/f742a9f4-36af-43e5-a7cb-480049a43821
98
120
  - .gitignore
99
- - .rvmrc
100
121
  - Gemfile
101
122
  - HISTORY.rdoc
102
123
  - MIT-LICENSE
@@ -156,8 +177,13 @@ files:
156
177
  - spec/hearken/range_expander_spec.rb
157
178
  - spec/spec_helper.rb
158
179
  homepage: http://github.com/markryall/hearken
159
- licenses: []
160
- post_install_message:
180
+ licenses:
181
+ - MIT
182
+ post_install_message: ! "Hey - thanks for installing hearken.\n\nBefore doing anything
183
+ else, you should index your music collection by running:\n\n hearken_index path_to_your_music_collection\n\nThis
184
+ could take a while if you have a large collection - you should hear some applause
185
+ when it's done\n\nAfter that just run hearken to start playing, queueing and rocking
186
+ out.\n"
161
187
  rdoc_options: []
162
188
  require_paths:
163
189
  - lib
@@ -166,16 +192,19 @@ required_ruby_version: !ruby/object:Gem::Requirement
166
192
  requirements:
167
193
  - - ! '>='
168
194
  - !ruby/object:Gem::Version
169
- version: '0'
195
+ version: 1.9.2
170
196
  required_rubygems_version: !ruby/object:Gem::Requirement
171
197
  none: false
172
198
  requirements:
173
199
  - - ! '>='
174
200
  - !ruby/object:Gem::Version
175
201
  version: '0'
202
+ segments:
203
+ - 0
204
+ hash: 2801778265441540950
176
205
  requirements: []
177
206
  rubyforge_project: hearken
178
- rubygems_version: 1.8.6
207
+ rubygems_version: 1.8.23
179
208
  signing_key:
180
209
  specification_version: 3
181
210
  summary: command line music player
data/.rvmrc DELETED
@@ -1 +0,0 @@
1
- rvm use 1.9.2@hearken --create