summaryrefslogtreecommitdiff
path: root/junklib.c
diff options
context:
space:
mode:
authorGravatar Alexey Yakovenko <wakeroid@gmail.com>2010-03-27 13:29:33 +0100
committerGravatar Alexey Yakovenko <wakeroid@gmail.com>2010-03-27 13:29:33 +0100
commitb83cbe27c1bdb55133ef581fdbaf98b1283fa621 (patch)
tree9257026545b4549312b5feebab9553acfdc7672a /junklib.c
parentd6b3275ebf1240c8c626c98eb72ca03bdc06155a (diff)
added more frame types into id3v2.3 and id3v2.4 parser
Diffstat (limited to 'junklib.c')
-rw-r--r--junklib.c68
1 files changed, 68 insertions, 0 deletions
diff --git a/junklib.c b/junklib.c
index a0c251e0..5dd986a7 100644
--- a/junklib.c
+++ b/junklib.c
@@ -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);
}