#include #include #include #include #include #include #include #include #include // some demo apic reading code; would be nice to save all APIC frames. using TagLib::ID3v2::AttachedPictureFrame; using TagLib::ID3v2::Frame; using TagLib::ID3v2::FrameList; using TagLib::ID3v2::Tag; int main(int argc, char **argv) { const char *mp3_path = argv[1]; TagLib::MPEG::File f(mp3_path); Tag *id3v2tag = f.ID3v2Tag(); if (!id3v2tag) { return 0; } const FrameList &frames = id3v2tag->frameList(); FrameList::ConstIterator it; for (it = frames.begin(); it != frames.end(); it++) { Frame *frame = *it; TagLib::ByteVector frameid = frame->frameID(); uint frameid_size = frameid.size(); char *frameid_s = new char[frameid_size + 1]; memcpy(frameid_s, frameid.data(), frameid_size); frameid_s[frameid_size] = '\0'; printf("%s: %s\n", frameid_s, frame->toString().toCString()); if (frameid != "APIC") { continue; } AttachedPictureFrame *pic_frame = (AttachedPictureFrame *)frame; TagLib::ByteVector data = pic_frame->picture(); int fd = open(argv[2], O_CREAT | O_EXCL | O_WRONLY, 0644); if (fd < 0) { perror("open"); return 2; } ssize_t size = data.size(); ssize_t status = write(fd, data.data(), size); if (status < 0) { perror("write"); return 3; } if (status != size) { fprintf(stderr, "wrote only %d bytes out of %d\n", status, size); return 4; } if (close(fd) < 0) { perror("close"); return 5; } } return 0; }