diff options
author | Alexey Yakovenko <wakeroid@gmail.com> | 2010-04-06 17:59:11 +0200 |
---|---|---|
committer | Alexey Yakovenko <wakeroid@gmail.com> | 2010-04-06 18:23:37 +0200 |
commit | 40522448588f63d6d72ef775e0340b7fae548a05 (patch) | |
tree | 501d4b860580f34c2e66598e5ebe70a1e7de9224 | |
parent | a9f223af03e491c49f3e127a626f2861882e7134 (diff) |
support for multiline apev2 frames;
improved apev2 parser;
improved cuesheet metadata interoperability
-rw-r--r-- | junklib.c | 119 | ||||
-rw-r--r-- | playlist.c | 38 |
2 files changed, 71 insertions, 86 deletions
@@ -721,6 +721,25 @@ junk_apev2_read_full (playItem_t *it, DB_apev2_tag_t *tag_store, DB_FILE *fp) { trace ("failed to seek to tag start (-%d)\n", size); return -1; } + + // this code ensures that APEv2 frames don't get appended to + // existing metainfo, but all APEv2 frames with the same key are + // appended + const char *metainfo[] = { + "artist", "artist", it ? pl_find_meta (it, "artist") : NULL, + "album artist", "band", it ? pl_find_meta (it, "band") : NULL, + "title", "title", it ? pl_find_meta (it, "title") : NULL, + "album", "album", it ? pl_find_meta (it, "album") : NULL, + "year", "year", it ? pl_find_meta (it, "year") : NULL, + "genre", "genre", it ? pl_find_meta (it, "genre") : NULL, + "composer", "composer", it ? pl_find_meta (it, "composer") : NULL, +// "performer", "performer", it ? pl_find_meta (it, "performer") : NULL, + "comment", "comment", it ? pl_find_meta (it, "comment") : NULL, + "copyright", "copyright", it ? pl_find_meta (it, "copyright") : NULL, + "totaltracks", "numtracks", it ? pl_find_meta (it, "numtracks") : NULL, + NULL + }; + int i; for (i = 0; i < numitems; i++) { uint8_t buffer[8]; @@ -778,66 +797,50 @@ junk_apev2_read_full (playItem_t *it, DB_apev2_tag_t *tag_store, DB_FILE *fp) { tail = frm; } - int valuetype = ((itemflags >> 1) & 3); - // add metainfo only if it's textual - if (valuetype == 0 && (itemsize < MAX_TEXT_FRAME_SIZE || (!strcasecmp (key, "cuesheet") && itemsize < MAX_CUESHEET_FRAME_SIZE))) { - if (!u8_valid (value, itemsize, NULL)) { - trace ("junk_read_ape_full: bad encoding in text frame %s\n", key); - continue; - } + if (it) { + int valuetype = ((itemflags >> 1) & 3); + // add metainfo only if it's textual + if (valuetype == 0 && (itemsize < MAX_TEXT_FRAME_SIZE || (!strcasecmp (key, "cuesheet") && itemsize < MAX_CUESHEET_FRAME_SIZE))) { + printf ("APEv2 %s=%s\n", key, value); - if (!strcasecmp (key, "artist")) { - pl_add_meta (it, "artist", value); - } - else if (!strcasecmp (key, "title")) { - pl_add_meta (it, "title", value); - } - else if (!strcasecmp (key, "album")) { - pl_add_meta (it, "album", value); - } - else if (!strcasecmp (key, "track")) { - char *slash = strchr (value, '/'); - if (slash) { - // split into track/number - *slash = 0; - slash++; - pl_add_meta (it, "numtracks", slash); + if (!u8_valid (value, itemsize, NULL)) { + trace ("junk_read_ape_full: bad encoding in text frame %s\n", key); + continue; + } + + int m; + for (m = 0; metainfo[m]; m+=3) { + if (!metainfo[m+2] && !strcasecmp (key, metainfo[m])) { + printf ("adding %s=%s as %s\n", key, value, metainfo[m+1]); + pl_append_meta (it, metainfo[m+1], value); + break; + } + } + + if (!metainfo[m]) { + if (!strcasecmp (key, "track")) { + pl_add_meta (it, "track", value); + } + else if (!strcasecmp (key, "cuesheet")) { + pl_add_meta (it, "cuesheet", value); + } + else if (!strncasecmp (key, "replaygain_album_gain", 21)) { + it->replaygain_album_gain = atof (value); + trace ("album_gain=%s\n", value); + } + else if (!strncasecmp (key, "replaygain_album_peak", 21)) { + it->replaygain_album_peak = atof (value); + trace ("album_peak=%s\n", value); + } + else if (!strncasecmp (key, "replaygain_track_gain", 21)) { + it->replaygain_track_gain = atof (value); + trace ("track_gain=%s\n", value); + } + else if (!strncasecmp (key, "replaygain_track_peak", 21)) { + it->replaygain_track_peak = atof (value); + trace ("track_peak=%s\n", value); + } } - pl_add_meta (it, "track", value); - } - else if (!strcasecmp (key, "year")) { - pl_add_meta (it, "year", value); - } - else if (!strcasecmp (key, "genre")) { - pl_add_meta (it, "genre", value); - } - else if (!strcasecmp (key, "composer")) { - pl_add_meta (it, "composer", value); - } - else if (!strcasecmp (key, "comment")) { - pl_add_meta (it, "comment", value); - } - else if (!strcasecmp (key, "copyright")) { - pl_add_meta (it, "copyright", value); - } - else if (!strcasecmp (key, "cuesheet")) { - pl_add_meta (it, "cuesheet", value); - } - else if (!strncasecmp (key, "replaygain_album_gain", 21)) { - it->replaygain_album_gain = atof (value); - trace ("album_gain=%s\n", value); - } - else if (!strncasecmp (key, "replaygain_album_peak", 21)) { - it->replaygain_album_peak = atof (value); - trace ("album_peak=%s\n", value); - } - else if (!strncasecmp (key, "replaygain_track_gain", 21)) { - it->replaygain_track_gain = atof (value); - trace ("track_gain=%s\n", value); - } - else if (!strncasecmp (key, "replaygain_track_peak", 21)) { - it->replaygain_track_peak = atof (value); - trace ("track_peak=%s\n", value); } } free (value); @@ -2739,34 +2739,16 @@ pl_playqueue_getcount (void) { void pl_items_copy_junk (playItem_t *from, playItem_t *first, playItem_t *last) { LOCK; - const char *year = pl_find_meta (from, "year"); - const char *genre = pl_find_meta (from, "genre"); - const char *copyright = pl_find_meta (from, "copyright"); - const char *vendor = pl_find_meta (from, "vendor"); - const char *comment = pl_find_meta (from, "comment"); - const char *tags = pl_find_meta (from, "tags"); - playItem_t *i; - for (i = first; i; i = i->next[PL_MAIN]) { - if (year) { - pl_add_meta (i, "year", year); - } - if (genre) { - pl_add_meta (i, "genre", genre); - } - if (copyright) { - pl_add_meta (i, "copyright", copyright); - } - if (vendor) { - pl_add_meta (i, "vendor", vendor); - } - if (comment) { - pl_add_meta (i, "comment", comment); - } - if (tags) { - pl_add_meta (i, "tags", tags); - } - if (i == last) { - break; + const char *metainfo[] = { + "year", "genre", "copyright", "vendor", "comment", "tags", "numtracks", "band", "performer", "composer", "disc", NULL + }; + for (int m = 0; metainfo[m]; m++) { + const char *data = pl_find_meta (from, metainfo[m]); + if (data) { + playItem_t *i; + for (i = first; i != last; i = i->next[PL_MAIN]) { + pl_add_meta (i, metainfo[m], data); + } } } UNLOCK; |