From 18ac12f3b55139a4fe844962f985b28ce6ca8bea Mon Sep 17 00:00:00 2001 From: K1ndWha1e Date: Sun, 12 Jul 2026 00:26:27 +0300 Subject: [PATCH] =?UTF-8?q?*=D0=BD=D0=B5=D0=B1=D0=BE=D0=BB=D1=8C=D1=88?= =?UTF-8?q?=D0=BE=D0=B9=20=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE=D1=80?= =?UTF-8?q?=D0=B8=D0=BD=D0=B3=20*=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=20encode=5Fsize?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20Frame?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- metadata/frame.v | 16 +++++++++++++--- metadata/id3v2.3.v | 27 ++++----------------------- metadata/id3v2.4.v | 30 +++++------------------------- metadata/struct.v | 2 ++ metadata/utils.v | 38 ++++++++++++++++++++++++++++++-------- 6 files changed, 55 insertions(+), 60 deletions(-) diff --git a/.gitignore b/.gitignore index 7330bfb..2648b3d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ -data\ +*.mp3 temp.v path.text \ No newline at end of file diff --git a/metadata/frame.v b/metadata/frame.v index 846bfe1..ec5f3b6 100644 --- a/metadata/frame.v +++ b/metadata/frame.v @@ -8,12 +8,13 @@ pub struct Frame { size u64 start u64 end u64 - apic ?[]u8 - coded_size ?[]u64 - addition []u8 encoding string text string name string + addition []u8 + encoded [4]u8 + apic ?[]u8 + coded_size ?[]u64 } // Во врейме первый байт указывает кодировку 0 - ISO-8859-1 (Latin-1), 1 - UTF-16LE @@ -70,3 +71,12 @@ pub fn (mut frame Frame) encode_size(idv3_version u8) []u64 { frame.size & stride[3] ] } + + +@[inline] +pub fn encode_size(mut frame Frame) { + frame.encoded[3] = u8(frame.size & 0x7F) + frame.encoded[2] = u8((frame.size >> 7) & 0x7F) + frame.encoded[1] = u8((frame.size >> 14) & 0x7F) + frame.encoded[0] = u8((frame.size >> 21) & 0x7F) +} \ No newline at end of file diff --git a/metadata/id3v2.3.v b/metadata/id3v2.3.v index 634d9da..d618406 100644 --- a/metadata/id3v2.3.v +++ b/metadata/id3v2.3.v @@ -71,29 +71,14 @@ fn get_size_v23(size_bytes []u8) u64 { return (u64(size_bytes[0]) << 24) | (u64(size_bytes[1]) << 16) | (u64(size_bytes[2]) << 8) | u64(size_bytes[3]) } +// Получения размеров всех тэгов pub fn (mut id3v23 ID3v23) get_full_size(mut audio File) { - // Первые 10 байт тэга - first_ten_bytes := get_bytes(mut audio, 0, 10) - - id3v23.size = (u64(first_ten_bytes[6]) << 21) | (u64(first_ten_bytes[7]) << 14) | (u64(first_ten_bytes[8]) << 7) | u64(first_ten_bytes[9]) + get_full_size(mut id3v23, mut audio) } +// Заполнение тэга pub fn (mut id3v23 ID3v23) fill_tag(mut audio File) { - mut current_frame := &Frame{} - // Самая первая позиция - mut start_position := u64(10) - // Версия IDv3 - idv3_version := u8(3) - // Получаем вне возможные байты - all_tag_bytes := get_bytes(mut audio, 10, int(id3v23.size + start_position)) - - for id3v23.size > start_position { - current_frame.fill_frame(all_tag_bytes, start_position, idv3_version) - start_position = current_frame.end - id3v23.size -= current_frame.size - - id3v23.add_frame(current_frame) - } + fill_tag[ID3v23](mut id3v23, mut audio) } // Конвертировать ID3 v2.3 в ID3 v1 @@ -108,7 +93,3 @@ pub fn (id3v23 ID3v23) to_v1() ID3v1 { comment: id3v23.comment.text } } - -pub fn to_bytes () { - -} \ No newline at end of file diff --git a/metadata/id3v2.4.v b/metadata/id3v2.4.v index d508feb..4640376 100644 --- a/metadata/id3v2.4.v +++ b/metadata/id3v2.4.v @@ -59,34 +59,14 @@ 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 id3v23 ID3v24) get_full_size(mut audio File) { - // Первые 10 байт тэга - first_ten_bytes := get_bytes(mut audio, 0, 10) - - id3v23.size = (u64(first_ten_bytes[6]) << 21) | (u64(first_ten_bytes[7]) << 14) | (u64(first_ten_bytes[8]) << 7) | u64(first_ten_bytes[9]) +// Получения размеров всех тэгов +pub fn (mut id3v24 ID3v24) get_full_size(mut audio File) { + get_full_size(mut id3v24, mut audio) } - +// Заполнение тэга pub fn (mut id3v24 ID3v24) fill_tag(mut audio File) { - mut current_frame := &Frame{} - // Самая первая позиция - mut start_position := u64(10) - // Версия IDv3 - idv3_version := u8(4) - // Получаем вне возможные байты - all_tag_bytes := get_bytes(mut audio, 10, int(id3v24.size + start_position)) - // TODO Подумать как правильно считать размер - // Скорее всего просто скадлывать байтики, если нуль - вырубать - for id3v24.size > start_position { - // Заполнение кадров - current_frame.fill_frame(all_tag_bytes, start_position, idv3_version) - - start_position = current_frame.end - id3v24.size -= current_frame.size - - // Добавление кадра - id3v24.add_frame(current_frame) - } + fill_tag[ID3v24](mut id3v24, mut audio) } // Конвертировать ID3 v2.3 в ID3 v1 diff --git a/metadata/struct.v b/metadata/struct.v index 702062e..d45e637 100644 --- a/metadata/struct.v +++ b/metadata/struct.v @@ -29,6 +29,7 @@ pub struct ID3v23 { apic Frame // Обложка comment Frame // Комментарий others []Frame + version u8 = 3 // Версия тэга embedded bool // Присутвует ли тэг } @@ -47,6 +48,7 @@ pub struct ID3v24 { apic Frame // Обложка comment Frame // Комментарий others []Frame + version u8 = 4 // Версия тэга embedded bool // Присутвует ли тэг } diff --git a/metadata/utils.v b/metadata/utils.v index 8258a9d..cd04ff4 100644 --- a/metadata/utils.v +++ b/metadata/utils.v @@ -15,14 +15,13 @@ pub fn (mut audio Audio) detect_tags(mut data os.File) { // ? --- Проверка версии ID3v23.3 --- first_ten_bytes := get_bytes(mut data, 0, 4) - if first_ten_bytes[..3].bytestr() == "ID3" && first_ten_bytes[3] == 3 { - audio.id3v23.embedded = true - } - // =============================== - - // ? --- Проверка версии ID3v23.4 --- - if first_ten_bytes[..3].bytestr() == "ID3" && first_ten_bytes[3] == 4 { - audio.id3v24.embedded = true + if first_ten_bytes[..3].bytestr() == "ID3" { + if first_ten_bytes[3] == 3 { + audio.id3v23.embedded = true + } else if first_ten_bytes[3] == 4 { + // Проверка версии ID3v23.4 + audio.id3v24.embedded = true + } } // =============================== } @@ -42,3 +41,26 @@ pub fn get_bytes(mut audio os.File, position int, size int) []u8 { return last_bytes } + +pub fn fill_tag[T](mut tag T, mut audio os.File) { + mut current_frame := &Frame{} + // Самая первая позиция + mut start_position := u64(10) + // Получаем вне возможные байты + all_tag_bytes := get_bytes(mut audio, 10, int(tag.size + start_position)) + + for tag.size > start_position { + current_frame.fill_frame(all_tag_bytes, start_position, tag.version) + start_position = current_frame.end + tag.size -= current_frame.size + + tag.add_frame(current_frame) + } +} + +pub fn get_full_size[T](mut tag T, mut audio os.File) { + // Первые 10 байт тэга + first_ten_bytes := get_bytes(mut audio, 0, 10) + + tag.size = (u64(first_ten_bytes[6]) << 21) | (u64(first_ten_bytes[7]) << 14) | (u64(first_ten_bytes[8]) << 7) | u64(first_ten_bytes[9]) +} \ No newline at end of file