Command line multi audio format meta tagging util
Command line utility based on TagLib (v1.11.1) to read/write basic meta information to the following common audio file formats:
MP3flacM4a
Basic functionality to:
- unified interface across all supported formats: goodbye to different tag names in
metaflacvsid3tagvsffmpegetc for simple tagging - clean - strip all tags except for very basic artist/title/genre etc
- sync - copy existing tags from other files or within same file, ie
APEtoID3v2onMP3 - delete - delete tags from file
- UTF8 tag data supported in tags which support it (NOT in
ID3v1)
Using ffmpeg/libavfilter will allow for more accurate file determination based on actual file container type, rather than file extension.
Based heavily on the tagwritter util from TabLib.
Multiple commands can be chained together in a single execution - however the file is only written to disk once. The output can be of two useful forms:
- mock
JSON - old
id3tagoutput
Drop the ID3v2 tag, add/change the artist, clear the comment and display the meta
$ audiotag -d2 -a "foo bar" -c "" -O json -l test.mp3
{
"file": {
"name": "test.mp3",
"size": 59938,
"mod_time": "Thu 22 Jun 2023 07:05:06 PM BST",
"audio_properties": {
"length": 3.631,
"bitrate": 129,
"samplerate": 44100,
"channels": 2,
"hash": "223286320b511145cd4da6a789348bb9ae704f724e413ff950d3eae397f36820"
}
},
"meta": [
{
"tag_type": "ID3v1",
"artist": "foo",
"title": "Japan Nippon",
"album": "audiotag test files",
"track": 2,
"year": 2007,
"genre": "Pop",
"comment": "this is a comment",
"artwork": false,
"properties": {
"ALBUM": [ "audiotag test files" ],
"ARTIST": [ "foo" ],
"COMMENT": [ "this is a comment" ],
"DATE": [ "2007" ],
"GENRE": [ "Pop" ],
"TITLE": [ "Japan Nippon" ],
"TRACKNUMBER": [ "2" ]
}
},
{
"tag_type": "APE",
"artist": "foo 香港 Hong Kong",
"title": "Japan 日本国 Nippon",
"album": "audiotag test files",
"track": 2,
"year": 1999,
"genre": "Pop",
"comment": null,
"artwork": false,
"properties": {
"ALBUM": [ "audiotag test files" ],
"ARTIST": [ "foo 香港 Hong Kong" ],
"DATE": [ "1999" ],
"GENRE": [ "Pop" ],
"TITLE": [ "Japan 日本国 Nippon" ],
"TRACKNUMBER": [ "2" ]
}
}
]
}
With the example above, we can see there is an ID3v1 and APE tag but no ID3v2 tag - we can clone the APE tag onto the ID3v2 whilst deleting the ID3v1 tag (it can't hold unicode text anyway, as seen in the album tag) in one command:
$ audiotag -d 1 -n "a:2" -A "music from 香港 by foo" -O json -l test.mp3
{
"file": {
"name": "test.mp3",
"size": 59938,
"mod_time": "Thu 22 Jun 2023 07:05:06 PM BST",
"audio_properties": {
"length": 3.631,
"bitrate": 129,
"samplerate": 44100,
"channels": 2,
"hash": "223286320b511145cd4da6a789348bb9ae704f724e413ff950d3eae397f36820"
}
},
"meta": [
{
"tag_type": "ID3v2",
"artist": "foo 香港 Hong Kong",
"title": "Japan 日本国 Nippon",
"album": "music from 香港 by foo",
"track": 2,
"year": 1999,
"genre": "Pop",
"comment": "id3v2 comment",
"artwork": false,
"properties": {
"ALBUM": [ "music from 香港 by foo" ],
"ARTIST": [ "foo 香港 Hong Kong" ],
"COMMENT": [ "id3v2 comment" ],
"DATE": [ "1999" ],
"GENRE": [ "Pop" ],
"RELEASEDATE": [ "1999-01-01" ],
"TITLE": [ "Japan 日本国 Nippon" ],
"TRACKNUMBER": [ "2" ]
}
},
{
"tag_type": "APE",
"artist": "foo 香港 Hong Kong",
"title": "Japan 日本国 Nippon",
"album": "audiotag test files",
"track": 2,
"year": 1999,
"genre": "Pop",
"comment": null,
"artwork": false,
"properties": {
"ALBUM": [ "audiotag test files" ],
"ARTIST": [ "foo 香港 Hong Kong" ],
"DATE": [ "1999" ],
"GENRE": [ "Pop" ],
"TITLE": [ "Japan 日本国 Nippon" ],
"TRACKNUMBER": [ "2" ]
}
}
]
}
TagLib provides a uniform set of property names across all tag formats which are shown in json output. The -P flag can add/remove property tags but the user is responsible for verifying if such a property is valid for that tag type.
$ audiotag test.mp3
{
"file": {
"name": "test.mp3",
"size": 59938,
"mod_time": "Sat 24 Jun 2023 09:17:08 AM BST",
"audio_properties": {
"length": 3.631,
"bitrate": 129,
"samplerate": 44100,
"channels": 2,
"hash": "223286320b511145cd4da6a789348bb9ae704f724e413ff950d3eae397f36820"
}
},
"meta": [
{
"tag_type": "ID3v2",
"artist": "foo 香港 Hong Kong",
"title": "Japan 日本国 Nippon",
"album": "audiotag test files",
"track": 2,
"year": 1999,
"genre": "Pop",
"comment": "id3v2 comment",
"artwork": false,
"properties": {
"ALBUM": [ "audiotag test files" ],
"ARTIST": [ "foo 香港 Hong Kong" ],
"COMMENT": [ "id3v2 comment" ],
"DATE": [ "1999" ],
"GENRE": [ "Pop" ],
"RELEASEDATE": [ "1999-12-25" ],
"TITLE": [ "Japan 日本国 Nippon" ],
"TRACKNUMBER": [ "2" ]
}
}
]
}
$ audiotag -P foo:bar,coke:cola -l test.mp3
{
"file": {
"name": "test.mp3",
"size": 59938,
"mod_time": "Sat 24 Jun 2023 09:17:44 AM BST",
"audio_properties": {
"length": 3.631,
"bitrate": 129,
"samplerate": 44100,
"channels": 2,
"hash": "223286320b511145cd4da6a789348bb9ae704f724e413ff950d3eae397f36820"
}
},
"meta": [
{
"tag_type": "ID3v2",
"artist": "foo 香港 Hong Kong",
"title": "Japan 日本国 Nippon",
"album": "audiotag test files",
"track": 2,
"year": 1999,
"genre": "Pop",
"comment": "id3v2 comment",
"artwork": false,
"properties": {
"ALBUM": [ "audiotag test files" ],
"ARTIST": [ "foo 香港 Hong Kong" ],
"COKE": [ "cola" ],
"COMMENT": [ "id3v2 comment" ],
"DATE": [ "1999" ],
"FOO": [ "bar" ],
"GENRE": [ "Pop" ],
"RELEASEDATE": [ "1999-12-25" ],
"TITLE": [ "Japan 日本国 Nippon" ],
"TRACKNUMBER": [ "2" ]
}
}
]
}
$ audiotag -P coke:,COMMENT:"an updated comment" -l test.mp3
{
"file": {
"name": "test.mp3",
"size": 59938,
"mod_time": "Sat 24 Jun 2023 09:18:01 AM BST",
"audio_properties": {
"length": 3.631,
"bitrate": 129,
"samplerate": 44100,
"channels": 2,
"hash": "223286320b511145cd4da6a789348bb9ae704f724e413ff950d3eae397f36820"
}
},
"meta": [
{
"tag_type": "ID3v2",
"artist": "foo 香港 Hong Kong",
"title": "Japan 日本国 Nippon",
"album": "audiotag test files",
"track": 2,
"year": 1999,
"genre": "Pop",
"comment": "an updated comment",
"artwork": false,
"properties": {
"ALBUM": [ "audiotag test files" ],
"ARTIST": [ "foo 香港 Hong Kong" ],
"COMMENT": [ "an updated comment" ],
"DATE": [ "1999" ],
"FOO": [ "bar" ],
"GENRE": [ "Pop" ],
"RELEASEDATE": [ "1999-12-25" ],
"TITLE": [ "Japan 日本国 Nippon" ],
"TRACKNUMBER": [ "2" ]
}
}
]
}
$ audiotag -w foo.jpg -y 1955-11-05 -T 1/10 -D 1/3 track1of10-on-disc1of3.mp3
Other file formats supported by Taglib can be added: this util relies on a File object to represent the underlying file and a corresponding Meta object that is directly coupled to handle the retrieval and updating of metadata. Any new objects will have to be registered with the FileFactory.
Note that the Taglib interface provides a Tag object that will be sufficient in most instances for the basic tagging operations.