tinytag
tinytag is a Python library for reading audio file metadata
Install
python3 -m pip install tinytag
Features
- Read tags, images and properties of audio files
- Supported formats:
- MP3 / MP2 / MP1 (ID3 v1, v1.1, v2.2, v2.3+)
- M4A (AAC / ALAC)
- WAVE / WAV
- OGG (FLAC / Opus / Speex / Vorbis)
- FLAC
- WMA
- AIFF / AIFF-C
- Same API for all formats
- Small, portable library
- High code coverage
- Pure Python, no dependencies
- Supports Python 3.7 or higher
Important
Support for changing/writing metadata will not be added. Use another library such as Mutagen for this.
Usage
tinytag only provides the minimum needed for reading metadata, and presents it in a simple format. It can determine track number, total tracks, title, artist, album, year, duration and more.
tag: TinyTag = TinyTag.get('/some/music.mp3')
print(f'This track is by {tag.artist}.')
print(f'It is {tag.duration:.2f} seconds long.')
Warning
The ignore_errors parameter of TinyTag.get() is obsolete as of tinytag
2.0.0, and will be removed in the future.
Alternatively you can use tinytag directly on the command line:
$ python3 -m tinytag /some/music.mp3
{
"filename": "/some/music.mp3",
"filesize": 3243226,
"duration": 173.52,
"channels": 2,
"bitrate": 128,
"samplerate": 44100,
"artist": [
"artist name"
],
"album": [
"album name"
],
"title": [
"track name"
],
"track": 4,
"genre": [
"Jazz"
],
"year": [
"2010"
],
"comment": [
"Some comment here"
]
}
Check python3 -m tinytag --help for all CLI options, for example other
output formats.
Supported Files
To receive a tuple of file extensions tinytag supports, use the
SUPPORTED_FILE_EXTENSIONS constant:
Alternatively, check if a file is supported by providing its path:
Common Metadata
tinytag provides some common attributes, which always contain a single value. These are helpful when you need quick access to common metadata.
File/Audio Properties
tag.bitdepth # bit depth as integer (for lossless audio)
tag.bitrate # bitrate in kBits/s as float
tag.duration # audio duration in seconds as float
tag.filename # filename as string
tag.filesize # file size in bytes as integer
tag.samplerate # samples per second as integer
Warning
The tag.audio_offset attribute is obsolete as of tinytag 2.0.0, and will
be removed in the future.
Metadata Fields
tag.album # album as string
tag.albumartist # album artist as string
tag.artist # artist name as string
tag.comment # file comment as string
tag.composer # composer as string
tag.disc # disc number as integer
tag.disc_total # total number of discs as integer
tag.genre # genre as string
tag.title # title of the song as string
tag.track # track number as integer
tag.track_total # total number of tracks as integer
tag.year # year or date as string
Additional Metadata
For additional values of the same field type, uncommon metadata fields, or
metadata specific to certain file formats, use other:
tag.other # a dictionary of additional fields
Warning
The other dictionary has replaced the extra dictionary in tinytag 2.0.0.
The latter will be removed in a future release.
The following other field names are standardized in tinytag, and optionally
present when files provide such metadata:
barcode
bpm
catalog_number
conductor
copyright
director
encoded_by
encoder_settings
grouping
initial_key
isrc
language
license
lyricist
lyrics
media
movement
movement_name
movement_total
publisher
set_subtitle
show_movement
url
work
Additional other field names not documented above may be present, but are
format-specific and may change or disappear in future tinytag releases. If
tinytag does not expose metadata you need, or you wish to standardize more
field names, open a feature request on GitHub for discussion.
other values are always provided as strings, and are not guaranteed to be
valid. Should e.g. the bpm value in the file contain non-numeric characters,
tinytag will provide the string as-is. It is your responsibility to handle
possible exceptions, e.g. when converting the value to an integer.
Multiple values of the same field type are provided if a file contains them. Values are always provided as a list, even when only a single value exists.
Example:
tag: TinyTag = TinyTag.get('/some/music.mp3')
other_fields: OtherFields = tag.other
catalog_numbers: list[str] | None = other_fields.get('catalog_number')
if catalog_numbers:
catalog_number: str = catalog_numbers[0]
print(catalog_number)
print(catalog_numbers)
Output:
> 10
> ['10']