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.
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.
Hi Klaus,
Es ist jetzt viel besser. Folgendes habe ich noch gefunden, z.B:
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
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.:
2024-09-15T11:35:21.650687+02:00 rpi4s vdr: [1320167] channel 626 (RheinMain TV) event So. 15.09.2024 08:30-09:00 'Inspiration 4 today' status 0->1
2024-09-15T11:35:21.650925+02:00 rpi4s vdr: [1320167] channel 626 (RheinMain TV) event So. 15.09.2024 09:00-09:30 'Antworten mit Bayless Conley' status 0->1
2024-09-15T11:35:21.651052+02:00 rpi4s vdr: [1320167] channel 626 (RheinMain TV) event So. 15.09.2024 09:30-10:00 'Revolution der Gnade - mit Pastor Joseph Prince' status 0->1
2024-09-15T11:35:21.651140+02:00 rpi4s vdr: [1320167] channel 626 (RheinMain TV) event So. 15.09.2024 10:00-10:30 'Teleshopping' status 0->1
2024-09-15T11:35:21.651233+02:00 rpi4s vdr: [1320167] channel 626 (RheinMain TV) event So. 15.09.2024 10:30-11:00 'Teleshopping' status 0->1
2024-09-15T11:35:21.651310+02:00 rpi4s vdr: [1320167] channel 626 (RheinMain TV) event So. 15.09.2024 11:00-11:30 'Erlebt TV' status 0->1
2024-09-15T11:35:21.651396+02:00 rpi4s vdr: [1320167] channel 626 (RheinMain TV) event So. 15.09.2024 11:30-12:00 '(null)' status 0->4
2024-09-15T11:35:21.766150+02:00 rpi4s vdr: [1320167] event So. 15.09.2024 11:30-12:00 'The Lord's challenge mit Joshua Daniel' status 0->1
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
2024-09-16T06:05:54.492188+02:00 rpi4s vdr: [1320167] channel 1833 (ORF RADIO B) event Mo. 16.09.2024 00:00-05:00 'Radio Burgenland Musiknacht' status 4->1
2024-09-16T06:05:54.492531+02:00 rpi4s vdr: [1320167] channel 1833 (ORF RADIO B) event Mo. 16.09.2024 05:00-09:00 '(null)' status 0->4
2024-09-16T06:05:54.605471+02:00 rpi4s vdr: [1320167] event Mo. 16.09.2024 06:00-06:10 'Ö1 Frühjournal' status 0->1
2024-09-16T06:05:54.605641+02:00 rpi4s vdr: [1320167] event Mo. 16.09.2024 06:04-07:04 'Guten Morgen Vorarlberg' status 0->1
2024-09-16T06:05:54.605842+02:00 rpi4s vdr: [1320167] event Mo. 16.09.2024 05:00-09:00 'Guten Morgen Steiermark' status 0->1
2024-09-16T06:05:54.605995+02:00 rpi4s vdr: [1320167] event Mo. 16.09.2024 06:00-09:00 'Guten Morgen Salzburg' status 0->1
2024-09-16T06:05:54.606206+02:00 rpi4s vdr: [1320167] event Mo. 16.09.2024 05:00-10:00 'Guten Morgen Tirol' status 0->1
2024-09-16T06:05:54.609890+02:00 rpi4s vdr: [1320167] event Mo. 16.09.2024 05:00-09:00 'Guten Morgen Burgenland' status 0->1
Display More
Frage:
Ich vermute, eines der Events kommt im EIT mit den current/next Events. Und das andere Event mit der Liste "aller" Events.
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:
if (Tid == 0x4E || (Tid & 0xF0) == 0x50)
pEvent = const_cast<cEvent *>(pSchedule->GetEventById(SiEitEvent.getEventId()));
else
pEvent = const_cast<cEvent *>(pSchedule->GetEventByTime(StartTime));
if (!pEvent || handledExternally) {
if (handledExternally && !EpgHandlers.IsUpdate(SiEitEvent.getEventId(), StartTime, Tid, getVersionNumber()))
continue;
// If we don't have that event yet, we create a new one.
// Otherwise we copy the information into the existing event anyway, because the data might have changed.
pEvent = newEvent = new cEvent(SiEitEvent.getEventId());
...
Display More
> 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?
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...
Und wie kann es dann passieren, dass es 2 Events mit gleicher Startzeit gibt?
Nutzt Du externe EPG-Quellen?
> 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:
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:
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
...
> 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?
Hallo Klaus,
Ich habe auch ohne Plugins getestet, und die Findings, die ich in #30 RE: [epgsearch] Suchtimer erzeugt nicht alle passenden Timer gepostet habe, sind das Ergebnis des Tests ohne Plugins.
Nur zur Sicherheit: die in #50 auch?
OK, ich habe den Test nochmal ohne Plugins wiederholt. Dann gibt es z.B.:
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.
Ich habe jetzt mal deine Ausgaben etwas erweitert:
--- eit.c 2022/12/23 09:47:23 5.6
+++ eit.c 2024/09/21 12:34:18
@@ -166,7 +166,16 @@
cEvent *rEvent = NULL;
cEvent *pEvent = NULL;
if (Tid == 0x4E || (Tid & 0xF0) == 0x50)
+ {//XXX
pEvent = const_cast<cEvent *>(pSchedule->GetEventById(SiEitEvent.getEventId()));
+ if (!pEvent) {
+ cEvent *e = const_cast<cEvent *>(pSchedule->GetEventByTime(StartTime));
+ if (e) {
+ dsyslog("eit.c, channel %d (%s) old ID %5u, TBL %02X, V %2d '%s'", Channel->Number(), Channel->Name(), e->EventID(), e->TableID(), e->Version(), *(e->ToDescr()));
+ dsyslog("eit.c, channel %d (%s) new ID %5u, TBL %02X, V %2d start '%s' end '%s'", Channel->Number(), Channel->Name(), SiEitEvent.getEventId(), Tid, getVersionNumber(), *TimeToString(StartTime), *TimeToString(StartTime + Duration));
+ }
+ }
+ }//XXX
else
pEvent = const_cast<cEvent *>(pSchedule->GetEventByTime(StartTime));
if (!pEvent || handledExternally) {
--- epg.c 2024/09/14 14:17:12 5.10
+++ epg.c 2024/09/21 12:53:31
@@ -1125,7 +1125,10 @@
// The segment overwrites all events from tables with other ids, and
// within the same table id all events must have the same version.
// Special consideration: table 0x4E can only be overwritten with the same id!
+ {//XXX
+ dsyslog("epg.c, del [%02X %2d] ID %5u, TBL %02X, V %2d '%s'", TableID, Version, p->EventID(), p->TableID(), p->Version(), *(p->ToDescr()));//XXX
DelEvent(p);
+ }//XXX
}
}
else
Display More
Damit erhalte ich z.B.:
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
Dann bekommt das aktuelle Event den running Status 1. Was falsch ist.
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:
--- epg.c 2024/09/14 14:17:12 5.10
+++ epg.c 2024/09/21 20:20:17
@@ -1100,14 +1100,6 @@
void cSchedule::Sort(void)
{
events.Sort();
- // Make sure there are no RunningStatusUndefined before the currently running event:
- for (cEvent *p = events.First(); p; p = events.Next(p)) {
- if (p->RunningStatus() >= SI::RunningStatusPausing) {
- for (p = events.Prev(p); p; p = events.Prev(p))
- p->SetRunningStatus(SI::RunningStatusNotRunning);
- break;
- }
- }
SetModified();
}
@@ -1133,6 +1125,14 @@
}
p = n;
}
+ // Make sure there are no RunningStatusUndefined before the currently running event:
+ for (cEvent *p = events.First(); p; p = events.Next(p)) {
+ if (p->RunningStatus() >= SI::RunningStatusPausing) {
+ for (p = events.Prev(p); p; p = events.Prev(p))
+ p->SetRunningStatus(SI::RunningStatusNotRunning);
+ break;
+ }
+ }
}
}
Display More
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)
--- epg.c 2024/09/14 14:17:12 5.10
+++ epg.c 2024/09/22 08:04:09
@@ -1100,14 +1100,6 @@
void cSchedule::Sort(void)
{
events.Sort();
- // Make sure there are no RunningStatusUndefined before the currently running event:
- for (cEvent *p = events.First(); p; p = events.Next(p)) {
- if (p->RunningStatus() >= SI::RunningStatusPausing) {
- for (p = events.Prev(p); p; p = events.Prev(p))
- p->SetRunningStatus(SI::RunningStatusNotRunning);
- break;
- }
- }
SetModified();
}
@@ -1134,6 +1126,14 @@
p = n;
}
}
+ // Make sure there are no RunningStatusUndefined before the currently running event:
+ for (cEvent *p = events.First(); p; p = events.Next(p)) {
+ if (p->RunningStatus() >= SI::RunningStatusPausing) {
+ for (p = events.Prev(p); p; p = events.Prev(p))
+ p->SetRunningStatus(SI::RunningStatusNotRunning);
+ break;
+ }
+ }
}
Display More
> Haben wir vielleicht zwei unterschiedliche qsort-Implementierungen
Kann ich jetzt nicht sagen. Aber laut Spezifikation ist std::qsort nicht stabil, s. z.B. https://stackoverflow.com/ques…tdsort-and-stdstable-sort
Der Patch in #58 sieht gut aus, werde ich testen
Hi Klaus,
Ich habe jetzt in cSchedule::DropOutdated noch weitere Ausgaben zum Debuggen eingebaut:
...
// Make sure there are no RunningStatusUndefined before the currently running event: bool is_logged = false;
for (cEvent *p = events.First(); p; p = events.Next(p)) {
cEvent *ne = events.Next(p);
if (ne && ne->StartTime() == p->StartTime() ) {
if (!is_logged) {
dsyslog("epg.c, cSchedule::DropOutdated, TableID Version [%02X %2d], SegmentStart %s %s, SegmentEnd %s %s", TableID, Version, *DateString(SegmentStart), *TimeString(SegmentStart), *DateString(SegmentEnd), *TimeString(SegmentEnd) );
is_logged = true;
}
dsyslog("epg.c, cSchedule::DropOutdated, first event ID %5u, TBL %02X, V %2d '%s'", p->EventID(), p->TableID(), p->Version(), *(p->ToDescr()));
dsyslog("epg.c, cSchedule::DropOutdated, second event ID %5u, TBL %02X, V %2d '%s'", ne->EventID(), ne->TableID(), ne->Version(), *(ne->ToDescr()));
}
if (p->RunningStatus() >= SI::RunningStatusPausing) {
cEvent *pr = p;
for (p = events.Prev(p); p; p = events.Prev(p)) {
if (pr && p->RunningStatus() != SI::RunningStatusNotRunning) {
esyslog("epg.c, cSchedule::DropOutdated, running event: event %s, event ID %u, RunningStatus %d", *(pr->ToDescr()), pr->EventID(), pr->RunningStatus() );
pr = nullptr;
}
p->SetRunningStatus(SI::RunningStatusNotRunning);
}
break;
}
}
...
Display More
Damit erhalte ich dann im syslog z.B.:
2024-09-24T12:33:38.562127+02:00 rpi4s vdr: [1670962] start EPG scan
2024-09-24T12:33:38.564015+02:00 rpi4s vdr: [1670962] EIT scan: 41 device 1 source S19.2E tp 110891
2024-09-24T12:33:38.564579+02:00 rpi4s vdr: [1670962] opening frontend 0/0
2024-09-24T12:33:38.596674+02:00 rpi4s vdr: [1670962] EIT scan: 40 device 2 source S19.2E tp 111052
2024-09-24T12:33:38.606138+02:00 rpi4s vdr: [1670962] opening frontend 1/0
...
2024-09-24T12:36:09.481472+02:00 rpi4s vdr: [1670969] eit.c, channel 35 (TELEGOLD) old ID 46540, TBL 4E, V 17 'Di. 24.09.2024 07:25-10:50 'Teleshopping''
2024-09-24T12:36:09.481767+02:00 rpi4s vdr: [1670969] eit.c, channel 35 (TELEGOLD) new ID 46918, TBL 50, V 2 start 'Tue Sep 24 07:25:00 2024' end 'Tue Sep 24 10:50:00 2024'
2024-09-24T12:36:09.481931+02:00 rpi4s vdr: [1670969] epg.c, cSchedule::DropOutdated, TableID Version [50 2], SegmentStart Di. 24.09.2024 07:25, SegmentEnd Di. 24.09.2024 10:50
2024-09-24T12:36:09.482131+02:00 rpi4s vdr: [1670969] epg.c, cSchedule::DropOutdated, first event ID 46540, TBL 4E, V 17 'Di. 24.09.2024 07:25-10:50 'Teleshopping''
2024-09-24T12:36:09.482299+02:00 rpi4s vdr: [1670969] epg.c, cSchedule::DropOutdated, second event ID 46918, TBL 50, V 2 'Di. 24.09.2024 07:25-10:50 'Teleshopping''
Display More
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
Don’t have an account yet? Register yourself now and be a part of our community!