[epgsearch] Suchtimer erzeugt nicht alle passenden Timer

  • Die Änderung ist drin: 2024-09-14T08:29:17.050638+02:00 rpi4s vdr: [1204287] VDR version 2.7.1 started


    jetzt beobachte ich mal, ob ich nach diesem Timestamp noch Events mit falschem Running Status finde.

    Client1: ASUS P5QC, Dual Core 3G, Cine S2, Ext. Board von TBE, Xubuntu 20.04, VDR 2.6x

    Client2: RPI3

    Server: RPI4, Sundtek SkyTV Dual 2x

  • Hi Klaus,


    Es ist jetzt viel besser. Folgendes habe ich noch gefunden, z.B:

    Code
    2024-09-15T11:35:22.380138+02:00 rpi4s vdr: [1320167] channel 35 (TELEGOLD) event So. 15.09.2024 07:30-10:55 'Teleshopping' status 0->1
    2024-09-15T11:35:22.380334+02:00 rpi4s vdr: [1320167] channel 35 (TELEGOLD) event So. 15.09.2024 10:55-11:50 '(null)' status 0->4
    2024-09-15T11:35:22.380438+02:00 rpi4s vdr: [1320167]                 event So. 15.09.2024 10:55-11:50 'Das große Daniela Alfinito Wunschkonzert' status 0->1


    Der Kanal fehlt in der letzten Zeile. Ich vermute, es ist auch "channel 35 (TELEGOLD)". Ich vermute, es gibt da zwei Events mit "So. 15.09.2024 10:55-11:50". Eines ohne Titel, mit Status 4. Und ein anderes mit Titel, das jetzt Status 1 bekommt (aber Status 4 wäre wohl richtiger).


    ~ Markus

    Client1: ASUS P5QC, Dual Core 3G, Cine S2, Ext. Board von TBE, Xubuntu 20.04, VDR 2.6x

    Client2: RPI3

    Server: RPI4, Sundtek SkyTV Dual 2x

  • MarkusE Dann gehe ich mal davon aus, dass die Änderung das aktuelle Problem behebt (auch wenn ich es hier nie nachvollziehen konnte). Bisher konnte ja theoretisch zwischen dem Setzen von hasRunning und der späteren Abfrage in cSchedule::Sort() tatsächlich eine unerwartete Änderung des laufenden Events passieren. Mit der neuen Vorgehensweise ist zumindest das nicht mehr möglich.

    Folgendes habe ich noch gefunden, z.B:

    War das ein einmaliges Ereignis, oder tritt das öfter auf?

  • > War das ein einmaliges Ereignis, oder tritt das öfter auf?

    Das tritt öfter auf. z.B.:

    Client1: ASUS P5QC, Dual Core 3G, Cine S2, Ext. Board von TBE, Xubuntu 20.04, VDR 2.6x

    Client2: RPI3

    Server: RPI4, Sundtek SkyTV Dual 2x

  • Frage:

    • Könnte man vor dem Anlegen eines Events prüfen, ob es dieses schon gibt (auf gleiche Startzeit/Stoppzeit prüfen)?
    • Oder nach dem Sortieren auf gleiche Events prüfen?

    Ich vermute, eines der Events kommt im EIT mit den current/next Events. Und das andere Event mit der Liste "aller" Events.

    Client1: ASUS P5QC, Dual Core 3G, Cine S2, Ext. Board von TBE, Xubuntu 20.04, VDR 2.6x

    Client2: RPI3

    Server: RPI4, Sundtek SkyTV Dual 2x

  • Könnte man vor dem Anlegen eines Events prüfen, ob es dieses schon gibt (auf gleiche Startzeit/Stoppzeit prüfen)?

    Das passiert doch bereits, siehe eit.c:

  • > Das passiert doch bereits, siehe eit.c:

    Und wie kann es dann passieren, dass es 2 Events mit gleicher Startzeit gibt? Müsste man das noch explizit prüfen?


    Code
          if (Tid == 0x4E || (Tid & 0xF0) == 0x50)
             pEvent = const_cast<cEvent *>(pSchedule->GetEventById(SiEitEvent.getEventId()));
             if (!pEvent)
                pEvent = const_cast<cEvent *>(pSchedule->GetEventByTime(StartTime));
          else
             pEvent = const_cast<cEvent *>(pSchedule->GetEventByTime(StartTime));
             ...

    Client1: ASUS P5QC, Dual Core 3G, Cine S2, Ext. Board von TBE, Xubuntu 20.04, VDR 2.6x

    Client2: RPI3

    Server: RPI4, Sundtek SkyTV Dual 2x

  • Es sollte eigentlich keine zwei Events mit unerschiedlicher ID und gleicher Startzeit geben.

    Aber bau den Check ruhig mal ein und schau, ob er zuschlägt (wobei du wahrscheinlich noch Klammern setzen musst).


    Ich frage mich nur, warum diese Fehler erst jetzt und nur bei dir auftreten...

  • > Nutzt Du externe EPG-Quellen?

    Ja. Aber ich verändere NUR den Kurztext und die Beschreibung von existierenden Events. Da bin ich sicher, das habe ich selbst implementiert ...


    Ich habe mal testweise folgendes eingebaut:

    Code
          if (Tid == 0x4E || (Tid & 0xF0) == 0x50) {                                                                                                                                     
             pEvent = const_cast<cEvent *>(pSchedule->GetEventById(SiEitEvent.getEventId()));                                                                                            
             if (!pEvent) {                                                                                                                                                              
               pEvent = const_cast<cEvent *>(pSchedule->GetEventByTime(StartTime));                                                                                                      
               if (pEvent) {                                                                                                                                                                          esyslog("eit.c, channel %d (%s) existing event %s, event ID %u, SiEitEvent: EventId, %u", Channel->Number(), Channel->Name(), *(pEvent->ToDescr()), pEvent->EventID(), SiEitEvent.getEventId()  );                                                                                                                                                           
                 }                                                                                                                                                                       
               }                                                                                                                                                                         
             } 
    ...                                                                                                                                                                         


    Und bekomme, ohne lange zu warten:

    Code
    2024-09-16T19:48:02.580771+02:00 rpi4s vdr: [1361317] eit.c, channel 37 (MDR Sachsen HD) existing event Mo. 07.10.2024 06:45-07:15 (VPS: 07.10. 06:45) 'Regionalprogramm', event ID 4
    1603, SiEitEvent: EventId, 41634
    
    
    2024-09-16T19:48:50.983021+02:00 rpi4s vdr: [1361317] eit.c, channel 416 (ORF2N HD) existing event Sa. 21.09.2024 09:05-09:30 (VPS: 21.09. 09:05) 'Der Sagenjäger - Max Müller auf Sp
    urensuche', event ID 44289, SiEitEvent: EventId, 44756
    2024-09-16T19:48:51.404915+02:00 rpi4s vdr: [1361317] eit.c, channel 414 (ORF2W HD) existing event Sa. 21.09.2024 09:05-09:30 (VPS: 21.09. 09:05) 'Der Sagenjäger - Max Müller auf Sp
    urensuche', event ID 44289, SiEitEvent: EventId, 44756
    
    ...

    Client1: ASUS P5QC, Dual Core 3G, Cine S2, Ext. Board von TBE, Xubuntu 20.04, VDR 2.6x

    Client2: RPI3

    Server: RPI4, Sundtek SkyTV Dual 2x

  • > Nutzt Du externe EPG-Quellen?

    Ja. Aber ich verändere NUR den Kurztext und die Beschreibung von existierenden Events. Da bin ich sicher, das habe ich selbst implementiert ...

    Also ist doch ein Plugin im Spiel, das den EPG verändert!?

    Und bekomme, ohne lange zu warten:

    Bevor ich das weiter untersuche: passiert das auch ohne dein EPG-Plugin?

  • OK, ich habe den Test nochmal ohne Plugins wiederholt. Dann gibt es z.B.:

    Code
    2024-09-19T19:51:04.707734+02:00 rpi4s vdr: [1481078] eit.c, channel 333 (NDR Blue) existing event Do. 19.09.2024 20:00-21:00 (VPS: 19.09. 20:00) 'Nachtclub Classics', event ID 9913, SiEitEvent: EventId, 10127
    2024-09-19T19:51:09.449111+02:00 rpi4s vdr: [1481076] eit.c, channel 37 (MDR Sachsen HD) existing event Mo. 07.10.2024 06:45-07:15 (VPS: 07.10. 06:45) 'Regionalprogramm', event ID 42655, SiEitEvent: EventId, 42690
    2024-09-19T19:51:23.027636+02:00 rpi4s vdr: [1481078] eit.c, channel 312 (tagesschau24 HD) existing event Di. 08.10.2024 02:15-02:17 (VPS: 08.10. 02:15) 'Tagesschau', event ID 55746, SiEitEvent: EventId, 56059
    2024-09-19T19:51:23.028058+02:00 rpi4s vdr: [1481078] eit.c, channel 312 (tagesschau24 HD) existing event Di. 08.10.2024 03:00-03:02 (VPS: 08.10. 03:00) 'Tagesschau', event ID 55749, SiEitEvent: EventId, 55746
    
    2024-09-19T19:53:34.650135+02:00 rpi4s vdr: [1481076] eit.c, channel 10 (ProSieben) existing event Di. 24.09.2024 22:55-00:08 'Late Night Berlin - Mit Klaas Heufer-Umlauf', event ID 9314, SiEitEvent: EventId, 9322
    2024-09-19T19:53:34.750371+02:00 rpi4s vdr: [1481076] eit.c, channel 10 (ProSieben) existing event Mi. 25.09.2024 00:08-01:13 'TV total', event ID 9315, SiEitEvent: EventId, 9323
    2024-09-19T19:53:34.750764+02:00 rpi4s vdr: [1481076] eit.c, channel 10 (ProSieben) existing event Mi. 25.09.2024 01:13-03:31 'Mission: Impossible - Phantom Protokoll', event ID 9316, SiEitEvent: EventId, 9324


    Alles andere hätte mich auch gewundert: Wie geschrieben, mein Plugin ändert keine Event IDs, legt keine Events an und löscht auch keine Events.

    Client1: ASUS P5QC, Dual Core 3G, Cine S2, Ext. Board von TBE, Xubuntu 20.04, VDR 2.6x

    Client2: RPI3

    Server: RPI4, Sundtek SkyTV Dual 2x

  • Ich habe jetzt mal deine Ausgaben etwas erweitert:

    Damit erhalte ich z.B.:

    Code
    Sep 21 15:08:34 raspi4 vdr: [21787] eit.c, channel 1733 (MDR S-Anhalt) old ID 40211, TBL 55, V 255 'Wed 02.10.2024 21:15-21:45 (VPS: 02.10. 21:15) 'Bankräuber 2.0 - Skrupellose Geldautomatensprenger (3/3)''
    Sep 21 15:08:34 raspi4 vdr: [21787] eit.c, channel 1733 (MDR S-Anhalt) new ID 43003, TBL 52, V  2 start 'Wed Oct  2 21:15:00 2024' end 'Wed Oct  2 21:45:00 2024'
    Sep 21 15:08:34 raspi4 vdr: [21787] epg.c, del [52  2] ID 40211, TBL 55, V 255 'Wed 02.10.2024 21:15-21:45 (VPS: 02.10. 21:15) 'Bankräuber 2.0 - Skrupellose Geldautomatensprenger (3/3)''

    Der Event mit der ID 40211 in Table 55 wird ersetzt durch den Event mit ID 43003 in Table 52.

    In cSchedule::DropOutdated() wird dann der alte Event gelöscht.


    Das heißt also, du kannst in eit.c zwar einen Event mit gleicher Startzeit finden, dieser ist aber veraltet und wird noch bevor eventuelle Timer-Betrachtungen stattfinden, gelöscht.


    Warum die Sender immer wieder die Event-IDs ändern, weiß der Geier...

  • Erstmal vielen Dank für den Test. Erst wird Sort(), und dann DropOutdated() aufgerufen. D.h. zu dem Zeitpunkt, wenn Sort() aufgerufen wird, gibt es noch Events mit identischer Startzeit. Falls

    • das "veraltete" dieser Events den running Staus 4 hat, und das aktuelle den running Status 0
    • das "aktuelle" dieser Events vor dem veralteten sortiert ist

    Dann bekommt das aktuelle Event den running Status 1. Was falsch ist.

    Client1: ASUS P5QC, Dual Core 3G, Cine S2, Ext. Board von TBE, Xubuntu 20.04, VDR 2.6x

    Client2: RPI3

    Server: RPI4, Sundtek SkyTV Dual 2x

  • Der neue Event wird in der Schedule-Liste hinten angehängt. Um deinen zweiten Punkt zu erfüllen müsste er also durch das Sortieren vor den alten kommen. Wenn das tatsächlich passieren kann, dann hat das ganze bisher wohl nur eher zufällig funktioniert.

    Haben wir vielleicht zwei unterschiedliche qsort-Implementierungen? Kann es sein, dass meine (und wohl viele andere) "stabil" sind (bestehende Ordnung bleibt erhalten) und deine nicht?


    Den Event über die Startzeit zu suchen, wenn er nicht über die ID gefunden wird, funktioniert aber auch nicht immer. Denn wenn der neue Event eine frühere Startzeit hat als der alte, dann landet er auf jeden Fall vor dem alten, egal ob qsort stabil ist oder nicht.


    Als Lösung fällt mir jetzt eigentlich nur ein, den fraglichen Code von cSchedule::Sort() nach cSchedule::DropOutdated() zu verlagern:

    Kannst du mal testen, ob das das Problem behebt?

  • Oder vielleicht eher so, denn der Code wurde ja bisher auf jeden Fall ausgeführt, nicht nur wenn

    (SegmentStart > 0 && SegmentEnd > 0)

  • Hi Klaus,


    Ich habe jetzt in cSchedule::DropOutdated noch weitere Ausgaben zum Debuggen eingebaut:

    Damit erhalte ich dann im syslog z.B.:


    Dass Event 46540 nicht gelöscht wird (da table ID dieses Events == 0x4E), leuchtet mir ein. Trotzdem ist es irgendwie unschön zwei Events mit der gleichen Startzeit zu haben. Wäre es sinnvoll, in diesem Fall das andere Event 46918 zu löschen?


    ~ Markus

    Client1: ASUS P5QC, Dual Core 3G, Cine S2, Ext. Board von TBE, Xubuntu 20.04, VDR 2.6x

    Client2: RPI3

    Server: RPI4, Sundtek SkyTV Dual 2x

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!