Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions lib/src/parser.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
5 changes: 3 additions & 2 deletions lib/src/writers/id3v4_writer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -184,12 +184,13 @@ class Id3v4Writer extends BaseMetadataWriter<Mp3Metadata> {
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(
Expand Down
Binary file added test/mp3/cyrillic_symbols.mp3
Binary file not shown.
11 changes: 11 additions & 0 deletions test/mp3/mp3_parser_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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("Текст"));
});
}
89 changes: 89 additions & 0 deletions test/writers/id3v4_writer_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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));
},
);
},
);
}