diff options
Diffstat (limited to 'tag.cpp')
-rw-r--r-- | tag.cpp | 53 |
1 files changed, 53 insertions, 0 deletions
@@ -0,0 +1,53 @@ +#include "tag.h" + +#include <id3tag.h> + +#include <cstdlib> +#include <stdexcept> + +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); +} |