Here is my code
import eyed3
audiofile = eyed3.load(\"19 Calvin Harris - Summer.mp3\")
print(audiofile.tag.artist)
This is an error
I think the problem lies within the module.
I did some debugging using this code:
from eyed3 import id3
tag = id3.Tag()
tag.parse("myfile.mp3")
print(tag.artist)
In the parse function, the file is opened and then passed to _loadV2Tag(fileobject). Then, the module reads the first few lines of the file header and checks if it begins with ID3.
if f.read(3) != "ID3":
return False
And here it returns false and I think this is where the error lies, because if I try to read the header myself, it is most definitely ID3.
>>> f = open("myfile.mp3", "rb")
>>> print(f.read(3))
b'ID3'
But full python3 support is not to be expected until version 0.8 according to https://bitbucket.org/nicfit/eyed3/issues/25/python-3-compatibilty which is available here: https://bitbucket.org/nicfit/eyed3/branch/py3
Try this:
if audiofile.tag is None:
audiofile.tag = eyed3.id3.Tag()
audiofile.tag.file_info = eyed3.id3.FileInfo("foo.id3")
audiofile.tag.artist=unicode(artist, "utf-8")
For Python 3 things have changed and my code runs on my Mac.
@yask was correct as you should be checking for non-existent values and this is my example:
Copy and paste and just adjust the path for your needs & can be used in a loop of file paths.
"""PlaceHolder."""
import re
from os import path as ospath
from eyed3 import id3
current_home = ospath.expanduser('~')
file_path = ospath.join(current_home,
'Music',
'iTunes',
'iTunes Media',
'Music',
'Aerosmith',
'Big Ones',
'01 Walk On Water.mp3',
)
def read_id3_artist(audio_file):
"""Module to read MP3 Meta Tags.
Accepts Path like object only.
"""
filename = audio_file
tag = id3.Tag()
tag.parse(filename)
# =========================================================================
# Set Variables
# =========================================================================
artist = tag.artist
title = tag.title
track_path = tag.file_info.name
# =========================================================================
# Check Variables Values & Encode Them and substitute back-ticks
# =========================================================================
if artist is not None:
artist.encode()
artistz = re.sub(u'`', u"'", artist)
else:
artistz = 'Not Listed'
if title is not None:
title.encode()
titlez = re.sub(u'`', u"'", title)
else:
titlez = 'Not Listed'
if track_path is not None:
track_path.encode()
track_pathz = re.sub(u'`', u"'", track_path)
else:
track_pathz = ('Not Listed, and you have an the worst luck, '
'because this is/should not possible.')
# =========================================================================
# print them out
# =========================================================================
try:
if artist is not None and title is not None and track_path is not None:
print('Artist: "{}"'.format(artistz))
print('Track : "{}"'.format(titlez))
print('Path : "{}"'.format(track_pathz))
except Exception as e:
raise e
read_id3_artist(file_path)
# Show Case:
# Artist: "Aerosmith"
# Track : "Walk On Water"
# Path : "/Users/MyUserName/Music/iTunes/iTunes Media/Music/Aerosmith/Big Ones/01 Walk On Water.mp3" # noqa
Title and Artists are available through accessor functions of the Tag()
return value. The example below shows how to get them using getArtist()
and getTitle()
methods.
import eyed3
tag = eyed3.Tag()
tag.link("/some/file.mp3")
print tag.getArtist()
print tag.getTitle()
Try this Code , it worked for me
import eyed3
def show_info():
audio = eyed3.load("[PATH_TO_MP3]")
print audio.tag.artist
print audio.tag.album
print audio.tag.title
show_info()