extractCoverArt.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. // Requires:
  2. // apt-get install libtag1-dev
  3. //
  4. // Pythonばっかだったから頭ごっちゃになる
  5. #include <iostream>
  6. #include <iomanip>
  7. #include <string>
  8. #include <stdio.h>
  9. #include <taglib/fileref.h>
  10. #include <taglib/tag.h>
  11. #include <taglib/tpropertymap.h>
  12. #include <taglib/fileref.h>
  13. #include <taglib/apefile.h>
  14. #include <taglib/apetag.h>
  15. #include <taglib/asffile.h>
  16. #include <taglib/attachedpictureframe.h>
  17. #include <taglib/commentsframe.h>
  18. #include <taglib/flacfile.h>
  19. #include <taglib/id3v1genres.h>
  20. #include <taglib/id3v2tag.h>
  21. #include <taglib/mpcfile.h>
  22. #include <taglib/mpegfile.h>
  23. #include <taglib/mp4file.h>
  24. #include <taglib/tag.h>
  25. #include <taglib/taglib.h>
  26. #include <taglib/textidentificationframe.h>
  27. #include <taglib/tstring.h>
  28. #include <taglib/vorbisfile.h>
  29. using namespace std;
  30. void error(void)
  31. {
  32. cerr << "extractCoverArt infile outfile" << endl;
  33. exit(-1);
  34. }
  35. int saveCoverArt(TagLib::ByteVector d, string outfile)
  36. {
  37. FILE *f = fopen(outfile.c_str(), "wb");
  38. if(f != NULL ){
  39. fwrite(d.data(), 1,d.size(), f);
  40. fclose(f);
  41. return 0;
  42. }
  43. return -1;
  44. }
  45. int extractCoverArt(TagLib::FileRef ifile, string outfile)
  46. {
  47. if(TagLib::FLAC::File *f = dynamic_cast<TagLib::FLAC::File *>(ifile.file())) { // flac
  48. TagLib::List<TagLib::FLAC::Picture*> pl = f->pictureList();
  49. if( !pl.isEmpty() ) {
  50. TagLib::FLAC::Picture *pic = pl[0]; // 最初のカバー
  51. return saveCoverArt(pic->data(), outfile);
  52. }
  53. else
  54. return -1; // 空
  55. }
  56. if(TagLib::MPEG::File *f = dynamic_cast<TagLib::MPEG::File *>(ifile.file())) {
  57. if(f->ID3v2Tag()) { // ID3v2
  58. TagLib::ID3v2::Tag* tag = f->ID3v2Tag();
  59. TagLib::ID3v2::FrameList list = tag->frameList("APIC");
  60. if(!list.isEmpty()) {
  61. TagLib::ID3v2::AttachedPictureFrame* frame = (TagLib::ID3v2::AttachedPictureFrame *)list.front(); // フロントカバー
  62. return saveCoverArt(frame->picture(), outfile);
  63. }
  64. else
  65. return -1; // 空
  66. }
  67. else
  68. return -1; // ID3v2以外はサポートしない
  69. }
  70. if(TagLib::MP4::File *f = dynamic_cast<TagLib::MP4::File *>(ifile.file())) { // MPEG-4/AAC
  71. TagLib::MP4::Tag *tag = f->tag();
  72. TagLib::MP4::ItemListMap itemListMap = tag->itemListMap();
  73. if(itemListMap.contains("covr")) { // カバー
  74. TagLib::MP4::CoverArtList list = itemListMap["covr"].toCoverArtList();
  75. if(!list.isEmpty()){
  76. TagLib::MP4::CoverArt *pic = &(list.front()); // フロントカバー
  77. return saveCoverArt(pic->data(), outfile);
  78. }
  79. else
  80. return -1; // 空
  81. }
  82. else
  83. return -1;
  84. }
  85. // 未実装
  86. return -1;
  87. }
  88. int main(int argc, char *argv[])
  89. {
  90. if(argc < 3)
  91. error();
  92. TagLib::FileRef ifile(argv[1]);
  93. if(ifile.isNull()) // メディアファイルでない
  94. error();
  95. return extractCoverArt(ifile, string(argv[2]));
  96. }