Files
id3_editor/metadata/id3v23.v
T
2026-10-07 23:03:27 +03:00

117 lines
2.7 KiB
V
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
module metadata
import os { File }
import io { read_all }
// 00: ISO-8859-1 (1 байт на символ).
// 01: UTF-16 с BOM (2 байта на символ + 2 байта маркер).
// 03: UTF-8 (переменная длина).
// Пример из пункта 3 (13 байт размера):
// Если первый байт данных 01 (UTF-16), то реальный текст занимает:
// 13 - 1 (байт кодировки) - 2 (BOM) = 10 байт.
// В UTF-16 это будет всего 5 символов (так как 1 символ = 2 байта).
// enum EnumID3v23 as u8 {
// tit2
// tpe1
// tpe2
// talb
// tyer
// trck
// tcon
// tcop
// apic
// comment
// unknown
// }
const start_idx = 10
pub fn (mut tag ID3v23) add_frame(frame Frame) {
name := EnumID3v23.from(frame.name.to_lower()) or { EnumID3v23.unknown }
match name {
.tit2 {
tag.tit2 = frame
}
.tpe1 {
tag.tpe1 = frame
}
.tpe2 {
tag.tpe2 = frame
}
.talb {
tag.talb = frame
}
.tyer {
tag.tyer = frame
}
.trck {
tag.trck = frame
}
.tcon {
tag.tcon = frame
}
.tcop {
tag.tcop = frame
}
.apic {
tag.apic = frame
}
.txxx {
tag.txxx = frame
}
else {
tag.others << frame
}
}
}
// [ID3v23] Получение размера всего тэга / фрейма
@[inline]
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) {
get_current_tag_size(mut id3v23, mut audio)
}
// Кодирование всех тегов
pub fn (mut id3v23 ID3v23) encode_embed_tags() {
encode_embed_tags[ID3v23](mut id3v23)
}
// Заполнение тэга
pub fn (mut id3v23 ID3v23) fill_tags(mut audio File) {
dump_data[ID3v23](mut id3v23, mut audio)
}
// Конвертировать ID3 v2.3 в ID3 v1
pub fn (id3v23 ID3v23) 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.tyer.data
comment: id3v23.txxx.data
}
}
pub fn (mut id3v23 ID3v23) insert_tags_into_audio(mut audio File) {
full_part := read_all(reader: audio) or { panic(err) }
// Размер старого тэга берётся из файла, id3v23.size уже хранит размер нового.
// В заголовке тэга размер syncsafe даже в v2.3, поэтому get_size_v24
old_size := get_size_v24(full_part[6..10])
sound_part := full_part[int(old_size) + 10 .. ]
id3v23.encoded_header << sound_part
}