/* Copyright (C) 2008 Jason A. Donenfeld */ /* Use at your own risk. */ #include #include #include #include #include #include using namespace TagLib; using namespace std; int main(int argc, char *argv[]) { for(int i = 1; i < argc; i++) { MPEG::File *file = new MPEG::File(argv[i]); if(argc > 2) cout << "--File " << i << " of " << argc - 1 << "--" << endl; if(!file->isValid()) { cout << "[!] Could not open " << argv[i] << "." << endl; continue; } Tag *tag = file->tag(); if(tag->isEmpty()) { cout << "[!] No tags in " << argv[i] << "." << endl; continue; } cout << "[*] Reading " << argv[i] << ":" << endl; String artist = tag->artist().stripWhiteSpace(); String album = tag->album().stripWhiteSpace(); String title = tag->title().stripWhiteSpace(); TagLib::uint track = tag->track(); TagLib::uint year = tag->year(); String genre = tag->genre().stripWhiteSpace(); // COMMENTS ARE NOT SAVED. I HATE ID3 COMMENTS, SO THEY'RE STRIPPED OUT String disc; String bpm; String composer; String albumArtist; String compilation; if(file->ID3v2Tag()) { if(!file->ID3v2Tag()->frameListMap()["TPOS"].isEmpty()) disc = file->ID3v2Tag()->frameListMap()["TPOS"].front()->toString().stripWhiteSpace(); if(!file->ID3v2Tag()->frameListMap()["TBPM"].isEmpty()) bpm = file->ID3v2Tag()->frameListMap()["TBPM"].front()->toString().stripWhiteSpace(); if(!file->ID3v2Tag()->frameListMap()["TCOM"].isEmpty()) composer = file->ID3v2Tag()->frameListMap()["TCOM"].front()->toString().stripWhiteSpace(); if(!file->ID3v2Tag()->frameListMap()["TPE2"].isEmpty()) albumArtist = file->ID3v2Tag()->frameListMap()["TPE2"].front()->toString().stripWhiteSpace(); if(!file->ID3v2Tag()->frameListMap()["TCMP"].isEmpty()) compilation = file->ID3v2Tag()->frameListMap()["TCMP"].front()->toString().stripWhiteSpace(); } cout << "\tArtist: " << artist << endl << "\tComposer: " << composer << endl << "\tAlbum: " << album << endl << "\tAlbum Artist: " << albumArtist << endl << "\tTitle: " << title << endl << "\tTrack: " << track << endl << "\tDisc: " << disc << endl << "\tCompilation: " << compilation << endl << "\tYear: " << year << endl << "\tGenre: " << genre << endl; cout << "[*] Stripping tags and saving." << endl; file->strip(MPEG::File::AllTags); file->save(); delete file; cout << "[*] Re-opening and re-writing new tags." << endl; file = new MPEG::File(argv[i]); tag = file->tag(); tag->setArtist(artist); tag->setAlbum(album); tag->setTitle(title); tag->setTrack(track); tag->setYear(year); tag->setGenre(genre); ::ID3v2::TextIdentificationFrame *frame; if(!disc.isEmpty()) { frame = new ::ID3v2::TextIdentificationFrame("TPOS", ::ID3v2::FrameFactory::instance()->defaultTextEncoding()); frame->setText(disc); file->ID3v2Tag()->addFrame(frame); } if(!bpm.isEmpty()) { frame = new ::ID3v2::TextIdentificationFrame("TBPM", ::ID3v2::FrameFactory::instance()->defaultTextEncoding()); frame->setText(bpm); file->ID3v2Tag()->addFrame(frame); } if(!composer.isEmpty()) { frame = new ::ID3v2::TextIdentificationFrame("TCOM", ::ID3v2::FrameFactory::instance()->defaultTextEncoding()); frame->setText(composer); file->ID3v2Tag()->addFrame(frame); } if(!albumArtist.isEmpty()) { frame = new ::ID3v2::TextIdentificationFrame("TPE2", ::ID3v2::FrameFactory::instance()->defaultTextEncoding()); frame->setText(albumArtist); file->ID3v2Tag()->addFrame(frame); } if(!compilation.isEmpty()) { frame = new ::ID3v2::TextIdentificationFrame("TCMP", ::ID3v2::FrameFactory::instance()->defaultTextEncoding()); frame->setText(compilation); file->ID3v2Tag()->addFrame(frame); } cout << "[*] Saving file." << endl; file->save(); delete file; cout << "[*] Success." << endl; } }