ruby-audioinfo 0.1.5 → 0.1.7

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,8 @@
1
+ === 0.1.7 / 2010-06-18
2
+
3
+ * included differents patches from Marcello Barnaba (see vtj-ruby-audioinfo fork)
4
+ * support for ape tag writing (for .mpc and .ape files) through apetag gem
5
+
1
6
  === 0.1.5 / 2009-03-29
2
7
 
3
8
  * flac parsing more robust
data/Rakefile CHANGED
@@ -1,25 +1,48 @@
1
1
  require 'rubygems'
2
- require 'hoe'
3
- require 'lib/audioinfo.rb'
4
- #require "pp"
5
-
6
- hoe = Hoe.new('ruby-audioinfo', AudioInfo::VERSION) do |p|
7
- p.rubyforge_name = 'ruby-audioinfo'
8
- p.author = 'Guillaume Pierronnet'
9
- p.email = 'moumar@rubyforge.org'
10
- p.extra_deps << [ "ruby-mp3info", ">= 0.6.3"]
11
- p.extra_deps << [ "ruby-ogginfo", ">= 0.3.1" ]
12
- p.extra_deps << [ "MP4Info", ">= 0.3.2" ]
13
- p.extra_deps << [ "wmainfo-rb", ">= 0.5" ]
14
- p.extra_deps << "flacinfo-rb"
15
- p.description = p.paragraphs_of('README.txt', 3).first
16
- p.summary = "ruby-audioinfo glue together various audio ruby libraries and presents a single API to the developper. Currently, supported formats are: mp3, ogg, mpc, ape, wma, flac, aac, mp4, m4a."
17
- p.url = "http://ruby-audioinfo.rubyforge.org"
18
- p.changes = p.paragraphs_of('History.txt', 0..1).join("\n\n")
19
- p.remote_rdoc_dir = ''
2
+ require "rake/rdoctask"
3
+
4
+ require File.join(File.expand_path(File.dirname(__FILE__)), 'lib', 'audioinfo')
5
+
6
+ begin
7
+ require 'jeweler'
8
+
9
+ #Jeweler::GemcutterTasks.new
10
+
11
+ Jeweler::Tasks.new do |gemspec|
12
+ gemspec.name = 'ruby-audioinfo'
13
+ gemspec.version = AudioInfo::VERSION
14
+ gemspec.authors = ['Guillaume Pierronnet', 'Marcello Barnaba']
15
+ gemspec.email = 'moumar@rubyforge.org'
16
+ gemspec.date = '2010-03-20'
17
+
18
+ gemspec.homepage = 'http://ruby-audioinfo.rubyforge.org'
19
+ gemspec.summary = 'Unified audio info access library'
20
+ gemspec.description = 'ruby-audioinfo glues together various audio libraries and presents a single API to the developer.'
21
+ 'Currently, supported formats are: mp3, ogg, mpc, ape, wma, flac, aac, mp4, m4a.'
22
+
23
+ gemspec.files = %w( README.txt Rakefile History.txt) + Dir['{lib,test}/**/*']
24
+ gemspec.extra_rdoc_files = %w( README.txt )
25
+ gemspec.has_rdoc = true
26
+ gemspec.require_path = 'lib'
27
+
28
+ gemspec.add_dependency 'ruby-mp3info', '>= 0.6.3'
29
+ gemspec.add_dependency 'ruby-ogginfo', '>= 0.3.1'
30
+ gemspec.add_dependency 'mp4info', '>= 1.7.3'
31
+ gemspec.add_dependency 'wmainfo-rb', '>= 0.5'
32
+ gemspec.add_dependency 'flacinfo-rb', '>= 0.4'
33
+ gemspec.add_dependency 'apetag', '= 1.1.2'
34
+ end
35
+ Jeweler::GemcutterTasks.new
36
+
37
+ Jeweler::RubyforgeTasks.new
38
+
39
+ rescue LoadError
40
+ puts 'Jeweler not available. Install it with: gem install jeweler'
20
41
  end
21
42
 
22
- task :tag_svn do
23
- svn_repo = "svn+ssh://rubyforge.org/var/svn/ruby-audioinfo"
24
- sh "svn copy -m 'tagged version #{hoe.version}' #{svn_repo}/trunk #{svn_repo}/tags/REL-#{hoe.version}"
43
+ Rake::RDocTask.new do |rd|
44
+ rd.main = "README.txt"
45
+ rd.rdoc_dir = "rdoc"
46
+ rd.rdoc_files.include("README.txt", "History.txt", "lib/**/*.rb")
47
+ rd.title = "ruby-audioinfo #{AudioInfo::VERSION}"
25
48
  end
data/lib/audioinfo.rb CHANGED
@@ -1,18 +1,16 @@
1
- #!/usr/bin/env ruby
2
-
3
1
  require "iconv"
4
2
  require "stringio"
5
3
 
6
- $: << File.dirname(__FILE__)+"/audioinfo"
7
-
8
4
  require "mp3info"
9
5
  require "ogginfo"
10
- require "mpcinfo"
11
- require "apetag"
12
6
  require "wmainfo"
13
7
  require "mp4info"
14
8
  require "flacinfo"
15
- require "shell_escape"
9
+ require "apetag"
10
+
11
+ $: << File.expand_path(File.dirname(__FILE__))
12
+
13
+ require "audioinfo/mpcinfo"
16
14
 
17
15
  class AudioInfoError < Exception ; end
18
16
 
@@ -30,7 +28,7 @@ class AudioInfo
30
28
 
31
29
  SUPPORTED_EXTENSIONS = %w{mp3 ogg mpc wma mp4 aac m4a flac}
32
30
 
33
- VERSION = "0.1.5"
31
+ VERSION = "0.1.7"
34
32
 
35
33
  attr_reader :path, :extension, :musicbrainz_infos, :tracknum, :bitrate, :vbr
36
34
  attr_reader :artist, :album, :title, :length, :date
@@ -138,7 +136,7 @@ class AudioInfo
138
136
  @length = @info.SECS
139
137
  mapping = MUSICBRAINZ_FIELDS.invert
140
138
 
141
- `faad -i #{filename.shell_escape} 2>&1 `.grep(/^MusicBrainz (.+)$/) do
139
+ faad_info(filename).match(/^MusicBrainz (.+)$/) do
142
140
  name, value = $1.split(/: /, 2)
143
141
  key = mapping[name]
144
142
  @musicbrainz_infos[key] = value
@@ -251,6 +249,14 @@ class AudioInfo
251
249
  end
252
250
  end
253
251
 
252
+ when ApeTag
253
+ ape = ApeTag.new(@path)
254
+ ape.update do |fields|
255
+ fields["Artist"] = @artist
256
+ fields["Album"] = @album
257
+ fields["Title"] = @title
258
+ fields["Track"] = @tracknum.to_s
259
+ end
254
260
  else
255
261
  raise(AudioInfoError, "implement me")
256
262
  end
@@ -287,31 +293,32 @@ class AudioInfo
287
293
  s.gsub("\000", "")
288
294
  end
289
295
 
290
- def default_fill_musicbrainz_fields
296
+ def default_fill_musicbrainz_fields(tags = @info.tag)
291
297
  MUSICBRAINZ_FIELDS.keys.each do |field|
292
- val = @info.tag["musicbrainz_#{field}"]
298
+ val = tags["musicbrainz_#{field}"]
293
299
  @musicbrainz_infos[field] = val if val
294
300
  end
295
301
  end
296
302
 
297
- def default_tag_fill(tag = @info.tag)
303
+ def default_tag_fill(tags = @info.tag)
298
304
  %w{artist album title}.each do |v|
299
- instance_variable_set( "@#{v}".to_sym, sanitize(tag[v].to_s) )
305
+ instance_variable_set( "@#{v}".to_sym, sanitize(tags[v].to_s) )
300
306
  end
301
307
  end
302
308
 
303
309
  def fill_ape_tag(filename)
304
310
  begin
305
311
  @info = ApeTag.new(filename)
306
- tags = convert_tags_encoding(@info.tag, "UTF-8")
312
+ #tags = convert_tags_encoding(@info.fields, "UTF-8")
313
+ tags = @info.fields.inject({}) do |hash, (k, v)|
314
+ hash[k.downcase] = v ? v.first : nil
315
+ hash
316
+ end
317
+ default_fill_musicbrainz_fields(tags)
307
318
  default_tag_fill(tags)
308
- default_fill_musicbrainz_fields
309
- @date = @info.tag["year"]
310
- @tracknum = 0
311
319
 
312
- if track = @info.tag['track']
313
- @tracknum = @info.tag['track'].split("/").first.to_i
314
- end
320
+ @date = tags["year"]
321
+ @tracknum = tags['track'].to_i
315
322
  rescue ApeTagError
316
323
  end
317
324
  end
@@ -328,4 +335,29 @@ class AudioInfo
328
335
  end
329
336
  tags
330
337
  end
338
+
339
+ def faad_info(file)
340
+ stdout, stdout_w = IO.pipe
341
+ stderr, stderr_w = IO.pipe
342
+
343
+ fork do
344
+ stdout.close
345
+ stderr.close
346
+ STDOUT.reopen(stdout_w)
347
+ STDERR.reopen(stderr_w)
348
+ exec 'faad', '-i', file
349
+ end
350
+
351
+ stdout_w.close
352
+ stderr_w.close
353
+ pid, status = Process.wait2
354
+
355
+ out = stdout.read.chomp
356
+ stdout.close
357
+ err = stderr.read.chomp
358
+ stderr.close
359
+
360
+ # Return the stderr because faad prints info on that fd...
361
+ status.exitstatus.zero? ? err : ''
362
+ end
331
363
  end
@@ -28,6 +28,8 @@ class MpcInfo
28
28
 
29
29
  FREQUENCIES = [ 44100, 48000, 37800, 32000 ]
30
30
 
31
+ SV4_6_HEADER = Regexp.new('^[\x00\x01\x10\x11\x40\x41\x50\x51\x80\x81\x90\x91\xC0\xC1\xD0\xD1][\x20-37][\x00\x20\x40\x60\x80\xA0\xC0\xE0]/', nil, 'n')
32
+
31
33
  attr_reader :infos
32
34
  attr_reader :id3v2_tag
33
35
 
@@ -144,7 +146,7 @@ class MpcInfo
144
146
  #$ThisFileInfo['audio']['encoder'] = @infos['encoder_version'];
145
147
  #$ThisFileInfo['audio']['encoder_options'] = @infos['profile'];
146
148
  =end
147
- elsif mpc_header =~ /^[\x00\x01\x10\x11\x40\x41\x50\x51\x80\x81\x90\x91\xC0\xC1\xD0\xD1][\x20-37][\x00\x20\x40\x60\x80\xA0\xC0\xE0]/s
149
+ elsif mpc_header =~ SV4_6_HEADER
148
150
  # this is SV4 - SV6, handle seperately
149
151
  header_size = 8
150
152
  elsif mpc_header == "ID3"
metadata CHANGED
@@ -1,124 +1,168 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-audioinfo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ hash: 21
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 7
10
+ version: 0.1.7
5
11
  platform: ruby
6
12
  authors:
7
13
  - Guillaume Pierronnet
14
+ - Marcello Barnaba
8
15
  autorequire:
9
16
  bindir: bin
10
17
  cert_chain: []
11
18
 
12
- date: 2009-03-28 23:00:00 +01:00
19
+ date: 2010-06-18 00:00:00 +02:00
13
20
  default_executable:
14
21
  dependencies:
15
22
  - !ruby/object:Gem::Dependency
16
23
  name: ruby-mp3info
17
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
24
+ prerelease: false
25
+ requirement: &id001 !ruby/object:Gem::Requirement
26
+ none: false
20
27
  requirements:
21
28
  - - ">="
22
29
  - !ruby/object:Gem::Version
30
+ hash: 1
31
+ segments:
32
+ - 0
33
+ - 6
34
+ - 3
23
35
  version: 0.6.3
24
- version:
36
+ type: :runtime
37
+ version_requirements: *id001
25
38
  - !ruby/object:Gem::Dependency
26
39
  name: ruby-ogginfo
27
- type: :runtime
28
- version_requirement:
29
- version_requirements: !ruby/object:Gem::Requirement
40
+ prerelease: false
41
+ requirement: &id002 !ruby/object:Gem::Requirement
42
+ none: false
30
43
  requirements:
31
44
  - - ">="
32
45
  - !ruby/object:Gem::Version
46
+ hash: 17
47
+ segments:
48
+ - 0
49
+ - 3
50
+ - 1
33
51
  version: 0.3.1
34
- version:
35
- - !ruby/object:Gem::Dependency
36
- name: MP4Info
37
52
  type: :runtime
38
- version_requirement:
39
- version_requirements: !ruby/object:Gem::Requirement
53
+ version_requirements: *id002
54
+ - !ruby/object:Gem::Dependency
55
+ name: mp4info
56
+ prerelease: false
57
+ requirement: &id003 !ruby/object:Gem::Requirement
58
+ none: false
40
59
  requirements:
41
60
  - - ">="
42
61
  - !ruby/object:Gem::Version
43
- version: 0.3.2
44
- version:
62
+ hash: 13
63
+ segments:
64
+ - 1
65
+ - 7
66
+ - 3
67
+ version: 1.7.3
68
+ type: :runtime
69
+ version_requirements: *id003
45
70
  - !ruby/object:Gem::Dependency
46
71
  name: wmainfo-rb
47
- type: :runtime
48
- version_requirement:
49
- version_requirements: !ruby/object:Gem::Requirement
72
+ prerelease: false
73
+ requirement: &id004 !ruby/object:Gem::Requirement
74
+ none: false
50
75
  requirements:
51
76
  - - ">="
52
77
  - !ruby/object:Gem::Version
78
+ hash: 1
79
+ segments:
80
+ - 0
81
+ - 5
53
82
  version: "0.5"
54
- version:
83
+ type: :runtime
84
+ version_requirements: *id004
55
85
  - !ruby/object:Gem::Dependency
56
86
  name: flacinfo-rb
57
- type: :runtime
58
- version_requirement:
59
- version_requirements: !ruby/object:Gem::Requirement
87
+ prerelease: false
88
+ requirement: &id005 !ruby/object:Gem::Requirement
89
+ none: false
60
90
  requirements:
61
91
  - - ">="
62
92
  - !ruby/object:Gem::Version
63
- version: "0"
64
- version:
93
+ hash: 3
94
+ segments:
95
+ - 0
96
+ - 4
97
+ version: "0.4"
98
+ type: :runtime
99
+ version_requirements: *id005
65
100
  - !ruby/object:Gem::Dependency
66
- name: hoe
67
- type: :development
68
- version_requirement:
69
- version_requirements: !ruby/object:Gem::Requirement
101
+ name: apetag
102
+ prerelease: false
103
+ requirement: &id006 !ruby/object:Gem::Requirement
104
+ none: false
70
105
  requirements:
71
- - - ">="
106
+ - - "="
72
107
  - !ruby/object:Gem::Version
73
- version: 1.9.0
74
- version:
75
- description: "ruby-audioinfo glue together various audio ruby libraries and presents a unified API to the developper. Currently, supported formats are: mp3, ogg, mpc, ape, wma, flac, aac, mp4, m4a."
108
+ hash: 23
109
+ segments:
110
+ - 1
111
+ - 1
112
+ - 2
113
+ version: 1.1.2
114
+ type: :runtime
115
+ version_requirements: *id006
116
+ description: ruby-audioinfo glues together various audio libraries and presents a single API to the developer.
76
117
  email: moumar@rubyforge.org
77
118
  executables: []
78
119
 
79
120
  extensions: []
80
121
 
81
122
  extra_rdoc_files:
82
- - History.txt
83
- - Manifest.txt
84
123
  - README.txt
85
124
  files:
86
125
  - History.txt
87
- - Manifest.txt
88
126
  - README.txt
89
127
  - Rakefile
90
128
  - lib/audioinfo.rb
91
129
  - lib/audioinfo/album.rb
92
130
  - lib/audioinfo/apetag.rb
93
131
  - lib/audioinfo/mpcinfo.rb
94
- - lib/shell_escape.rb
95
132
  - test/mpcinfo.rb
96
133
  has_rdoc: true
97
134
  homepage: http://ruby-audioinfo.rubyforge.org
135
+ licenses: []
136
+
98
137
  post_install_message:
99
138
  rdoc_options:
100
- - --main
101
- - README.txt
139
+ - --charset=UTF-8
102
140
  require_paths:
103
141
  - lib
104
142
  required_ruby_version: !ruby/object:Gem::Requirement
143
+ none: false
105
144
  requirements:
106
145
  - - ">="
107
146
  - !ruby/object:Gem::Version
147
+ hash: 3
148
+ segments:
149
+ - 0
108
150
  version: "0"
109
- version:
110
151
  required_rubygems_version: !ruby/object:Gem::Requirement
152
+ none: false
111
153
  requirements:
112
154
  - - ">="
113
155
  - !ruby/object:Gem::Version
156
+ hash: 3
157
+ segments:
158
+ - 0
114
159
  version: "0"
115
- version:
116
160
  requirements: []
117
161
 
118
- rubyforge_project: ruby-audioinfo
119
- rubygems_version: 1.3.1
162
+ rubyforge_project:
163
+ rubygems_version: 1.3.7
120
164
  signing_key:
121
- specification_version: 2
122
- summary: "ruby-audioinfo glue together various audio ruby libraries and presents a single API to the developper. Currently, supported formats are: mp3, ogg, mpc, ape, wma, flac, aac, mp4, m4a."
165
+ specification_version: 3
166
+ summary: Unified audio info access library
123
167
  test_files: []
124
168
 
data/Manifest.txt DELETED
@@ -1,10 +0,0 @@
1
- History.txt
2
- Manifest.txt
3
- README.txt
4
- Rakefile
5
- lib/audioinfo.rb
6
- lib/audioinfo/album.rb
7
- lib/audioinfo/apetag.rb
8
- lib/audioinfo/mpcinfo.rb
9
- lib/shell_escape.rb
10
- test/mpcinfo.rb
data/lib/shell_escape.rb DELETED
@@ -1,6 +0,0 @@
1
- class String
2
- # escape special characters used in most unix shells to use it, for example, with system()
3
- def shell_escape
4
- "'" + gsub(/'/) { "'\\''" } + "'"
5
- end
6
- end