static char * iptv_http_m3u(char *data) { char *url; while (*data && *data != '\n') data++; if (*data) data++; while (*data) { if (strncmp(data, "#EXT", 4) == 0) { data = until_eol(data); continue; } while (*data && *data <= ' ') data++; url = data; data = until_eol(data); if (*url && *url > ' ') return strdup(url); } return NULL; }
/* * Note: text in data pointer is not preserved (must be read/write) */ htsmsg_t *parse_m3u (char *data, const char *charset, const char *url) { char *p, *x, *y; char *charset_id = intlconv_charset_id(charset, 0, 1); const char *multi_name; int delim; htsmsg_t *m = htsmsg_create_map(); htsmsg_t *item = NULL, *l = NULL, *t, *key = NULL; char buf[512]; while (*data && *data <= ' ') data++; p = data; data = until_eol(data); if (strncmp(p, "#EXTM3U", 7)) { htsmsg_add_msg(m, "items", htsmsg_create_list()); return m; } while (*data) { if (strncmp(data, "#EXTINF:", 8) == 0) { if (item == NULL) item = htsmsg_create_map(); data += 8; p = data; if (*data == '-') data++; while (*data >= '0' && *data <= '9') data++; delim = *data; *data = '\0'; htsmsg_add_s64(item, "m3u-duration", strtoll(p, NULL, 10)); *data = delim; while (*data > ' ' && *data != ',') data++; while (delim && delim != ',' && delim != '\n' && delim != '\r') { while (*data && *data <= ' ') data++; if (*data == '\0' || *data == ',') break; p = data++; while (*data && *data != ',' && *data != '=') data++; if (*data == '=') { *data = '\0'; x = get_m3u_str(data + 1, &data, &delim); if (*p && *x) { y = intlconv_to_utf8safestr(charset_id, x, strlen(x)*2); htsmsg_add_str(item, p, y ?: ".invalid.charset."); free(y); } get_m3u_str_post(&data, delim); } } p = NULL; if (*data == ',') { delim = ','; data++; } if (delim == ',') { while (*data && *data <= ' ' && *data != '\n' && *data != '\r') data++; if (*data) p = data; } data = until_eol(data); if (p && *p) { y = intlconv_to_utf8safestr(charset_id, p, strlen(p)*2); htsmsg_add_str(item, "m3u-name", y ?: ".invalid.charset."); free(y); }