summaryrefslogtreecommitdiff
path: root/tag.cpp
blob: 833735a9b2cfc9791ce385e2553fa4e212680878 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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);
}