#include "tag.h" #include #include #include // TODO: Make this a "smart" tag loader Tag::p Tag::load(const std::string filename) { return Tag::p(new ID3Tag(filename)); } bool Tag::has_field(const std::string name) { return fields.find(name) != fields.end(); } void ID3Tag::tag_add_string(struct id3_tag *id3tag, const char *type, const char *id) { struct id3_frame *frame = id3_tag_findframe(id3tag, id, 0); if(frame == NULL) { return; } if(frame->nfields != 2) { throw std::runtime_error("unexpected nfields value"); } const union id3_field *field = id3_frame_field(frame, 1); unsigned int nstrings = id3_field_getnstrings(field); for(unsigned int i = 0; i < nstrings; i++) { const id3_ucs4_t *ucs4 = id3_field_getstrings(field, i); if(ucs4 == NULL) { throw std::runtime_error("ucs4 is NULL"); } id3_utf8_t *utf8 = id3_ucs4_utf8duplicate(ucs4); fields[type] = (char*)utf8; free(utf8); } } ID3Tag::ID3Tag(const std::string filename) { struct id3_file *file = id3_file_open(filename.c_str(), ID3_FILE_MODE_READONLY); if(file == NULL) { throw std::runtime_error("failed to open file for reading"); } struct id3_tag *id3tag = id3_file_tag(file); if(id3tag == NULL) { throw std::runtime_error("tag is NULL"); } tag_add_string(id3tag, "artist", ID3_FRAME_ARTIST); tag_add_string(id3tag, "title", ID3_FRAME_TITLE); tag_add_string(id3tag, "album", ID3_FRAME_ALBUM); id3_file_close(file); }