1 --- libtunepimp-0.5.3/plugins/mp4/mp4.cpp.orig 2020-11-25 06:34:36.728698744 +0100
2 +++ libtunepimp-0.5.3/plugins/mp4/mp4.cpp 2020-11-27 22:41:42.158210090 +0100
8 +#include <mp4v2/mp4v2.h>
13 #define PLUGIN_VERSION "1.0.0"
14 #define PLUGIN_NAME "MP4 metadata reader/writer"
16 -static char *formats[][2] = {
17 +static const char *formats[][2] = {
18 { ".aac", "AAC/MP4" },
25 -static char *errorString = "";
26 +static const char *errorString = "";
31 - if (strlen(errorString))
40 +static MP4ItmfItemList*
41 +mp4GetItmfItemValue(MP4FileHandle mp4file, const char *tagName, const char **value)
43 + MP4ItmfItemList *items = MP4ItmfGetItemsByMeaning(mp4file, "com.apple.iTunes", tagName);
44 + if (items != NULL) {
45 + if (items->size == 0) {
46 + MP4ItmfItemListFree(items);
49 + if (items->elements[0].dataList.size == 0) {
50 + MP4ItmfItemListFree(items);
53 + *value = reinterpret_cast<const char*>(items->elements[0].dataList.elements[0].value);
59 +mp4SetItmfItemValue(MP4FileHandle mp4file, const char *tagName, const char *value, size_t size)
61 + MP4ItmfItemList *items = MP4ItmfGetItemsByMeaning(mp4file, "com.apple.iTunes", tagName);
62 + if (items != NULL) {
63 + for (size_t idx = 0; idx < items->size; idx++)
64 + MP4ItmfRemoveItem(mp4file, items->elements + idx);
65 + MP4ItmfItemListFree(items);
68 + MP4ItmfItem *item = MP4ItmfItemAlloc("----", 1);
69 + item->mean = strdup("com.apple.iTunes");
70 + item->name = strdup(tagName);
71 + item->dataList.elements[0].typeCode = MP4_ITMF_BT_UTF8;
72 + item->dataList.elements[0].valueSize = size;
73 + item->dataList.elements[0].value = (uint8_t*)malloc(size);
74 + memcpy(item->dataList.elements[0].value, value, size);
75 + MP4ItmfAddItem(mp4file, item);
79 mp4ReadMetadata(metadata_t *mdata, const char *fileName, int flags, const char *encoding)
82 - u_int16_t numval, numval2;
85 MP4FileHandle mp4file;
86 + MP4ItmfItemList *items;
90 mp4file = MP4Read(utf8ToEncoding(fileName, encoding).c_str());
91 @@ -120,95 +154,100 @@
94 memset(mdata, 0, sizeof(metadata_t));
96 - if (MP4GetMetadataName(mp4file, &value) && value != NULL) {
97 - strcpy(mdata->track, value);
101 - if (MP4GetMetadataArtist(mp4file, &value) && value != NULL) {
102 - strcpy(mdata->artist, value);
105 + const MP4Tags *tags = MP4TagsAlloc();
106 + if (MP4TagsFetch(tags, mp4file)) {
108 + strcpy(mdata->track, tags->name);
111 + strcpy(mdata->artist, tags->artist);
113 + if (tags->releaseDate)
114 + mdata->releaseYear = atoi(tags->releaseDate); // ignore errors, so will stop on "-" after YYYY[-MM-DD]
117 + strcpy(mdata->album, tags->album);
120 + mdata->trackNum = tags->track->index;
121 + mdata->totalInSet = tags->track->total;
124 - if (MP4GetMetadataYear(mp4file, &value) && value != NULL) {
125 - mdata->releaseYear = strtol(value, NULL, 0);
128 + if (tags->compilation)
129 + mdata->variousArtist = *(tags->compilation);
131 - if (MP4GetMetadataAlbum(mp4file, &value) && value != NULL) {
132 - strcpy(mdata->album, value);
136 - if (MP4GetMetadataTrack(mp4file, &numval, &numval2)) {
137 - mdata->trackNum = numval;
138 - mdata->totalInSet = numval2;
142 - if (MP4GetMetadataFreeForm(mp4file, "MusicBrainz Sortname", (u_int8_t **)&value, &size) && value != NULL) {
143 + if ((items = mp4GetItmfItemValue(mp4file, "MusicBrainz Sortname", &value)) != NULL) {
144 strcpy(mdata->sortName, value);
146 + MP4ItmfItemListFree(items);
149 - if (MP4GetMetadataFreeForm(mp4file, "MusicBrainz Track Id", (u_int8_t **)&value, &size) && value != NULL) {
150 + if ((items = mp4GetItmfItemValue(mp4file, "MusicBrainz Track Id", &value)) != NULL) {
151 strcpy(mdata->trackId, value);
153 + MP4ItmfItemListFree(items);
156 - if (MP4GetMetadataFreeForm(mp4file, "MusicBrainz Album Id", (u_int8_t **)&value, &size) && value != NULL) {
157 + if ((items = mp4GetItmfItemValue(mp4file, "MusicBrainz Album Id", &value)) != NULL) {
158 strcpy(mdata->albumId, value);
160 + MP4ItmfItemListFree(items);
163 - if (MP4GetMetadataFreeForm(mp4file, "MusicBrainz Artist Id", (u_int8_t **)&value, &size) && value != NULL) {
164 + if ((items = mp4GetItmfItemValue(mp4file, "MusicBrainz Artist Id", &value)) != NULL) {
165 strcpy(mdata->artistId, value);
167 + MP4ItmfItemListFree(items);
170 - if (MP4GetMetadataFreeForm(mp4file, "MusicIP PUID", (u_int8_t **)&value, &size) && value != NULL) {
172 + if ((items = mp4GetItmfItemValue(mp4file, "MusicIP PUID", &value)) != NULL) {
173 strcpy(mdata->filePUID, value);
175 + MP4ItmfItemListFree(items);
178 - if (MP4GetMetadataFreeForm(mp4file, "MusicBrainz Album Artist Id", (u_int8_t **)&value, &size) && value != NULL) {
179 + if ((items = mp4GetItmfItemValue(mp4file, "MusicBrainz Album Artist Id", &value)) != NULL) {
180 strcpy(mdata->albumArtistId, value);
182 + MP4ItmfItemListFree(items);
185 - if (MP4GetMetadataFreeForm(mp4file, "MusicBrainz Album Artist Sortname", (u_int8_t **)&value, &size) && value != NULL) {
186 + if ((items = mp4GetItmfItemValue(mp4file, "MusicBrainz Album Artist Sortname", &value)) != NULL) {
187 strcpy(mdata->albumArtistSortName, value);
189 + MP4ItmfItemListFree(items);
192 - if (MP4GetMetadataFreeForm(mp4file, "MusicBrainz Album Artist", (u_int8_t **)&value, &size) && value != NULL) {
193 + if ((items = mp4GetItmfItemValue(mp4file, "MusicBrainz Album Artist", &value)) != NULL) {
194 strcpy(mdata->albumArtist, value);
196 + MP4ItmfItemListFree(items);
199 - if (MP4GetMetadataFreeForm(mp4file, "MusicBrainz Album Type", (u_int8_t **)&value, &size) && value != NULL) {
200 + if ((items = mp4GetItmfItemValue(mp4file, "MusicBrainz Album Type", &value)) != NULL) {
201 mdata->albumType = convertToAlbumType(value);
203 + MP4ItmfItemListFree(items);
206 - if (MP4GetMetadataFreeForm(mp4file, "MusicBrainz Album Status", (u_int8_t **)&value, &size) && value != NULL) {
208 + if ((items = mp4GetItmfItemValue(mp4file, "MusicBrainz Album Status", &value)) != NULL) {
209 mdata->albumStatus = convertToAlbumStatus(value);
211 + MP4ItmfItemListFree(items);
214 - if (MP4GetMetadataFreeForm(mp4file, "MusicBrainz Album Release Date", (u_int8_t **)&value, &size) && value != NULL) {
216 + if ((items = mp4GetItmfItemValue(mp4file, "MusicBrainz Album Release Date", &value)) != NULL) {
217 int year = 0, month = 0, day = 0;
218 if (sscanf(value, "%04d-%02d-%02d", &year, &month, &day) > 0) {
219 mdata->releaseYear = year;
220 mdata->releaseMonth = month;
221 mdata->releaseDay = day;
224 + MP4ItmfItemListFree(items);
227 - if (MP4GetMetadataFreeForm(mp4file, "MusicBrainz Album Release Country", (u_int8_t **)&value, &size) && value != NULL) {
228 + if ((items = mp4GetItmfItemValue(mp4file, "MusicBrainz Album Release Country", &value)) != NULL) {
229 strcpy(mdata->releaseCountry, value);
231 + MP4ItmfItemListFree(items);
234 + if ((items = mp4GetItmfItemValue(mp4file, "MusicBrainz Non-Album", &value)) != NULL) {
235 + mdata->nonAlbum = atoi(value);
236 + MP4ItmfItemListFree(items);
239 u_int32_t numTracks = MP4GetNumberOfTracks(mp4file);
244 - if (MP4GetMetadataCompilation(mp4file, &numval3)) {
245 - mdata->variousArtist = numval3;
248 - if (MP4GetMetadataFreeForm(mp4file, "MusicBrainz Non-Album", (u_int8_t **)&value, &size) && value != NULL) {
249 - mdata->nonAlbum = atoi(value);
253 strcpy(mdata->fileFormat, fileName + strlen(fileName) - 3);
255 - if (!MP4Close(mp4file))
261 @@ -255,41 +284,54 @@
262 if (mp4file == MP4_INVALID_FILE_HANDLE)
265 - if ((flags & TP_PLUGIN_FLAGS_GENERAL_CLEAR_TAGS) != 0)
266 - MP4MetadataDelete(mp4file);
268 - MP4SetMetadataName(mp4file, mdata->track);
269 + if ((flags & TP_PLUGIN_FLAGS_GENERAL_CLEAR_TAGS) != 0) {
270 + MP4ItmfItemList* items = MP4ItmfGetItems(mp4file);
271 + if (items != NULL) {
272 + for (size_t idx = 0; idx < items->size; idx++)
273 + MP4ItmfRemoveItem(mp4file, items->elements + idx);
274 + MP4ItmfItemListFree(items);
278 + const MP4Tags* mp4tags = MP4TagsAlloc();
279 + if (MP4TagsFetch(mp4tags, mp4file)) {
280 + MP4TagsSetName(mp4tags, mdata->track);
282 - MP4SetMetadataArtist(mp4file, mdata->artist);
283 + MP4TagsSetArtist(mp4tags, mdata->artist);
285 sprintf(temp, "%04d", mdata->releaseYear);
286 - MP4SetMetadataYear(mp4file, temp);
287 + MP4TagsSetReleaseDate(mp4tags, temp);
289 - MP4SetMetadataAlbum(mp4file, mdata->album);
290 + MP4TagsSetAlbum(mp4tags, mdata->album);
292 - MP4SetMetadataTrack(mp4file, mdata->trackNum, mdata->totalInSet);
293 + MP4TagTrack tagTrack = {mdata->trackNum, mdata->totalInSet};
294 + MP4TagsSetTrack(mp4tags, &tagTrack);
296 + uint8_t compilation = mdata->variousArtist ? 1 : 0;
297 + MP4TagsSetCompilation(mp4tags, &compilation);
300 - MP4SetMetadataFreeForm(mp4file, "MusicBrainz Sortname", (u_int8_t *)mdata->sortName, strlen(mdata->sortName) + 1);
301 + mp4SetItmfItemValue(mp4file, "MusicBrainz Sortname", mdata->sortName, strlen(mdata->sortName) + 1);
303 - MP4SetMetadataFreeForm(mp4file, "MusicBrainz Track Id", (u_int8_t *)mdata->trackId, strlen(mdata->trackId) + 1);
304 + mp4SetItmfItemValue(mp4file, "MusicBrainz Track Id", mdata->trackId, strlen(mdata->trackId) + 1);
306 - MP4SetMetadataFreeForm(mp4file, "MusicBrainz Album Id", (u_int8_t *)mdata->albumId, strlen(mdata->albumId) + 1);
307 + mp4SetItmfItemValue(mp4file, "MusicBrainz Album Id", mdata->albumId, strlen(mdata->albumId) + 1);
309 - MP4SetMetadataFreeForm(mp4file, "MusicBrainz Artist Id", (u_int8_t *)mdata->artistId, strlen(mdata->artistId) + 1);
310 + mp4SetItmfItemValue(mp4file, "MusicBrainz Artist Id", mdata->artistId, strlen(mdata->artistId) + 1);
312 - MP4SetMetadataFreeForm(mp4file, "MusicIP PUID", (u_int8_t *)mdata->filePUID, strlen(mdata->filePUID) + 1);
313 + mp4SetItmfItemValue(mp4file, "MusicIP PUID", mdata->filePUID, strlen(mdata->filePUID) + 1);
315 - MP4SetMetadataFreeForm(mp4file, "MusicBrainz Album Artist Id", (u_int8_t *)mdata->albumArtistId, strlen(mdata->albumArtistId) + 1);
316 + mp4SetItmfItemValue(mp4file, "MusicBrainz Album Artist Id", mdata->albumArtistId, strlen(mdata->albumArtistId) + 1);
318 - MP4SetMetadataFreeForm(mp4file, "MusicBrainz Album Artist Sortname", (u_int8_t *)mdata->albumArtistSortName, strlen(mdata->albumArtistSortName) + 1);
319 + mp4SetItmfItemValue(mp4file, "MusicBrainz Album Artist Sortname", mdata->albumArtistSortName, strlen(mdata->albumArtistSortName) + 1);
321 - MP4SetMetadataFreeForm(mp4file, "MusicBrainz Album Artist", (u_int8_t *)mdata->albumArtist, strlen(mdata->albumArtist) + 1);
322 + mp4SetItmfItemValue(mp4file, "MusicBrainz Album Artist", mdata->albumArtist, strlen(mdata->albumArtist) + 1);
324 convertFromAlbumType(mdata->albumType, temp2);
325 - MP4SetMetadataFreeForm(mp4file, "MusicBrainz Album Type", (u_int8_t *)temp2.c_str(), temp2.length() + 1);
326 + mp4SetItmfItemValue(mp4file, "MusicBrainz Album Type", temp2.c_str(), temp2.length() + 1);
328 convertFromAlbumStatus(mdata->albumStatus, temp2);
329 - MP4SetMetadataFreeForm(mp4file, "MusicBrainz Album Status", (u_int8_t *)temp2.c_str(), temp2.length() + 1);
330 + mp4SetItmfItemValue(mp4file, "MusicBrainz Album Status", temp2.c_str(), temp2.length() + 1);
332 if (mdata->releaseYear > 0) {
333 if (mdata->releaseMonth > 0) {
334 @@ -307,17 +349,14 @@
338 - MP4SetMetadataFreeForm(mp4file, "MusicBrainz Album Release Date", (u_int8_t *)temp, strlen(temp) + 1);
339 + mp4SetItmfItemValue(mp4file, "MusicBrainz Album Release Date", temp, strlen(temp) + 1);
341 - MP4SetMetadataFreeForm(mp4file, "MusicBrainz Album Release Country", (u_int8_t *)mdata->releaseCountry, strlen(mdata->releaseCountry) + 1);
343 - MP4SetMetadataCompilation(mp4file, mdata->variousArtist ? 1 : 0);
344 + mp4SetItmfItemValue(mp4file, "MusicBrainz Album Release Country", mdata->releaseCountry, strlen(mdata->releaseCountry) + 1);
346 sprintf(temp, "%d", mdata->nonAlbum);
347 - MP4SetMetadataFreeForm(mp4file, "MusicBrainz Non-Album", (u_int8_t *)temp, strlen(temp) + 1);
348 + mp4SetItmfItemValue(mp4file, "MusicBrainz Non-Album", temp, strlen(temp) + 1);
350 - if (!MP4Close(mp4file))
355 if (!MP4Optimize(utf8ToEncoding(fileName, encoding).c_str()))