How do you embed album art into an MP3 using Python?

21,690

Solution 1

Here is how to add example.png as album cover into example.mp3 with mutagen:

from mutagen.mp3 import MP3
from mutagen.id3 import ID3, APIC, error

audio = MP3('example.mp3', ID3=ID3)

# add ID3 tag if it doesn't exist
try:
    audio.add_tags()
except error:
    pass

audio.tags.add(
    APIC(
        encoding=3, # 3 is for utf-8
        mime='image/png', # image/jpeg or image/png
        type=3, # 3 is for the cover image
        desc=u'Cover',
        data=open('example.png').read()
    )
)
audio.save()

Solution 2

I've used the eyeD3 module to do this exact thing.

def update_id3(mp3_file_name, artwork_file_name, artist, item_title):    
    #edit the ID3 tag to add the title, artist, artwork, date, and genre
    tag = eyeD3.Tag()
    tag.link(mp3_file_name)
    tag.setVersion([2,3,0])
    tag.addImage(0x08, artwork_file_name)
    tag.setArtist(artist)
    tag.setDate(localtime().tm_year)
    tag.setTitle(item_title)
    tag.setGenre("Trance")
    tag.update()

Solution 3

Looks like you have to add a special type of frame to the MP3. See the site on ID3 tags

Also the tutorial for mutagen implies that you can add ID3 tags in mutagen see

Solution 4

Possible solution

Are you trying to embed images into a lot of files? If so, I found a script (see the link) that goes through a set of directories, looks for images, and the embeds them into MP3 files. This was useful for me when I wanted to actually have something to look at in CoverFlow on my (now defunct) iPhone.

Share:
21,690
jjnguy
Author by

jjnguy

About Me: I currently work for Design Center as a Sr. Software Engineer. Follow me on Twitter If you want to contact me personally, email me or send me a private message on twitter. jjnguy13 [at]gmail[dot] com

Updated on October 30, 2020

Comments

  • jjnguy
    jjnguy over 3 years

    I've been using mutagen for reading and writing MP3 tags, but I want to be able to embed album art directly into the file.

    • nosklo
      nosklo over 15 years
      isn't that a very bad idea? Won't you increase your mp3 sizes by embedding the same picture many times on all mp3 of a single album? Album art should belong to the folder where the album is located.
    • sdu
      sdu over 14 years
      @nosklo there are mp3 players showing only embedded pictures and not the one located in folder
    • Mark Ransom
      Mark Ransom almost 8 years
      @nosklo I have found that my mp3 files are so large that a tiny thumbnail doesn't make much difference. I estimated my average size at 6MB, I allow my thumbnails to be up to 60KB so they only add 1% to the file size. With JPEG that turns out to be plenty.
  • Tensigh
    Tensigh almost 9 years
    This doesn't work; I follow the code above and I get "TypeError: an integer is required"
  • Brutus
    Brutus over 8 years
    For me neither, I get: TypeError: 'str' object cannot be interpreted as an integer. Full trace and source here: gist.github.com/brutus/69c51cd706a6cf5d1594
  • Admin
    Admin over 8 years
    As of v0.7, usage is like this: audiofile = eyed43.load(file_name) and audiofile.tag.artist = artist, etc. See: eyed3.nicfit.net
  • Mark Ransom
    Mark Ransom over 7 years
    I found it necessary to use v2_version=3 in the save so that the new tags could be read by Windows 7, and I simplified this code by reading directly into an ID3 object. Otherwise this answer was perfect, none of the errors reported by others.
  • bittterbotter
    bittterbotter over 7 years
    The link expired.
  • Rajeev Atmakuri
    Rajeev Atmakuri over 7 years
    This blog does a good job of explaing the eyed3 implementation using the updated and latest API. tuxpool.blogspot.in/2013/02/…
  • MagTun
    MagTun about 7 years
    @MarkRansom, how did you "simplified this code by reading directly into an ID3 object"? Please post your code in an answer.
  • codezjx
    codezjx almost 7 years
    Great answer, but in my case, I found it necessary to add 'rb' mode to read success, just like this: data=open('example.png', 'rb').read()
  • Jaccoud
    Jaccoud almost 3 years
    eyeD3 does NOT support Unicode so it will fail whenever the paths to the music file or the picture contain any non-ASCII character. So it is useless if you have songs like "Canção do mar", "Dvořák's 9. Simphonie" or "昨日は歌を歌いました". I suggest Python's metagen module.