Is there a way to read the mp3 tags of a file from the shell? Something like:
mp3tags MyFile.mp3 author
should output the author-tag of an mp3-file.
10 Answers
You can also use ffprobe
which is part of ffmpeg
.
sudo apt-get install ffmpeg
ffprobe file.mp3
If you don't want other information, like track length and so on, you can combine the output with grep:
ffprobe file.mp3 2>&1 | grep -A90 'Metadata:'
Or in order to get only the author:
ffprobe -loglevel error -show_entries format_tags=artist -of default=noprint_wrappers=1:nokey=1 file.mp3
You can select other tags by separating them with a comma, such as format_tags=title,album
.
I wanted to search for a keyword in all mp3 files in a folder. The folder had 486 files, so it became interesting to know which of the solutions mentioned here is the fastest. Here is the loop I used:
# sudo apt-get install ffmpeg lltag eyed3 mp3info id3v2 libimage-exiftool-perl libid3-tools id3tool
keyword='fill_me_in'
getTitleFF() { ffprobe "$1" 2>&1 | sed -E -n 's/^ *title *: (.*)/\1/p'; }
getTitleLL() { lltag --show-tags title "$1" | sed -nE 's/^ TITLE=(.*)/\1/p'; }
getTitleEyed() { eyeD3 2>&1 "$1" | sed -n 's|\x1b\[[0-9;]*mtitle[^:]*: ||p'; }
getTitleInfo() { mp3info -p %t "$1"; }
getTitleId3() { id3v2 -l "$1" | sed -nE 's/^(TIT2 \([^)]*\)|Title *): (.*)/\2/p'; }
getTitleExif() { exiftool -title -b "$1"; }
getTitleId3i() { id3info "$1" | sed -nE 's/^=== TIT2 \([^)]*\): //p'; }
getTitleTool() { id3tool "$1" | sed -n 's|^Song Title:\t||p'; }
for prog in FF LL Eyed Info Id3 Exif Id3i Tool; do
echo "=== getTitle${prog} ==="
time \
for file in *.mp3; do
if "getTitle${prog}" "$file" | grep -q "$keyword"; then
echo "$file"
fi
done
done
Notes:
lltag
andmp3info
don't find a title, because the files I was using had ID3v2 tags, see the comment by @s-prasanth: How to read mp3 tags in shell?eyeD3
is problematic to use programmatically, because it uses color codes (boldness).eyeD3
and alsoid3v2
(but only for ID3 v1 tags) return the title and the artist on the same line, which further complicates things; thereforegetTitleEyed
and sometimesgetTitleId3
return both the title and the artist, so please don't copy-paste those functions.getTitleId3 will only work for ID3 v2 tags, because
id3v2
has different formats for ID3v1- and ID3v2-tags, i.e.Title : Artist:
vs. ID3v2:
TIT2 (Title/songname/content description):
As the only program of these 5
eyeD3
prints a red warning for two of the files:Invalid mode/bitrate combination for layer II No ID3 v1.x/v2.x tag found!
It seems like those two files have ID3v1 tags, because those two files are the only ones where
lltag
andmp3info
can get a title. I'm wondering if this is a bug ineyeD3
as no other program mentioned here has a problem with these files ...
Results (real time):
Program | Version | Time / s
----------+------------+-----------
exiftool | 10.25 | 49.5 ± 0.5
lltag | 0.14.5 | 41 ± 1.0
ffprobe | 3.1.3-1+b3 | 33 ± 0.5
eyeD3 | 0.6.18 | 24 ± 0.5
id3info | 3.8.3 | 4.2 ± 0.1
id3v2 | 0.1.12 | 2.9 ± 0.1
id3tool | 1.2a | 1.7 ± 0.1
mp3info | 0.8.5a | 1.4 ± 0.1
Time-wise the winner here is id3tool
(mp3info is faster, but doesn't work with ID3 v2).
id3v2
is also quite fast, but the getTitleId3
function would need adjustment to also work with ID3v1-tags, which may at worst slow it down by factor 2.
-
1Wow. I have been an exiftool power user for years and I had no idea it could also read metadata for sound files! The ffprobe (or avprobe in my case) solution is also great, thanks. This is the best answer!– marlarMay 30, 2016 at 19:34
-
1Thanks for you gigantic work! Some of these tools are not available from my package manager in Fedora. Could you please include
id3info
in your comparison? Oct 1, 2016 at 11:46 -
ffmpeg
has another advantage: it works withaac
/m4a
files. Other tools don't seem to (or do you know otherwise?). I will also suggest searching itsFORMAT
section, to avoid cases where a stream also has atitle
etc.:ffprobe -loglevel error -show_entries format -i "$1" 2>&1 | sed -E -n 's|^TAG:title=(.*)$|\1|p'
. Jul 14, 2017 at 15:33 -
@JonathanY. You're right, AAC encoded audio stored in a M4A-containter file has non-ID3 metadata and therefore can only be read by ffmpeg and additionally exiftool, out of the selection in my answer.– mxmlnknSep 27, 2017 at 2:22
-
FLACs has another metadata format different from MP4/M4A namely vorbis comment metadata, but the tags can also be read with
exiftool
orffprobe
. The more specialized tool for this job would bemetaflac --list
from theflac
package. For oggexiftool
also works, but there also isvorbiscomment -l
from thevorbis-tools
package. Weirdlyvorbiscomment
andmetaflac
can not be interchanged, even though FLAC and OGG both have vorbis coment metadata?– mxmlnknFeb 20, 2018 at 15:32
Ok, I found a program by myself. It is called mp3info and installed by
sudo apt-get install mp3info
To get single mp3 tags from a file, one has to call
mp3info -p %a file.mp3
which gives the artist of the file. The %a means that one want to get the artist and there are some other keys for the other tags.
-
23Additional info: There are 4 different standards of mp3 tags id3v1, id3v2.2(obsolete), id3v2.3, id3v2.4 en.wikipedia.org/wiki/ID3. A file can have v1 and/or v2 tags (Yes v1 and v2 can coexist, but v2.x and v2.y cannot coexist). I believe v2.3 is the most widely used one. According to ibiblio.org/mp3info (See Todo) v2 tags are not supported by
mp3info
. You might want to look atid3v2
- It can edit/add v2 and display v1 and v2. If you don't like the way it displays the tags you can write a script that runsid3v2
and processes the output appropriately. Dec 11, 2012 at 8:04 -
@SPrasanth how to make it to display a specific tag. For example: only the artist of an mp3 file?– GowthamApr 23, 2014 at 11:10
-
@SPrasanth I got it. Thanks I'm using
-R
flag withgrep
to get the specified output.– GowthamApr 23, 2014 at 11:14 -
When you print the track title with %t, it prints it clipped. Dec 14, 2016 at 13:54
-
1
You can use eyed3. First, from a terminal, install:
sudo apt-get install eyed3
Then, run:
eyeD3 song.mp3
Combine that with grep
to get specific tags in one line.
eyeD3 song.mp3 | grep artist
(to strip all mp3 tags, see HERE)
-
1I tried this, and the command to use is eyeD3, with an uppercase D ;). But I found another tool, which better matches my needs, named mp3info. This can output mp3 tags without the need to use grep, which I prefer. Dec 8, 2012 at 13:29
-
eyeD3 works better for me because it works with id3v2, but @red_trumpet is right, the command should be
eyeD3
noteyed3
– bmaupinMay 29, 2013 at 4:03 -
1Use the display plugin to output tags in the desired format:
eyeD3 --plugin display -p "%t% by %a%" *
.– simlevJan 8, 2019 at 22:03 -
This doesn't display ALL tags, for example no ISRC. The below mentioned program id3v2 returns also the ISRC, but no duration...– minyvesAug 29, 2019 at 8:45
I prefer to use id3v2, just type id3v2 -l somefile.mp3
.
You can also see the id3v2 man page for more specific use.
-
-
Should definitely be the best answer, all other tools have dependencies problems on some distributions.– SergioJun 8, 2017 at 22:31
-
Here is recommended
mid3v2
instead because of the lack of Unicode support. Also id3v2 last update was on 2013. May 24, 2019 at 15:08
You can try exiftool(Read and write meta information in files).
"ExifTool is a platform-independent Perl library plus a command-line application for reading, writing and editing meta information in a wide variety of files. ExifTool supports many different metadata formats including EXIF, GPS, IPTC, XMP, JFIF, GeoTIFF, ICC Profile, Photoshop IRB, FlashPix, AFCP and ID3, as well as the maker notes of many digital cameras by Canon, Casio, FLIR, FujiFilm, GE, HP, JVC/Victor, Kodak, Leaf, Minolta/Konica-Minolta, Motorola, Nikon, Nintendo, Olympus/Epson, Panasonic/Leica, Pentax/Asahi, Phase One, Reconyx, Ricoh, Samsung, Sanyo, Sigma/Foveon and Sony." - ExifTool by Phil Harvey
Here is an example of the command:
exiftool test.mp3
ExifTool Version Number : 10.00
File Name : test.mp3
Directory : .
File Size : 8.2 MB
File Modification Date/Time : 2016:03:02 21:44:58+01:00
File Access Date/Time : 2016:04:06 21:34:01+02:00
File Inode Change Date/Time : 2016:03:02 21:45:36+01:00
File Permissions : rw-rw-r--
File Type : MP3
File Type Extension : mp3
MIME Type : audio/mpeg
MPEG Audio Version : 1
Audio Layer : 3
Sample Rate : 44100
Channel Mode : Stereo
MS Stereo : Off
Intensity Stereo : Off
Copyright Flag : False
Original Media : False
Emphasis : None
VBR Frames : 9544
VBR Bytes : 8467680
ID3 Size : 115419
Band : Tech N9ne Collabos
Album : Strangeulation (Deluxe Edition)
Composer : Tech N9ne Collabos
Genre : Rap & Hip-Hop
Copyright : 2014 Strange Music, Inc
Title : American Horror Story (feat. Ces Cru)
Artist : Tech N9ne Collabos
Track : 10
Year : 2014
Comment :
Lyrics :
Private : (Binary data 8192 bytes, use -b option to extract)
Picture MIME Type : image/jpeg
Picture Type : Front Cover
Picture Description :
Picture : (Binary data 104371 bytes, use -b option to extract)
Audio Bitrate : 272 kbps
Date/Time Original : 2014
Duration : 0:04:09 (approx)
Check out lltag
if you are looking for a solution which supports more than just mp3/ID3.
Install it with:
sudo apt-get install lltag
to view all tags with it: (-S
is for show)
lltag -S somefile.mp3
to view certain tags with it:
lltag --show-tags artist,album,title,number somefile.mp3
I've just recovered dozens of deleted mp3 files from a memory card using PhotoRec. PhotoRec is not able to recover the original file name, so assigns names to the files in order of recovery - eg. f1234567.mp3
.
I wanted a quick way of reading and listing the ID3 tags so that I could see what the recovered recordings were without having to open, listen to and rename each mp3 file in turn. I'm using Linux Mint 20 ('Ulyana') Cinnamon and have previously installed the free open source app EasyTAG for editing ID3 tags via a GUI.
If you open EasyTAG and navigate to the folder containing the mp3 files, its default behaviour is to list the file name (eg. f1234567.mp3
assigned by PhotoRec) alongside the Song Title (eg. La Vie En Rose) extracted from the Title
field of the ID3 tag for all files in that folder. I appreciate that this does not use the shell as stated in the original question, but is an alternative which is incredibly simple to use. Hope this helps.
Beets
You can start with this screencast and the Getting started guide
Install either:
pip install beets # latest version
apt install beets # repo version
Also:
- To just read the metadata:
exiftool -v3 *.mp3
mid3v2
from (python-mutagen
package) (instead ofid3v2
, last update was on 2013!)id3
- Editor for ID3 tags (not the same as this id3)id3tool
- Command line editor for id3 tagsid3ren
- id3 tagger and renamer
I have the same problem and need some app but I have python on my ubuntu, then I decide to use python. you can use the python package tinytag
if you have python on your ubuntu
first, install tinytag using pip
pip install tinytag
now
from tinytag import TinyTag
tag = TinyTag.get('/some/music.mp3')
print('This track is by %s.' % tag.artist)
print('It is %f seconds long.' % tag.duration)
A python mutagen
solution. To install the dependency use pip3 install mutagen
.
#!/usr/bin/env python3
import sys
from mutagen.id3 import ID3
from mutagen.mp3 import MP3
print(MP3(sys.argv[1], ID3=ID3).tags.pprint())
You might be interested in this approach in case you want to programmatically read/write tags. Some typical use cases can seen here.