All pastes #634480 Raw Edit

Someone

public text v1 · immutable
#634480 ·published 2007-07-26 12:52 UTC
rendered paste body
/*!
 * \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;
}