]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
IPTV: another m3u parser improvements
authorJaroslav Kysela <perex@perex.cz>
Thu, 15 Oct 2015 13:38:18 +0000 (15:38 +0200)
committerJaroslav Kysela <perex@perex.cz>
Thu, 15 Oct 2015 13:38:18 +0000 (15:38 +0200)
src/input/mpegts/iptv/iptv_auto.c
src/input/mpegts/iptv/iptv_http.c

index e3dd5bb712a0bb8a218fdf9486fd7c1a805f2fa1..14bdeb703f1aba437d6a3d4548b1b8f7e89c30b7 100644 (file)
@@ -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,
index a95a736ac585781427520b7222c7d47ea1865873..8b6ae2a5695aaee91427e9b82d3d949ba90f9535 100644 (file)
 /*
  * 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);
   }