From e6f7d4700155729c4574254250f2fc70de6e59b8 Mon Sep 17 00:00:00 2001 From: lavruh Date: Sat, 15 Nov 2025 09:31:28 +0200 Subject: [PATCH 1/2] Fix: Mp3 parser should return not empty artist metadata --- lib/src/parser.dart | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/src/parser.dart b/lib/src/parser.dart index 7f9eec8..6aee6dc 100644 --- a/lib/src/parser.dart +++ b/lib/src/parser.dart @@ -25,9 +25,11 @@ AudioMetadata readMetadata(File track, {bool getImage = false}) { final a = AudioMetadata( file: track, album: mp3Metadata.album, - artist: mp3Metadata.bandOrOrchestra ?? - mp3Metadata.leadPerformer ?? - mp3Metadata.originalArtist, + artist: (mp3Metadata.bandOrOrchestra?.isNotEmpty ?? false) + ? mp3Metadata.bandOrOrchestra + : (mp3Metadata.leadPerformer?.isNotEmpty ?? false) + ? mp3Metadata.leadPerformer + : mp3Metadata.originalArtist, bitrate: mp3Metadata.bitrate, duration: mp3Metadata.duration, language: mp3Metadata.languages, From b1e272e6d687b5e846521b63cb0a613889f7907e Mon Sep 17 00:00:00 2001 From: lavruh Date: Sat, 15 Nov 2025 09:45:09 +0200 Subject: [PATCH 2/2] Fix: id3v4_writer incorrectly writes tags containing non latin symbols due to different data length --- lib/src/writers/id3v4_writer.dart | 5 +- test/mp3/cyrillic_symbols.mp3 | Bin 0 -> 46955 bytes test/mp3/mp3_parser_test.dart | 11 ++++ test/writers/id3v4_writer_test.dart | 89 ++++++++++++++++++++++++++++ 4 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 test/mp3/cyrillic_symbols.mp3 diff --git a/lib/src/writers/id3v4_writer.dart b/lib/src/writers/id3v4_writer.dart index 69b7662..e5ef356 100644 --- a/lib/src/writers/id3v4_writer.dart +++ b/lib/src/writers/id3v4_writer.dart @@ -184,12 +184,13 @@ class Id3v4Writer extends BaseMetadataWriter { void _writeFrame(BytesBuilder builder, String frameId, String data) { builder.add(frameId.codeUnits); - builder.add(_encodeSynchsafeInteger(data.length + 1)); + final encodedData = utf8.encode(data); + builder.add(_encodeSynchsafeInteger(encodedData.length + 1)); // flags builder.add([0, 0]); builder.addByte(0x03); - builder.add(utf8.encode(data)); + builder.add(encodedData); } void _writeFrameWithBytes( diff --git a/test/mp3/cyrillic_symbols.mp3 b/test/mp3/cyrillic_symbols.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..62cf3c32674f72f0d5cf4f9ddaf6462e82db60a1 GIT binary patch literal 46955 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 literal 0 HcmV?d00001 diff --git a/test/mp3/mp3_parser_test.dart b/test/mp3/mp3_parser_test.dart index f120e6b..6cde519 100644 --- a/test/mp3/mp3_parser_test.dart +++ b/test/mp3/mp3_parser_test.dart @@ -69,4 +69,15 @@ void main() { expect(result.duration, isNotNull); expect(result.duration!.inMilliseconds, closeTo(310, 5)); }); + + + test("Parse MP3 file with cyrillic symbols", () { + final track = File('./test/mp3/cyrillic_symbols.mp3'); + final result = readMetadata(track, getImage: false); + + expect(result.album, equals("Альбом")); + expect(result.artist, equals("Артист")); + expect(result.title, equals("Название")); + expect(result.lyrics, equals("Текст")); + }); } diff --git a/test/writers/id3v4_writer_test.dart b/test/writers/id3v4_writer_test.dart index 5015b32..178c759 100644 --- a/test/writers/id3v4_writer_test.dart +++ b/test/writers/id3v4_writer_test.dart @@ -126,6 +126,95 @@ void main() { expect(picture.bytes, equals([0, 1, 2, 3])); }, ); + + test( + "Write metadata with cyrillic symbols", + () { + final writer = Id3v4Writer(); + + final file = createTemporaryFile("test.mp3", mp3FrameHeaderCBR()); + + final metadata = Mp3Metadata(); + metadata.songName = "Какое-то название"; + metadata.originalArtist = "Новый артист"; + metadata.album = "Самый лучший альбом"; + metadata.trackNumber = 6; + metadata.trackTotal = 12; + metadata.year = 2007; + + writer.write(file, metadata); + + final resultMetadata = + ID3v2Parser().parse(file.openSync()) as Mp3Metadata; + + expect(resultMetadata.songName, equals(metadata.songName)); + expect( + resultMetadata.originalArtist, equals(metadata.originalArtist)); + expect(resultMetadata.album, equals(metadata.album)); + expect(resultMetadata.trackNumber, equals(6)); + expect(resultMetadata.trackTotal, equals(12)); + expect(resultMetadata.year, equals(metadata.year)); + }, + ); + + test( + "Write metadata with arabic symbols", + () { + final writer = Id3v4Writer(); + + final file = createTemporaryFile("test.mp3", mp3FrameHeaderCBR()); + + final metadata = Mp3Metadata(); + metadata.songName = "التيتل المعروف"; + metadata.originalArtist = "التيتل المعروف"; + metadata.album = "التيتل المعروف"; + metadata.trackNumber = 6; + metadata.trackTotal = 12; + metadata.year = 2007; + + writer.write(file, metadata); + + final resultMetadata = + ID3v2Parser().parse(file.openSync()) as Mp3Metadata; + + expect(resultMetadata.songName, equals(metadata.songName)); + expect( + resultMetadata.originalArtist, equals(metadata.originalArtist)); + expect(resultMetadata.album, equals(metadata.album)); + expect(resultMetadata.trackNumber, equals(6)); + expect(resultMetadata.trackTotal, equals(12)); + expect(resultMetadata.year, equals(metadata.year)); + }, + ); + + test( + "Write metadata with chinese symbols", + () { + final writer = Id3v4Writer(); + + final file = createTemporaryFile("test.mp3", mp3FrameHeaderCBR()); + final metadata = Mp3Metadata(); + metadata.songName = "这是一个标题"; + metadata.originalArtist = "新的艺术家"; + metadata.album = "这是一个标题"; + metadata.trackNumber = 6; + metadata.trackTotal = 12; + metadata.year = 2007; + + writer.write(file, metadata); + + final resultMetadata = + ID3v2Parser().parse(file.openSync()) as Mp3Metadata; + + expect(resultMetadata.songName, equals(metadata.songName)); + expect( + resultMetadata.originalArtist, equals(metadata.originalArtist)); + expect(resultMetadata.album, equals(metadata.album)); + expect(resultMetadata.trackNumber, equals(6)); + expect(resultMetadata.trackTotal, equals(12)); + expect(resultMetadata.year, equals(metadata.year)); + }, + ); }, ); }