module metadata import os { File } import io { read_all } pub fn (mut tag ID3v24) add_frame(frame Frame) { name := EnumID3v24.from(frame.name.to_lower()) or { EnumID3v24.unknown } match name { .tit2 { tag.tit2 = frame } .tpe1 { tag.tpe1 = frame } .tpe2 { tag.tpe2 = frame } .talb { tag.talb = frame } .tdrc { tag.tdrc = frame } .trck { tag.trck = frame } .tcon { tag.tcon = frame } .tcop { tag.tcop = frame } .apic { tag.apic = frame } else { tag.others << frame } } } @[inline] fn get_size_v24(size_bytes []u8) u64 { return (u64(size_bytes[0]) << 21) | (u64(size_bytes[1]) << 14) | (u64(size_bytes[2]) << 7) | u64(size_bytes[3]) } // Получения размеров всех тэгов pub fn (mut id3v24 ID3v24) get_full_size(mut audio File) { get_current_tag_size(mut id3v24, mut audio) } // Кодирование всех тегов pub fn (mut id3v24 ID3v24) encode_embed_tags() { encode_embed_tags[ID3v24](mut id3v24) } // Заполнение тэга pub fn (mut id3v24 ID3v24) fill_tags(mut audio File) { dump_data[ID3v24](mut id3v24, mut audio) } // Конвертировать ID3 v2.3 в ID3 v1 pub fn (id3v24 ID3v24) to_v1() ID3v1 { return ID3v1{ genre: id3v24.tcon.data title: id3v24.tit2.data artist: id3v24.tpe2.data album: id3v24.talb.data track: id3v24.trck.data.split('/')[0] year: id3v24.tdrc.data comment: id3v24.comment.data } } pub fn (mut id3v24 ID3v24) insert_tags_into_audio(mut audio File) { full_part := read_all(reader: audio) or { panic(err) } // Размер старого тэга берётся из файла, id3v24.size уже хранит размер нового old_size := get_size_v24(full_part[6..10]) sound_part := full_part[int(old_size) + 10 .. ] id3v24.encoded_header << sound_part }