Skip to content

Commit 4325519

Browse files
committed
musicbrainz: do not append all tags by default
The way the awful credits musicbrainz API works is that you need to append each credit with a joiner string. The common macro we used to do that did this for all strings. Which worked, as long as the metadata field was completely empty. Which got changed. So, instead of always appending, just append where we need to.
1 parent cdc4250 commit 4325519

File tree

1 file changed

+32
-29
lines changed

1 file changed

+32
-29
lines changed

src/musicbrainz.c

Lines changed: 32 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,9 @@
2222
#include <musicbrainz5/mb5_c.h>
2323
#include <libavutil/crc.h>
2424

25-
#define READ_MB(FUNC, MBCTX, DICT, KEY) \
25+
#define READ_MB(FUNC, MBCTX, DICT, KEY, APPEND) \
2626
do { \
27+
int flags = AV_DICT_DONT_STRDUP_VAL | ((APPEND) ? AV_DICT_APPEND : 0x0); \
2728
if (!MBCTX) \
2829
break; \
2930
int len = FUNC(MBCTX, NULL, 0) + 1; \
@@ -32,24 +33,26 @@
3233
if (str[0] == '\0') \
3334
av_free(str); \
3435
else \
35-
av_dict_set(&DICT, KEY, str, AV_DICT_DONT_STRDUP_VAL | AV_DICT_APPEND); \
36+
av_dict_set(&DICT, KEY, str, flags); \
3637
} while (0)
3738

3839
static void mb_credit(Mb5ArtistCredit credit, AVDictionary *dict, const char *key)
3940
{
41+
int append = 0;
4042
Mb5NameCreditList namecredit_list = mb5_artistcredit_get_namecreditlist(credit);
43+
4144
for (int i = 0; i < mb5_namecredit_list_size(namecredit_list); i++) {
4245
Mb5NameCredit namecredit = mb5_namecredit_list_item(namecredit_list, i);
4346

4447
if (mb5_namecredit_get_name(namecredit, NULL, 0)) {
45-
READ_MB(mb5_namecredit_get_name, namecredit, dict, key);
48+
READ_MB(mb5_namecredit_get_name, namecredit, dict, key, append++);
4649
} else {
4750
Mb5Artist artist = mb5_namecredit_get_artist(namecredit);
4851
if (artist)
49-
READ_MB(mb5_artist_get_name, artist, dict, key);
52+
READ_MB(mb5_artist_get_name, artist, dict, key, append++);
5053
}
5154

52-
READ_MB(mb5_namecredit_get_joinphrase, namecredit, dict, key);
55+
READ_MB(mb5_namecredit_get_joinphrase, namecredit, dict, key, append++);
5356
}
5457
}
5558

@@ -68,14 +71,14 @@ static uint32_t crc_medium(Mb5Medium medium)
6871
Mb5Track track = mb5_track_list_item(track_list, i);
6972
Mb5Recording recording = mb5_track_get_recording(track);
7073

71-
READ_MB(mb5_recording_get_id, recording, tmp_dict, "mbid");
74+
READ_MB(mb5_recording_get_id, recording, tmp_dict, "mbid", 0);
7275

7376
Mb5ArtistCredit credit;
7477
if (recording) {
75-
READ_MB(mb5_recording_get_title, recording, tmp_dict, "title");
78+
READ_MB(mb5_recording_get_title, recording, tmp_dict, "title", 0);
7679
credit = mb5_recording_get_artistcredit(recording);
7780
} else {
78-
READ_MB(mb5_track_get_title, track, tmp_dict, "title");
81+
READ_MB(mb5_track_get_title, track, tmp_dict, "title", 0);
7982
credit = mb5_track_get_artistcredit(track);
8083
}
8184
if (credit)
@@ -144,8 +147,8 @@ static int mb_tracks(cyanrip_ctx *ctx, Mb5Release release, const char *discid, i
144147
}
145148
}
146149

147-
READ_MB(mb5_medium_get_title, medium, ctx->meta, "discname");
148-
READ_MB(mb5_medium_get_format, medium, ctx->meta, "format");
150+
READ_MB(mb5_medium_get_title, medium, ctx->meta, "discname", 0);
151+
READ_MB(mb5_medium_get_format, medium, ctx->meta, "format", 0);
149152

150153
Mb5TrackList track_list = mb5_medium_get_tracklist(medium);
151154
if (!track_list) {
@@ -161,14 +164,14 @@ static int mb_tracks(cyanrip_ctx *ctx, Mb5Release release, const char *discid, i
161164
Mb5Track track = mb5_track_list_item(track_list, i);
162165
Mb5Recording recording = mb5_track_get_recording(track);
163166

164-
READ_MB(mb5_recording_get_id, recording, ctx->tracks[i].meta, "mbid");
167+
READ_MB(mb5_recording_get_id, recording, ctx->tracks[i].meta, "mbid", 0);
165168

166169
Mb5ArtistCredit credit;
167170
if (recording) {
168-
READ_MB(mb5_recording_get_title, recording, ctx->tracks[i].meta, "title");
171+
READ_MB(mb5_recording_get_title, recording, ctx->tracks[i].meta, "title", 0);
169172
credit = mb5_recording_get_artistcredit(recording);
170173
} else {
171-
READ_MB(mb5_track_get_title, track, ctx->tracks[i].meta, "title");
174+
READ_MB(mb5_track_get_title, track, ctx->tracks[i].meta, "title", 0);
172175
credit = mb5_track_get_artistcredit(track);
173176
}
174177
if (credit)
@@ -266,11 +269,11 @@ static int mb_metadata(cyanrip_ctx *ctx, int manual_metadata_specified, int rele
266269
for (int i = 0; i < num_releases; i++) {
267270
release = mb5_release_list_item(release_list, i);
268271
AVDictionary *tmp_dict = NULL;
269-
READ_MB(mb5_release_get_date, release, tmp_dict, "date");
270-
READ_MB(mb5_release_get_title, release, tmp_dict, "album");
271-
READ_MB(mb5_release_get_id, release, tmp_dict, "id");
272-
READ_MB(mb5_release_get_disambiguation, release, tmp_dict, "disambiguation");
273-
READ_MB(mb5_release_get_country, release, tmp_dict, "country");
272+
READ_MB(mb5_release_get_date, release, tmp_dict, "date", 0);
273+
READ_MB(mb5_release_get_title, release, tmp_dict, "album", 0);
274+
READ_MB(mb5_release_get_id, release, tmp_dict, "id", 0);
275+
READ_MB(mb5_release_get_disambiguation, release, tmp_dict, "disambiguation", 0);
276+
READ_MB(mb5_release_get_country, release, tmp_dict, "country", 0);
274277

275278
Mb5MediumList medium_list = mb5_release_get_mediumlist(release);
276279
int num_cds = mb5_medium_list_size(medium_list);
@@ -312,7 +315,7 @@ static int mb_metadata(cyanrip_ctx *ctx, int manual_metadata_specified, int rele
312315
for (; i < num_releases; i++) {
313316
release = mb5_release_list_item(release_list, i);
314317
AVDictionary *tmp_dict = NULL;
315-
READ_MB(mb5_release_get_id, release, tmp_dict, "id");
318+
READ_MB(mb5_release_get_id, release, tmp_dict, "id", 0);
316319
if (dict_get(tmp_dict, "id") && !strcmp(release_str, dict_get(tmp_dict, "id"))) {
317320
av_dict_free(&tmp_dict);
318321
break;
@@ -328,23 +331,23 @@ static int mb_metadata(cyanrip_ctx *ctx, int manual_metadata_specified, int rele
328331
release = mb5_release_list_item(release_list, 0);
329332
}
330333

331-
READ_MB(mb5_release_get_id, release, ctx->meta, "release_id");
332-
READ_MB(mb5_release_get_disambiguation, release, ctx->meta, "releasecomment");
333-
READ_MB(mb5_release_get_date, release, ctx->meta, "date");
334-
READ_MB(mb5_release_get_title, release, ctx->meta, "album");
335-
READ_MB(mb5_release_get_barcode, release, ctx->meta, "barcode");
336-
READ_MB(mb5_release_get_packaging, release, ctx->meta, "packaging");
337-
READ_MB(mb5_release_get_country, release, ctx->meta, "country");
338-
READ_MB(mb5_release_get_status, release, ctx->meta, "status");
334+
READ_MB(mb5_release_get_id, release, ctx->meta, "release_id", 0);
335+
READ_MB(mb5_release_get_disambiguation, release, ctx->meta, "releasecomment", 0);
336+
READ_MB(mb5_release_get_date, release, ctx->meta, "date", 0);
337+
READ_MB(mb5_release_get_title, release, ctx->meta, "album", 0);
338+
READ_MB(mb5_release_get_barcode, release, ctx->meta, "barcode", 0);
339+
READ_MB(mb5_release_get_packaging, release, ctx->meta, "packaging", 0);
340+
READ_MB(mb5_release_get_country, release, ctx->meta, "country", 0);
341+
READ_MB(mb5_release_get_status, release, ctx->meta, "status", 0);
339342

340343
/* Label info */
341344
Mb5LabelInfoList *labelinfolist = mb5_release_get_labelinfolist(release);
342345
if (mb5_labelinfo_list_size(labelinfolist) == 1) {
343346
Mb5LabelInfo *labelinfo = mb5_label_list_item(labelinfolist, 0);
344-
READ_MB(mb5_labelinfo_get_catalognumber, labelinfo, ctx->meta, "catalog");
347+
READ_MB(mb5_labelinfo_get_catalognumber, labelinfo, ctx->meta, "catalog", 0);
345348

346349
Mb5Label *label = mb5_labelinfo_get_label(labelinfo);
347-
READ_MB(mb5_label_get_name, label, ctx->meta, "label");
350+
READ_MB(mb5_label_get_name, label, ctx->meta, "label", 0);
348351
}
349352

350353
Mb5ArtistCredit artistcredit = mb5_release_get_artistcredit(release);

0 commit comments

Comments
 (0)