HTTP Reader: Guess encoding type of stream info

Stream metadata could be in any encoding, not necessarily UTF-8. Handle
this in an appropriate way.

Signed-off-by: Christopher Snowhill <kode54@gmail.com>
CQTexperiment
Christopher Snowhill 2022-02-16 01:51:16 -08:00
parent 1ac1fe29c7
commit 8c945b53de
1 changed files with 14 additions and 7 deletions

View File

@ -59,6 +59,13 @@ static size_t http_curl_write_wrapper(HTTPSource *fp, void *ptr, size_t size) {
return size - avail; return size - avail;
} }
static NSString *guess_encoding_of_string(const char *input) {
NSString *ret = @"";
NSData *stringData = [NSData dataWithBytes:input length:strlen(input)];
[NSString stringEncodingForData:stringData encodingOptions:nil convertedString:&ret usedLossyConversion:nil];
return ret;
}
static int http_parse_shoutcast_meta(HTTPSource *fp, const char *meta, size_t size) { static int http_parse_shoutcast_meta(HTTPSource *fp, const char *meta, size_t size) {
// DLog (@"reading %d bytes of metadata\n", size); // DLog (@"reading %d bytes of metadata\n", size);
DLog(@"%s", meta); DLog(@"%s", meta);
@ -90,18 +97,18 @@ static int http_parse_shoutcast_meta(HTTPSource *fp, const char *meta, size_t si
const char *orig_artist = [fp->artist UTF8String]; const char *orig_artist = [fp->artist UTF8String];
if(!orig_title || strcasecmp(orig_title, tit)) { if(!orig_title || strcasecmp(orig_title, tit)) {
fp->title = [NSString stringWithUTF8String:tit]; fp->title = guess_encoding_of_string(tit);
fp->gotmetadata = 1; fp->gotmetadata = 1;
} }
if(!orig_artist || strcasecmp(orig_artist, title)) { if(!orig_artist || strcasecmp(orig_artist, title)) {
fp->artist = [NSString stringWithUTF8String:title]; fp->artist = guess_encoding_of_string(title);
fp->gotmetadata = 1; fp->gotmetadata = 1;
} }
} else { } else {
const char *orig_title = [fp->title UTF8String]; const char *orig_title = [fp->title UTF8String];
if(!orig_title || strcasecmp(orig_title, title)) { if(!orig_title || strcasecmp(orig_title, title)) {
fp->artist = @""; fp->artist = @"";
fp->title = [NSString stringWithUTF8String:title]; fp->title = guess_encoding_of_string(title);
fp->gotmetadata = 1; fp->gotmetadata = 1;
} }
} }
@ -199,15 +206,15 @@ static size_t http_content_header_handler_int(void *ptr, size_t size, void *stre
p = parse_header(p, end, key, sizeof(key), value, sizeof(value)); p = parse_header(p, end, key, sizeof(key), value, sizeof(value));
DLog(@"%skey=%s value=%s\n", fp->icyheader ? "[icy] " : "", key, value); DLog(@"%skey=%s value=%s\n", fp->icyheader ? "[icy] " : "", key, value);
if(!strcasecmp((char *)key, "Content-Type")) { if(!strcasecmp((char *)key, "Content-Type")) {
fp->content_type = [NSString stringWithUTF8String:(const char *)value]; fp->content_type = guess_encoding_of_string((const char *)value);
} else if(!strcasecmp((char *)key, "Content-Length")) { } else if(!strcasecmp((char *)key, "Content-Length")) {
char *end; char *end;
fp->length = strtol((const char *)value, &end, 10); fp->length = strtol((const char *)value, &end, 10);
} else if(!strcasecmp((char *)key, "icy-name")) { } else if(!strcasecmp((char *)key, "icy-name")) {
fp->title = [NSString stringWithUTF8String:(const char *)value]; fp->title = guess_encoding_of_string((const char *)value);
fp->gotmetadata = 1; fp->gotmetadata = 1;
} else if(!strcasecmp((char *)key, "icy-genre")) { } else if(!strcasecmp((char *)key, "icy-genre")) {
fp->genre = [NSString stringWithUTF8String:(const char *)value]; fp->genre = guess_encoding_of_string((const char *)value);
fp->gotmetadata = 1; fp->gotmetadata = 1;
} else if(!strcasecmp((char *)key, "icy-metaint")) { } else if(!strcasecmp((char *)key, "icy-metaint")) {
// printf ("icy-metaint: %d\n", atoi (value)); // printf ("icy-metaint: %d\n", atoi (value));
@ -215,7 +222,7 @@ static size_t http_content_header_handler_int(void *ptr, size_t size, void *stre
fp->icy_metaint = (int)strtoul((const char *)value, &end, 10); fp->icy_metaint = (int)strtoul((const char *)value, &end, 10);
fp->wait_meta = fp->icy_metaint; fp->wait_meta = fp->icy_metaint;
} else if(!strcasecmp((char *)key, "icy-url")) { } else if(!strcasecmp((char *)key, "icy-url")) {
fp->album = [NSString stringWithUTF8String:(const char *)value]; fp->album = guess_encoding_of_string((const char *)value);
fp->gotmetadata = 1; fp->gotmetadata = 1;
} }