/*!
* \brief Reads Metadata from a file.
*
* \param filename The filename to read metadata from.
* \returns Metadata pointer or NULL on error
*/
Metadata* MetaIOTagLib::read(QString filename)
{
QString artist = "", compilation_artist = "", album = "", title = "",
genre = "";
int year = 0, tracknum = 0, length = 0, playcount = 0, rating = 0, id = 0;
bool compilation = false;
QValueList<struct AlbumArtImage> albumart;
QString extension = filename.section( '.', -1 ) ;
File *taglib = new TagLib::MPEG::File(filename.local8Bit());
Tag *tag = taglib->tag();
if (!tag)
{
if (taglib)
delete taglib;
return NULL;
}
// Basic Tags
if (! tag->isEmpty())
{
title = TStringToQString(tag->title().stripWhiteSpace());
artist = TStringToQString(tag->artist().stripWhiteSpace());
album = TStringToQString(tag->album().stripWhiteSpace());
tracknum = tag->track();
year = tag->year();
genre = TStringToQString(tag->genre().stripWhiteSpace());
}
// ID3V2 Only Tags
if (taglib->ID3v2Tag())
{
// Compilation Artist (TPE4)
if(!taglib->ID3v2Tag()->frameListMap()["TPE4"].isEmpty())
compilation_artist = TStringToQString(
taglib->ID3v2Tag()->frameListMap()["TPE4"].front()->toString()
.stripWhiteSpace());
// Look for MusicBrainz Album+Artist ID in TXXX Frame
UserTextIdentificationFrame *musicbrainz = find(taglib->ID3v2Tag(),
"MusicBrainz Album Artist Id");
if (musicbrainz)
{
// If the MusicBrainz ID is the special "Various Artists" ID
// then compilation is TRUE
compilation = (MYTH_MUSICBRAINZ_ALBUMARTIST_UUID
== TStringToQString(musicbrainz->fieldList().front()));
}
// Length
if(!taglib->ID3v2Tag()->frameListMap()["TLEN"].isEmpty())
length = taglib->ID3v2Tag()->frameListMap()["TLEN"].front()->toString().toInt();
// Album Art
if(!taglib->ID3v2Tag()->frameListMap()["APIC"].isEmpty())
{
albumart = readAlbumArt(taglib->ID3v2Tag());
}
}
// Fallback to filename reading
if (title.isEmpty())
{
readFromFilename(filename, artist, album, title, genre, tracknum);
}
if (length <= 0 && taglib->audioProperties())
length = taglib->audioProperties()->length() * 1000;
if (taglib)
delete taglib;
// If we didn't get a valid length, add the metadata but show warning.
if (length <= 0)
VERBOSE(VB_GENERAL, QString("MetaIOTagLib: Failed to read length "
"from '%1'. It may be corrupt.").arg(filename));
// If we don't have title and artist or don't have the length return NULL
if (title.isEmpty() && artist.isEmpty())
{
VERBOSE(VB_IMPORTANT, QString("MetaIOTagLib: Failed to read metadata from '%1'")
.arg(filename));
return NULL;
}
Metadata *retdata = new Metadata(filename, artist, compilation_artist, album,
title, genre, year, tracknum, length,
id, rating, playcount);
retdata->setCompilation(compilation);
retdata->setEmbeddedAlbumArt(albumart);
return retdata;
}