diff --git a/main.v b/main.v index 105cd07..05dea7d 100644 --- a/main.v +++ b/main.v @@ -4,9 +4,9 @@ import os import metadata fn id3(){ - // mut audio := os.open("./data/АЛИСА 11000.mp3") or { panic(err) } + mut audio := os.open("./data/АЛИСА 11000.mp3") or { panic(err) } // mut audio := os.open("./data/Глава 2. 16 и 17 июля.mp3") or { panic(err) } - mut audio := os.open("./data/01_01.mp3") or { panic(err) } + // mut audio := os.open("./data/01_01.mp3") or { panic(err) } // mut audio := os.open("./test.mp3") or { panic(err) } defer { @@ -39,7 +39,12 @@ fn id3(){ wav.id3v24.get_full_size(mut audio) wav.id3v24.fill_tag(mut audio) println(wav.id3v24.to_v1()) - wav.id3v24.tit2.encode_size(4) + // wav.id3v24.tit2.encode_size(4) + + flex := wav.id3v24.tit2.get_encoded_frame_tag(4) + + print(flex) + // println(wav.id3v24.tit2) } diff --git a/metadata/frame.v b/metadata/frame.v index 0fb9401..d195482 100644 --- a/metadata/frame.v +++ b/metadata/frame.v @@ -11,10 +11,12 @@ pub struct Frame { encoding_name string data string name string + encoding_name_idx u8 addition []u8 + encoded_data []u8 apic ?[]u8 - encoded_size ?[]u8 - encoded_data ?[]u8 + encoded_size []u8 + modified bool } // Во врейме первый байт указывает кодировку 0 - ISO-8859-1 (Latin-1), 1 - UTF-16LE @@ -42,6 +44,8 @@ fn (mut frame Frame) fill_frame(bytes []u8, start_position u64, idv3_version u8) else { "UTF-8" } } + frame.encoding_name_idx = u8(bytes[frame.start+10]) + if frame.name.to_lower() == "apic" { // Дополнительные байты с информацией (MIME) frame.addition = bytes[frame.start+10..frame.start+24] @@ -64,23 +68,43 @@ pub fn (mut frame Frame) encode_size(idv3_version u8) { [u64(21), u64(14), u64(7), u64(0x7F)] } - mut encoded_size := []u8{len: 4, cap: 16} - encoded_size << u8((frame.size >> stride[0]) & stride[3]) - encoded_size << u8((frame.size >> stride[1]) & stride[3]) - encoded_size << u8((frame.size >> stride[2]) & stride[3]) - encoded_size << u8(frame.size & stride[3]) + mut encoded_size := []u8{len: 4} + encoded_size[0] = u8((frame.size >> stride[0]) & stride[3]) + encoded_size[1] = u8((frame.size >> stride[1]) & stride[3]) + encoded_size[2] = u8((frame.size >> stride[2]) & stride[3]) + encoded_size[3] = u8(frame.size & stride[3]) frame.encoded_size = encoded_size - // fnums2 := [1, 10, 100].to_fixed_size() } - // Кодируем кадр для дальнейшей записи pub fn (mut frame Frame) encode_frame(idv3_version u8) { encoded_data := iconv.vstring_to_encoding(frame.data, frame.encoding_name) or { [u8(0), u8(0), u8(0), u8(0)] } frame.encoded_data = encoded_data - frame.size = u64(encoded_data.len) + + // + frame.size = u64(encoded_data.len + 10) frame.encode_size(idv3_version) +} + +// Получить закодированый тэг +pub fn (mut frame Frame) get_encoded_frame_tag(idv3_version u8) []u8 { + frame.encode_frame(idv3_version) + + // Название тэга + mut encoded_tag := frame.name.bytes() + // Флаги, оставляем пустыми + encoded_tag << []u8{len: 2} + // Идекс кодировщика текста + encoded_tag << frame.encoding_name_idx + // Четыре числа на закодированный размер + encoded_tag << frame.encoded_size + // Уже сами данные + encoded_tag << frame.encoded_data + // Запас нулей чтобы не пересчитывать весь фрейм при маленьком редактировании + encoded_tag << []u8{len: 10} + + return encoded_tag } \ No newline at end of file diff --git a/metadata/id3v24.v b/metadata/id3v24.v index cdad5ba..1d8f280 100644 --- a/metadata/id3v24.v +++ b/metadata/id3v24.v @@ -69,17 +69,19 @@ pub fn (mut id3v24 ID3v24) fill_tag(mut audio File) { } // Конвертировать ID3 v2.3 в ID3 v1 -pub fn (id3v23 ID3v24) to_v1() ID3v1 { +pub fn (id3v24 ID3v24) to_v1() ID3v1 { return ID3v1{ - genre: id3v23.tcon.data - title: id3v23.tit2.data - artist: id3v23.tpe2.data - album: id3v23.talb.data - track: id3v23.trck.data.split('/')[0] - year: id3v23.tdrc.data - comment: id3v23.comment.data + 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 insert(mut audio File) { + +pub fn flexd() { + } diff --git a/metadata/struct.v b/metadata/struct.v index d45e637..0915897 100644 --- a/metadata/struct.v +++ b/metadata/struct.v @@ -28,7 +28,8 @@ pub struct ID3v23 { tcop Frame // Композитор (автор) apic Frame // Обложка comment Frame // Комментарий - others []Frame + unknown Frame // Затычка + others []Frame // Остальные фреймы version u8 = 3 // Версия тэга embedded bool // Присутвует ли тэг } @@ -47,13 +48,13 @@ pub struct ID3v24 { tcop Frame // Композитор (автор) apic Frame // Обложка comment Frame // Комментарий - others []Frame + modified_frames []Frame // Затычка + others []Frame // Остальные фреймы version u8 = 4 // Версия тэга embedded bool // Присутвует ли тэг } -@[heap] pub struct Audio { pub mut: id3v1 ID3v1