module metadata import os { File } 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 } .txxx { tag.txxx = 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.txxx.data } } // Добавление аудио после нового тэга pub fn (mut id3v24 ID3v24) insert_tags_into_audio(mut audio File) ! { insert_tags_into_audio[ID3v24](mut id3v24, mut audio)! }