void MetaBundle::readTags( TagLib::AudioProperties::ReadStyle readStyle ) { if( m_url.protocol() != "file" ) return; const QString path = m_url.path(); TagLib::FileRef fileref; TagLib::Tag *tag = 0; if( AmarokConfig::recodeID3v1Tags() && path.endsWith( ".mp3", false ) ) { TagLib::MPEG::File *mpeg = new TagLib::MPEG::File( QFile::encodeName( path ), true, readStyle ); fileref = TagLib::FileRef( mpeg ); if( mpeg->isValid() ) // we prefer ID3v1 over ID3v2 if recoding tags because // apparently this is what people who ignore ID3 standards want tag = mpeg->ID3v1Tag() ? (TagLib::Tag*)mpeg->ID3v1Tag() : (TagLib::Tag*)mpeg->ID3v2Tag(); } else { fileref = TagLib::FileRef( QFile::encodeName( path ), true, readStyle ); if( !fileref.isNull() ) tag = fileref.tag(); } if( !fileref.isNull() ) { if ( tag ) { #define strip( x ) TStringToQString( x ).stripWhiteSpace() m_title = strip( tag->title() ); m_artist = strip( tag->artist() ); m_album = strip( tag->album() ); m_comment = strip( tag->comment() ); m_genre = strip( tag->genre() ); m_year = tag->year() ? QString::number( tag->year() ) : QString(); m_track = tag->track() ? QString::number( tag->track() ) : QString(); #undef strip m_isValidMedia = true; } init( fileref.audioProperties() ); } //FIXME disabled for beta4 as it's simpler to not got 100 bug reports //else if( KMimeType::findByUrl( m_url )->is( "audio" ) ) // init( KFileMetaInfo( m_url, QString::null, KFileMetaInfo::Everything ) ); }
void Track::readTags() { QByteArray fileName = QFile::encodeName( p->url.toLocalFile() ); const char * encodedName = fileName.constData(); TagLib::FileRef fileref = TagLib::FileRef( encodedName, true, TagLib::AudioProperties::Fast); if ( !fileref.isNull() ) { if( fileref.tag() ) { TagLib::Tag *tag = fileref.tag(); p->title = !tag->title().isNull() ? TStringToQString( tag->title() ).trimmed() : QObject::tr("Unknown"); p->artist = !tag->artist().isNull() ? TStringToQString( tag->artist() ).trimmed() : QObject::tr("Unknown"); p->album = !tag->album().isNull() ? TStringToQString( tag->album() ).trimmed() : QObject::tr("Unknown"); p->comment = TStringToQString( tag->comment() ).trimmed(); p->genre = !tag->genre().isNull() ? TStringToQString( tag->genre() ).trimmed() : QObject::tr("Unknown"); p->year = tag->year() ? QString::number( tag->year() ) : QString::null; p->tracknumber = tag->track() ? QString::number( tag->track() ) : QString::null; p->length = fileref.audioProperties()->length(); p->counter = 0; p->rate = 0; //polish up empty tags if( p->title == QObject::tr("Unknown") ) { QFileInfo fileInfo(p->url.toLocalFile()); p->title = fileInfo.fileName().replace( '_', ' ' ).replace('.' + fileInfo.suffix(),"") ; } } } }
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; }
bool getAudioInfo(const QString& file, qint64* durationMiliSecs, int* bitrate) { TagLib::FileRef ref = Qomp::fileName2TaglibRef(file); if(!ref.isNull() && ref.audioProperties()) { TagLib::AudioProperties *prop = ref.audioProperties(); *bitrate = prop->bitrate(); *durationMiliSecs = prop->length() * 1000; return true; } return false; }
// Use Taglib to parse tags from file and add entried to wxListCtrl void AddFromFile_Taglib(wxListCtrl *listctrl, const std::map< wxString, long > &mapping, const wxString &filename) { TagLib::FileRef f = TagLib::FileRef(filename.c_str(), TagLib::String::UTF8 ); //TODO: is c_str() safe? if ( f.isNull() ) { wxLogError(wxT("Error: TagLib could not read ") + filename + wxT(".")); return; } if ( ! f.tag() ) { wxLogError(wxT("Error: TagLib could not read the tags of file ") + filename + wxT(".")); return; } TagLib::Tag *tag = f.tag(); auto idx = listctrl->GetItemCount(); auto row_idx = listctrl->InsertItem(idx, wxString::Format(wxT("%d"), idx) ); // TODO: check return values listctrl->SetItem(row_idx, mapping.find("Artist")->second, wxString(tag->artist().to8Bit(true)) ); listctrl->SetItem(row_idx, mapping.find("Trackname")->second, wxString(tag->title().to8Bit(true))); listctrl->SetItem(row_idx, mapping.find("Album")->second, wxString(tag->album().to8Bit(true))); if ( f.audioProperties() ) { TagLib::AudioProperties *properties = f.audioProperties(); int seconds = properties->length() % 60; int minutes = (properties->length() - seconds) / 60; wxString timestr = wxString::Format("%d:%02d", minutes, seconds); listctrl->SetItem(row_idx, mapping.find("Time")->second, timestr); } }