vfmt: весь код в формате V master (без изменений логики)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
4c9184aeb2
commit
6161a7faaa
12 files changed
+405
-287
No files matched your search
+43
-39
@@ -4,23 +4,23 @@ import encoding.iconv
|
||||
|
||||
@[heap]
|
||||
pub struct Frame {
|
||||
pub mut:
|
||||
data string
|
||||
mut:
|
||||
prev_size u64
|
||||
cur_size u64
|
||||
start u64
|
||||
end u64
|
||||
encoding_name string
|
||||
name string
|
||||
encoding_name_idx u8
|
||||
addition []u8
|
||||
encoded_data []u8
|
||||
apic ?[]u8
|
||||
encoded_size []u8
|
||||
modified bool
|
||||
// Фрейм целиком в том виде, в каком он был прочитан из файла
|
||||
raw []u8
|
||||
pub mut:
|
||||
data string
|
||||
mut:
|
||||
prev_size u64
|
||||
cur_size u64
|
||||
start u64
|
||||
end u64
|
||||
encoding_name string
|
||||
name string
|
||||
encoding_name_idx u8
|
||||
addition []u8
|
||||
encoded_data []u8
|
||||
apic ?[]u8
|
||||
encoded_size []u8
|
||||
modified bool
|
||||
// Фрейм целиком в том виде, в каком он был прочитан из файла
|
||||
raw []u8
|
||||
}
|
||||
|
||||
// Во фрейме первый байт указывает кодировку 0 - ISO-8859-1 (Latin-1), 1 - UTF-16LE
|
||||
@@ -32,10 +32,10 @@ fn (mut frame Frame) fill(bytes []u8, start_position u64, idv3_version u8) {
|
||||
frame.name = bytes[frame.start..frame.start + 4].bytestr()
|
||||
|
||||
// Размер фрейма
|
||||
frame.cur_size = if idv3_version == 3 {
|
||||
get_size_v23(bytes[frame.start + 4..frame.start + 8])
|
||||
} else {
|
||||
get_size_v24(bytes[frame.start + 4..frame.start + 8])
|
||||
frame.cur_size = if idv3_version == 3 {
|
||||
get_size_v23(bytes[frame.start + 4..frame.start + 8])
|
||||
} else {
|
||||
get_size_v24(bytes[frame.start + 4..frame.start + 8])
|
||||
}
|
||||
// Конец фрейма
|
||||
frame.end = frame.start + frame.cur_size + 10
|
||||
@@ -44,16 +44,16 @@ fn (mut frame Frame) fill(bytes []u8, start_position u64, idv3_version u8) {
|
||||
frame.modified = false
|
||||
|
||||
// Содержимое фрейма
|
||||
frame.encoding_name = match bytes[frame.start + 10] {
|
||||
0 { "ISO-8859-1" }
|
||||
1 { "UTF-16LE" }
|
||||
2 { "UTF-16BE" }
|
||||
else { "UTF-8" }
|
||||
frame.encoding_name = match bytes[frame.start + 10] {
|
||||
0 { 'ISO-8859-1' }
|
||||
1 { 'UTF-16LE' }
|
||||
2 { 'UTF-16BE' }
|
||||
else { 'UTF-8' }
|
||||
}
|
||||
|
||||
frame.encoding_name_idx = u8(bytes[frame.start + 10])
|
||||
|
||||
if frame.name.to_lower() == "apic" {
|
||||
if frame.name.to_lower() == 'apic' {
|
||||
// Дополнительные байты с информацией (MIME)
|
||||
frame.addition = bytes[frame.start + 10..frame.start + 24]
|
||||
// Фрейм целиком вместе с заголовком, чтобы записать его обратно без изменений
|
||||
@@ -65,13 +65,13 @@ fn (mut frame Frame) fill(bytes []u8, start_position u64, idv3_version u8) {
|
||||
// UTF-16 с BOM (01): 2 байта маркера, по ним определяется порядок байт
|
||||
if frame.encoding_name_idx == 1 && data_start + 2 <= frame.end {
|
||||
if bytes[data_start] == 0xFE && bytes[data_start + 1] == 0xFF {
|
||||
frame.encoding_name = "UTF-16BE"
|
||||
frame.encoding_name = 'UTF-16BE'
|
||||
}
|
||||
data_start += 2
|
||||
}
|
||||
|
||||
// Замыкающие нули не относятся к данным
|
||||
frame.data = (iconv.encoding_to_vstring(bytes[data_start..frame.end], frame.encoding_name) or { "" }).all_before('\x00')
|
||||
frame.data = (iconv.encoding_to_vstring(bytes[data_start..frame.end], frame.encoding_name) or { '' }).all_before('\x00')
|
||||
|
||||
frame.addition = bytes[frame.start..frame.start + 10]
|
||||
}
|
||||
@@ -86,10 +86,10 @@ pub fn (mut frame Frame) init(tag_name string, idv3_version u8) {
|
||||
fn (mut frame Frame) set_unicode_encoding(idv3_version u8) {
|
||||
// В v2.3 нет UTF-8, там Юникод только UTF-16 с BOM
|
||||
if idv3_version == 3 {
|
||||
frame.encoding_name = "UTF-16LE"
|
||||
frame.encoding_name = 'UTF-16LE'
|
||||
frame.encoding_name_idx = 1
|
||||
} else {
|
||||
frame.encoding_name = "UTF-8"
|
||||
frame.encoding_name = 'UTF-8'
|
||||
frame.encoding_name_idx = 3
|
||||
}
|
||||
}
|
||||
@@ -97,10 +97,10 @@ fn (mut frame Frame) set_unicode_encoding(idv3_version u8) {
|
||||
// Кодируем длину фрейма с нужным сдвигом
|
||||
@[inline]
|
||||
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)]
|
||||
stride := if idv3_version == 3 {
|
||||
[u64(24), u64(16), u64(8), u64(0xFF)]
|
||||
} else {
|
||||
[u64(21), u64(14), u64(7), u64(0x7F)]
|
||||
}
|
||||
|
||||
mut encoded_size := []u8{len: 4}
|
||||
@@ -123,13 +123,17 @@ pub fn (mut frame Frame) encode_frame(idv3_version u8) {
|
||||
// Не удалось закодировать в исходной кодировке фрейма, переходим на Юникод
|
||||
frame.set_unicode_encoding(idv3_version)
|
||||
iconv.vstring_to_encoding(frame.data, frame.encoding_name) or {
|
||||
panic("не удалось закодировать фрейм ${frame.name}: ${err}")
|
||||
panic('не удалось закодировать фрейм ${frame.name}: ${err}')
|
||||
}
|
||||
}
|
||||
|
||||
// Для UTF-16 с BOM (01) перед текстом нужен маркер порядка байт
|
||||
frame.encoded_data = if frame.encoding_name_idx == 1 {
|
||||
mut bom := if frame.encoding_name == "UTF-16BE" { [u8(0xFE), 0xFF] } else { [u8(0xFF), 0xFE] }
|
||||
mut bom := if frame.encoding_name == 'UTF-16BE' {
|
||||
[u8(0xFE), 0xFF]
|
||||
} else {
|
||||
[u8(0xFF), 0xFE]
|
||||
}
|
||||
bom << encoded_data
|
||||
bom
|
||||
} else {
|
||||
@@ -174,7 +178,7 @@ pub fn (mut frame Frame) get_encoded_frame_tag(idv3_version u8) []u8 {
|
||||
pub fn (mut frame Frame) to_bytes(idv3_version u8) []u8 {
|
||||
// Картинка и нетронутые фреймы пишутся как были прочитаны,
|
||||
// чтобы не потерять то, что не разбирается (язык в COMM, значение в TXXX, бинарные фреймы)
|
||||
if frame.raw.len > 0 && (!frame.modified || frame.name == "APIC") {
|
||||
if frame.raw.len > 0 && (!frame.modified || frame.name == 'APIC') {
|
||||
return frame.raw
|
||||
}
|
||||
|
||||
@@ -195,4 +199,4 @@ pub fn (mut frame Frame) set_data(data string) {
|
||||
|
||||
frame.data = data
|
||||
frame.modified = true
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user