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) 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) get_full_embed_tag() { // Проход по всем полям стуктуры mut tag_bytes := []u8{} id3v24.size = 0 $for field in ID3v24.fields { $if field.typ is Frame { // Читаются только заполненные тэги if id3v24.$(field.name).cur_size > 0 { id3v24.size += id3v24.$(field.name).cur_size id3v24.size += 10 if id3v24.$(field.name).name.to_lower() != "apic" { // Кодируем значения полей tag_bytes << id3v24.$(field.name).get_encoded_frame_tag(id3v24.version) } else { // Картинка не трогается tag_bytes << id3v24.$(field.name).apic or { []u8{len: 4}} } } } } encode_header(mut id3v24) id3v24.encoded_header << tag_bytes } pub fn (mut id3v24 ID3v24) insert_tags_into_audio(mut audio File) { full_part := read_all(reader: audio) or { [u8(0), u8(0), u8(0), u8(0)] } sound_part := full_part[int(id3v24.size) + 10 .. ] id3v24.encoded_header << sound_part }