lib/audioinfo.rb in ruby-audioinfo-0.1.4 vs lib/audioinfo.rb in ruby-audioinfo-0.1.5

- old
+ new

@@ -28,11 +28,11 @@ "trackid" => "Track Id" } SUPPORTED_EXTENSIONS = %w{mp3 ogg mpc wma mp4 aac m4a flac} - VERSION = "0.1.4" + VERSION = "0.1.5" attr_reader :path, :extension, :musicbrainz_infos, :tracknum, :bitrate, :vbr attr_reader :artist, :album, :title, :length, :date # "block version" of #new() @@ -50,31 +50,32 @@ end ret end # open the file with path +fn+ and convert all tags from/to specified +encoding+ - def initialize(fn, encoding = 'utf-8') - raise(AudioInfoError, "path is nil") if fn.nil? - @path = fn + def initialize(filename, encoding = 'utf-8') + raise(AudioInfoError, "path is nil") if filename.nil? + @path = filename ext = File.extname(@path) raise(AudioInfoError, "cannot find extension") if ext.empty? @extension = ext[1..-1].downcase @musicbrainz_infos = {} @encoding = encoding begin case @extension when 'mp3' - @info = Mp3Info.new(fn, :encoding => @encoding) + @info = Mp3Info.new(filename, :encoding => @encoding) default_tag_fill - #"TXXX"=> - #["MusicBrainz TRM Id\000", - #"MusicBrainz Artist Id\000aba64937-3334-4c65-90a1-4e6b9d4d7ada", - #"MusicBrainz Album Id\000e1a223c1-cbc2-427f-a192-5d22fefd7c4c", - #"MusicBrainz Album Type\000album", - #"MusicBrainz Album Status\000official", - #"MusicBrainz Album Artist Id\000"] + #"TXXX"=> + #["MusicBrainz TRM Id\000", + #"MusicBrainz Artist Id\000aba64937-3334-4c65-90a1-4e6b9d4d7ada", + #"MusicBrainz Album Id\000e1a223c1-cbc2-427f-a192-5d22fefd7c4c", + #"MusicBrainz Album Type\000album", + #"MusicBrainz Album Status\000official", + #"MusicBrainz Album Artist Id\000"] + if (arr = @info.tag2["TXXX"]).is_a?(Array) fields = MUSICBRAINZ_FIELDS.invert arr.each do |val| if val =~ /^MusicBrainz (.+)\000(.*)$/ short_name = fields[$1] @@ -89,32 +90,32 @@ @date = @info.tag["date"] @vbr = @info.vbr @info.close when 'ogg' - @info = OggInfo.new(fn, @encoding) + @info = OggInfo.new(filename, @encoding) default_fill_musicbrainz_fields default_tag_fill @bitrate = @info.bitrate/1000 @tracknum = @info.tag.tracknumber.to_i @length = @info.length.to_i @date = @info.tag["date"] @vbr = true @info.close when 'mpc' - fill_ape_tag(fn) - - mpc_info = MpcInfo.new(fn) + fill_ape_tag(filename) + + mpc_info = MpcInfo.new(filename) @bitrate = mpc_info.infos['bitrate']/1000 @length = mpc_info.infos['length'] when 'ape' - fill_ape_tag(fn) + fill_ape_tag(filename) when 'wma' - @info = WmaInfo.new(fn, :encoding => @encoding) + @info = WmaInfo.new(filename, :encoding => @encoding) @artist = @info.tags["Author"] @album = @info.tags["AlbumTitle"] @title = @info.tags["Title"] @tracknum = @info.tags["TrackNumber"].to_i @date = @info.tags["Year"] @@ -125,36 +126,41 @@ @info.info["MusicBrainz/" + original_key.tr(" ", "")] || @info.info["MusicBrainz/" + original_key] end when 'aac', 'mp4', 'm4a' - @info = MP4Info.open(fn) + @info = MP4Info.open(filename) @artist = @info.ART @album = @info.ALB @title = @info.NAM @tracknum = ( t = @info.TRKN ) ? t.first : 0 @date = @info.DAY @bitrate = @info.BITRATE @length = @info.SECS mapping = MUSICBRAINZ_FIELDS.invert - `faad -i #{fn.shell_escape} 2>&1 `.grep(/^MusicBrainz (.+)$/) do + `faad -i #{filename.shell_escape} 2>&1 `.grep(/^MusicBrainz (.+)$/) do name, value = $1.split(/: /, 2) key = mapping[name] @musicbrainz_infos[key] = value end when 'flac' - @info = FlacInfo.new(fn) + @info = FlacInfo.new(filename) tags = convert_tags_encoding(@info.tags, "UTF-8") - @artist = tags["ARTIST"] - @album = tags["ALBUM"] - @title = tags["TITLE"] - @tracknum = tags["TRACKNUMBER"].to_i - @date = tags["DATE"] + @artist = tags["ARTIST"] || tags["artist"] + @album = tags["ALBUM"] || tags["album"] + @title = tags["TITLE"] || tags["title"] + @tracknum = (tags["TRACKNUMBER"]||tags["tracknumber"]).to_i + @date = tags["DATE"]||tags["date"] @length = @info.streaminfo["total_samples"] / @info.streaminfo["samplerate"].to_f - @bitrate = File.size(fn).to_f*8/@length/1024 + @bitrate = File.size(filename).to_f*8/@length/1024 + tags.each do |tagname, tagvalue| + next unless tagname =~ /^musicbrainz_(.+)$/ + @musicbrainz_infos[$1] = tags[tagname] + end + @musicbrainz_infos["trmid"] = tags["musicip_puid"] #default_fill_musicbrainz_fields else raise(AudioInfoError, "unsupported extension '.#{@extension}'") end @@ -239,11 +245,11 @@ OggInfo.open(@path, @encoding) do |ogg| { "artist" => @artist, "album" => @album, "title" => @title, "tracknumber" => @tracknum}.each do |k,v| - ogg.tag[k] = v + ogg.tag[k] = v.to_s end end else raise(AudioInfoError, "implement me") @@ -292,12 +298,12 @@ %w{artist album title}.each do |v| instance_variable_set( "@#{v}".to_sym, sanitize(tag[v].to_s) ) end end - def fill_ape_tag(fn) + def fill_ape_tag(filename) begin - @info = ApeTag.new(fn) + @info = ApeTag.new(filename) tags = convert_tags_encoding(@info.tag, "UTF-8") default_tag_fill(tags) default_fill_musicbrainz_fields @date = @info.tag["year"] @tracknum = 0