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; \
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
3839static 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