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, 'Ошибка не возвращена' }