// Requires: // apt-get install libtag1-dev // // Pythonばっかだったから頭ごっちゃになる #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; void error(void) { cerr << "extractCoverArt infile outfile" << endl; exit(-1); } int saveCoverArt(TagLib::ByteVector d, string outfile) { FILE *f = fopen(outfile.c_str(), "wb"); if(f != NULL ){ fwrite(d.data(), 1,d.size(), f); fclose(f); return 0; } return -1; } int extractCoverArt(TagLib::FileRef ifile, string outfile) { if(TagLib::FLAC::File *f = dynamic_cast(ifile.file())) { // flac TagLib::List pl = f->pictureList(); if( !pl.isEmpty() ) { TagLib::FLAC::Picture *pic = pl[0]; // 最初のカバー return saveCoverArt(pic->data(), outfile); } else return -1; // 空 } if(TagLib::MPEG::File *f = dynamic_cast(ifile.file())) { if(f->ID3v2Tag()) { // ID3v2 TagLib::ID3v2::Tag* tag = f->ID3v2Tag(); TagLib::ID3v2::FrameList list = tag->frameList("APIC"); if(!list.isEmpty()) { TagLib::ID3v2::AttachedPictureFrame* frame = (TagLib::ID3v2::AttachedPictureFrame *)list.front(); // フロントカバー return saveCoverArt(frame->picture(), outfile); } else return -1; // 空 } else return -1; // ID3v2以外はサポートしない } if(TagLib::MP4::File *f = dynamic_cast(ifile.file())) { // MPEG-4/AAC TagLib::MP4::Tag *tag = f->tag(); TagLib::MP4::ItemListMap itemListMap = tag->itemListMap(); if(itemListMap.contains("covr")) { // カバー TagLib::MP4::CoverArtList list = itemListMap["covr"].toCoverArtList(); if(!list.isEmpty()){ TagLib::MP4::CoverArt *pic = &(list.front()); // フロントカバー return saveCoverArt(pic->data(), outfile); } else return -1; // 空 } else return -1; } // 未実装 return -1; } int main(int argc, char *argv[]) { if(argc < 3) error(); TagLib::FileRef ifile(argv[1]); if(ifile.isNull()) // メディアファイルでない error(); return extractCoverArt(ifile, string(argv[2])); }