import os import metadata // Проверка чтения id3v23 fn test_idv3v23() { mut audio := os.open("./data/test_id3v23.mp3") or { panic(err) } defer { audio.close() } mut wav := metadata.Audio{} wav.detect_tags(mut audio) assert wav.id3v1.embedded == false, 'Тег показан true, а должен быть false' assert wav.id3v23.embedded == true, 'Тег показан false, а должен быть true' assert wav.id3v24.embedded == false, 'Тег показан true, а должен быть false' wav.id3v23.get_full_size(mut audio) wav.id3v23.fill_tags(mut audio) assert wav.id3v23.tit2.data == "Test Title" assert wav.id3v23.tpe1.data == "Test Author" assert wav.id3v23.tpe2.data == "Test Narator" assert wav.id3v23.talb.data == "Test Album" assert wav.id3v23.tyer.data == "2026" assert wav.id3v23.trck.data == "6/7" assert wav.id3v23.tcon.data == "Rock" assert wav.id3v23.tcop.data == "Test" assert wav.id3v23.txxx.data == "comment" id3v1 := wav.id3v23.to_v1() assert id3v1.genre == "Rock" assert id3v1.title == "Test Title" assert id3v1.artist == "Test Narator" assert id3v1.album == "Test Album" assert id3v1.track == "6" assert id3v1.year == "2026" assert id3v1.comment == "comment" } fn test_writeidv3v23() { mut audio := os.open("./data/test_id3v23.mp3") or { panic(err) } defer { audio.close() } mut wav := metadata.Audio{} wav.detect_tags(mut audio) assert wav.id3v1.embedded == false, 'Тег показан true, а должен быть false' assert wav.id3v23.embedded == true, 'Тег показан false, а должен быть true' assert wav.id3v24.embedded == false, 'Тег показан true, а должен быть false' wav.id3v23.get_full_size(mut audio) wav.id3v23.fill_tags(mut audio) // Изменение значений тэга wav.id3v23.tit2.set_data("Test Title2") wav.id3v23.tpe1.set_data("Test Author2") wav.id3v23.tpe2.set_data("Test Narator2") wav.id3v23.talb.set_data("Test Album2") wav.id3v23.tyer.set_data("2027") wav.id3v23.trck.set_data("7/7") wav.id3v23.tcon.set_data("Rock2") wav.id3v23.tcop.set_data("Test2") wav.id3v23.txxx.set_data("comment2") wav.id3v23.encode_embed_tags() wav.id3v23.insert_tags_into_audio(mut audio) or { panic(err) } os.write_bytes("./data/temp_v23.mp3", wav.id3v23.encoded_header) or { panic(err) } // Чтение файла и проверка записи mut temp_audio := os.open("./data/temp_v23.mp3") or { panic(err) } defer { temp_audio.close() } mut temp_wav := metadata.Audio{} temp_wav.detect_tags(mut temp_audio) assert temp_wav.id3v1.embedded == false, 'Тег показан true, а должен быть false' assert temp_wav.id3v23.embedded == true, 'Тег показан false, а должен быть true' assert temp_wav.id3v24.embedded == false, 'Тег показан true, а должен быть false' temp_wav.id3v23.get_full_size(mut temp_audio) temp_wav.id3v23.fill_tags(mut temp_audio) assert temp_wav.id3v23.tit2.data == "Test Title2" assert temp_wav.id3v23.tpe1.data == "Test Author2" assert temp_wav.id3v23.tpe2.data == "Test Narator2" assert temp_wav.id3v23.talb.data == "Test Album2" assert temp_wav.id3v23.tyer.data == "2027" assert temp_wav.id3v23.trck.data == "7/7" assert temp_wav.id3v23.tcon.data == "Rock2" assert temp_wav.id3v23.tcop.data == "Test2" assert temp_wav.id3v23.txxx.data == "comment2" // Проверяется прочитанный с диска тэг, а не тот, что в памяти id3v1 := temp_wav.id3v23.to_v1() assert id3v1.genre == "Rock2" assert id3v1.title == "Test Title2" assert id3v1.artist == "Test Narator2" assert id3v1.album == "Test Album2" assert id3v1.track == "7" assert id3v1.year == "2027" assert id3v1.comment == "comment2" } // Проверка чтения id3v24 fn test_idv3v24() { mut audio := os.open("./data/test_id3v24.mp3") or { panic(err) } defer { audio.close() } mut wav := metadata.Audio{} wav.detect_tags(mut audio) assert wav.id3v1.embedded == false, 'Тег показан true, а должен быть false' assert wav.id3v23.embedded == false, 'Тег показан true, а должен быть false' assert wav.id3v24.embedded == true, 'Тег показан false, а должен быть true' wav.id3v24.get_full_size(mut audio) wav.id3v24.fill_tags(mut audio) assert wav.id3v24.tit2.data == "Test Title" assert wav.id3v24.tpe1.data == "Test Author" assert wav.id3v24.tpe2.data == "Test Narator" assert wav.id3v24.talb.data == "Test Album" assert wav.id3v24.tdrc.data == "2026" assert wav.id3v24.trck.data == "6/7" assert wav.id3v24.tcon.data == "Rock" assert wav.id3v24.tcop.data == "Test" assert wav.id3v24.txxx.data == "comment" id3v1 := wav.id3v24.to_v1() assert id3v1.genre == "Rock" assert id3v1.title == "Test Title" assert id3v1.artist == "Test Narator" assert id3v1.album == "Test Album" assert id3v1.track == "6" assert id3v1.year == "2026" assert id3v1.comment == "comment" } // Кириллица во фрейме с кодировкой ISO-8859-1 не должна превращаться в '?' fn test_write_unicode_into_latin1_frame() { mut audio := os.open("./data/test_id3v23.mp3") or { panic(err) } defer { audio.close() } mut wav := metadata.Audio{} wav.detect_tags(mut audio) wav.id3v23.get_full_size(mut audio) wav.id3v23.fill_tags(mut audio) old_size := int(wav.id3v23.size) wav.id3v23.tit2.set_data("Глава 2") wav.id3v23.encode_embed_tags() wav.id3v23.insert_tags_into_audio(mut audio) or { panic(err) } temp_path := os.join_path(os.temp_dir(), "id3_editor_unicode_test.mp3") os.write_bytes(temp_path, wav.id3v23.encoded_header) or { panic(err) } defer { os.rm(temp_path) or {} } mut temp_audio := os.open(temp_path) or { panic(err) } defer { temp_audio.close() } mut temp_wav := metadata.Audio{} temp_wav.detect_tags(mut temp_audio) temp_wav.id3v23.get_full_size(mut temp_audio) temp_wav.id3v23.fill_tags(mut temp_audio) assert temp_wav.id3v23.tit2.data == "Глава 2" // Нетронутые фреймы и аудио сохраняются без изменений assert temp_wav.id3v23.tpe1.data == "Test Author" assert temp_wav.id3v23.others.len == 1 original := os.read_bytes("./data/test_id3v23.mp3") or { panic(err) } written := os.read_bytes(temp_path) or { panic(err) } assert written[int(temp_wav.id3v23.size) + 10..] == original[old_size + 10..] } // Вставка в файл без тэга ID3v2 возвращает ошибку, а не падает fn test_insert_without_id3v2() { mut audio := os.open("./data/test_id3v1.mp3") or { panic(err) } defer { audio.close() } mut wav := metadata.Audio{} wav.id3v23.encode_embed_tags() wav.id3v23.insert_tags_into_audio(mut audio) or { assert err.msg() == "в файле нет тэга ID3v2" return } assert false, 'Ошибка не возвращена' }