ruby-audioinfo 0.1.4 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +6 -0
- data/lib/audioinfo/mpcinfo.rb +10 -1
- data/lib/audioinfo.rb +36 -30
- metadata +5 -5
data/History.txt
CHANGED
data/lib/audioinfo/mpcinfo.rb
CHANGED
@@ -150,7 +150,16 @@ class MpcInfo
|
|
150
150
|
elsif mpc_header == "ID3"
|
151
151
|
@id3v2_tag = ID3v2.new
|
152
152
|
@id3v2_tag.from_io(@file)
|
153
|
-
|
153
|
+
@file.seek(@id3v2_tag.io_position)
|
154
|
+
# very dirty hack to allow parsing of mpc infos after id3v2 tag
|
155
|
+
while @file.read(1) != "M"; end
|
156
|
+
if @file.read(2) == "P+"
|
157
|
+
@file.seek(-3, IO::SEEK_CUR)
|
158
|
+
# we need to reparse the tag, since we have the beggining of the mpc file
|
159
|
+
parse_infos
|
160
|
+
else
|
161
|
+
raise(MpcInfoError, "cannot find MPC header after id3 tag")
|
162
|
+
end
|
154
163
|
else
|
155
164
|
raise(MpcInfoError, "cannot find MPC header")
|
156
165
|
end
|
data/lib/audioinfo.rb
CHANGED
@@ -30,7 +30,7 @@ class AudioInfo
|
|
30
30
|
|
31
31
|
SUPPORTED_EXTENSIONS = %w{mp3 ogg mpc wma mp4 aac m4a flac}
|
32
32
|
|
33
|
-
VERSION = "0.1.
|
33
|
+
VERSION = "0.1.5"
|
34
34
|
|
35
35
|
attr_reader :path, :extension, :musicbrainz_infos, :tracknum, :bitrate, :vbr
|
36
36
|
attr_reader :artist, :album, :title, :length, :date
|
@@ -52,9 +52,9 @@ class AudioInfo
|
|
52
52
|
end
|
53
53
|
|
54
54
|
# open the file with path +fn+ and convert all tags from/to specified +encoding+
|
55
|
-
def initialize(
|
56
|
-
raise(AudioInfoError, "path is nil") if
|
57
|
-
@path =
|
55
|
+
def initialize(filename, encoding = 'utf-8')
|
56
|
+
raise(AudioInfoError, "path is nil") if filename.nil?
|
57
|
+
@path = filename
|
58
58
|
ext = File.extname(@path)
|
59
59
|
raise(AudioInfoError, "cannot find extension") if ext.empty?
|
60
60
|
@extension = ext[1..-1].downcase
|
@@ -64,15 +64,16 @@ class AudioInfo
|
|
64
64
|
begin
|
65
65
|
case @extension
|
66
66
|
when 'mp3'
|
67
|
-
@info = Mp3Info.new(
|
67
|
+
@info = Mp3Info.new(filename, :encoding => @encoding)
|
68
68
|
default_tag_fill
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
69
|
+
#"TXXX"=>
|
70
|
+
#["MusicBrainz TRM Id\000",
|
71
|
+
#"MusicBrainz Artist Id\000aba64937-3334-4c65-90a1-4e6b9d4d7ada",
|
72
|
+
#"MusicBrainz Album Id\000e1a223c1-cbc2-427f-a192-5d22fefd7c4c",
|
73
|
+
#"MusicBrainz Album Type\000album",
|
74
|
+
#"MusicBrainz Album Status\000official",
|
75
|
+
#"MusicBrainz Album Artist Id\000"]
|
76
|
+
|
76
77
|
if (arr = @info.tag2["TXXX"]).is_a?(Array)
|
77
78
|
fields = MUSICBRAINZ_FIELDS.invert
|
78
79
|
arr.each do |val|
|
@@ -91,7 +92,7 @@ class AudioInfo
|
|
91
92
|
@info.close
|
92
93
|
|
93
94
|
when 'ogg'
|
94
|
-
@info = OggInfo.new(
|
95
|
+
@info = OggInfo.new(filename, @encoding)
|
95
96
|
default_fill_musicbrainz_fields
|
96
97
|
default_tag_fill
|
97
98
|
@bitrate = @info.bitrate/1000
|
@@ -102,17 +103,17 @@ class AudioInfo
|
|
102
103
|
@info.close
|
103
104
|
|
104
105
|
when 'mpc'
|
105
|
-
|
106
|
-
|
107
|
-
mpc_info = MpcInfo.new(
|
106
|
+
fill_ape_tag(filename)
|
107
|
+
|
108
|
+
mpc_info = MpcInfo.new(filename)
|
108
109
|
@bitrate = mpc_info.infos['bitrate']/1000
|
109
110
|
@length = mpc_info.infos['length']
|
110
111
|
|
111
112
|
when 'ape'
|
112
|
-
fill_ape_tag(
|
113
|
+
fill_ape_tag(filename)
|
113
114
|
|
114
115
|
when 'wma'
|
115
|
-
@info = WmaInfo.new(
|
116
|
+
@info = WmaInfo.new(filename, :encoding => @encoding)
|
116
117
|
@artist = @info.tags["Author"]
|
117
118
|
@album = @info.tags["AlbumTitle"]
|
118
119
|
@title = @info.tags["Title"]
|
@@ -127,7 +128,7 @@ class AudioInfo
|
|
127
128
|
end
|
128
129
|
|
129
130
|
when 'aac', 'mp4', 'm4a'
|
130
|
-
@info = MP4Info.open(
|
131
|
+
@info = MP4Info.open(filename)
|
131
132
|
@artist = @info.ART
|
132
133
|
@album = @info.ALB
|
133
134
|
@title = @info.NAM
|
@@ -137,22 +138,27 @@ class AudioInfo
|
|
137
138
|
@length = @info.SECS
|
138
139
|
mapping = MUSICBRAINZ_FIELDS.invert
|
139
140
|
|
140
|
-
`faad -i #{
|
141
|
+
`faad -i #{filename.shell_escape} 2>&1 `.grep(/^MusicBrainz (.+)$/) do
|
141
142
|
name, value = $1.split(/: /, 2)
|
142
143
|
key = mapping[name]
|
143
144
|
@musicbrainz_infos[key] = value
|
144
145
|
end
|
145
146
|
|
146
147
|
when 'flac'
|
147
|
-
@info = FlacInfo.new(
|
148
|
+
@info = FlacInfo.new(filename)
|
148
149
|
tags = convert_tags_encoding(@info.tags, "UTF-8")
|
149
|
-
@artist = tags["ARTIST"]
|
150
|
-
@album = tags["ALBUM"]
|
151
|
-
@title = tags["TITLE"]
|
152
|
-
@tracknum = tags["TRACKNUMBER"].to_i
|
153
|
-
@date = tags["DATE"]
|
150
|
+
@artist = tags["ARTIST"] || tags["artist"]
|
151
|
+
@album = tags["ALBUM"] || tags["album"]
|
152
|
+
@title = tags["TITLE"] || tags["title"]
|
153
|
+
@tracknum = (tags["TRACKNUMBER"]||tags["tracknumber"]).to_i
|
154
|
+
@date = tags["DATE"]||tags["date"]
|
154
155
|
@length = @info.streaminfo["total_samples"] / @info.streaminfo["samplerate"].to_f
|
155
|
-
@bitrate = File.size(
|
156
|
+
@bitrate = File.size(filename).to_f*8/@length/1024
|
157
|
+
tags.each do |tagname, tagvalue|
|
158
|
+
next unless tagname =~ /^musicbrainz_(.+)$/
|
159
|
+
@musicbrainz_infos[$1] = tags[tagname]
|
160
|
+
end
|
161
|
+
@musicbrainz_infos["trmid"] = tags["musicip_puid"]
|
156
162
|
#default_fill_musicbrainz_fields
|
157
163
|
|
158
164
|
else
|
@@ -241,7 +247,7 @@ class AudioInfo
|
|
241
247
|
"album" => @album,
|
242
248
|
"title" => @title,
|
243
249
|
"tracknumber" => @tracknum}.each do |k,v|
|
244
|
-
ogg.tag[k] = v
|
250
|
+
ogg.tag[k] = v.to_s
|
245
251
|
end
|
246
252
|
end
|
247
253
|
|
@@ -294,9 +300,9 @@ class AudioInfo
|
|
294
300
|
end
|
295
301
|
end
|
296
302
|
|
297
|
-
def fill_ape_tag(
|
303
|
+
def fill_ape_tag(filename)
|
298
304
|
begin
|
299
|
-
@info = ApeTag.new(
|
305
|
+
@info = ApeTag.new(filename)
|
300
306
|
tags = convert_tags_encoding(@info.tag, "UTF-8")
|
301
307
|
default_tag_fill(tags)
|
302
308
|
default_fill_musicbrainz_fields
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-audioinfo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Guillaume Pierronnet
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2009-03-28 23:00:00 +01:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -64,13 +64,13 @@ dependencies:
|
|
64
64
|
version:
|
65
65
|
- !ruby/object:Gem::Dependency
|
66
66
|
name: hoe
|
67
|
-
type: :
|
67
|
+
type: :development
|
68
68
|
version_requirement:
|
69
69
|
version_requirements: !ruby/object:Gem::Requirement
|
70
70
|
requirements:
|
71
71
|
- - ">="
|
72
72
|
- !ruby/object:Gem::Version
|
73
|
-
version: 1.
|
73
|
+
version: 1.9.0
|
74
74
|
version:
|
75
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."
|
76
76
|
email: moumar@rubyforge.org
|
@@ -116,7 +116,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
116
116
|
requirements: []
|
117
117
|
|
118
118
|
rubyforge_project: ruby-audioinfo
|
119
|
-
rubygems_version: 1.
|
119
|
+
rubygems_version: 1.3.1
|
120
120
|
signing_key:
|
121
121
|
specification_version: 2
|
122
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."
|