From 4196efa9a6bb6f5eb0f3096b38a424b867d88224 Mon Sep 17 00:00:00 2001 From: K1ndWha1e Date: Fri, 17 Jul 2026 23:55:22 +0300 Subject: [PATCH] =?UTF-8?q?*=D0=BD=D0=B5=D0=B1=D0=BE=D0=BB=D1=8C=D1=88?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BE=D0=BF=D1=82=D0=B8=D0=BC=D0=B8=D0=B7=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D0=B8=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=5Fframe?= =?UTF-8?q?=20*=D0=BF=D0=BE=D0=B4=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=82=D1=83=D1=80?= =?UTF-8?q?=D0=B0=20Frame?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.v | 6 +++-- metadata/frame.v | 44 +++++++++++++++++--------------- metadata/id3v1.v | 14 +++++----- metadata/{id3v2.3.v => id3v23.v} | 15 ++++++----- metadata/{id3v2.4.v => id3v24.v} | 20 +++++++-------- 5 files changed, 52 insertions(+), 47 deletions(-) rename metadata/{id3v2.3.v => id3v23.v} (90%) rename metadata/{id3v2.4.v => id3v24.v} (84%) diff --git a/main.v b/main.v index 790de2a..105cd07 100644 --- a/main.v +++ b/main.v @@ -32,7 +32,7 @@ fn id3(){ wav.id3v23.fill_tag(mut audio) println(wav.id3v23.to_v1()) wav.id3v23.tit2.encode_size(3) - println(wav.id3v23.tit2) + // println(wav.id3v23.tit2) } if wav.id3v24.embedded { @@ -40,9 +40,11 @@ fn id3(){ wav.id3v24.fill_tag(mut audio) println(wav.id3v24.to_v1()) wav.id3v24.tit2.encode_size(4) - println(wav.id3v24.tit2) + // println(wav.id3v24.tit2) } + + // println(wav.id3v23) // println(wav.id3v23.tit2) diff --git a/metadata/frame.v b/metadata/frame.v index ec5f3b6..0fb9401 100644 --- a/metadata/frame.v +++ b/metadata/frame.v @@ -8,13 +8,13 @@ pub struct Frame { size u64 start u64 end u64 - encoding string - text string + encoding_name string + data string name string addition []u8 - encoded [4]u8 apic ?[]u8 - coded_size ?[]u64 + encoded_size ?[]u8 + encoded_data ?[]u8 } // Во врейме первый байт указывает кодировку 0 - ISO-8859-1 (Latin-1), 1 - UTF-16LE @@ -35,7 +35,7 @@ fn (mut frame Frame) fill_frame(bytes []u8, start_position u64, idv3_version u8) frame.end = frame.start + frame.size + 10 // Содержимое фрейма - frame.encoding = match bytes[frame.start+10] { + frame.encoding_name = match bytes[frame.start+10] { 0 { "ISO-8859-1" } 1 { "UTF-16LE" } 2 { "UTF-16BE" } @@ -47,9 +47,9 @@ fn (mut frame Frame) fill_frame(bytes []u8, start_position u64, idv3_version u8) frame.addition = bytes[frame.start+10..frame.start+24] frame.apic = bytes[frame.start+24..frame.end] } else { - // Выбор шага в записимости от версии + // Выбор шага в записимости от версии ID3 stride := if idv3_version == 3 { 13 } else { 11 } - frame.text = iconv.encoding_to_vstring(bytes[frame.start+u64(stride)..frame.end], frame.encoding) or { "" } + frame.data = iconv.encoding_to_vstring(bytes[frame.start+u64(stride)..frame.end], frame.encoding_name) or { "" } frame.addition = bytes[frame.start..frame.start + 10] } @@ -57,26 +57,30 @@ fn (mut frame Frame) fill_frame(bytes []u8, start_position u64, idv3_version u8) // Кодируем длину фрейма с нужным сдвигом @[inline] -pub fn (mut frame Frame) encode_size(idv3_version u8) []u64 { +pub fn (mut frame Frame) encode_size(idv3_version u8) { stride := if idv3_version == 3 { [u64(24), u64(16), u64(8), u64(0xFF)] } else { [u64(21), u64(14), u64(7), u64(0x7F)] } - return [ - (frame.size >> stride[0]) & stride[3], - (frame.size >> stride[1]) & stride[3], - (frame.size >> stride[2]) & stride[3], - frame.size & stride[3] - ] + 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]) + + frame.encoded_size = encoded_size + // fnums2 := [1, 10, 100].to_fixed_size() } -@[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) +// Кодируем кадр для дальнейшей записи +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.encode_size(idv3_version) } \ No newline at end of file diff --git a/metadata/id3v1.v b/metadata/id3v1.v index e353b43..dfac383 100644 --- a/metadata/id3v1.v +++ b/metadata/id3v1.v @@ -31,25 +31,25 @@ pub fn (mut tag ID3v1) get_metadata(last_bytes []u8) { pub fn (id3v1 ID3v1) to_v23() ID3v23 { return ID3v23{ tcon: metadata.Frame{ - text: id3v1.genre + data: id3v1.genre } tit2: metadata.Frame{ - text: id3v1.title + data: id3v1.title } tpe2: metadata.Frame{ - text: id3v1.artist + data: id3v1.artist } talb: metadata.Frame{ - text: id3v1.album + data: id3v1.album } trck: metadata.Frame{ - text: id3v1.track + data: id3v1.track } tyer: metadata.Frame{ - text: id3v1.year + data: id3v1.year } comment: metadata.Frame{ - text: id3v1.comment + data: id3v1.comment } } } diff --git a/metadata/id3v2.3.v b/metadata/id3v23.v similarity index 90% rename from metadata/id3v2.3.v rename to metadata/id3v23.v index d618406..b4548dd 100644 --- a/metadata/id3v2.3.v +++ b/metadata/id3v23.v @@ -84,12 +84,13 @@ pub fn (mut id3v23 ID3v23) fill_tag(mut audio File) { // Конвертировать ID3 v2.3 в ID3 v1 pub fn (id3v23 ID3v23) to_v1() ID3v1 { return ID3v1{ - genre: id3v23.tcon.text - title: id3v23.tit2.text - artist: id3v23.tpe2.text - album: id3v23.talb.text - track: id3v23.trck.text.split("/")[0] - year: id3v23.tyer.text - comment: id3v23.comment.text + genre: id3v23.tcon.data + title: id3v23.tit2.data + artist: id3v23.tpe2.data + album: id3v23.talb.data + track: id3v23.trck.data.split("/")[0] + year: id3v23.tyer.data + comment: id3v23.comment.data } } + diff --git a/metadata/id3v2.4.v b/metadata/id3v24.v similarity index 84% rename from metadata/id3v2.4.v rename to metadata/id3v24.v index 4640376..cdad5ba 100644 --- a/metadata/id3v2.4.v +++ b/metadata/id3v24.v @@ -2,7 +2,6 @@ module metadata import os { File } - enum EnumID3v24 as u8 { tit2 tpe1 @@ -47,7 +46,7 @@ pub fn (mut tag ID3v24) add_frame(frame Frame) { } .apic { tag.apic = frame - } + } else { tag.others << frame } @@ -72,16 +71,15 @@ pub fn (mut id3v24 ID3v24) fill_tag(mut audio File) { // Конвертировать ID3 v2.3 в ID3 v1 pub fn (id3v23 ID3v24) to_v1() ID3v1 { return ID3v1{ - genre: id3v23.tcon.text - title: id3v23.tit2.text - artist: id3v23.tpe2.text - album: id3v23.talb.text - track: id3v23.trck.text.split("/")[0] - year: id3v23.tdrc.text - comment: id3v23.comment.text + 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 } } pub fn insert(mut audio File) { - -} \ No newline at end of file +}