summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/rbcodec/metadata/metadata_common.c78
1 files changed, 50 insertions, 28 deletions
diff --git a/lib/rbcodec/metadata/metadata_common.c b/lib/rbcodec/metadata/metadata_common.c
index 6fc50e9a9d..3677599c30 100644
--- a/lib/rbcodec/metadata/metadata_common.c
+++ b/lib/rbcodec/metadata/metadata_common.c
@@ -252,6 +252,22 @@ bool skip_id3v2(int fd, struct mp3entry *id3)
252 return success; 252 return success;
253} 253}
254 254
255static int get_tag_option(const char *option, const char *const oplist[])
256{
257 int i;
258 int ifound = -1;
259 const char *op;
260 for (i=0; (op=oplist[i]) != NULL; i++)
261 {
262 if (strcasecmp(op, option) == 0)
263 {
264 ifound = i;
265 break;
266 }
267 }
268 return ifound;
269}
270
255/* Parse the tag (the name-value pair) and fill id3 and buffer accordingly. 271/* Parse the tag (the name-value pair) and fill id3 and buffer accordingly.
256 * String values to keep are written to buf. Returns number of bytes written 272 * String values to keep are written to buf. Returns number of bytes written
257 * to buf (including end nil). 273 * to buf (including end nil).
@@ -262,19 +278,38 @@ long parse_tag(const char* name, char* value, struct mp3entry* id3,
262 long len = 0; 278 long len = 0;
263 char** p; 279 char** p;
264 280
265 if ((((strcasecmp(name, "track") == 0) && (type == TAGTYPE_APE))) 281 enum
266 || ((strcasecmp(name, "tracknumber") == 0) && (type == TAGTYPE_VORBIS))) 282 {
283 eTRACK = 0, eTRACKNUMBER, eDISCNUMBER, eDISC,
284 eYEAR, eDATE, eTITLE, eARTIST, eALBUM, eGENRE,
285 eCOMPOSER, eCOMMENT, eALBUMARTIST, eALBUM_ARTIST,
286 eENSEMBLE, eGROUPING, eCONTENTGROUP, eCONTENT_GROUP,
287 eMUSICBRAINZ1, eMUSICBRAINZ2
288 };
289
290 const char *tagops[] =
291 { "track", "tracknumber", "discnumber", "disc",
292 "year","date","title", "artist", "album", "genre"
293 "composer","comment","albumartist","album artist",
294 "ensemble","grouping","contentgroup","content group",
295 "musicbrainz_trackid", "http://musicbrainz.org", NULL
296 };
297
298 int item = get_tag_option(name, tagops);
299
300 if (((item == eTRACK && (type == TAGTYPE_APE)))
301 || (item == eTRACKNUMBER && (type == TAGTYPE_VORBIS)))
267 { 302 {
268 id3->tracknum = atoi(value); 303 id3->tracknum = atoi(value);
269 p = &(id3->track_string); 304 p = &(id3->track_string);
270 } 305 }
271 else if (strcasecmp(name, "discnumber") == 0 || strcasecmp(name, "disc") == 0) 306 else if (item == eDISCNUMBER || item == eDISC)
272 { 307 {
273 id3->discnum = atoi(value); 308 id3->discnum = atoi(value);
274 p = &(id3->disc_string); 309 p = &(id3->disc_string);
275 } 310 }
276 else if (((strcasecmp(name, "year") == 0) && (type == TAGTYPE_APE)) 311 else if ((item == eYEAR && (type == TAGTYPE_APE))
277 || ((strcasecmp(name, "date") == 0) && (type == TAGTYPE_VORBIS))) 312 || (item == eDATE && (type == TAGTYPE_VORBIS)))
278 { 313 {
279 /* Date's can be in any format in Vorbis. However most of them 314 /* Date's can be in any format in Vorbis. However most of them
280 * are in ISO8601 format so if we try and parse the first part 315 * are in ISO8601 format so if we try and parse the first part
@@ -288,56 +323,43 @@ long parse_tag(const char* name, char* value, struct mp3entry* id3,
288 } 323 }
289 p = &(id3->year_string); 324 p = &(id3->year_string);
290 } 325 }
291 else if (strcasecmp(name, "title") == 0) 326 else if (item == eTITLE)
292 { 327 {
293 p = &(id3->title); 328 p = &(id3->title);
294 } 329 }
295 else if (strcasecmp(name, "artist") == 0) 330 else if (item == eARTIST)
296 { 331 {
297 p = &(id3->artist); 332 p = &(id3->artist);
298 } 333 }
299 else if (strcasecmp(name, "album") == 0) 334 else if (item == eALBUM)
300 { 335 {
301 p = &(id3->album); 336 p = &(id3->album);
302 } 337 }
303 else if (strcasecmp(name, "genre") == 0) 338 else if (item == eGENRE)
304 { 339 {
305 p = &(id3->genre_string); 340 p = &(id3->genre_string);
306 } 341 }
307 else if (strcasecmp(name, "composer") == 0) 342 else if (item == eCOMPOSER)
308 { 343 {
309 p = &(id3->composer); 344 p = &(id3->composer);
310 } 345 }
311 else if (strcasecmp(name, "comment") == 0) 346 else if (item == eCOMMENT)
312 { 347 {
313 p = &(id3->comment); 348 p = &(id3->comment);
314 } 349 }
315 else if (strcasecmp(name, "albumartist") == 0) 350 else if (item == eALBUMARTIST || item == eALBUM_ARTIST)
316 { 351 {
317 p = &(id3->albumartist); 352 p = &(id3->albumartist);
318 } 353 }
319 else if (strcasecmp(name, "album artist") == 0) 354 else if (item == eENSEMBLE)
320 { 355 {
321 p = &(id3->albumartist); 356 p = &(id3->albumartist);
322 } 357 }
323 else if (strcasecmp(name, "ensemble") == 0) 358 else if (item == eGROUPING || item == eCONTENTGROUP || item == eCONTENT_GROUP)
324 {
325 p = &(id3->albumartist);
326 }
327 else if (strcasecmp(name, "grouping") == 0)
328 {
329 p = &(id3->grouping);
330 }
331 else if (strcasecmp(name, "content group") == 0)
332 {
333 p = &(id3->grouping);
334 }
335 else if (strcasecmp(name, "contentgroup") == 0)
336 { 359 {
337 p = &(id3->grouping); 360 p = &(id3->grouping);
338 } 361 }
339 else if (strcasecmp(name, "musicbrainz_trackid") == 0 362 else if (item == eMUSICBRAINZ1 || item == eMUSICBRAINZ2)
340 || strcasecmp(name, "http://musicbrainz.org") == 0 )
341 { 363 {
342 p = &(id3->mb_track_id); 364 p = &(id3->mb_track_id);
343 } 365 }