bool CCover::GetComposer(TagLib::FileRef& fr, std::string& composer) { TagLib::MPEG::File * mpgfile = NULL; TagLib::Ogg::Vorbis::File * oggfile = NULL; TagLib::FLAC::File * flacfile = NULL; TagLib::Ogg::XiphComment * xiph = NULL; TagLib::ID3v2::Tag * id3v2 = NULL; #ifdef TAGLIB_HAVE_MP4 TagLib::MP4::File * mp4file = NULL; TagLib::MP4::Tag * mp4 = NULL; #endif if ((oggfile = dynamic_cast<TagLib::Ogg::Vorbis::File*>(fr.file()))) { xiph=oggfile->tag(); //log_debug("ogg"); } else if ((flacfile = dynamic_cast<TagLib::FLAC::File*>(fr.file()))) { xiph=flacfile->xiphComment(); id3v2=flacfile->ID3v2Tag(); //log_debug("flac"); } else if ((mpgfile = dynamic_cast<TagLib::MPEG::File*>(fr.file()))) { id3v2=mpgfile->ID3v2Tag(); //log_debug("mpg"); } #ifdef TAGLIB_HAVE_MP4 else if ((mp4file = dynamic_cast<TagLib::MP4::File*>(fr.file()))) { mp4=mp4file->tag(); } #endif #ifndef TAGLIB_HAVE_MP4 void* mp4 = NULL; #endif //log_debug4("xiph=%p, id3v2=%p, mp4=%p", xiph, id3v2, mp4); bool retval = true; if (xiph) retval = xiph_get_field(xiph, "COMPOSER",composer); else if (id3v2) retval = id3v2_get_field(id3v2, "TCOM",composer); #ifdef TAGLIB_HAVE_MP4 else if (mp4) retval = mp4_get_field(mp4file, "\251wrt",composer); #endif else retval = false; //log_debug2("composer = %s", composer.c_str()); return retval; }
Tune* tuneFromFile(const QString& file) { Tune* tune = new Tune(false); tune->file = file; TagLib::FileRef ref = fileName2TaglibRef(file); if(!ref.isNull()) { if(ref.tag()) { TagLib::Tag* tag = ref.tag(); tune->artist = safeTagLibString2QString( tag->artist() ); tune->album = safeTagLibString2QString( tag->album() ); tune->title = safeTagLibString2QString( tag->title() ); tune->trackNumber = QString::number( tag->track() ); tune->genre = safeTagLibString2QString( tag->genre() ); } Qomp::loadCover(tune, ref.file()); if(ref.audioProperties()) { TagLib::AudioProperties *prop = ref.audioProperties(); tune->duration = Qomp::durationSecondsToString( prop->length() ); tune->bitRate = QString::number( prop->bitrate() ); } tune->setMetadataResolved(true); } return tune; }
/* ** Attempts to extract cover art from audio files. ** */ bool CCover::GetEmbedded(const TagLib::FileRef& fr, const std::wstring& target) { bool found = false; if (TagLib::MPEG::File* file = dynamic_cast<TagLib::MPEG::File*>(fr.file())) { if (file->ID3v2Tag()) { found = ExtractID3(file->ID3v2Tag(), target); } if (!found && file->APETag()) { found = ExtractAPE(file->APETag(), target); } } else if (TagLib::FLAC::File* file = dynamic_cast<TagLib::FLAC::File*>(fr.file())) { found = ExtractFLAC(file, target); if (!found && file->ID3v2Tag()) { found = ExtractID3(file->ID3v2Tag(), target); } } else if (TagLib::ASF::File* file = dynamic_cast<TagLib::ASF::File*>(fr.file())) { found = ExtractASF(file, target); } else if (TagLib::APE::File* file = dynamic_cast<TagLib::APE::File*>(fr.file())) { if (file->APETag()) { found = ExtractAPE(file->APETag(), target); } } else if (TagLib::MPC::File* file = dynamic_cast<TagLib::MPC::File*>(fr.file())) { if (file->APETag()) { found = ExtractAPE(file->APETag(), target); } } return found; }
/* ** Attempts to extract cover art from audio files. ** */ bool QCoverArt::GetCover(const TagLib::FileRef& fr) { bool found = false; if (TagLib::MPEG::File* file = dynamic_cast<TagLib::MPEG::File*>(fr.file())) { if (file->ID3v2Tag()) { found = ExtractID3(file->ID3v2Tag()); } if (!found && file->APETag()) { found = ExtractAPE(file->APETag()); } } else if (TagLib::ASF::File* file = dynamic_cast<TagLib::ASF::File*>(fr.file())) { found = ExtractASF(file); } else if (TagLib::MP4::File* file = dynamic_cast<TagLib::MP4::File*>(fr.file())) { if (file->tag()) { found = ExtractMP4(file); } } else if (TagLib::FLAC::File* file = dynamic_cast<TagLib::FLAC::File*>(fr.file())) { found = ExtractFLAC(file); if (!found && file->ID3v2Tag()) { found = ExtractID3(file->ID3v2Tag()); } } else if (TagLib::APE::File* file = dynamic_cast<TagLib::APE::File*>(fr.file())) { if (file->APETag()) { found = ExtractAPE(file->APETag()); } } else if (TagLib::MPC::File* file = dynamic_cast<TagLib::MPC::File*>(fr.file())) { if (file->APETag()) { found = ExtractAPE(file->APETag()); } } else if (TagLib::WavPack::File* file = dynamic_cast<TagLib::WavPack::File*>(fr.file())) { if (file->APETag()) { found = ExtractAPE(file->APETag()); } } return found; }
BlockResult Block::eval(const TagLib::FileRef& file) { TagLib::PropertyMap metadata = file.tag()->properties(); TagLib::StringList list; std::stringstream ss; // TODO: Needs to be refactored // TODO: Add more ss << file.audioProperties()->length(); list.append(ss.str()); metadata.insert("length", list); list.clear(); ss.clear(); ss << file.audioProperties()->bitrate(); list.append(ss.str()); metadata.insert("bitrate", list); list.clear(); ss.clear(); if (file.audioProperties()->channels() == 1) { list.append("mono"); } else if (file.audioProperties()->channels() == 2) { list.append("stereo"); } //TODO: Add more channels names metadata.insert("channels", list); list.clear(); ss.clear(); ss << file.audioProperties()->sampleRate(); list.append(ss.str()); metadata.insert("samplerate", list); list.clear(); ss.clear(); list.append(file.file()->name()); metadata.insert("filename", list); list.clear(); ss.clear(); return this->eval(metadata); }
Meta::ReplayGainTagMap Meta::readReplayGainTags( const TagLib::FileRef &fileref ) { Meta::ReplayGainTagMap map; // NB: we can't get replay gain info from MPC files, since it's stored in some magic place // and not in the APE tags, and taglib doesn't let us access the information (unless // we want to parse the file ourselves). // FIXME: should we try getting the info from the MPC APE tag just in case? if ( TagLib::MPEG::File *file = dynamic_cast<TagLib::MPEG::File *>( fileref.file() ) ) { if ( file->ID3v2Tag() ) map = readID3v2Tags( file->ID3v2Tag() ); if ( map.isEmpty() && file->APETag() ) map = readAPETags( file->APETag() ); } else if ( TagLib::Ogg::Vorbis::File *file = dynamic_cast<TagLib::Ogg::Vorbis::File *>( fileref.file() ) ) { if ( file->tag() ) map = readXiphTags( file->tag() ); } else if ( TagLib::FLAC::File *file = dynamic_cast<TagLib::FLAC::File *>( fileref.file() ) ) { if ( file->xiphComment() ) map = readXiphTags( file->xiphComment() ); if ( map.isEmpty() && file->ID3v2Tag() ) map = readID3v2Tags( file->ID3v2Tag() ); } else if ( TagLib::Ogg::FLAC::File *file = dynamic_cast<TagLib::Ogg::FLAC::File *>( fileref.file() ) ) { if ( file->tag() ) map = readXiphTags( file->tag() ); } else if ( TagLib::WavPack::File *file = dynamic_cast<TagLib::WavPack::File *>( fileref.file() ) ) { if ( file->APETag() ) map = readAPETags( file->APETag() ); } else if ( TagLib::TrueAudio::File *file = dynamic_cast<TagLib::TrueAudio::File *>( fileref.file() ) ) { if ( file->ID3v2Tag() ) map = readID3v2Tags( file->ID3v2Tag() ); } else if ( TagLib::Ogg::Speex::File *file = dynamic_cast<TagLib::Ogg::Speex::File *>( fileref.file() ) ) { if ( file->tag() ) map = readXiphTags( file->tag() ); } else if ( TagLib::MPC::File *file = dynamic_cast<TagLib::MPC::File *>( fileref.file() ) ) { // This is NOT the correct way to get replay gain tags from MPC files, but // taglib doesn't allow us access to the real information. // This allows people to work around this issue by copying their replay gain // information to the APE tag. if ( file->APETag() ) map = readAPETags( file->APETag() ); } else if ( TagLib::ASF::File *file = dynamic_cast<TagLib::ASF::File *>( fileref.file() ) ) { if ( file->tag() ) map = readASFTags( file->tag() ); } // See comment above #ifdef DO_NOT_USE_THIS_UNTIL_FIXED else if ( TagLib::MP4::File *file = dynamic_cast<TagLib::MP4::File *>( fileref.file() ) ) { if ( file->tag() ) map = readMP4Tags( file->getMP4Tag() ); } #endif return map; }