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