diff options
author | Alexey Yakovenko <wakeroid@gmail.com> | 2010-03-27 13:29:33 +0100 |
---|---|---|
committer | Alexey Yakovenko <wakeroid@gmail.com> | 2010-03-27 13:29:33 +0100 |
commit | b83cbe27c1bdb55133ef581fdbaf98b1283fa621 (patch) | |
tree | 9257026545b4549312b5feebab9553acfdc7672a /junklib.c | |
parent | d6b3275ebf1240c8c626c98eb72ca03bdc06155a (diff) |
added more frame types into id3v2.3 and id3v2.4 parser
Diffstat (limited to 'junklib.c')
-rw-r--r-- | junklib.c | 68 |
1 files changed, 68 insertions, 0 deletions
@@ -827,6 +827,10 @@ junk_read_id3v2 (playItem_t *it, DB_FILE *fp) { char *comment = NULL; char *copyright = NULL; char *genre = NULL; + char *performer = NULL; + char *composer = NULL; + char *numtracks = NULL; + char *disc = NULL; int err = 0; while (readptr - tag <= size - 4) { if (version_major == 3 || version_major == 4) { @@ -952,7 +956,25 @@ junk_read_id3v2 (playItem_t *it, DB_FILE *fp) { } char str[sz+2]; id3v2_string_read (version_major, &str[0], sz, unsync, readptr); + track = convstr (str, sz); + + char *slash = strchr (track, '/'); + if (slash) { + // split into track/number + *slash = 0; + slash++; + numtracks = strdup (slash); + } + } + else if (!strcmp (frameid, "TPOS")) { + if (sz > 1000) { + err = 1; + break; // too large + } + char str[sz+2]; + id3v2_string_read (version_major, &str[0], sz, unsync, readptr); + disc = convstr (str, sz); } else if (!strcmp (frameid, "TIT2")) { trace ("parsing TIT2...\n"); @@ -1033,6 +1055,36 @@ junk_read_id3v2 (playItem_t *it, DB_FILE *fp) { comment = convstr (str, s+1); trace ("COMM text: %s\n", comment); } + else if (!strcmp (frameid, "TENC")) { + if (sz > 1000) { + err = 1; + break; // too large + } + char str[sz+2]; + id3v2_string_read (version_major, &str[0], sz, unsync, readptr); + vendor = convstr (str, sz); + trace ("TENC: %s\n", vendor); + } + else if (!strcmp (frameid, "TPE3")) { + if (sz > 1000) { + err = 1; + break; // too large + } + char str[sz+2]; + id3v2_string_read (version_major, &str[0], sz, unsync, readptr); + performer = convstr (str, sz); + trace ("TPE3: %s\n", performer); + } + else if (!strcmp (frameid, "TCOM")) { + if (sz > 1000) { + err = 1; + break; // too large + } + char str[sz+2]; + id3v2_string_read (version_major, &str[0], sz, unsync, readptr); + composer = convstr (str, sz); + trace ("TCOM: %s\n", composer); + } else if (!strcmp (frameid, "TXXX")) { if (sz < 2) { trace ("TXXX frame is too short, skipped\n"); @@ -1234,10 +1286,22 @@ junk_read_id3v2 (playItem_t *it, DB_FILE *fp) { pl_add_meta (it, "band", band); free (band); } + if (performer) { + pl_add_meta (it, "performer", performer); + free (performer); + } + if (composer) { + pl_add_meta (it, "composer", composer); + free (composer); + } if (track) { pl_add_meta (it, "track", track); free (track); } + if (numtracks) { + pl_add_meta (it, "numtracks", numtracks); + free (numtracks); + } if (title) { pl_add_meta (it, "title", title); free (title); @@ -1280,6 +1344,10 @@ junk_read_id3v2 (playItem_t *it, DB_FILE *fp) { pl_add_meta (it, "comment", comment); free (comment); } + if (disc) { + pl_add_meta (it, "disc", disc); + free (disc); + } if (!title) { pl_add_meta (it, "title", NULL); } |