本文整理汇总了C++中taglib::Tag::comment方法的典型用法代码示例。如果您正苦于以下问题:C++ Tag::comment方法的具体用法?C++ Tag::comment怎么用?C++ Tag::comment使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类taglib::Tag
的用法示例。
在下文中一共展示了Tag::comment方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: MetaData
bool MetaData(const char* filepath, cFields& fields, cRow& props)
{
#define ADD(x, t) do { if (t) { fields.push_back(x); props.push_back(t); } } while(0)
#define ADDSTRING(x, t) do { if (!t.empty()) { fields.push_back(x); props.push_back(t); } } while(0)
#define ADDINT(x, t) do { std::string c = *itoa(t); if (!c.empty()){ fields.push_back(x); props.push_back(c);} } while(0)
TagLib::FileRef f(filepath);
fields.clear();
props.clear();
//cTag t;
//const char* tmp = NULL;
std::string tmp;
if (f.isNull())
{
std::cerr<< "Taglib failed on " << filepath << std::endl;
ADD("metadata_needs_update", "2"); // failure
return false;
}
TagLib::Tag *tag = f.tag();
if (tag)
{
#if 0
tmp = toString(tag->title()).c_str(); ADD("title", tmp);
tmp = toString(tag->artist()).c_str(); ADD("artist", tmp);
tmp = toString(tag->album()).c_str(); ADD("album", tmp);
tmp = toString(tag->comment()).c_str(); ADD("comment", tmp);
tmp = toString(tag->genre()).c_str(); ADD("genre", tmp);
#else
tmp = toString(tag->title()); ADDSTRING("title", tmp);
tmp = toString(tag->artist()); ADDSTRING("artist", tmp);
tmp = toString(tag->album()); ADDSTRING("album", tmp);
tmp = toString(tag->comment()); ADDSTRING("comment", tmp);
tmp = toString(tag->genre()); ADDSTRING("genre", tmp);
#endif
//ADDINT("track", tag->track());
ADDINT("year", tag->year());
}
TagLib::AudioProperties *prop = f.audioProperties();
if (prop)
{
ADDINT("bitrate", prop->bitrate());
ADDINT("samplerate", prop->sampleRate());
// ADDINT("channels", prop->channels());
ADDINT("length" , prop->length());
}
ADD("metadata_needs_update", "0");
return true;
}
示例2: readTags
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(),"") ;
}
}
}
}
示例3: getMp3Info
void getMp3Info(const WCHAR* fileName, MP3Info &info)
{
TagLib::FileRef f(fileName);
if (!f.isNull() && f.tag())
{
TagLib::Tag *tag = f.tag();
info.tag[0] = tag->title().toWString();
info.tag[1] = tag->artist().toWString();
info.tag[2] = tag->album().toWString();
info.tag[3] = tag->comment().toWString();
info.tag[4] = tag->genre().toWString();
info.year = tag->year();
info.track = tag->track();
TagLib::PropertyMap tags = f.file()->properties();
if (!f.isNull() && f.audioProperties())
{
TagLib::AudioProperties *properties = f.audioProperties();
int seconds = properties->length() % 60;
int minutes = (properties->length() - seconds) / 60;
info.bitrate = properties->bitrate();
info.sample_rate = properties->sampleRate();
info.channels = properties->channels();
info.length_minutes = minutes;
info.length_seconds = seconds;
}
}
}
示例4: urlObj
TagLibTokenizer::TagLibTokenizer(const Document *pDocument) :
Tokenizer(NULL),
m_pTagDocument(NULL)
{
if (pDocument != NULL)
{
Url urlObj(pDocument->getLocation());
string pseudoContent;
if ((urlObj.isLocal() == true) &&
(urlObj.getFile().empty() == false))
{
string location(urlObj.getLocation());
string trackTitle;
location += "/";
location += urlObj.getFile();
TagLib::FileRef fileRef(location.c_str(), false);
if (fileRef.isNull() == false)
{
TagLib::Tag *pTag = fileRef.tag();
if ((pTag != NULL) &&
(pTag->isEmpty() == false))
{
char yearStr[64];
trackTitle = pTag->title().to8Bit();
trackTitle += " ";
trackTitle += pTag->artist().to8Bit();
pseudoContent = trackTitle;
pseudoContent += " ";
pseudoContent += pTag->album().to8Bit();
pseudoContent += " ";
pseudoContent += pTag->comment().to8Bit();
pseudoContent += " ";
pseudoContent += pTag->genre().to8Bit();
snprintf(yearStr, 64, " %u", pTag->year());
pseudoContent += yearStr;
}
}
else
{
trackTitle = pseudoContent = pDocument->getTitle();
}
m_pTagDocument = new Document(trackTitle, pDocument->getLocation(),
pDocument->getType(), pDocument->getLanguage());
m_pTagDocument->setData(pseudoContent.c_str(), pseudoContent.length());
m_pTagDocument->setTimestamp(pDocument->getTimestamp());
m_pTagDocument->setSize(pDocument->getSize());
// Give the result to the parent class
setDocument(m_pTagDocument);
}
}
}
示例5: handle_file
int handle_file(const char* filepath, const char* filekey, AudioFileRecordStore& record_store)
{
bool record_exists = record_store.find_record(filekey) != NULL;
// Scanning a file for tags is expensive, so only do it if required.
if(record_exists
&& !record_store.record_update_required(filekey))
{
// no update reqquired so has been handled.
return 1;
}
TagLib::FileRef f(filepath);
if (!f.isNull() && f.tag())
{
AudioFileRecord &record = record_store.get_record(filekey);
record.update_start();
if (verbose)
{
TagLib::Tag *tag = f.tag();
std::cout << filepath << endl;
std::cout << filekey << endl;
std::cout << "-- TAG (basic) --" << endl;
std::cout << "title - \"" << tag->title() << "\"" << endl;
std::cout << "artist - \"" << tag->artist() << "\"" << endl;
std::cout << "album - \"" << tag->album() << "\"" << endl;
std::cout << "year - \"" << tag->year() << "\"" << endl;
std::cout << "comment - \"" << tag->comment() << "\"" << endl;
std::cout << "track - \"" << tag->track() << "\"" << endl;
std::cout << "genre - \"" << tag->genre() << "\"" << endl;
}
TagLib::PropertyMap tags = f.file()->properties();
for(TagLib::PropertyMap::ConstIterator i = tags.begin(); i != tags.end(); ++i)
{
for(TagLib::StringList::ConstIterator j = i->second.begin(); j != i->second.end(); ++j)
{
record.update(i->first.toCString(true), j->toCString(true));
}
}
if (f.audioProperties())
{
TagLib::AudioProperties *properties = f.audioProperties();
record.update(audio_tags::BITRATE, properties->bitrate());
record.update(audio_tags::LENGTH, properties->length());
record.update(audio_tags::SAMPLERATE, properties->sampleRate());
record.update(audio_tags::CHANNELS, properties->channels());
}
record.update_complete();
return 1;
}
return 0;
}
示例6: ReadTag
bool ReadTag(const musik::Core::String& fn, musik::Core::SongInfo& target)
{
bool ret = true;
musik::Core::Filename mfn(fn);
target.SetFilename(fn);
target.SetFormat("Ogg Vorbis");
try
{
#if defined (WIN32)
TagLib::FileRef tag_file(fn.c_str());
#else
TagLib::FileRef tag_file(utf16to8(fn, true).c_str());
#endif
if (!tag_file.isNull())
{
if (tag_file.tag())
{
TagLib::Tag *tag = tag_file.tag();
target.SetArtist(musik::Core::utf8to16(tag->artist().to8Bit(true)));
target.SetAlbum(musik::Core::utf8to16(tag->album().to8Bit(true)));
target.SetTitle(musik::Core::utf8to16(tag->title().to8Bit(true)));
target.SetGenre(musik::Core::utf8to16(tag->genre().to8Bit(true)));
target.SetNotes(musik::Core::utf8to16(tag->comment().to8Bit(true)));
target.SetYear(musik::Core::IntToString(tag->year()));
target.SetTrackNum(musik::Core::IntToString(tag->track()));
}
if (tag_file.audioProperties())
{
TagLib::AudioProperties *properties = tag_file.audioProperties();
int duration = properties->length() * 1000;
target.SetBitrate(musik::Core::IntToString(properties->bitrate()));
target.SetDuration(musik::Core::IntToString(duration));
}
}
// if the title is empty, then use the
// filename...
if (target.GetTitle().IsEmpty())
{
musik::Core::Filename MFN(fn);
target.SetTitle(MFN.GetJustFilename());
}
}
catch (...)
{
ret = false;
cout << "taglib crashed reading: " << fn.c_str() << endl;
}
return ret;
}
示例7: main
int main(int argc, char *argv[])
{
for(int i = 1; i < argc; i++) {
cout << "******************** \"" << argv[i] << "\" ********************" << endl;
TagLib::FileRef f(argv[i]);
if(!f.isNull() && f.tag()) {
TagLib::Tag *tag = f.tag();
cout << "-- TAG (basic) --" << endl;
cout << "title - \"" << tag->title() << "\"" << endl;
cout << "artist - \"" << tag->artist() << "\"" << endl;
cout << "album - \"" << tag->album() << "\"" << endl;
cout << "year - \"" << tag->year() << "\"" << endl;
cout << "comment - \"" << tag->comment() << "\"" << endl;
cout << "track - \"" << tag->track() << "\"" << endl;
cout << "genre - \"" << tag->genre() << "\"" << endl;
TagLib::PropertyMap tags = f.file()->properties();
unsigned int longest = 0;
for(TagLib::PropertyMap::ConstIterator i = tags.begin(); i != tags.end(); ++i) {
if (i->first.size() > longest) {
longest = i->first.size();
}
}
cout << "-- TAG (properties) --" << endl;
for(TagLib::PropertyMap::ConstIterator i = tags.begin(); i != tags.end(); ++i) {
for(TagLib::StringList::ConstIterator j = i->second.begin(); j != i->second.end(); ++j) {
cout << left << std::setw(longest) << i->first << " - " << '"' << *j << '"' << endl;
}
}
}
if(!f.isNull() && f.audioProperties()) {
TagLib::AudioProperties *properties = f.audioProperties();
int seconds = properties->length() % 60;
int minutes = (properties->length() - seconds) / 60;
cout << "-- AUDIO --" << endl;
cout << "bitrate - " << properties->bitrate() << endl;
cout << "sample rate - " << properties->sampleRate() << endl;
cout << "channels - " << properties->channels() << endl;
cout << "length - " << minutes << ":" << setfill('0') << setw(2) << seconds << endl;
}
}
return 0;
}
示例8: main
int main(int argc, char *argv[])
{
for(int i = 1; i < argc; i++) {
cout << "******************** \"" << argv[i] << "\" ********************" << endl;
TagLib::FileRef f(argv[i]);
if(!f.isNull() && f.tag()) {
TagLib::Tag *tag = f.tag();
cout << "-- TAG --" << endl;
cout << "title - \"" << tag->title() << "\"" << endl;
cout << "artist - \"" << tag->artist() << "\"" << endl;
cout << "album - \"" << tag->album() << "\"" << endl;
cout << "year - \"" << tag->year() << "\"" << endl;
cout << "comment - \"" << tag->comment() << "\"" << endl;
cout << "track - \"" << tag->track() << "\"" << endl;
cout << "genre - \"" << tag->genre() << "\"" << endl;
}
if(!f.isNull() && f.audioProperties()) {
TagLib::AudioProperties *properties = f.audioProperties();
int seconds = properties->length() % 60;
int minutes = (properties->length() - seconds) / 60;
cout << "-- AUDIO --" << endl;
cout << "bitrate - " << properties->bitrate() << endl;
cout << "sample rate - " << properties->sampleRate() << endl;
cout << "channels - " << properties->channels() << endl;
cout << "length - " << minutes << ":" << formatSeconds(seconds) << endl;
}
}
return 0;
}
示例9: parse
QString NTagReaderTaglib::parse(const QString &format, bool *success, bool stopOnFail)
{
if (format.isEmpty())
return "";
*success = true;
if (!isValid())
return "NTagReaderTaglib::InvalidFile";
TagLib::Tag *tag = NTaglib::_tagRef->tag();
TagLib::AudioProperties *ap = NTaglib::_tagRef->audioProperties();
int seconds_total = ap->length();
QString res;
for (int i = 0; i < format.size(); ++i) {
if (format.at(i) == '%') {
++i;
QChar ch = format.at(i);
if (ch == 'a') {
QString str = TStringToQString(tag->artist());
if (!(*success = !str.isEmpty()))
str = "<Unknown artist>";
res += str;
} else if (ch == 't') {
QString str = TStringToQString(tag->title());
if (!(*success = !str.isEmpty()))
str = "<Unknown title>";
res += str;
} else if (ch == 'A') {
QString str = TStringToQString(tag->album());
if (!(*success = !str.isEmpty()))
str = "<Unknown album>";
res += str;
} else if (ch == 'c') {
QString str = TStringToQString(tag->comment());
if (!(*success = !str.isEmpty()))
str = "<Empty comment>";
res += str;
} else if (ch == 'g') {
QString str = TStringToQString(tag->genre());
if (!(*success = !str.isEmpty()))
str = "<Unknown genre>";
res += str;
} else if (ch == 'y') {
QString str = QString::number(tag->year());
if (str == "0") {
str = "<Unknown year>";
*success = false;
}
res += str;
} else if (ch == 'n') {
QString str = QString::number(tag->track());
if (str == "0") {
str = "<Unknown track number>";
*success = false;
}
res += str;
} else if (ch == 'b') {
if (auto *prop = dynamic_cast<TagLib::APE::Properties *>(ap)) {
res += QString::number(prop->bitsPerSample());
}
else
if (auto *prop = dynamic_cast<TagLib::FLAC::Properties *>(ap)) {
res += QString::number(prop->sampleWidth());
}
else
if (auto *prop = dynamic_cast<TagLib::MP4::Properties *>(ap)) {
res += QString::number(prop->bitsPerSample());
}
else
if (auto *prop = dynamic_cast<TagLib::RIFF::AIFF::Properties *>(ap)) {
res += QString::number(prop->sampleWidth());
}
else
if (auto *prop = dynamic_cast<TagLib::RIFF::WAV::Properties *>(ap)) {
res += QString::number(prop->sampleWidth());
}
else
if (auto *prop = dynamic_cast<TagLib::TrueAudio::Properties *>(ap)) {
res += QString::number(prop->bitsPerSample());
}
else
if (auto *prop = dynamic_cast<TagLib::WavPack::Properties *>(ap)) {
res += QString::number(prop->bitsPerSample());
}
else {
res += "<Unknown bit depth>";
*success = false;
}
} else if (ch == 'd') {
QString duration;
if (seconds_total > 0) {
int seconds = seconds_total % 60;
int minutes = (seconds_total - seconds) / 60;
int hours = minutes / 60;
minutes = minutes % 60;
if (hours > 0)
duration.sprintf("%d:%02d:%02d", hours, minutes, seconds);
//.........这里部分代码省略.........
示例10: processTaglibFile
bool SoundSource::processTaglibFile(TagLib::File& f) {
if (s_bDebugMetadata)
qDebug() << "Parsing" << getFilename();
if (f.isValid()) {
TagLib::Tag *tag = f.tag();
if (tag) {
QString title = TStringToQString(tag->title());
setTitle(title);
QString artist = TStringToQString(tag->artist());
setArtist(artist);
QString album = TStringToQString(tag->album());
setAlbum(album);
QString comment = TStringToQString(tag->comment());
setComment(comment);
QString genre = TStringToQString(tag->genre());
setGenre(genre);
int iYear = tag->year();
QString year = "";
if (iYear > 0) {
year = QString("%1").arg(iYear);
setYear(year);
}
int iTrack = tag->track();
QString trackNumber = "";
if (iTrack > 0) {
trackNumber = QString("%1").arg(iTrack);
setTrackNumber(trackNumber);
}
if (s_bDebugMetadata)
qDebug() << "TagLib" << "title" << title << "artist" << artist << "album" << album << "comment" << comment << "genre" << genre << "year" << year << "trackNumber" << trackNumber;
}
TagLib::AudioProperties *properties = f.audioProperties();
if (properties) {
int lengthSeconds = properties->length();
int bitrate = properties->bitrate();
int sampleRate = properties->sampleRate();
int channels = properties->channels();
if (s_bDebugMetadata)
qDebug() << "TagLib" << "length" << lengthSeconds << "bitrate" << bitrate << "sampleRate" << sampleRate << "channels" << channels;
setDuration(lengthSeconds);
setBitrate(bitrate);
setSampleRate(sampleRate);
setChannels(channels);
}
// If we didn't get any audio properties, this was a failure.
return (properties!=NULL);
}
return false;
}
示例11: f
std::vector<std::string> GetFileInfo(std::string path)
{
std::vector<std::string> fileInfo;
std::string title, artist, album, genre, comment;
TagLib::FileRef f( path.c_str() );
if(!f.isNull() && f.tag())
{
TagLib::Tag *tag = f.tag();
// unicode = false
title = tag->title().stripWhiteSpace().toCString(false) ;
if(title.size())
{
std::stringstream temp;
temp << tr("Title") << ":\t";
temp << title;
fileInfo.push_back(temp.str());
}
artist = tag->artist().stripWhiteSpace().toCString(false) ;
if(artist.size())
{
std::stringstream temp;
temp << tr("Artist") << ":\t";
temp << artist;
fileInfo.push_back(temp.str());
}
album = tag->album().stripWhiteSpace().toCString(false) ;
if(album.size())
{
std::stringstream temp;
temp << tr("Album") << ":\t";
temp << album;
fileInfo.push_back(temp.str());
}
genre = tag->genre().stripWhiteSpace().toCString(false) ;
if(genre.size())
{
std::stringstream temp;
temp << tr("Genre") << ":\t";
temp << genre;
fileInfo.push_back(temp.str());
}
comment = tag->comment().stripWhiteSpace().toCString(false) ;
if(comment.size())
{
std::stringstream temp;
temp << tr("Comment") << ":\t";
temp << comment;
fileInfo.push_back(temp.str());
}
if(tag->year())
{
std::stringstream temp;
temp << tr("Year") << ":\t";
temp << tag->year();
fileInfo.push_back(temp.str());
}
if(tag->track())
{
std::stringstream temp;
temp << tr("Track") << ":\t";
temp << tag->track();
fileInfo.push_back(temp.str());
}
}
if(!f.isNull() && f.audioProperties())
{
TagLib::AudioProperties *props = f.audioProperties();
if(props->length())
{
int min = props->length()/60;
int sec = props->length()%60;
std::stringstream temp;
temp << tr("Length") << ":\t";
temp << min << ":";
if(sec<=9)
temp << "0";
temp << sec << " " << tr("min");
fileInfo.push_back(temp.str());
}
if(props->bitrate())
{
std::stringstream temp;
temp << tr("Bitrate") << ":\t";
temp << props->bitrate() << " kb/s";
fileInfo.push_back(temp.str());
}
if(props->sampleRate())
{
std::stringstream temp;
temp << tr("Samplerate") << ":\t";
//.........这里部分代码省略.........
示例12: extract
//.........这里部分代码省略.........
}
// Genre.
itOgg = lstOgg.find("GENRE");
if (itOgg != lstOgg.end()) {
genres.append((*itOgg).second);
}
}
}
// Handling multiple tags in Musepack files.
if (mimeType == QLatin1String("audio/x-musepack")) {
TagLib::MPC::File mpcFile(fileUrl.toUtf8().constData(), true);
if (mpcFile.tag() && !mpcFile.tag()->isEmpty()) {
TagLib::APE::ItemListMap lstMusepack = mpcFile.APETag()->itemListMap();
TagLib::APE::ItemListMap::ConstIterator itMPC;
// Artist.
itMPC = lstMusepack.find("ARTIST");
if (itMPC != lstMusepack.end()) {
if (!artists.isEmpty()) {
artists += ", ";
}
artists += (*itMPC).second.toString();
}
// Album Artist.
itMPC = lstMusepack.find("ALBUMARTIST");
if (itMPC != lstMusepack.end()) {
if(!albumArtists.isEmpty()) {
albumArtists += ", ";
}
albumArtists += (*itMPC).second.toString();
}
// Composer.
itMPC = lstMusepack.find("COMPOSER");
if (itMPC != lstMusepack.end()) {
if (!composers.isEmpty()) {
composers += ", ";
}
composers += (*itMPC).second.toString();
}
// Lyricist.
itMPC = lstMusepack.find("LYRICIST");
if (itMPC != lstMusepack.end()) {
if (!lyricists.isEmpty()) {
lyricists += ", ";
}
lyricists += (*itMPC).second.toString();
}
// Genre.
itMPC = lstMusepack.find("GENRE");
if (itMPC != lstMusepack.end()) {
genres.append((*itMPC).second.toString());
}
}
}
if (!tags->isEmpty()) {
QString title = t2q(tags->title());
if (!title.isEmpty()) {
result->add(Property::Title, title);
}
QString comment = t2q(tags->comment());
if (!comment.isEmpty()) {
result->add(Property::Comment, comment);
}
if (genres.isEmpty()) {
genres.append(tags->genre());
}
for (uint i = 0; i < genres.size(); i++) {
QString genre = t2q(genres[i]).trimmed();
// Convert from int
bool ok = false;
int genreNum = genre.toInt(&ok);
if (ok) {
genre = t2q(TagLib::ID3v1::genre(genreNum));
}
result->add(Property::Genre, genre);
}
QString artistString;
if (artists.isEmpty()) {
artistString = t2q(tags->artist());
} else {
artistString = t2q(artists).trimmed();
}
QStringList artists = contactsFromString(artistString);
foreach(const QString& artist, artists) {
result->add(Property::Artist, artist);
}
示例13: main
int main(int argc, char *argv[])
{
for(int i = 1; i < argc; i++) {
cout << "******************** \"" << argv[i] << "\" ********************" << endl;
TagLib::FileRef f(argv[i]);
if(!f.isNull() && f.tag()) {
TagLib::Tag *tag = f.tag();
cout << "-- TAG --" << endl;
cout << "title - \"" << tag->title() << "\"" << endl;
cout << "artist - \"" << tag->artist() << "\"" << endl;
cout << "album artist - \"" << tag->albumArtist() << "\"" << endl;
cout << "album - \"" << tag->album() << "\"" << endl;
cout << "year - \"" << tag->year() << "\"" << endl;
cout << "comment - \"" << tag->comment() << "\"" << endl;
cout << "track - \"" << tag->track() << "\"" << endl;
cout << "genre - \"" << tag->genre() << "\"" << endl;
cout << "grouping - \"" << tag->grouping() << "\"" << endl;
TagLib::Ogg::XiphComment *comment = NULL;
TagLib::FLAC::File *flac = dynamic_cast<TagLib::FLAC::File *>(f.file());
if (flac) {
cout << "flac:" << endl;
cout << "id3v1 - \"" << flac->ID3v1Tag() << "\"" << endl;
cout << "id3v2 - \"" << flac->ID3v2Tag() << "\"" << endl;
cout << "xiph - \"" << flac->xiphComment() << "\"" << endl;
comment = flac->xiphComment();
}
if (!comment) {
comment = dynamic_cast<TagLib::Ogg::XiphComment *>(tag);
}
if (comment) {
TagLib::Ogg::FieldListMap fields = comment->fieldListMap();
for(TagLib::Ogg::FieldListMap::ConstIterator it = fields.begin(), end = fields.end(); it != end; it++) {
if (!it->second.isEmpty())
cout << "xiph:" << it->first << " \"" << it->second[0].substr(0,3) << "\"" << endl;
}
}
cout << "pictures- \"" << f.file()->pictures().size() << "\"" << endl;
TagLib::File::PictureList l = f.file()->pictures();
for (TagLib::File::_PictureList::ConstIterator i = l.begin(), end = l.end(); i != end; i++) {
cout << "\t" << (*i)->typeName() << ' ' << (*i)->mimeType() << ' ' << (*i)->base64data().size() << endl;
}
cout << "pictures- \"" << tag->pictures().size() << "\"" << endl;
}
if(!f.isNull() && f.audioProperties()) {
TagLib::AudioProperties *properties = f.audioProperties();
int seconds = properties->length() % 60;
int minutes = (properties->length() - seconds) / 60;
cout << "-- AUDIO --" << endl;
cout << "bitrate - " << properties->bitrate() << endl;
cout << "sample rate - " << properties->sampleRate() << endl;
cout << "channels - " << properties->channels() << endl;
cout << "length - " << minutes << ":" << formatSeconds(seconds) << endl;
}
}
return 0;
}
示例14: readOnlyStream
Tags *TagUtils::load(const QString &filename) {
#ifdef Q_OS_WIN
const wchar_t * encodedName = reinterpret_cast<const wchar_t*>(filename.utf16());
TagLib::FileStream readOnlyStream(encodedName, true);
#else
TagLib::FileStream readOnlyStream((TagLib::FileName)filename.toUtf8(), true);
#endif
TagLib::FileRef fileref(&readOnlyStream);
if (fileref.isNull()) {
qDebug() << "Taglib cannot parse" << filename;
return nullptr;
}
Tags *tags = new Tags();
tags->setFilename(filename);
TagLib::Tag *tag = fileref.tag();
if (tag) {
tags->setTitle(TagUtils::qString(tag->title()));
tags->setArtistString(TagUtils::qString(tag->artist()));
tags->setAlbumString(TagUtils::qString(tag->album()));
tags->setGenre(TagUtils::qString(tag->genre()));
tags->setTrackNumber(tag->track());
tags->setYear(tag->year());
tags->setComment(TagUtils::qString(tag->comment()));
TagLib::AudioProperties *audioProperties = fileref.audioProperties();
if (audioProperties)
tags->setDuration(audioProperties->length());
}
/*
TagLib::PropertyMap map = tag->properties();
for (TagLib::PropertyMap::ConstIterator i = map.begin(); i != map.end(); ++i) {
for (TagLib::StringList::ConstIterator j = i->second.begin(); j != i->second.end(); ++j) {
const QString tagName = TagLibUtils::toQString(i->first);
qDebug() << "PropertyMap" << tagName << TagLibUtils::toQString(*j);
if (tagName == QLatin1String("ALBUMARTIST"))
tags->setAlbumArtist(TagLibUtils::toQString(*j));
else if (tagName == QLatin1String("DISCNUMBER"))
tags->setDiskNumber(TagLibUtils::toQString(*j).toInt());
// else if (tagName == QLatin1String("COMPOSER"))
// tags->setComposer(toQString(*j));
else if (tagName == QLatin1String("LYRICS"))
tags->setLyrics(TagLibUtils::toQString(*j));
//else if (tagName == QLatin1String("BPM"))
// tags->bpm = toQString(*j).toInt();
// else qDebug() << "Unused tag" << tagName << toQString(*j);
}
}
*/
// Handle file types where TagLibf:::File::tag() returns a "TagUnion"
TagLib::File *file = fileref.file();
if (TagLib::MPEG::File *f = dynamic_cast<TagLib::MPEG::File*>(file)) {
if (TagLib::ID3v2::Tag *t = f->ID3v2Tag()) Id3Utils::load(t, tags);
} else if (TagLib::TrueAudio::File *f = dynamic_cast<TagLib::TrueAudio::File*>(file)) {
if (TagLib::ID3v2::Tag *t = f->ID3v2Tag()) Id3Utils::load(t, tags);
} else if (TagLib::FLAC::File *f = dynamic_cast<TagLib::FLAC::File*>(file)) {
if (TagLib::Ogg::XiphComment *t = f->xiphComment()) VorbisUtils::load(t, tags);
else if (TagLib::ID3v2::Tag *t = f->ID3v2Tag()) Id3Utils::load(t, tags);
} else if (TagLib::APE::File *f = dynamic_cast<TagLib::APE::File*>(file)) {
if (TagLib::APE::Tag *t = f->APETag()) ApeUtils::load(t, tags);
} else if (TagLib::MPC::File *f = dynamic_cast<TagLib::MPC::File*>(file)) {
if (TagLib::APE::Tag *t = f->APETag()) ApeUtils::load(t, tags);
} else if (TagLib::WavPack::File *f = dynamic_cast<TagLib::WavPack::File*>(file)) {
if (TagLib::APE::Tag *t = f->APETag()) ApeUtils::load(t, tags);
} else {
// Fallback to casting tag() for any other file type
TagLib::Tag *tag = file->tag();
if (TagLib::ID3v2::Tag *t = dynamic_cast<TagLib::ID3v2::Tag*>(tag))
Id3Utils::load(t, tags);
else if (TagLib::Ogg::XiphComment *t = dynamic_cast<TagLib::Ogg::XiphComment*>(tag))
VorbisUtils::load(t, tags);
else if (TagLib::APE::Tag *t = dynamic_cast<TagLib::APE::Tag*>(tag))
ApeUtils::load(t, tags);
else if (TagLib::MP4::Tag *t = dynamic_cast<TagLib::MP4::Tag*>(tag))
Mp4Utils::load(t, tags);
else if (TagLib::ASF::Tag *t = dynamic_cast<TagLib::ASF::Tag*>(tag))
AsfUtils::load(t, tags);
}
return tags;
}
示例15: ReadFile
void TagReader::ReadFile(const QString& filename,
pb::tagreader::SongMetadata* song) const {
const QByteArray url(QUrl::fromLocalFile(filename).toEncoded());
const QFileInfo info(filename);
qLog(Debug) << "Reading tags from" << filename;
song->set_basefilename(DataCommaSizeFromQString(info.fileName()));
song->set_url(url.constData(), url.size());
song->set_filesize(info.size());
song->set_mtime(info.lastModified().toTime_t());
song->set_ctime(info.created().toTime_t());
std::unique_ptr<TagLib::FileRef> fileref(factory_->GetFileRef(filename));
if (fileref->isNull()) {
qLog(Info) << "TagLib hasn't been able to read " << filename << " file";
return;
}
TagLib::Tag* tag = fileref->tag();
if (tag) {
Decode(tag->title(), nullptr, song->mutable_title());
Decode(tag->artist(), nullptr, song->mutable_artist()); // TPE1
Decode(tag->album(), nullptr, song->mutable_album());
Decode(tag->genre(), nullptr, song->mutable_genre());
song->set_year(tag->year());
song->set_track(tag->track());
song->set_valid(true);
}
QString disc;
QString compilation;
// Handle all the files which have VorbisComments (Ogg, OPUS, ...) in the same
// way;
// apart, so we keep specific behavior for some formats by adding another
// "else if" block below.
if (TagLib::Ogg::XiphComment* tag =
dynamic_cast<TagLib::Ogg::XiphComment*>(fileref->file()->tag())) {
ParseOggTag(tag->fieldListMap(), nullptr, &disc, &compilation, song);
}
if (TagLib::MPEG::File* file =
dynamic_cast<TagLib::MPEG::File*>(fileref->file())) {
if (file->ID3v2Tag()) {
const TagLib::ID3v2::FrameListMap& map = file->ID3v2Tag()->frameListMap();
if (!map["TPOS"].isEmpty())
disc = TStringToQString(map["TPOS"].front()->toString()).trimmed();
if (!map["TBPM"].isEmpty())
song->set_bpm(TStringToQString(map["TBPM"].front()->toString())
.trimmed()
.toFloat());
if (!map["TCOM"].isEmpty())
Decode(map["TCOM"].front()->toString(), nullptr,
song->mutable_composer());
if (!map["TIT1"].isEmpty()) // content group
Decode(map["TIT1"].front()->toString(), nullptr,
song->mutable_grouping());
// Skip TPE1 (which is the artist) here because we already fetched it
if (!map["TPE2"].isEmpty()) // non-standard: Apple, Microsoft
Decode(map["TPE2"].front()->toString(), nullptr,
song->mutable_albumartist());
if (!map["TCMP"].isEmpty())
compilation =
TStringToQString(map["TCMP"].front()->toString()).trimmed();
if (!map["APIC"].isEmpty()) song->set_art_automatic(kEmbeddedCover);
// Find a suitable comment tag. For now we ignore iTunNORM comments.
for (int i = 0; i < map["COMM"].size(); ++i) {
const TagLib::ID3v2::CommentsFrame* frame =
dynamic_cast<const TagLib::ID3v2::CommentsFrame*>(map["COMM"][i]);
if (frame && TStringToQString(frame->description()) != "iTunNORM") {
Decode(frame->text(), nullptr, song->mutable_comment());
break;
}
}
// Parse FMPS frames
for (int i = 0; i < map["TXXX"].size(); ++i) {
const TagLib::ID3v2::UserTextIdentificationFrame* frame =
dynamic_cast<const TagLib::ID3v2::UserTextIdentificationFrame*>(
map["TXXX"][i]);
if (frame && frame->description().startsWith("FMPS_")) {
ParseFMPSFrame(TStringToQString(frame->description()),
TStringToQString(frame->fieldList()[1]), song);
}
}
// Check POPM tags
// We do this after checking FMPS frames, so FMPS have precedence, as we
//.........这里部分代码省略.........