/*! * \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 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; }