]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
bouquet: fix overzealous channel removals in merged multi-network setup
authorJames Hutchinson <jahutchinson99@googlemail.com>
Wed, 4 Sep 2024 10:44:54 +0000 (11:44 +0100)
committerFlole <Flole998@users.noreply.github.com>
Fri, 6 Sep 2024 21:30:23 +0000 (23:30 +0200)
src/bouquet.c

index ce97549580333d7b461a069c0fb5c10a75fb2503..59d87f4491c5df1cdab120b55f960fb9dce74221 100644 (file)
@@ -537,16 +537,39 @@ bouquet_add_service(bouquet_t *bq, service_t *s, uint64_t lcn, const char *tag)
 static void
 bouquet_unmap_channel(bouquet_t *bq, service_t *t)
 {
-  idnode_list_mapping_t *ilm, *ilm_next;
+  idnode_list_mapping_t *ilm, *ilm_next, *ilm2;
+  int delchannel;
+  channel_t *ch;
+  service_t *chsvc;
 
   ilm = LIST_FIRST(&t->s_channels);
   while (ilm) {
     ilm_next = LIST_NEXT(ilm, ilm_in1_link);
-    if (((channel_t *)ilm->ilm_in2)->ch_bouquet == bq) {
+    ch = (channel_t *)ilm->ilm_in2;
+    if (ch->ch_bouquet == bq) {
+      delchannel = 1;
       tvhinfo(LS_BOUQUET, "%s / %s: unmapped from %s",
-              channel_get_name((channel_t *)ilm->ilm_in2, channel_blank_name),
+              channel_get_name(ch, channel_blank_name),
               t->s_nicename, bq->bq_name ?: "<unknown>");
-      channel_delete((channel_t *)ilm->ilm_in2, 1);
+
+      // are any other (maybe merged) services from the same bouquet mapped to this channel
+      LIST_FOREACH(ilm2, &ch->ch_services, ilm_in2_link) {
+        chsvc = (service_t *)ilm2->ilm_in1;
+        if (&chsvc->s_id != &t->s_id && idnode_set_exists(bq->bq_services, &chsvc->s_id)) {
+          tvhdebug(LS_BOUQUET, "Service: %s is also linked to %s and was mapped from the same bouquet: %s",
+                   chsvc->s_nicename, channel_get_name(ch, channel_blank_name),
+                   bq->bq_name ?: "<unknown>");
+          delchannel = 0;
+        }
+      }
+
+      if (delchannel)
+        channel_delete(ch, 1);
+      else {
+        tvhinfo(LS_BOUQUET, "Skipped deleting %s as other services are mapped from the same bouquet: %s",
+                channel_get_name(ch, channel_blank_name), bq->bq_name ?: "<unknown>");
+        idnode_list_unlink(ilm, ch);
+      }
     }
     ilm = ilm_next;
   }