2ee381d
diff -Nurp vdr-2.4.6.orig/channels.c vdr-2.4.6/channels.c
2ee381d
--- vdr-2.4.6.orig/channels.c	2020-04-11 11:22:05.000000000 +0200
2ee381d
+++ vdr-2.4.6/channels.c	2021-01-02 14:56:49.883831519 +0100
2ee381d
@@ -16,6 +16,8 @@
2ee381d
 // format characters in order to allow any number of blanks after a numeric
2ee381d
 // value!
2ee381d
 
2ee381d
+#define CHANNELMARKOBSOLETE "OBSOLETE"
2ee381d
+
2ee381d
 // --- tChannelID ------------------------------------------------------------
2ee381d
 
2ee381d
 const tChannelID tChannelID::InvalidID;
2ee381d
@@ -434,6 +436,24 @@ void cChannel::SetSeen(void)
2ee381d
   seen = time(NULL);
2ee381d
 }
2ee381d
 
2ee381d
+bool cChannel::ClearObsoleteChannel(void)
2ee381d
+{
2ee381d
+  bool ChannelsModified = false;
2ee381d
+  if (endswith(name, CHANNELMARKOBSOLETE)) {
2ee381d
+     int mlen = strlen(CHANNELMARKOBSOLETE);
2ee381d
+     int e = strlen(name) - mlen - 1;
2ee381d
+     name[e] = '\0';
2ee381d
+     cString clrname = cString::sprintf("%s", name);
2ee381d
+     name[e] = ' ';
2ee381d
+
2ee381d
+     int OldShowChannelNamesWithSource = Setup.ShowChannelNamesWithSource;
2ee381d
+     Setup.ShowChannelNamesWithSource = 0;
2ee381d
+     ChannelsModified |= SetName(clrname, shortName, provider + mlen + 1);
2ee381d
+     Setup.ShowChannelNamesWithSource = OldShowChannelNamesWithSource;
2ee381d
+     }
2ee381d
+  return ChannelsModified;
2ee381d
+}
2ee381d
+
2ee381d
 void cChannel::DelLinkChannel(cChannel *LinkChannel)
2ee381d
 {
2ee381d
   if (linkChannels) {
2ee381d
@@ -1112,7 +1132,6 @@ cChannel *cChannels::NewChannel(const cC
2ee381d
   return NULL;
2ee381d
 }
2ee381d
 
2ee381d
-#define CHANNELMARKOBSOLETE "OBSOLETE"
2ee381d
 #define CHANNELTIMEOBSOLETE 3600 // seconds to wait before declaring a channel obsolete (in case it has actually been seen before)
2ee381d
 
2ee381d
 bool cChannels::MarkObsoleteChannels(int Source, int Nid, int Tid)
2ee381d
diff -Nurp vdr-2.4.6.orig/channels.h vdr-2.4.6/channels.h
2ee381d
--- vdr-2.4.6.orig/channels.h	2020-06-10 16:00:36.000000000 +0200
2ee381d
+++ vdr-2.4.6/channels.h	2021-01-02 12:58:13.693581025 +0100
2ee381d
@@ -202,6 +202,7 @@ public:
2ee381d
   void SetRefChannel(cChannel *RefChannel);
2ee381d
   bool SetSubtitlingDescriptors(uchar *SubtitlingTypes, uint16_t *CompositionPageIds, uint16_t *AncillaryPageIds);
2ee381d
   void SetSeen(void);
2ee381d
+  bool ClearObsoleteChannel(void);
2ee381d
   void DelLinkChannel(cChannel *LinkChannel);
2ee381d
   };
2ee381d
 
2ee381d
diff -Nurp vdr-2.4.6.orig/pat.c vdr-2.4.6/pat.c
2ee381d
--- vdr-2.4.6.orig/pat.c	2020-12-18 15:51:57.000000000 +0100
2ee381d
+++ vdr-2.4.6/pat.c	2021-01-02 12:56:25.480243876 +0100
2ee381d
@@ -489,6 +489,9 @@ void cPatFilter::Process(u_short Pid, u_
2ee381d
         SwitchToNextPmtPid();
2ee381d
      cChannel *Channel = Channels->GetByServiceID(Source(), Transponder(), pmt.getServiceId());
2ee381d
      if (Channel) {
2ee381d
+        bool seen = Channel->Seen();
2ee381d
+        if (!seen) // not yet seen in sdt.c
2ee381d
+           Channel->SetSeen();
2ee381d
         SI::CaDescriptor *d;
2ee381d
         cCaDescriptors *CaDescriptors = new cCaDescriptors(Channel->Source(), Channel->Transponder(), Channel->Sid(), Pid);
2ee381d
         // Scan the common loop:
2ee381d
@@ -723,6 +726,8 @@ void cPatFilter::Process(u_short Pid, u_
2ee381d
            ChannelsModified |= Channel->SetCaIds(CaDescriptors->CaIds());
2ee381d
            ChannelsModified |= Channel->SetSubtitlingDescriptors(SubtitlingTypes, CompositionPageIds, AncillaryPageIds);
2ee381d
            }
2ee381d
+        if (!seen && (Setup.UpdateChannels == 1 || Setup.UpdateChannels >= 3))
2ee381d
+           ChannelsModified |= Channel->ClearObsoleteChannel(); // just in case
2ee381d
         ChannelsModified |= Channel->SetCaDescriptors(CaDescriptorHandler.AddCaDescriptors(CaDescriptors));
2ee381d
         }
2ee381d
      StateKey.Remove(ChannelsModified);