This library allow you to read and write ID3 tags to MP3 files. \ Based on JAudiotagger library.
Library actually works only on Android.
dependencies:
audiotagger: ^2.2.1
Audiotagger need access to read and write storage. \ To do this you can use Permission Handler library.
Initialize a new instance of the tagger;
final tagger = new Audiotagger();
Tag
objectObtain ID3 tags of the file as a Tag
object.
void getTags() async {
final String filePath = "/storage/emulated/0/file.mp3";
final Tag tag = await tagger.readTags(
path: filePath
);
}
This method does not read the artwork of the song. To do this, use the readArtwork
method.
The Tag
object has this schema: Tag
schema.
Obtain ID3 tags of the file as a Map
.
void getTagsAsMap() async {
final String filePath = "/storage/emulated/0/file.mp3";
final Map map = await tagger.readTagsAsMap(
path: filePath
);
}
This method does not read the artwork of the song. To do this, use the readArtwork
method.
The map has this schema: Map
of Tag
schema.
Obtain the artwork of the song as a Uint8List
.
void getArtwork() async {
final String filePath = "/storage/emulated/0/file.mp3";
final Uint8List bytes = await tagger.readArtwork(
path: filePath
);
}
AudioFile
objectObtain informations about the MP3 file as a Tag
object.
void getAudioFile() async {
final String filePath = "/storage/emulated/0/file.mp3";
final AudioFile audioFile = await tagger.readAudioFile(
path: filePath
);
}
The AudioFile
object has this schema: AudioFile
schema.
Obtain informations about the MP3 file as a Map
.
void getAudioFileAsMap() async {
final String filePath = "/storage/emulated/0/file.mp3";
final Map map = await tagger.readAudioFileAsMap(
path: filePath
);
}
The map has this schema: Map
of AudioFile
schema.
You can write the ID3 tags from a Map
. \
To reset a field, pass an empty string (""
). \
If the value is null
, the field will be ignored and it will not be written.
void setTagsFromMap() async {
final path = "storage/emulated/0/Music/test.mp3";
final tags = <String, String>{
"title": "Title of the song",
"artist": "A fake artist",
"album": "", //This field will be reset
"genre": null, //This field will not be written
};
final result = await tagger.writeTagsFromMap(
path: path,
tags: tags
);
}
The map has this schema: Map
of Tag
schema.
Tag
objectYou can write the ID3 tags from a Tag
object. \
To reset a field, pass an empty string (""
). \
If the value is null
, the field will be ignored and it will not be written.
void setTags() async {
final path = "storage/emulated/0/Music/test.mp3";
final tag = Tag(
title: "Title of the song",
artist: "A fake artist",
album: "", //This field will be reset
genre: null, //This field will not be written
);
final result = await tagger.writeTags(
path: path,
tag: tag,
);
}
The Tag
object has this schema: Tag
schema.
You can write a single tag field by specifying the field name. \
To reset the field, pass an empty string (""
). \
If the value is null
, the field will be ignored and it will not be written. \
void setTags() async {
final path = "storage/emulated/0/Music/test.mp3";
final result = await tagger.writeTag(
path: path,
tagField: "title",
value: "Title of the song"
);
}
Refer to Map
of Tag
schema for fields name.
These are the schemes of the Map
and classes asked and returned by Audiotagger.
Tag
classString? title;
String? artist;
String? genre;
String? trackNumber;
String? trackTotal;
String? discNumber;
String? discTotal;
String? lyrics;
String? comment;
String? album;
String? albumArtist;
String? year;
String? artwork; // It represents the file path of the song artwork.
Map
of Tag
<String, String>{
"title": value,
"artist": value,
"genre": value,
"trackNumber": value,
"trackTotal": value,
"discNumber": value,
"discTotal": value,
"lyrics": value,
"comment": value,
"album": value,
"albumArtist": value,
"year": value,
"artwork": value, // Null if obtained from readTags or readTagsAsMap
};
AudioFile
classint? length;
int? bitRate;
String? channels;
String? encodingType;
String? format;
int? sampleRate;
bool? isVariableBitRate;
Map
of AudioFile
<String, dynamic?>{
"length": length,
"bitRate": bitRate,
"channels": channels,
"encodingType": encodingType,
"format": format,
"sampleRate": sampleRate,
"isVariableBitRate": isVariableBitRate,
};
This library is developed and maintained by Nicolò Rebaioli
:globe_with_meridians: My website
:mailbox: niko.reba@gmail.com
Released under MIT license
Copyright 2021 Nicolò Rebaioli