Чтение тэгов без обложки: с диска только нужные текстовые фреймы, у APIC — лишь признак

read_book_tags читал тэг целиком вместе с картинкой (у книг с обложкой 3 МБ — 3 МБ на файл
при каждом открытии книги). Теперь фреймы читаются по одному, обложка и ненужные фреймы
пропускаются; тэг с unsynchronisation (v2.3) — целиком, как раньше. Тест: на тэге с обложкой
3 МБ выделяется меньше 1 МБ, теги и has_cover те же.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
K1ndWha1eandClaude Opus 5.5 committed 2026-10-11 17:26:44 +03:00
1 parent dc13ae43b8
commit 4c9184aeb2
2 files changed
+113 -6

No files matched your search

+33
View File
@@ -82,6 +82,39 @@ fn test_roundtrip_v24() {
check_roundtrip('test_id3v24.mp3')
}
// Чтение тэгов не загружает обложку: у тэга с картинкой 3 МБ — только текстовые фреймы
fn test_read_skips_cover() {
for name in ['test_id3v23.mp3', 'test_id3v24.mp3'] {
path := tmp_copy(name)
defer {
os.rm(path) or {}
}
mut data := []u8{len: 3 * 1024 * 1024, init: u8(index % 251)}
data[0] = 0xFF
data[1] = 0xD8
tags := metadata.BookTags{
title: 'Глава 1'
album: 'Тень ветра'
author: 'Сафон'
series: 'Кладбище забытых книг'
}
metadata.write_book_tags(path, tags, cover: metadata.Cover{
mime: 'image/jpeg'
data: data
}) or { panic(err) }
before := u64(gc_heap_usage().total_bytes)
t := metadata.read_book_tags(path) or { panic(err) }
allocated := u64(gc_heap_usage().total_bytes) - before
assert t.has_cover
assert t.tags.title == 'Глава 1'
assert t.tags.album == 'Тень ветра'
assert t.tags.series == 'Кладбище забытых книг'
assert allocated < 1024 * 1024, '${name}: при чтении выделено ${allocated} Б'
// Обложку по-прежнему отдаёт read_cover
assert (metadata.read_cover(path) or { panic(err) }).data.len == data.len
}
}
// В файл без ID3v2 тэг добавляется в начало
fn test_write_without_id3v2() {
path := tmp_copy('test_id3v1.mp3')