lib/audioinfo.rb in ruby-audioinfo-0.1.5 vs lib/audioinfo.rb in ruby-audioinfo-0.1.7
- old
+ new
@@ -1,21 +1,19 @@
-#!/usr/bin/env ruby
-
require "iconv"
require "stringio"
-$: << File.dirname(__FILE__)+"/audioinfo"
-
require "mp3info"
require "ogginfo"
-require "mpcinfo"
-require "apetag"
require "wmainfo"
require "mp4info"
require "flacinfo"
-require "shell_escape"
+require "apetag"
+$: << File.expand_path(File.dirname(__FILE__))
+
+require "audioinfo/mpcinfo"
+
class AudioInfoError < Exception ; end
class AudioInfo
MUSICBRAINZ_FIELDS = {
"trmid" => "TRM Id",
@@ -28,11 +26,11 @@
"trackid" => "Track Id"
}
SUPPORTED_EXTENSIONS = %w{mp3 ogg mpc wma mp4 aac m4a flac}
- VERSION = "0.1.5"
+ VERSION = "0.1.7"
attr_reader :path, :extension, :musicbrainz_infos, :tracknum, :bitrate, :vbr
attr_reader :artist, :album, :title, :length, :date
# "block version" of #new()
@@ -136,11 +134,11 @@
@date = @info.DAY
@bitrate = @info.BITRATE
@length = @info.SECS
mapping = MUSICBRAINZ_FIELDS.invert
- `faad -i #{filename.shell_escape} 2>&1 `.grep(/^MusicBrainz (.+)$/) do
+ faad_info(filename).match(/^MusicBrainz (.+)$/) do
name, value = $1.split(/: /, 2)
key = mapping[name]
@musicbrainz_infos[key] = value
end
@@ -249,10 +247,18 @@
"tracknumber" => @tracknum}.each do |k,v|
ogg.tag[k] = v.to_s
end
end
+ when ApeTag
+ ape = ApeTag.new(@path)
+ ape.update do |fields|
+ fields["Artist"] = @artist
+ fields["Album"] = @album
+ fields["Title"] = @title
+ fields["Track"] = @tracknum.to_s
+ end
else
raise(AudioInfoError, "implement me")
end
end
@@ -285,35 +291,36 @@
def sanitize(input)
s = input.is_a?(Array) ? input.first : input
s.gsub("\000", "")
end
- def default_fill_musicbrainz_fields
+ def default_fill_musicbrainz_fields(tags = @info.tag)
MUSICBRAINZ_FIELDS.keys.each do |field|
- val = @info.tag["musicbrainz_#{field}"]
+ val = tags["musicbrainz_#{field}"]
@musicbrainz_infos[field] = val if val
end
end
- def default_tag_fill(tag = @info.tag)
+ def default_tag_fill(tags = @info.tag)
%w{artist album title}.each do |v|
- instance_variable_set( "@#{v}".to_sym, sanitize(tag[v].to_s) )
+ instance_variable_set( "@#{v}".to_sym, sanitize(tags[v].to_s) )
end
end
def fill_ape_tag(filename)
begin
@info = ApeTag.new(filename)
- tags = convert_tags_encoding(@info.tag, "UTF-8")
+ #tags = convert_tags_encoding(@info.fields, "UTF-8")
+ tags = @info.fields.inject({}) do |hash, (k, v)|
+ hash[k.downcase] = v ? v.first : nil
+ hash
+ end
+ default_fill_musicbrainz_fields(tags)
default_tag_fill(tags)
- default_fill_musicbrainz_fields
- @date = @info.tag["year"]
- @tracknum = 0
- if track = @info.tag['track']
- @tracknum = @info.tag['track'].split("/").first.to_i
- end
+ @date = tags["year"]
+ @tracknum = tags['track'].to_i
rescue ApeTagError
end
end
def convert_tags_encoding(tags_orig, from_encoding)
@@ -325,7 +332,32 @@
end
hash
end
end
tags
+ end
+
+ def faad_info(file)
+ stdout, stdout_w = IO.pipe
+ stderr, stderr_w = IO.pipe
+
+ fork do
+ stdout.close
+ stderr.close
+ STDOUT.reopen(stdout_w)
+ STDERR.reopen(stderr_w)
+ exec 'faad', '-i', file
+ end
+
+ stdout_w.close
+ stderr_w.close
+ pid, status = Process.wait2
+
+ out = stdout.read.chomp
+ stdout.close
+ err = stderr.read.chomp
+ stderr.close
+
+ # Return the stderr because faad prints info on that fd...
+ status.exitstatus.zero? ? err : ''
end
end