diff options
Diffstat (limited to 'apps/metadata')
-rw-r--r-- | apps/metadata/id3tags.c | 34 | ||||
-rw-r--r-- | apps/metadata/vorbis.c | 20 |
2 files changed, 51 insertions, 3 deletions
diff --git a/apps/metadata/id3tags.c b/apps/metadata/id3tags.c index dcf71f71bf..e9b59e012a 100644 --- a/apps/metadata/id3tags.c +++ b/apps/metadata/id3tags.c | |||
@@ -995,6 +995,40 @@ void setid3v2title(int fd, struct mp3entry *entry) | |||
995 | if(bytesread >= buffersize - bufferpos) | 995 | if(bytesread >= buffersize - bufferpos) |
996 | bytesread = buffersize - bufferpos - 1; | 996 | bytesread = buffersize - bufferpos - 1; |
997 | 997 | ||
998 | if ( /* Is it an embedded cuesheet? */ | ||
999 | (tr->tag_length == 4 && !memcmp(header, "TXXX", 4)) && | ||
1000 | (bytesread >= 14 && !strncmp(utf8buf, "CUESHEET", 8)) | ||
1001 | ) { | ||
1002 | unsigned char char_enc = 0; | ||
1003 | /* 0CUESHEET0 = 10 bytes */ | ||
1004 | unsigned char cuesheet_offset = 10; | ||
1005 | switch (tag[0]) { | ||
1006 | case 0x00: | ||
1007 | char_enc = CHAR_ENC_ISO_8859_1; | ||
1008 | break; | ||
1009 | case 0x01: | ||
1010 | char_enc = CHAR_ENC_UTF_16_LE; | ||
1011 | cuesheet_offset += cuesheet_offset+1; | ||
1012 | break; | ||
1013 | case 0x02: | ||
1014 | char_enc = CHAR_ENC_UTF_16_BE; | ||
1015 | cuesheet_offset += cuesheet_offset+1; | ||
1016 | break; | ||
1017 | case 0x03: | ||
1018 | char_enc = CHAR_ENC_UTF_8; | ||
1019 | break; | ||
1020 | } | ||
1021 | if (char_enc > 0) { | ||
1022 | entry->embed_cuesheet.present = true; | ||
1023 | entry->embed_cuesheet.pos = lseek(fd, 0, SEEK_CUR) | ||
1024 | - framelen + cuesheet_offset; | ||
1025 | entry->embed_cuesheet.size = totframelen | ||
1026 | - cuesheet_offset; | ||
1027 | entry->embed_cuesheet.encoding = char_enc; | ||
1028 | } | ||
1029 | break; | ||
1030 | } | ||
1031 | |||
998 | for (j = 0; j < bytesread; j++) | 1032 | for (j = 0; j < bytesread; j++) |
999 | tag[j] = utf8buf[j]; | 1033 | tag[j] = utf8buf[j]; |
1000 | 1034 | ||
diff --git a/apps/metadata/vorbis.c b/apps/metadata/vorbis.c index f6d3af1cef..29848daa19 100644 --- a/apps/metadata/vorbis.c +++ b/apps/metadata/vorbis.c | |||
@@ -341,15 +341,29 @@ long read_vorbis_tags(int fd, struct mp3entry *id3, | |||
341 | } | 341 | } |
342 | 342 | ||
343 | len -= read_len; | 343 | len -= read_len; |
344 | read_len = file_read_string(&file, id3->path, sizeof(id3->path), -1, len); | ||
344 | 345 | ||
345 | if (file_read_string(&file, id3->path, sizeof(id3->path), -1, len) < 0) | 346 | if (read_len < 0) |
346 | { | 347 | { |
347 | return 0; | 348 | return 0; |
348 | } | 349 | } |
349 | 350 | ||
350 | logf("Vorbis comment %d: %s=%s", i, name, id3->path); | 351 | logf("Vorbis comment %d: %s=%s", i, name, id3->path); |
351 | len = parse_tag(name, id3->path, id3, buf, buf_remaining, | 352 | |
352 | TAGTYPE_VORBIS); | 353 | /* Is it an embedded cuesheet? */ |
354 | if (!strcasecmp(name, "CUESHEET")) | ||
355 | { | ||
356 | id3->embed_cuesheet.present = true; | ||
357 | id3->embed_cuesheet.pos = lseek(file.fd, 0, SEEK_CUR) - read_len; | ||
358 | id3->embed_cuesheet.size = len; | ||
359 | id3->embed_cuesheet.encoding = CHAR_ENC_UTF_8; | ||
360 | } | ||
361 | else | ||
362 | { | ||
363 | len = parse_tag(name, id3->path, id3, buf, buf_remaining, | ||
364 | TAGTYPE_VORBIS); | ||
365 | } | ||
366 | |||
353 | buf += len; | 367 | buf += len; |
354 | buf_remaining -= len; | 368 | buf_remaining -= len; |
355 | } | 369 | } |