*всё работает

This commit is contained in:
K1ndWha1e committed 2026-10-07 23:03:27 +03:00
1 parent aa04fd4df0
commit ffa8d80875
6 files changed
+124 -154

No files matched your search

-1
View File
@@ -123,7 +123,6 @@ pub fn (mut frame Frame) get_encoded_frame_tag(idv3_version u8) []u8 {
// Название тэга
mut encoded_tag := frame.name.bytes()
// Четыре числа на закодированный размер
encoded_tag << frame.encoded_size
// Флаги, оставляем пустыми
+11
View File
@@ -1,6 +1,7 @@
module metadata
import os { File }
import io { read_all }
// 00: ISO-8859-1 (1 байт на символ).
// 01: UTF-16 с BOM (2 байта на символ + 2 байта маркер).
@@ -103,3 +104,13 @@ pub fn (id3v23 ID3v23) to_v1() ID3v1 {
}
}
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
}
+42 -22
View File
@@ -4,14 +4,22 @@ module metadata
@[heap; minify]
pub struct ID3v1 {
pub mut:
genre string// Жанр
title string // Название аудиодорожки
artist string // Актёр озучания
album string // Название альбома
track string // Записывается как 2/5, что значит 2 трэк из 5
year string // Год записи, может int нужно
comment string // Комментарий
embedded bool // Присутвует ли тэг
// Жанр
genre string
// Название аудиодорожки
title string
// Актёр озучания
artist string
// Название альбома
album string
// Записывается как 2/5, что значит 2 трэк из 5
track string
// Год записи, может int нужно
year string
// Комментарий
comment string
// Присутвует ли тэг
embedded bool
}
@[heap; minify]
@@ -21,21 +29,33 @@ pub struct ID3v23 {
size u64
// Название аудиодорожки
tit2 Frame
tpe1 Frame // Автор
tpe2 Frame // Исполнитель
talb Frame // Название альбома
tyer Frame // Год выпуска
trck Frame // Номер трека
tcon Frame // Жанр
tcop Frame // Композитор (автор)
apic Frame // Обложка
txxx Frame // Комментарий
unknown Frame // Затычка
others []Frame // Остальные фреймы
// Автор
tpe1 Frame
// Исполнитель
tpe2 Frame
// Название альбома
talb Frame
// Год выпуска
tyer Frame
// Номер трека
trck Frame
// Жанр
tcon Frame
// Композитор (автор)
tcop Frame
// Обложка
apic Frame
// Комментарий
txxx Frame
// Затычка
unknown Frame
// Остальные фреймы
others []Frame
encoded_header []u8
embedded bool // Присутвует ли тэг
version u8 = 3 // Версия тэга
// Присутвует ли тэг
embedded bool
// Версия тэга
version u8 = 3
title string = "ID3"
}
+5 -3
View File
@@ -99,7 +99,8 @@ pub fn encode_header[T](mut id3v T) {
// Минорная версия и спец. флаги
id3v.encoded_header << []u8{len: 2}
id3v.encoded_header << metadata.encode_header_size(id3v.size, id3v.version)
// Размер всего тэга в заголовке всегда syncsafe (по 7 бит в байте), в том числе в v2.3
id3v.encoded_header << metadata.encode_header_size(id3v.size, 4)
}
// Количество нулей в конце тэга
@@ -110,7 +111,8 @@ pub fn encode_embed_tags[T](mut id3v2 T) {
// Проход по всем полям стуктуры
mut tag_bytes := []u8{}
$for field in id3v2.fields {
// Именно T.fields: с id3v2.fields V пропускает поля, которых нет в другом типе (tyer в ID3v24)
$for field in T.fields {
$if field.typ is Frame {
// Читаются только заполненные тэги
if id3v2.$(field.name).cur_size > 0 {
@@ -133,4 +135,4 @@ pub fn encode_embed_tags[T](mut id3v2 T) {
id3v2.encoded_header = []u8{}
encode_header(mut id3v2)
id3v2.encoded_header << tag_bytes
}
}