def close
puts "close" if $DEBUG
if @tag != @tag_orig
puts "@tag has changed" if $DEBUG
@tag.each do |k, v|
@tag1[k] = v
end
V1_V2_TAG_MAPPING.each do |key1, key2|
@tag2[key2] = @tag[key1] if @tag[key1]
end
end
if @tag1 != @tag1_orig
puts "@tag1 has changed" if $DEBUG
raise(Mp3InfoError, "file is not writable") unless File.writable?(@filename)
@tag1_orig.update(@tag1)
File.open(@filename, 'rb+') do |file|
file.seek(-TAGSIZE, File::SEEK_END)
t = file.read(3)
if t != 'TAG'
file.seek(0, File::SEEK_END)
file.write('TAG')
end
str = [
@tag1_orig["title"]||"",
@tag1_orig["artist"]||"",
@tag1_orig["album"]||"",
((@tag1_orig["year"] != 0) ? ("%04d" % @tag1_orig["year"].to_i) : "\0\0\0\0"),
@tag1_orig["comments"]||"",
0,
@tag1_orig["tracknum"]||0,
@tag1_orig["genre"]||255
].pack("Z30Z30Z30Z4Z28CCC")
file.write(str)
end
end
if @tag2.changed?
puts "@tag2 has changed" if $DEBUG
raise(Mp3InfoError, "file is not writable") unless File.writable?(@filename)
tempfile_name = nil
File.open(@filename, 'rb+') do |file|
if @tag2.valid?
file.seek(@tag2.io_position)
end
tempfile_name = @filename + ".tmp"
File.open(tempfile_name, "wb") do |tempfile|
unless @tag2.empty?
tempfile.write("ID3")
tempfile.write(@tag2.to_bin)
end
bufsiz = file.stat.blksize || 4096
while buf = file.read(bufsiz)
tempfile.write(buf)
end
end
end
File.rename(tempfile_name, @filename)
end
@file = nil
end