ruby-audioinfo 0.1.7 → 0.2
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/.gemtest +0 -0
- data/History.txt +5 -0
- data/Manifest.txt +8 -0
- data/{README.txt → README.rdoc} +3 -1
- data/Rakefile +33 -41
- data/lib/audioinfo/album.rb +11 -8
- data/lib/audioinfo/mpcinfo.rb +2 -2
- data/lib/audioinfo.rb +37 -35
- metadata +111 -124
- data/lib/audioinfo/apetag.rb +0 -53
data/.gemtest
ADDED
File without changes
|
data/History.txt
CHANGED
data/Manifest.txt
ADDED
data/{README.txt → README.rdoc}
RENAMED
data/Rakefile
CHANGED
@@ -1,48 +1,40 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
|
3
|
+
require 'hoe'
|
4
|
+
|
5
|
+
Hoe.plugin :yard
|
6
|
+
Hoe.plugin :gemspec
|
7
|
+
|
8
|
+
Hoe.spec('ruby-audioinfo') do
|
9
|
+
developer "Guillaume Pierronnet", "guillaume.pierronnet@gmail.com"
|
10
|
+
developer 'Marcello Barnaba', "unknown"
|
11
|
+
remote_rdoc_dir = ''
|
12
|
+
rdoc_locations << "rubyforge.org:/var/www/gforge-projects/ruby-audioinfo/"
|
13
|
+
|
14
|
+
self.extra_rdoc_files = FileList["*.rdoc"]
|
15
|
+
#history_file = "History.txt"
|
16
|
+
self.readme_file = "README.rdoc"
|
17
|
+
self.test_globs = ["test/test_*.rb"]
|
18
|
+
self.rsync_args = "-rv --delete"
|
19
|
+
|
20
|
+
extra_deps << ['ruby-mp3info', '>= 0.7.1']
|
21
|
+
extra_deps << ['ruby-ogginfo', '>= 0.6.8']
|
22
|
+
extra_deps << ['mp4info', '>= 1.7.3']
|
23
|
+
extra_deps << ['moumar-wmainfo-rb', '>= 0.7']
|
24
|
+
extra_deps << ['flacinfo-rb', '>= 0.4']
|
25
|
+
extra_deps << ['apetag', '>= 1.1.4']
|
26
|
+
#extra_dev_deps << ["rake", ">=0"]
|
27
|
+
end
|
28
|
+
|
29
|
+
=begin
|
30
|
+
# vim: syntax=Ruby
|
1
31
|
require 'rubygems'
|
2
32
|
require "rake/rdoctask"
|
3
33
|
|
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'
|
41
|
-
end
|
42
|
-
|
43
34
|
Rake::RDocTask.new do |rd|
|
44
|
-
rd.main = "README.
|
35
|
+
rd.main = "README.rdoc"
|
45
36
|
rd.rdoc_dir = "rdoc"
|
46
|
-
rd.rdoc_files.include("README.
|
37
|
+
rd.rdoc_files.include("README.rdoc", "History.txt", "lib/**/*.rb")
|
47
38
|
rd.title = "ruby-audioinfo #{AudioInfo::VERSION}"
|
48
39
|
end
|
40
|
+
=end
|
data/lib/audioinfo/album.rb
CHANGED
@@ -43,12 +43,15 @@ class AudioInfo::Album
|
|
43
43
|
@path = path
|
44
44
|
@multicd = false
|
45
45
|
@basename = @path
|
46
|
-
exts = AudioInfo::SUPPORTED_EXTENSIONS.
|
46
|
+
exts = AudioInfo::SUPPORTED_EXTENSIONS.collect do |ext|
|
47
|
+
ext.gsub(/[a-z]/) { |c| "[#{c.downcase}#{c.upcase}]" }
|
48
|
+
end.join(",")
|
47
49
|
|
48
50
|
# need to escape the glob path
|
49
51
|
glob_escaped_path = @path.gsub(/([{}?*\[\]])/) { |s| '\\' << s }
|
50
52
|
|
51
|
-
|
53
|
+
glob_val = File.join(glob_escaped_path, "*.{#{exts}}")
|
54
|
+
file_names = Dir.glob(glob_val).sort
|
52
55
|
|
53
56
|
if fast_lookup
|
54
57
|
file_names = [file_names.first, file_names.last]
|
@@ -104,12 +107,8 @@ class AudioInfo::Album
|
|
104
107
|
|
105
108
|
# title of the album
|
106
109
|
def title
|
107
|
-
|
108
|
-
|
109
|
-
# "#{albums.first} others candidates: '" + albums[1..-1].join("', '") + "'"
|
110
|
-
#else
|
111
|
-
albums.first
|
112
|
-
#end
|
110
|
+
hash_counted = self.files.collect { |f| f.album }.inject(Hash.new(0)) { |hash, album| hash[album] += 1; hash }
|
111
|
+
hash_counted.sort_by { |k, v| v }.last[0]
|
113
112
|
end
|
114
113
|
|
115
114
|
# mbid (MusicBrainz ID) of the album
|
@@ -146,6 +145,10 @@ class AudioInfo::Album
|
|
146
145
|
out.string
|
147
146
|
end
|
148
147
|
|
148
|
+
def inspect
|
149
|
+
@infos.inspect
|
150
|
+
end
|
151
|
+
|
149
152
|
end
|
150
153
|
|
151
154
|
|
data/lib/audioinfo/mpcinfo.rb
CHANGED
@@ -52,7 +52,7 @@ class MpcInfo
|
|
52
52
|
header = StringIO.new(@file.read(25))
|
53
53
|
header_size = 28
|
54
54
|
#stream_version_byte = header.read(4).unpack("V").first
|
55
|
-
stream_version_byte = header.read(1)[0] #.unpack("c").first
|
55
|
+
stream_version_byte = header.read(1)[0].ord #.unpack("c").first
|
56
56
|
|
57
57
|
@infos['stream_major_version'] = (stream_version_byte & 0x0F)
|
58
58
|
@infos['stream_minor_version'] = (stream_version_byte & 0xF0) >> 4
|
@@ -168,7 +168,7 @@ class MpcInfo
|
|
168
168
|
end
|
169
169
|
|
170
170
|
def read8(io)
|
171
|
-
io.read(1)[0]
|
171
|
+
io.read(1)[0].ord
|
172
172
|
end
|
173
173
|
|
174
174
|
def read16(io)
|
data/lib/audioinfo.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
# encoding: utf-8
|
2
2
|
require "stringio"
|
3
3
|
|
4
4
|
require "mp3info"
|
@@ -15,6 +15,13 @@ require "audioinfo/mpcinfo"
|
|
15
15
|
class AudioInfoError < Exception ; end
|
16
16
|
|
17
17
|
class AudioInfo
|
18
|
+
if RUBY_VERSION[0..2] == "1.8"
|
19
|
+
RUBY_1_8 = true
|
20
|
+
require "iconv"
|
21
|
+
else
|
22
|
+
RUBY_1_8 = false
|
23
|
+
end
|
24
|
+
|
18
25
|
MUSICBRAINZ_FIELDS = {
|
19
26
|
"trmid" => "TRM Id",
|
20
27
|
"artistid" => "Artist Id",
|
@@ -28,7 +35,7 @@ class AudioInfo
|
|
28
35
|
|
29
36
|
SUPPORTED_EXTENSIONS = %w{mp3 ogg mpc wma mp4 aac m4a flac}
|
30
37
|
|
31
|
-
VERSION = "0.
|
38
|
+
VERSION = "0.2"
|
32
39
|
|
33
40
|
attr_reader :path, :extension, :musicbrainz_infos, :tracknum, :bitrate, :vbr
|
34
41
|
attr_reader :artist, :album, :title, :length, :date
|
@@ -49,20 +56,29 @@ class AudioInfo
|
|
49
56
|
ret
|
50
57
|
end
|
51
58
|
|
52
|
-
#
|
53
|
-
def
|
59
|
+
# test whether +path+ is a valid and supported audiofile
|
60
|
+
def self.is_audio_file?(path)
|
61
|
+
begin
|
62
|
+
AudioInfo.new(path)
|
63
|
+
return true
|
64
|
+
rescue AudioInfoError
|
65
|
+
return false
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
# open the file with path +fn+
|
70
|
+
def initialize(filename)
|
54
71
|
raise(AudioInfoError, "path is nil") if filename.nil?
|
55
72
|
@path = filename
|
56
73
|
ext = File.extname(@path)
|
57
74
|
raise(AudioInfoError, "cannot find extension") if ext.empty?
|
58
75
|
@extension = ext[1..-1].downcase
|
59
76
|
@musicbrainz_infos = {}
|
60
|
-
@encoding = encoding
|
61
77
|
|
62
78
|
begin
|
63
79
|
case @extension
|
64
80
|
when 'mp3'
|
65
|
-
@info = Mp3Info.new(filename
|
81
|
+
@info = Mp3Info.new(filename)
|
66
82
|
default_tag_fill
|
67
83
|
#"TXXX"=>
|
68
84
|
#["MusicBrainz TRM Id\000",
|
@@ -90,7 +106,7 @@ class AudioInfo
|
|
90
106
|
@info.close
|
91
107
|
|
92
108
|
when 'ogg'
|
93
|
-
@info = OggInfo.new(filename
|
109
|
+
@info = OggInfo.new(filename)
|
94
110
|
default_fill_musicbrainz_fields
|
95
111
|
default_tag_fill
|
96
112
|
@bitrate = @info.bitrate/1000
|
@@ -111,7 +127,7 @@ class AudioInfo
|
|
111
127
|
fill_ape_tag(filename)
|
112
128
|
|
113
129
|
when 'wma'
|
114
|
-
@info = WmaInfo.new(filename, :encoding =>
|
130
|
+
@info = WmaInfo.new(filename, :encoding => 'utf-8')
|
115
131
|
@artist = @info.tags["Author"]
|
116
132
|
@album = @info.tags["AlbumTitle"]
|
117
133
|
@title = @info.tags["Title"]
|
@@ -125,7 +141,8 @@ class AudioInfo
|
|
125
141
|
@info.info["MusicBrainz/" + original_key]
|
126
142
|
end
|
127
143
|
|
128
|
-
when '
|
144
|
+
when 'mp4', 'aac', 'm4a'
|
145
|
+
@extension = 'mp4'
|
129
146
|
@info = MP4Info.open(filename)
|
130
147
|
@artist = @info.ART
|
131
148
|
@album = @info.ALB
|
@@ -144,19 +161,18 @@ class AudioInfo
|
|
144
161
|
|
145
162
|
when 'flac'
|
146
163
|
@info = FlacInfo.new(filename)
|
147
|
-
|
148
|
-
@
|
149
|
-
@
|
150
|
-
@
|
151
|
-
@
|
152
|
-
@date = tags["DATE"]||tags["date"]
|
164
|
+
@artist = @info.tags["ARTIST"] || @info.tags["artist"]
|
165
|
+
@album = @info.tags["ALBUM"] || @info.tags["album"]
|
166
|
+
@title = @info.tags["TITLE"] || @info.tags["title"]
|
167
|
+
@tracknum = (@info.tags["TRACKNUMBER"]||@info.tags["tracknumber"]).to_i
|
168
|
+
@date = @info.tags["DATE"]||@info.tags["date"]
|
153
169
|
@length = @info.streaminfo["total_samples"] / @info.streaminfo["samplerate"].to_f
|
154
170
|
@bitrate = File.size(filename).to_f*8/@length/1024
|
155
|
-
tags.each do |tagname, tagvalue|
|
171
|
+
@info.tags.each do |tagname, tagvalue|
|
156
172
|
next unless tagname =~ /^musicbrainz_(.+)$/
|
157
|
-
@musicbrainz_infos[$1] = tags[tagname]
|
173
|
+
@musicbrainz_infos[$1] = @info.tags[tagname]
|
158
174
|
end
|
159
|
-
@musicbrainz_infos["trmid"] = tags["musicip_puid"]
|
175
|
+
@musicbrainz_infos["trmid"] = @info.tags["musicip_puid"]
|
160
176
|
#default_fill_musicbrainz_fields
|
161
177
|
|
162
178
|
else
|
@@ -233,14 +249,14 @@ class AudioInfo
|
|
233
249
|
if @needs_commit
|
234
250
|
case @info
|
235
251
|
when Mp3Info
|
236
|
-
Mp3Info.open(@path
|
252
|
+
Mp3Info.open(@path) do |info|
|
237
253
|
info.tag.artist = @artist
|
238
254
|
info.tag.title = @title
|
239
255
|
info.tag.album = @album
|
240
256
|
info.tag.tracknum = @tracknum
|
241
257
|
end
|
242
258
|
when OggInfo
|
243
|
-
OggInfo.open(@path
|
259
|
+
OggInfo.open(@path) do |ogg|
|
244
260
|
{ "artist" => @artist,
|
245
261
|
"album" => @album,
|
246
262
|
"title" => @title,
|
@@ -302,14 +318,13 @@ class AudioInfo
|
|
302
318
|
|
303
319
|
def default_tag_fill(tags = @info.tag)
|
304
320
|
%w{artist album title}.each do |v|
|
305
|
-
instance_variable_set( "@#{v}".to_sym, sanitize(tags[v]
|
321
|
+
instance_variable_set( "@#{v}".to_sym, sanitize(tags[v]||"") )
|
306
322
|
end
|
307
323
|
end
|
308
324
|
|
309
325
|
def fill_ape_tag(filename)
|
310
326
|
begin
|
311
327
|
@info = ApeTag.new(filename)
|
312
|
-
#tags = convert_tags_encoding(@info.fields, "UTF-8")
|
313
328
|
tags = @info.fields.inject({}) do |hash, (k, v)|
|
314
329
|
hash[k.downcase] = v ? v.first : nil
|
315
330
|
hash
|
@@ -323,19 +338,6 @@ class AudioInfo
|
|
323
338
|
end
|
324
339
|
end
|
325
340
|
|
326
|
-
def convert_tags_encoding(tags_orig, from_encoding)
|
327
|
-
tags = {}
|
328
|
-
Iconv.open(@encoding, from_encoding) do |ic|
|
329
|
-
tags_orig.inject(tags) do |hash, (k, v)|
|
330
|
-
if v.is_a?(String)
|
331
|
-
hash[ic.iconv(k)] = ic.iconv(v)
|
332
|
-
end
|
333
|
-
hash
|
334
|
-
end
|
335
|
-
end
|
336
|
-
tags
|
337
|
-
end
|
338
|
-
|
339
341
|
def faad_info(file)
|
340
342
|
stdout, stdout_w = IO.pipe
|
341
343
|
stderr, stderr_w = IO.pipe
|
metadata
CHANGED
@@ -1,168 +1,155 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-audioinfo
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 1
|
9
|
-
- 7
|
10
|
-
version: 0.1.7
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '0.2'
|
5
|
+
prerelease:
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Guillaume Pierronnet
|
14
9
|
- Marcello Barnaba
|
15
10
|
autorequire:
|
16
11
|
bindir: bin
|
17
12
|
cert_chain: []
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
dependencies:
|
22
|
-
- !ruby/object:Gem::Dependency
|
13
|
+
date: 2012-04-02 00:00:00.000000000Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
23
16
|
name: ruby-mp3info
|
24
|
-
|
25
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
17
|
+
requirement: &83894570 !ruby/object:Gem::Requirement
|
26
18
|
none: false
|
27
|
-
requirements:
|
28
|
-
- -
|
29
|
-
- !ruby/object:Gem::Version
|
30
|
-
|
31
|
-
segments:
|
32
|
-
- 0
|
33
|
-
- 6
|
34
|
-
- 3
|
35
|
-
version: 0.6.3
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 0.7.1
|
36
23
|
type: :runtime
|
37
|
-
version_requirements: *id001
|
38
|
-
- !ruby/object:Gem::Dependency
|
39
|
-
name: ruby-ogginfo
|
40
24
|
prerelease: false
|
41
|
-
|
25
|
+
version_requirements: *83894570
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: ruby-ogginfo
|
28
|
+
requirement: &83894300 !ruby/object:Gem::Requirement
|
42
29
|
none: false
|
43
|
-
requirements:
|
44
|
-
- -
|
45
|
-
- !ruby/object:Gem::Version
|
46
|
-
|
47
|
-
segments:
|
48
|
-
- 0
|
49
|
-
- 3
|
50
|
-
- 1
|
51
|
-
version: 0.3.1
|
30
|
+
requirements:
|
31
|
+
- - ! '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.6.8
|
52
34
|
type: :runtime
|
53
|
-
version_requirements: *id002
|
54
|
-
- !ruby/object:Gem::Dependency
|
55
|
-
name: mp4info
|
56
35
|
prerelease: false
|
57
|
-
|
36
|
+
version_requirements: *83894300
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: mp4info
|
39
|
+
requirement: &83893930 !ruby/object:Gem::Requirement
|
58
40
|
none: false
|
59
|
-
requirements:
|
60
|
-
- -
|
61
|
-
- !ruby/object:Gem::Version
|
62
|
-
hash: 13
|
63
|
-
segments:
|
64
|
-
- 1
|
65
|
-
- 7
|
66
|
-
- 3
|
41
|
+
requirements:
|
42
|
+
- - ! '>='
|
43
|
+
- !ruby/object:Gem::Version
|
67
44
|
version: 1.7.3
|
68
45
|
type: :runtime
|
69
|
-
version_requirements: *id003
|
70
|
-
- !ruby/object:Gem::Dependency
|
71
|
-
name: wmainfo-rb
|
72
46
|
prerelease: false
|
73
|
-
|
47
|
+
version_requirements: *83893930
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: moumar-wmainfo-rb
|
50
|
+
requirement: &83893420 !ruby/object:Gem::Requirement
|
74
51
|
none: false
|
75
|
-
requirements:
|
76
|
-
- -
|
77
|
-
- !ruby/object:Gem::Version
|
78
|
-
|
79
|
-
segments:
|
80
|
-
- 0
|
81
|
-
- 5
|
82
|
-
version: "0.5"
|
52
|
+
requirements:
|
53
|
+
- - ! '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0.7'
|
83
56
|
type: :runtime
|
84
|
-
version_requirements: *id004
|
85
|
-
- !ruby/object:Gem::Dependency
|
86
|
-
name: flacinfo-rb
|
87
57
|
prerelease: false
|
88
|
-
|
58
|
+
version_requirements: *83893420
|
59
|
+
- !ruby/object:Gem::Dependency
|
60
|
+
name: flacinfo-rb
|
61
|
+
requirement: &83893200 !ruby/object:Gem::Requirement
|
89
62
|
none: false
|
90
|
-
requirements:
|
91
|
-
- -
|
92
|
-
- !ruby/object:Gem::Version
|
93
|
-
|
94
|
-
segments:
|
95
|
-
- 0
|
96
|
-
- 4
|
97
|
-
version: "0.4"
|
63
|
+
requirements:
|
64
|
+
- - ! '>='
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '0.4'
|
98
67
|
type: :runtime
|
99
|
-
version_requirements: *id005
|
100
|
-
- !ruby/object:Gem::Dependency
|
101
|
-
name: apetag
|
102
68
|
prerelease: false
|
103
|
-
|
69
|
+
version_requirements: *83893200
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: apetag
|
72
|
+
requirement: &83892940 !ruby/object:Gem::Requirement
|
104
73
|
none: false
|
105
|
-
requirements:
|
106
|
-
- -
|
107
|
-
- !ruby/object:Gem::Version
|
108
|
-
|
109
|
-
segments:
|
110
|
-
- 1
|
111
|
-
- 1
|
112
|
-
- 2
|
113
|
-
version: 1.1.2
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 1.1.4
|
114
78
|
type: :runtime
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
79
|
+
prerelease: false
|
80
|
+
version_requirements: *83892940
|
81
|
+
- !ruby/object:Gem::Dependency
|
82
|
+
name: rdoc
|
83
|
+
requirement: &83892710 !ruby/object:Gem::Requirement
|
84
|
+
none: false
|
85
|
+
requirements:
|
86
|
+
- - ~>
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '3.10'
|
89
|
+
type: :development
|
90
|
+
prerelease: false
|
91
|
+
version_requirements: *83892710
|
92
|
+
- !ruby/object:Gem::Dependency
|
93
|
+
name: hoe
|
94
|
+
requirement: &83892490 !ruby/object:Gem::Requirement
|
95
|
+
none: false
|
96
|
+
requirements:
|
97
|
+
- - ~>
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '3.0'
|
100
|
+
type: :development
|
101
|
+
prerelease: false
|
102
|
+
version_requirements: *83892490
|
103
|
+
description: ! 'ruby-audioinfo glue together various audio ruby libraries and presents
|
104
|
+
a unified
|
119
105
|
|
120
|
-
|
106
|
+
API to the developper. Currently, supported formats are: mp3, ogg, mpc, ape,
|
121
107
|
|
122
|
-
|
123
|
-
|
124
|
-
|
108
|
+
wma, flac, aac, mp4, m4a.'
|
109
|
+
email:
|
110
|
+
- guillaume.pierronnet@gmail.com
|
111
|
+
- unknown
|
112
|
+
executables: []
|
113
|
+
extensions: []
|
114
|
+
extra_rdoc_files:
|
115
|
+
- History.txt
|
116
|
+
- Manifest.txt
|
117
|
+
- README.rdoc
|
118
|
+
files:
|
125
119
|
- History.txt
|
126
|
-
-
|
120
|
+
- Manifest.txt
|
121
|
+
- README.rdoc
|
127
122
|
- Rakefile
|
128
123
|
- lib/audioinfo.rb
|
129
124
|
- lib/audioinfo/album.rb
|
130
|
-
- lib/audioinfo/apetag.rb
|
131
125
|
- lib/audioinfo/mpcinfo.rb
|
132
126
|
- test/mpcinfo.rb
|
133
|
-
|
127
|
+
- .gemtest
|
134
128
|
homepage: http://ruby-audioinfo.rubyforge.org
|
135
129
|
licenses: []
|
136
|
-
|
137
130
|
post_install_message:
|
138
|
-
rdoc_options:
|
139
|
-
- --
|
140
|
-
|
131
|
+
rdoc_options:
|
132
|
+
- --main
|
133
|
+
- README.rdoc
|
134
|
+
require_paths:
|
141
135
|
- lib
|
142
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
136
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
143
137
|
none: false
|
144
|
-
requirements:
|
145
|
-
- -
|
146
|
-
- !ruby/object:Gem::Version
|
147
|
-
|
148
|
-
|
149
|
-
- 0
|
150
|
-
version: "0"
|
151
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
138
|
+
requirements:
|
139
|
+
- - ! '>='
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: '0'
|
142
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
152
143
|
none: false
|
153
|
-
requirements:
|
154
|
-
- -
|
155
|
-
- !ruby/object:Gem::Version
|
156
|
-
|
157
|
-
segments:
|
158
|
-
- 0
|
159
|
-
version: "0"
|
144
|
+
requirements:
|
145
|
+
- - ! '>='
|
146
|
+
- !ruby/object:Gem::Version
|
147
|
+
version: '0'
|
160
148
|
requirements: []
|
161
|
-
|
162
|
-
|
163
|
-
rubygems_version: 1.3.7
|
149
|
+
rubyforge_project: ruby-audioinfo
|
150
|
+
rubygems_version: 1.8.17
|
164
151
|
signing_key:
|
165
152
|
specification_version: 3
|
166
|
-
summary:
|
153
|
+
summary: ruby-audioinfo glue together various audio ruby libraries and presents a
|
154
|
+
unified API to the developper
|
167
155
|
test_files: []
|
168
|
-
|
data/lib/audioinfo/apetag.rb
DELETED
@@ -1,53 +0,0 @@
|
|
1
|
-
# see http://www.personal.uni-jena.de/~pfk/mpp/sv8/apetag.html for specs
|
2
|
-
|
3
|
-
class ApeTagError < StandardError ; end
|
4
|
-
|
5
|
-
class ApeTag
|
6
|
-
attr_reader :tag, :version
|
7
|
-
|
8
|
-
def initialize(filename)
|
9
|
-
@tag = {}
|
10
|
-
|
11
|
-
begin
|
12
|
-
@file = File.new(filename, "rb")
|
13
|
-
@file.seek(-32, IO::SEEK_END)
|
14
|
-
|
15
|
-
preamble, version, tagsize, itemcount, flags =
|
16
|
-
@file.read(24).unpack("A8VVVV")
|
17
|
-
@version = version/1000
|
18
|
-
|
19
|
-
raise(ApeTagError, "cannot find preamble") if preamble != 'APETAGEX'
|
20
|
-
@file.seek(-tagsize, IO::SEEK_END)
|
21
|
-
itemcount.times do |i|
|
22
|
-
len, flags = @file.read(8).unpack("VV")
|
23
|
-
key = ""
|
24
|
-
loop do
|
25
|
-
c = @file.getc
|
26
|
-
break if c == 0
|
27
|
-
key << c
|
28
|
-
end
|
29
|
-
#ugly FIX
|
30
|
-
@tag[key.downcase] = @file.read(len) unless len > 100_000
|
31
|
-
end
|
32
|
-
ensure
|
33
|
-
@file.close
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
if $0 == __FILE__
|
39
|
-
while filename = ARGV.shift
|
40
|
-
puts "Getting info from #{filename}"
|
41
|
-
begin
|
42
|
-
ape = ApeTag.new(filename)
|
43
|
-
rescue ApeTagError
|
44
|
-
puts "error: doesn't appear to be an ape tagged file"
|
45
|
-
else
|
46
|
-
puts ape
|
47
|
-
ape.tag.each do |key, value|
|
48
|
-
puts "#{key} => #{value}"
|
49
|
-
end
|
50
|
-
end
|
51
|
-
puts
|
52
|
-
end
|
53
|
-
end
|