]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
bouquets: freesat/bskyb - fix the bouquet update logic (do not add duplicate services)
authorJaroslav Kysela <perex@perex.cz>
Wed, 5 Nov 2014 10:01:55 +0000 (11:01 +0100)
committerJaroslav Kysela <perex@perex.cz>
Sat, 8 Nov 2014 20:05:38 +0000 (21:05 +0100)
src/input/mpegts/dvb_psi.c

index 0199ed3e545e0959a3c3ac471cc6366708c23a44..1aa67339e2b7e50a43249c80a0cc52ffb7580d39 100644 (file)
@@ -54,6 +54,7 @@ typedef struct dvb_bat_svc {
   TAILQ_ENTRY(dvb_bat_svc) link;
   mpegts_service_t *svc;
   dvb_freesat_svc_t *fallback;
+  uint32_t used:1;
 } dvb_bat_svc_t;
 
 typedef struct dvb_bat_id {
@@ -515,6 +516,9 @@ dvb_freesat_completed
   uint16_t sid;
   uint32_t total = 0, regions = 0, uregions = 0;
 
+  tvhtrace(dstr, "completed %s [%04X] bouquets '%s'",
+           bi->freesat ? "freesat" : "bskyb", bi->nbid, bi->name);
+
   /* Find all "fallback" services and region specific */
   TAILQ_FOREACH(bs, &bi->services, link) {
     total++;
@@ -532,8 +536,10 @@ dvb_freesat_completed
             break;
         if (!fr)
           tvhtrace(dstr, "cannot find freesat region id %u", fs->regionid);
-        else
+        else {
+          bs->used = 1;
           TAILQ_INSERT_TAIL(&fr->services, fs, region_link);
+        }
       }
   }
 
@@ -544,11 +550,13 @@ dvb_freesat_completed
     uregions++;
     TAILQ_FOREACH(fs, &fr->services, region_link)
       dvb_freesat_add_service(bi, fr, fs->svc, fs->lcn);
-    TAILQ_FOREACH(bs, &bi->services, link)
+    TAILQ_FOREACH(bs, &bi->services, link) {
+      if (bs->used) continue;
       if ((fs = bs->fallback) != NULL)
         dvb_freesat_add_service(bi, fr, bs->svc, fs->lcn);
       else
         dvb_freesat_add_service(bi, fr, bs->svc, 0);
+    }
   }
 
   tvhtrace(dstr, "completed %s [%04X] bouquets '%s' total %u regions %u (%u)",
@@ -566,8 +574,14 @@ dvb_freesat_completed
   }
 
   /* Clear all "fallback/default" services */
-  TAILQ_FOREACH(bs, &bi->services, link)
+  TAILQ_FOREACH(bs, &bi->services, link) {
     bs->fallback = NULL;
+    bs->used = 0;
+  }
+
+  tvhtrace(dstr, "completed %s [%04X] bouquets '%s' update finished",
+           bi->freesat ? "freesat" : "bskyb", bi->nbid, bi->name);
+
 }
 
 /*
@@ -621,7 +635,7 @@ dvb_bskyb_local_channels
   len -= 2;
   ptr += 2;
 
-  tvhtrace(dstr, "      region id %02X (%d) unknown %02X (%d)\n",
+  tvhtrace(dstr, "      region id %02X (%d) unknown %02X (%d)",
            regionid, regionid, ptr[0], ptr[0]);
 
   while (len > 8) {
@@ -632,7 +646,7 @@ dvb_bskyb_local_channels
     ptr += 9;
     len -= 9;
 
-    tvhtrace(dstr, "      sid %04X (%d) type %02X (%d) lcn %d unknown %04X (%d)\n",
+    tvhtrace(dstr, "      sid %04X (%d) type %02X (%d) lcn %d unknown %04X (%d)",
              sid, sid, stype, stype, lcn, unk, unk);
 
     TAILQ_FOREACH(fs, &b->fservices, link)