summaryrefslogtreecommitdiff
path: root/playlist.c
diff options
context:
space:
mode:
authorGravatar Alexey Yakovenko <waker@users.sourceforge.net>2014-06-13 19:11:37 +0200
committerGravatar Alexey Yakovenko <waker@users.sourceforge.net>2014-06-13 19:11:37 +0200
commit055ca014541453a3a2e07db6902b16f9406bf530 (patch)
tree861c62dc5aff4db7536278c9c8940b5033265613 /playlist.c
parenta46e39c5bc58d77a376652fe7f85f9c5b3b8e67b (diff)
improved cuesheet charset detection
Diffstat (limited to 'playlist.c')
-rw-r--r--playlist.c27
1 files changed, 16 insertions, 11 deletions
diff --git a/playlist.c b/playlist.c
index 7a3bf5a0..5be2a779 100644
--- a/playlist.c
+++ b/playlist.c
@@ -834,7 +834,12 @@ pl_cue_skipspaces (const uint8_t *p) {
}
static void
-pl_get_qvalue_from_cue (const uint8_t *p, int sz, char *out) {
+pl_get_qvalue_from_cue (const uint8_t *p, int sz, char *out, const char *charset) {
+ if (!charset) {
+ strcpy (out, "<UNRECOGNIZED CHARSET>");
+ return;
+ }
+
char *str = out;
if (*p == 0) {
*out = 0;
@@ -867,10 +872,7 @@ pl_get_qvalue_from_cue (const uint8_t *p, int sz, char *out) {
out++;
*out = 0;
}
- const char *charset = junk_detect_charset (str);
- if (!charset) {
- return;
- }
+
// recode
int l = strlen (str);
char recbuf[l*10];
@@ -1033,11 +1035,14 @@ plt_process_cue_track (playlist_t *playlist, const char *fname, const int starts
playItem_t *
plt_insert_cue_from_buffer (playlist_t *playlist, playItem_t *after, playItem_t *origin, const uint8_t *buffer, int buffersize, int numsamples, int samplerate) {
- LOCK;
if (buffersize >= 3 && buffer[0] == 0xef && buffer[1] == 0xbb && buffer[2] == 0xbf) {
buffer += 3;
buffersize -= 3;
}
+
+ const char *charset = junk_detect_charset_len (buffer, buffersize);
+
+ LOCK;
playItem_t *ins = after;
trace ("plt_insert_cue_from_buffer numsamples=%d, samplerate=%d\n", numsamples, samplerate);
char albumperformer[256] = "";
@@ -1086,25 +1091,25 @@ plt_insert_cue_from_buffer (playlist_t *playlist, playItem_t *after, playItem_t
// trace ("cue line: %s\n", p);
if (!strncmp (p, "PERFORMER ", 10)) {
if (!track[0]) {
- pl_get_qvalue_from_cue (p + 10, sizeof (albumperformer), albumperformer);
+ pl_get_qvalue_from_cue (p + 10, sizeof (albumperformer), albumperformer, charset);
}
else {
- pl_get_qvalue_from_cue (p + 10, sizeof (performer), performer);
+ pl_get_qvalue_from_cue (p + 10, sizeof (performer), performer, charset);
}
trace ("cue: got performer: %s\n", performer);
}
else if (!strncmp (p, "TITLE ", 6)) {
if (str[0] > ' ' && !albumtitle[0]) {
- pl_get_qvalue_from_cue (p + 6, sizeof (albumtitle), albumtitle);
+ pl_get_qvalue_from_cue (p + 6, sizeof (albumtitle), albumtitle, charset);
trace ("cue: got albumtitle: %s\n", albumtitle);
}
else {
- pl_get_qvalue_from_cue (p + 6, sizeof (title), title);
+ pl_get_qvalue_from_cue (p + 6, sizeof (title), title, charset);
trace ("cue: got title: %s\n", title);
}
}
else if (!strncmp (p, "REM GENRE ", 10)) {
- pl_get_qvalue_from_cue (p + 10, sizeof (genre), genre);
+ pl_get_qvalue_from_cue (p + 10, sizeof (genre), genre, charset);
}
else if (!strncmp (p, "REM DATE ", 9)) {
pl_get_value_from_cue (p + 9, sizeof (date), date);