19

I was wondering what module to use for setting an image as the album art for a particular mp3 file. Mutagen seemed to be a popular choice, but it doesn't seem to work on python 3 and I can't find any documentation.

Lakshay Kalbhor
  • 577
  • 3
  • 7
  • 19

3 Answers3

27

Here's a modified version of the code I use. You will want to change the example.mp3 and cover.jpg (and perhaps the mime type too):

import eyed3
from eyed3.id3.frames import ImageFrame

audiofile = eyed3.load('example.mp3')
if (audiofile.tag == None):
    audiofile.initTag()

audiofile.tag.images.set(ImageFrame.FRONT_COVER, open('cover.jpg','rb').read(), 'image/jpeg')

audiofile.tag.save()

tag.images.set() takes three arguments:

  • Picture Type: This is the type of image it is. 3 is the code for the front cover art. You can find them all here.
  • Image Data: This is the binary data of your image. In the example, I load this in using open().read().
  • Mime Type: This is the type of file the binary data is. If it's a jpg file, you'll want image/jpeg, and if it's a png file, you'll want image/png.
Thomas Pritchard
  • 429
  • 3
  • 11
9

an addition to answers above, here is what I struggled on for two days:

  • you have to set the ID3 version to "V2.3", otherwise the photo won't show up for the file icon.

  • also you have to set a different album name for each MP3 file because otherwise the music player shows the same cover image for all music files even if they don't have a cover image.

  • you'd better set a title too because file name won't be displayed in music players.

  • using the audio.initTag() can also wipe all meta information if you would want that.

audio.initTag()
audio.tag.title = u'Your Title'
audio.tag.album = u'Your Album Name'
audio.tag.images.set(3, open("cover.jpg", 'rb').read(), 'image/jpeg')
audio.tag.save(version=eyed3.id3.ID3_V2_3)
Ryan Norooz
  • 1,358
  • 1
  • 12
  • 8
1

As of this writing mutagen already works fine with python3.

Copy-paste from https://stackoverflow.com/a/47346660/191246 with the tiny fix of adding the binary file mode for the image which is required with python3.

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

audio = MP3(path_mp3, ID3=ID3)
audio.tags.add(
    APIC(
        encoding=3,  # 3 is for utf-8
        mime="image/png",  # can be image/jpeg or image/png
        type=3,  # 3 is for the cover image
        desc='Cover',
        data=open("cover.png", mode='rb').read()
    )
)

NOTE: you might want to wrap in a try-except in order to catch ID3NoHeaderError which will be raised on MP3 files without an ID3 tag. In those cases you can create the tag with e.g. tags = ID3()... followed by tags.save('myaudio.mp3')

ccpizza
  • 28,968
  • 18
  • 162
  • 169