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, 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 0000000..62cf3c3 Binary files /dev/null and b/test/mp3/cyrillic_symbols.mp3 differ 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)); + }, + ); }, ); }