From: Jaroslav Kysela Date: Thu, 15 Oct 2015 13:38:18 +0000 (+0200) Subject: IPTV: another m3u parser improvements X-Git-Tag: v4.2.1~1907 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=765cc8987f93221e23e8bfcf528e95d6d2d0951e;p=thirdparty%2Ftvheadend.git IPTV: another m3u parser improvements --- diff --git a/src/input/mpegts/iptv/iptv_auto.c b/src/input/mpegts/iptv/iptv_auto.c index e3dd5bb71..14bdeb703 100644 --- a/src/input/mpegts/iptv/iptv_auto.c +++ b/src/input/mpegts/iptv/iptv_auto.c @@ -40,23 +40,32 @@ static char *get_m3u_str(char *data, char **res) char *p = data, first = *data; if (first == '"' || first == '\'') { - data++; - p = data; + data++; p++; while (*data && *data != first) data++; } else { - p = data; while (*data && *data != ',' && *data > ' ') data++; } - *res = data; if (*data) { *data = '\0'; - (*res)++; + data++; } + *res = data; return p; } +/* + * + */ +static char *until_eol(char *d) +{ + while (*d && *d != '\r' && *d != '\n') d++; + if (*d) { *d = '\0'; d++; } + while (*d && (*d == '\r' || *d == '\n')) d++; + return d; +} + /* * */ @@ -219,18 +228,21 @@ iptv_auto_network_process_m3u(iptv_network_t *in, char *data, logo = NULL; epgid = NULL; data += 8; + while (*data > ' ' && *data != ',') data++; while (1) { while (*data && *data <= ' ') data++; if (*data == ',') break; - if (strncmp(data, "tvg-logo=", 9) == 0) - logo = get_m3u_str(data + 9, &data); - else if (strncmp(data, "tvg-id=", 7) == 0) - epgid = get_m3u_str(data + 7, &data); - else if (strncmp(data, "logo=", 5) == 0) - logo = get_m3u_str(data + 5, &data); - else { + if (strncmp(data, "tvg-logo=", 9) == 0) { + logo = get_m3u_str(data + 9, &data); continue; + } else if (strncmp(data, "tvg-id=", 7) == 0) { + epgid = get_m3u_str(data + 7, &data); continue; + } else if (strncmp(data, "logo=", 5) == 0) { + logo = get_m3u_str(data + 5, &data); continue; + } else { data++; - while (*data && *data != ',' && *data > ' ') data++; + while (*data && *data != ',' && *data != '=') data++; + if (*data == '=') + get_m3u_str(data + 1, &data); } } if (*data == ',') { @@ -239,8 +251,7 @@ iptv_auto_network_process_m3u(iptv_network_t *in, char *data, if (*data) name = data; } - while (*data && *data != '\n') data++; - if (*data) data++; + data = until_eol(data); continue; } else if (strncmp(data, "#EXT", 4) == 0) { data += 4; @@ -250,8 +261,7 @@ iptv_auto_network_process_m3u(iptv_network_t *in, char *data, } while (*data && *data <= ' ') data++; url = data; - while (*data && *data != '\n') data++; - if (*data) { *data = '\0'; data++; } + data = until_eol(data); if (*url && *url > ' ') iptv_auto_network_process_m3u_item(in, last_url, remove_args, url, name, logo, epgid, diff --git a/src/input/mpegts/iptv/iptv_http.c b/src/input/mpegts/iptv/iptv_http.c index a95a736ac..8b6ae2a56 100644 --- a/src/input/mpegts/iptv/iptv_http.c +++ b/src/input/mpegts/iptv/iptv_http.c @@ -24,6 +24,14 @@ /* * M3U parser */ +static char *until_eol(char *d) +{ + while (*d && *d != '\r' && *d != '\n') d++; + if (*d) { *d = '\0'; d++; } + while (*d && (*d == '\r' || *d == '\n')) d++; + return d; +} + static char * iptv_http_m3u(char *data) { @@ -33,14 +41,12 @@ iptv_http_m3u(char *data) if (*data) data++; while (*data) { if (strncmp(data, "#EXT", 4) == 0) { - while (*data && *data != '\n') data++; - if (*data) data++; + data = until_eol(data); continue; } while (*data && *data <= ' ') data++; url = data; - while (*data && *data != '\n') data++; - if (*data) { *data = '\0'; data++; } + data = until_eol(data); if (*url && *url > ' ') return strdup(url); }