]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
bouquets: add enigma1 parser, allow edit urls, logic fixes
authorJaroslav Kysela <perex@perex.cz>
Mon, 19 Oct 2015 19:56:58 +0000 (21:56 +0200)
committerJaroslav Kysela <perex@perex.cz>
Mon, 19 Oct 2015 19:56:58 +0000 (21:56 +0200)
src/api/api_bouquet.c
src/bouquet.c
src/webui/static/app/cteditor.js

index d5ad9eb614888b221b0ab4fa69f777d4a0b6b1fd..6c917795d7241669f868b6d7411544f595cb625c 100644 (file)
@@ -63,9 +63,13 @@ api_bouquet_create
 {
   htsmsg_t *conf;
   bouquet_t *bq;
+  const char *s;
 
   if (!(conf = htsmsg_get_map(args, "conf")))
     return EINVAL;
+  s = htsmsg_get_str(conf, "ext_url");
+  if (s == NULL || *s == '\0')
+    return EINVAL;
 
   pthread_mutex_lock(&global_lock);
   bq = bouquet_create(NULL, conf, NULL, NULL);
index ebd3c60b82c2aec22bfa066b93529990bf6dd07f..d4a98aec99837befc3648071687d72eda9cb102c 100644 (file)
@@ -92,15 +92,20 @@ bouquet_create(const char *uuid, htsmsg_t *conf,
   }
 
   if (bq->bq_ext_url) {
-    free(bq->bq_src);
-    snprintf(buf, sizeof(buf), "exturl://%s", idnode_uuid_as_sstr(&bq->bq_id));
-    bq->bq_src = strdup(buf);
-    bq->bq_download = bqd = calloc(1, sizeof(*bqd));
-    bqd->bq = bq;
-    download_init(&bqd->download, "bouquet");
-    bqd->download.process = bouquet_download_process;
-    bqd->download.stop = bouquet_download_stop;
-    bouquet_change_comment(bq, bq->bq_ext_url, 0);
+    if (bq->bq_src && strncmp(bq->bq_src, "exturl://", 9) != 0) {
+      free(bq->bq_ext_url);
+      bq->bq_ext_url = NULL;
+    } else {
+      free(bq->bq_src);
+      snprintf(buf, sizeof(buf), "exturl://%s", idnode_uuid_as_sstr(&bq->bq_id));
+      bq->bq_src = strdup(buf);
+      bq->bq_download = bqd = calloc(1, sizeof(*bqd));
+      bqd->bq = bq;
+      download_init(&bqd->download, "bouquet");
+      bqd->download.process = bouquet_download_process;
+      bqd->download.stop = bouquet_download_stop;
+      bouquet_change_comment(bq, bq->bq_ext_url, 0);
+    }
   }
 
   bq2 = RB_INSERT_SORTED(&bouquets, bq, bq_link, _bq_cmp);
@@ -951,6 +956,7 @@ const idclass_t bouquet_class = {
       .name     = N_("Re-fetch period (mins)"),
       .off      = offsetof(bouquet_t, bq_ext_url_period),
       .opts     = PO_ADVANCED | PO_HIDDEN,
+      .notify   = bouquet_class_ext_url_notify,
       .def.i    = 60
     },
     {
@@ -1041,7 +1047,7 @@ parse_enigma2(bouquet_t *bq, char *data)
   char *argv[11], *p, *tagname = NULL, *name;
   long lv, stype, sid, tsid, onid, hash;
   uint32_t seen = 0;
-  int n;
+  int n, ver = 2;
 
   while (*data) {
     if (strncmp(data, "#NAME ", 6) == 0) {
@@ -1051,6 +1057,7 @@ parse_enigma2(bouquet_t *bq, char *data)
         bq->bq_name = strdup(p);
     } if (strncmp(data, "#SERVICE ", 9) == 0) {
       data += 9, p = data;
+service:
       while (*data && *data != '\r' && *data != '\n') data++;
       if (*data) { *data = '\0'; data++; }
       n = http_tokenize(p, argv, ARRAY_SIZE(argv), ':');
@@ -1072,6 +1079,9 @@ parse_enigma2(bouquet_t *bq, char *data)
           tagname = name;
         }
       }
+    } else if (strncmp(data, "#SERVICE: ", 10) == 0) {
+      ver = 1, data += 10, p = data;
+      goto service;
     } else {
       while (*data && *data != '\r' && *data != '\n') data++;
     }
@@ -1079,7 +1089,7 @@ next:
     while (*data && (*data == '\r' || *data == '\n')) data++;
   }
   bouquet_completed(bq, seen);
-  tvhinfo("bouquet", "parsed Enigma2 bouquet %s (%d services)", bq->bq_name, seen);
+  tvhinfo("bouquet", "parsed Enigma%d bouquet %s (%d services)", ver, bq->bq_name, seen);
   return 0;
 }
 
index 4f4e1446e796c7928bae4c68863d2fe7b590818d..0d7a3de702567bd7f02ad6339128afc3f52520a5 100644 (file)
@@ -33,10 +33,11 @@ tvheadend.cteditor = function(panel, index)
  */
 tvheadend.bouquet = function(panel, index)
 {
-    var list = 'enabled,rescan,name,maptoch,mapnolcn,lcn_off,mapnoname,mapradio,' +
-               'chtag,source,services_count,services_seen,comment';
-    var alist = 'enabled,ext_url,name,maptoch,mapnolcn,lcn_off,mapnoname,mapradio,' +
-                'chtag,comment';
+    var list0 = 'name,maptoch,mapnolcn,lcn_off,mapnoname,mapradio,' +
+                'chtag,source,services_count,services_seen,comment';
+    var list  = 'enabled,rescan,' + list0;
+    var elist = 'enabled,rescan,ext_url,' + list0;
+    var alist = 'enabled,ext_url,' + list0;
 
     tvheadend.idnode_grid(panel, {
         url: 'api/bouquet',
@@ -66,7 +67,7 @@ tvheadend.bouquet = function(panel, index)
             create: { }
         },
         del: true,
-        edit: { params: { list: list } },
+        edit: { params: { list: elist } },
         sort: {
           field: 'name',
           direction: 'ASC'