Posts by SHF

    Man könnte allenfalls einmal programmierte Timer nie löschen.
    Natürlich mit der Ausnahme, wenn "bereits aufgezeichnet" plötzlich matcht.
    Aber ich weiß nicht, ob man das sowas machen will :/.

    Bei der "Kreativität", die die EPG-Macher teilweise an den Tag legen, ist schwer was zu machen.
    Wenn man nur "Sportschau"en mit "Bundesliga" aufzeichnen will und Begriff "Bundesliga" nicht erwähnt wird, kannst du nur alles aufnehmen.

    Gleiches war mit auch schon bei NZZ-Format auf 3Sat aufgefallen.
    Die erwähnen "NZZ-Format" oft nicht mal in der Beschreibung.

    Ich denke, man müsste den Git-Fehler abfangen:

    Oder so ähnlich ...

    The "EPGBugfixLevel" should not affect EPGLanguage. (At lest I don't know how it could.)

    A fresh EPG-Scan could however be necessary after changing the setting "EPGLanguages".
    Especially with only one DVB-Device.

    Btw.: Welcome to the :portal3

    Ich bin momentan leider auch recht beschäftigt und kann das hardwarebedingt leider nicht so "nebenher" laufen lassen.

    Ich muss ma schauen, ob ich am WE mal eine anständigen Patch zu testen erzeugt bekomme.
    Bisher war das ja alles hier nur "laut gedacht".

    Letzten Sonntag hatte ich aber auch zwei so komische Events bei mir.
    ~ 19:00 auf ComedyCentral. Now und Next waren jeweils "Kein Titel", der Rest vom EPG war o.k..
    Leider war es in dem Moment nicht möglich der Sache nach zu gehen.

    Sofern der Fehler nicht beim Sender lagt, könnte das Problem schon älter sein, bisher aber nicht durch NULL-Pointer aufgefallen nein.
    Und Events mit "Kein Titel" gibt es bei mir einige in der epg.data.

    aber das Event aus dem Timer enthält einen Titel der nicht mehr zur timersdone.conf passt.

    Irgendwie hatte ich das befürchtet.
    Das wird dann wohl ein Link auf das aktuelle Event sein.

    Egal, die Lösung mit der TimerId sollte auch eindeutig sein und das Problem beheben. :tup

    Bei mir ist einige Stunden später wieder der ursprüngliche Timer erzeugt worden und genauso wie vorher in die timersdone.conf eingetragen.

    Jetzt ist bei mir auch wieder "Bundesliga" um Untertitel, zwischenzeitlich war der mal leer.
    Wenn die den Suchbegriff im letzten Moment aus dem Event raus nehmen wird man aber nicht viel machen können :(.

    Das würde ja durch deine Änderung wieder rückgängig gemacht.

    Ich denke nein, zumindest war das nicht beabsichtigt.
    Bei den ganzen Ausnahmen und Änderungen derer, ist es aber schwer den Überblick zu behalten, wenn man nur alle paar Jahre mal rein schaut.

    Das alte GetEvent machte das auch anders:

    Es hat also entweder nach der ID oder nach der Zeit gesucht.

    Mein Vorschlag wäre erst nach der ID suchen (die sollte ja eindeutig sein).
    Wenn dann kein Event gefunden wurde, nach der Zeit suchen.
    Erst wenn dann immer noch kein Event gefunden wurde, ein Neues erzeugen.
    (Bei gleichzeitiger Änderung von ID und Startzeit würde es also nach wie vor ein Neues Event geben.)

    Die Idee dahinter war, möglichst wenig neue Events anlegen zu müssen.
    Das verringert die Anzahl an Events die gelöscht werden müssen und Chance, dass dabei was schief geht.

    Ob man auf die Weise versehentlich auch falsche Events erwischen kann, bin ich nicht ganz sicher.
    Aber da da sowohl ID als auch Startzeit eindeutig sein sollten, wüsste ich nicht wie.


    Code
    // - Some broadcast tables 0x5X and 0x6X, but use different event ids for the same event in both 
    //   sets of tables, and sometimes even use different titles, short texts or descriptions.

    Es bräuchte also eine gute Begründung, warum deine Änderung übernommen werden sollte.

    Für mich steht die eine Zeile darüber:

    Code
    // - Once a schedule has seen events from 0x5X, tables 0x6X are ignored for that schedule.

    Wenn das mit dem seen korrekt funktioniert, sollte das Table-Chaos doch eigentlich gar nicht mehr auftreten können :/.


    Es kommt vor (empirisch belegt), dass ein Event mit TableID 0x4E eine andere (neue) eventID bekommt. Wir sollten uns zunächst einigen, wie in einem solchen Fall das korrekte Vorgehen ist:
    1. Altes Event löschen, neues Event (mit neuer Event ID anlegen)
    2. Altes Event updaten, so dass es danach die neue Event ID hat
    3. Neues Event ignorieren
    4. ...

    Als allererstes sollte man sich mal überlegen was man an Ende haben will.
    Das ist IMHO (EPG-search User) ein aktuelles EPG.
    Damit wäre 3. raus.
    1. und 2. sollten, wenn es mit rechten Dingen zugeht, zum gleichen Ergebnis führen. (Lediglich die Pointer zu den Objekten sollten unterschiedlich sein, wenn ich nicht völlig daneben liege.)

    Wobei 1. in der Praxis so nicht auftreten kann.
    Es wird immer erst das neue Event erzeugt, dann eines gelöscht. (Im aktuellen Fall war's leider das Aktuelle und das verursachte letztendlich die Problem.)

    Wobei ich da noch immer nicht ganz sicher bin, warum das passiert ist.
    Eigentlich sollte die erste Schleife in DropOutdated() ja Events mit alter Version entfernen.

    // Special consideration: table 0x4E can only be overwritten with the same id!
    Vielleicht ist es dieser Sonderfall gepaart mit ungünstigem Timing?

    2. (also Update) wird schwierig, wenn sich ID und Startzeit ändern.
    Da man dann aktuell das bisherige Event nicht mehr findet.

    Eigentlich sollte man doch immer gefahrlos zuerst nach der EventID suchen können?
    Dann ließe sich der Bereich in der eit.c übersichtlicher gestalten:

    C++: eit.c
         cEvent *pEvent = NULL;
         pEvent = const_cast<cEvent *>(pSchedule->GetEventById(SiEitEvent.getEventId()));
          if (!pEvent && !((Tid & 0xF0) == 0x50))
                pEvent = const_cast<cEvent *>(pSchedule->GetEventByTime(StartTime)));
         if (!pEvent || handledExternally) {

    ch würde den Eintrag in timersdone.conf dann immer löschen, wenn epgsearch bei der aktuellen Suche keinen passenden Suchtimer findet. Unabhängig von TimerProgRepeat wird der Timer dann beim nänchsten Update wieder neu erzeugt, falls das EPG wieder funktioniert (hoffentlich rechtzeitig) und passt.

    btw Einträge in timersdone.conf, die in der Vergangenheit liegen, werden immer gelöscht. Manuell gelöschte Timer werden von "outdated" nicht erfasst.

    Macht für mich Sinn.
    Ich denke, das war auch gedacht so.

    der Event heisst jetzt plötzlich

    E 7891 1743968700 1800 54 6
    T Sportschau
    statt T Sportschau Bundesliga am Sonntag

    Eine einfache Änderung in (Sub-)Title sollte EPGsearch eigentlich verkraften.

    Dann ist diesmal jedenfalls eindeutig der Sender selber die Ursache.
    Bei der Arte-Geschichte war das ja nicht wirklich eindeutig raus zu finden, was da los war.

    Leider würden dann evtl. aber Einträge von anderen Suchen mit der gleichen Start- und Stopzeit vorher gefunden, da in RemoveTimer() für den Vergleich die searchID nicht hergenommen wird.

    Das hatte ich damals wohl nicht gesehen.

    Wobei, wo ich den Patch anschaue, fällt mir gerade auf, dass die Zeiten vom Timer genommen werden und das Event aus dem EPG.
    Würde es einem Unterschied machen, das Event aus dem Timer zu verwenden?

    Code
    cTimerDone * TimerDone = TimersDone.InList(t->StartTime(), t->StopTime(), t->Event(), trigger->ID);

    Von meinem Verständnis ist dann in searchtimer_thread.c::RemoveTimer() die Abfrage von TimerProgRepeat falsch herumgesetzt (wenn kein Neuanlegen gewünscht ist, wird der Eintrag in timersdone.conf gelöscht).

    Das ist IMHO korrekt, so wie es ist.
    Wenn TimerProgRepeat==1 ist wird die timers.done komplett ignoriert.

    C++: searchtimer_thread.c
         // already done the same timer?
       if (!EPGSearchConfig.TimerProgRepeat && index == 0 && TimersDone.InList(start, stop, pEvent, -1)) {
           LogFile.Log(2, "skip timer for '%s~%s' (%s - %s); search timer: '%s' - already done", pEvent->Title(), pEvent->ShortText() ? pEvent->ShortText() : "", GETDATESTRING(pEvent), GETTIMESTRING(pEvent), searchExt->search);
           return false;
       }

    Hat jemand einen Einspruch, den Eintrag dann zu löschen, wenn TimerProgRepeat=1 ist?

    Wenn ich nicht irre, würde das dazu führen, dass Einträge in der timers.done beim löschen eines Timers durch das Plugin nie gelöscht würden.

    Irgendwie ist diese Abfrage aber schon sinnlos (bei TimerProgRepeat==1 ist wird die timers.done ja ignoriert), aber man sollte den Eintrag in der timers.done immer löschen.

    TimerProgRepeat==0 soll IMHO ja nur das erneute programmieren eines Timers unterbinden, wenn der Benutzer ihn (absichtlich) löscht.

    Ich konnte damals das Problem darauf einkreisen, dass der timer nicht aus der timers.done gelöscht wurde.
    Mein Versuch das zu beheben war der Patch aus Beitrag #6.

    Gibt es irgendwelche Unregelmäßigkeiten im EPG oder externes EPG?

    Bei den ARD-Kanälen hatte ich das damals bei meinen Tests dauernd.
    Die Senden das EPG für alle Sender auf x Transpondern und bekommen das anscheinend manchmal nicht hin das alles aktuell und synchron zu halten.
    Das trat nicht immer auf, aber gerne mal bei dem großen, täglichen Update um 6:00.
    Ob man es bei EPGsearch überhaupt merkt, scheint auch von channels.conf und der Anzahl der DVB-Karten und deren Auslastung abzuhängen.

    Da das Ganze diese blöde Timing-Komponente hatte und die Fehler nur sporadisch und zu den unmöglichsten Zeiten auftraten, hab ich es dann irgendwann aufgegeben den Verursacher zu suchen.
    Ich habe dann kurzerhand den EPG von Fremdtranspondern komplett abgeklemmt, seit dem ist Ruhe: Arte EPG verhindert Suchtimeraufnahmen.

    Wenn die Fehler seit Anfang den Jahres vermehrt auftreten, würde ich auf die abgeschalteten SD-Transponder als Quelle tippen.
    Auch wenn auf den Kanälen nichts mehr kommt, heisst das lange nicht, dass die da auch kein EPG mehr senden. Wirklich pflegen wird die Transponder/Daten da aber wohl niemand mehr.


    edit:
    Wer will könnte auch mal den diesen Patch von kls testen, vielleicht behebt der die EPG-Probleme auch schon. So wie ich es eben sehe, hat der es doch nicht in den VDR geschafft.: Arte EPG verhindert Suchtimeraufnahmen
    Bei meiner alten VDR-Version passte das damals schon nicht gut, deshalb hatte ich da einen etwas "radikaleren" Ansatz gewählt. Der was nicht so gut angekommen ;).

    Die Zeilennummern haben sich zwar etwas geändert, aber generell sollte es noch passen.
    Eigentlich sind auch lediglich 2 Zeichen in eit.c zu ändern:
    In Zeile 497 das "0xC0" in "0xE0" und in Zeile 524 das "0x6F" in "0x5F".

    Nur dass der niemals aufgetaucht ist in der Timerliste.

    Ab dem ersten skip timer for ... - already done ist der Timer nicht mehr da.


    Es gab da eine Macke die zu dem beschriebenen Phänomen führt, wenn es einen kurzen EPG-Aussetzer gibt.
    Arte EPG verhindert Suchtimeraufnahmen
    (Die ersten 3 Absätze kannst Du ignorieren.)

    Ich hatte mich damals auch an einem Patch versucht, den aber nie wirklich getestet.
    (Ich verwende eigentlich schon immer "Timer nach löschen neuprogrammieren" "ja".)
    Evtl. magst Du den mal versuchen?
    Arte EPG verhindert Suchtimeraufnahmen

    Irgendwie fehlte im EPGsearch-Log auch eine klare Meldung, wenn das Event verloren gegangen ist.
    Wenn ich das recht erinnere war aber ein zweites added timer for ... für das gleiche Event ein ziemlich eindeutiges Abzeichen dafür.
    Und dann schlug normalerweise auch der Bug zu, wenn "Timer nach löschen neuprogrammieren" auf "nein" steht.

    Ich habe mir heute noch mal die Mühe gemacht und die Zeiten in ein lesbares Format dekodiert.
    Dabei ist mir aufgefallen, dass ich am Montag gedanklich wohl um einen vollen Tag falsch lag :wand.
    Meine epg.data ist die ältere und muss wohl irgendwann in der Nacht abgespeichert worden sein.
    (Mein VDR hatte ab Nachmittag mehrere Aufnahmen gemacht, daher hatte ich damit gerechnet, dass meine epg.data aktueller ist.)


    Mit dem Hintergrund machen auch die Änderungen im EPG Sinn.
    Da ist in der Zwischenzeit halt was aktualisiert worden.

    Die EPG-Daten von MegaV0ltund kfb77 sind anscheinend aktuell, wenn man den Beitrag bzw. das unvollständige Event als Maßstab nimmt.
    Daher scheint die Verwendung von TableID 0x4E auch in Ordnung zu sein. Zumindest sieht das jetzt vom timing her plausibel aus.


    Mit dem Hintergrund habe ich, denke ich, auch die (oder zumindest eine plausible) Ursache für das unvollständigen Events gefunden.
    Anhand der EPG-Daten lässt sich belegen, dass das fragliche Event die EventID gewechselt hat.
    Wenn fragliche Event da schon TableID 0x4E hat, bzw. auf TableID 0x4E wechselt, wird es vom VDR nicht mehr gefunden und ein neues mit der neuen eventID Event angelegt. (Bei Events mit TableID 0x4E nur nach EventID gesucht siehe eit.c Z. 169-170.)
    Die Folge ist, dass man zwei Events mit gleicher Startzeit (die hat sich nicht geändert) im Schedule hat.
    Das würde zu Problemen führen, daher wird eines davon gelöscht. (eit.c Z. 433 DropOutdated())
    In DropOutdated() müsste das in epg.c Z. 1124 geschehen (bei den viele Ausnahmen für TableID 0x4E ist das aber etwas schwierig nachzuvollziehen).
    Der Schedule ist nach Startzeit aufsteigend sortiert. Events gleicher Startzeit dann noch aufsteigend nach EventID.
    Gelöscht wird bei Events gleicher Startzeit (die nach dem Sortieren ja immer hintereinander auftreten) das zweite, also das mit der höheren EventID. In unserem Fall ist das aber das Falsche!
    Da das Event gelöscht wurde, wird es bei erneuten Durchlauf natürlich erneut gefunden.
    Damit rechnet aber niemand, keine Neuen Daten vorliegen und der Durchlauf eigentlich nur den Runningstatus aktualisieren soll (?). Daher wird danach auch abgebrochen und das Event nicht vollständig "befüllt". Auch wird am EndeDropOutdated() nicht aufgerufen, das unvollständige bleibt also im Schedule.

    Was mit dem Event, was hätte ersetzt werden müssen, passiert ist, bin ich nicht sicher.
    Evtl. ist es immernoch im Scheduele aber man sieht es nicht?


    Als Workaround könnte man die Erstellung des Events zu Ende durch laufen lassen:
    (Das wäre quasi das Gegenteil zu meinem letzten Vorschlag)

    C++: eit.c
                  }
               pSchedule->SetRunningStatus(pEvent, RunningStatus, Channel);
               }
    -         if (!Process)
    +         if (!Process && !newEvent)
               continue;
            }
         pEvent->SetVersion(getVersionNumber());

    Irgendwie sieht es fast so aus, als ob das so schon mal angedacht war, jetzt ist die Variable *newEvent auf einmal nützlich.
    Eine wirklich fertige Lösung ist das aber so noch nicht. Da fehlt eigentlich noch mindestens ein SortSchedule() und das Problem mit 2 Events gleicher Startzeit besteht potenziell noch immer.
    Aber immerhin besser als Events ohne Titel, die eigentlich einen hätte.


    Ich denke es ist sinnvoller das weiter vorne abzufangen und hier den vorherigen Patch zu verwenden. Am besten mit zusätzlicher Fehlermeldung.
    Bei einem erneuten Scan der gleichen Daten darf einfach kein neues Event entstehen, ansonsten ist was falsch gelaufen.

    Die Änderung sollte eigentlich nur genau diesen Fall greifen und sonst keine Auswirkung haben.

    Auch sollte man es wohl besser nicht den Zufall (bzw. Sender) überlassen, welches Event gelöscht wird:

    Hier bin ich nicht sicher, ob man das so machen darf. Das soll eher zur Illustration dienen.


    Weitere Tests muss jemand anderes machen, da bin ich aber leider erst mal raus.
    Mein Test-VDR muss sich momentan noch das Sat-Kabel teilen, da sind leider keine vernünftigen Experimente möglich, wenn es ums EPG geht.
    Oder ihr habt Geduld, bis ich endlich den Unicable-Multischalter angeschlossen habe. Das kann aber noch ein Bisschen dauern, der liegt schon seit letztem Sommer hier rum (auch eine längere Geschichte ;)).

    Das ist aber nicht ungewöhnlich. Ich habe bei der Entwicklung meines EPG-Plugins festgestelt, dass normalerweise die Event IDs hochgezählt werden, aber wenn z.B. in der ARD ein "Brennpunkt" eingeschoben wird bekommt der die nächste freie (und damit höchste) Nummer.

    Was ich merkwürdig fand, war eher, dass ab 39062 sauber hoch gezählt wird.
    Keine Spur mehr von Events 39470 und 39471. Das sieht fast so aus, als ob die nie da waren.
    Und meine Version ist neuer als die von @kfb77 und MegaV0lt.

    Da die Events, soweit ich das sehe, aber eindeutig sind und auch die Zeiten jetzt zu stimmen scheinen, ist das wohl Standard konform.
    Trotzdem hatte ich das so irgendwie nicht erwartet....

    Immerhin ist das "komische" Event bestätigt.
    Eine Race-Condition im VDR also eher unwahrscheinlich.

    Naja, Sinn macht das schon, um anzuzeigen, dass die Version nicht gesetzt wurde - zumindest seit Start des VDR (DVB nutzt nur Versionsnummern von 0 bis 31).

    Das FF kommt vermutlich noch aus dem Konstruktor vom Event.
    Ich gehe davon aus, dass es das Event nie über Zeile 234 von eit.c (pEvent->SetVersion(getVersionNumber());) geschafft hat.


    Meine Vermutung, was passiert, ist die folgende (bitte korrigieren, falls jemand eine Fehlannahme sieht):

    Trotz Process==false werden die Events mit TableID erneut 0x4E aktualisiert (Zeile 93).
    Dabei wird ein neues Event erstellt. Das sollte eigentlich nicht passieren, da die Daten schon mal verarbeitet wurden (daher auch das Process==false), aber es passiert.
    Dann wird die Verarbeitung, nach Aktualisierung des RunningStatus, vorzeitig abgebrochen, da man keine Änderung im Event erwartet.

    Warum beim rescan ein neues Event erstellt wird ist mir bislang auch unklar, das sollte nicht passieren.
    Meine Vermutungen wären, dass entweder das Event aus dem letzten Scan:
    a) - schon gelöscht wurde.
    b) - nie erstellt wurde, weil im weiteren Verlauf des Erstellens erkannt wurde, dass es sich um Unsinn handelt.
    c) - sich noch im Schedule befindet aber nicht gefunden wird.


    Mein aktuell bester Vorschlag das zu lösen wäre der folgende:

    Code: eit.c
                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.
    +        if (!Process) // A rescan should not find new events!
    +           continue;
            pEvent = newEvent = new cEvent(SiEitEvent.getEventId());
            newEvent->SetStartTime(StartTime);
            newEvent->SetDuration(Duration);

    Zumindest die Fälle a) und b) müssten damit korrekt behandelt sein.

    Fall c) muss man sich noch mal ansehen.
    Evtl. könnte es Sinn machen mal eine Debug-Meldung vor dem continue einzubauen.
    Ich hoffe, dann kann man einschätzen, ob da nur veraltete Events, Datenmüll, usw. kommt oder auch was Wichtiges dabei ist

    Sowas in der Art (ungetestet!) :
    dsyslog("NoProcess: channel %d (%s) eventID %d times %s-%s", Channel->Number(), Channel->Name(), SiEitEvent.getEventId(), *TimeString(StartTime), *TimeString(StartTime + Duration));

    Edit:
    Mir ist gerade aufgefallen, dass bei mit im EPG immer nur maximal 2 Events mit TableID 0x4E pro Sender existieren. Was bei Now/Next-Events durchaus logisch ist.
    Bei den Beispielen von FireFly und kfb77 sind es aber 3. Da ist also mindestens eines zu viel!
    Und ich denke, es ist nicht das "komische" Event. Das ist neu und sollte das Aktuelle, Korrekte sein.

    Ich befürchte, der Sender mach da irgendwelchen Unfug mit TableID 0x4E.
    Entweder er ändert EventId von solchen Events oder setzt TableID 0x4E bei Events, wo es nicht passt.
    Events mit TableID 0x4E sucht der VDR nur anhand der EventId und wenn die sich ändert, wird das Event nicht gefunden.
    Eine einmal auf 0x4E gesetzte TableID scheint man auch nicht wieder entfernen zu können, selbst wenn man das Event findet (Zeile 188).
    Das Ganze wird doch noch richtig kompliziert ...

    Die LED Schaltung sollte diese sein.

    Ich hatte vor Jahren mal die diskrete Version mit Transistoren gebaut.
    Das Teil liegt seit dem hier rum und blinkt lustig vor sich hin :).

    Spannender finde ich aber noch die Joulethief Schaltung.
    Das ist die wohl minimalistischste Version eines Schaltreglers. Interessant für jeden, der sich mal mit dem Thema beschäftigen möchte.
    Damit leuchtet eine weiße LED noch bis 0,4V runter und das mit erstaunlichem Wirkungsgrad.
    Bei einer gebrauchten "toten" AA-Zelle liegt bei mir der "Rekord" bei 2 Wochen Dauerbetrieb.

    Und dann gibt es mehr falsche Erklärungen, wie das funktioniert, als die Schaltung Bauteile hat :D.
    Spoiler: Mit der Sättigung des Ringkerns hat es nicht zu tun.

    Ja so ca. ist prinzipiell der Plan, nur haben vor mir schon einige die Flinte ins Korn geschmissen, weil der genutzte AD Wandler beim ESP32 ziemlich heftig rauscht.

    Der Maximalwert der Eingangsspannung sollte möglichst nahe an die Maximalspannung, die der ADC kann kommen.

    Wenn es nicht Zeitkritisch ist, macht man auch typischerweise mehrere Messungen (ungerade Anzahl > 5) und verwendet den Median-Wert der Messreihe.

    Ein kleiner RC-Filter am Eingang kann auch nicht schaden.
    Die Eingänge sind normalerweise recht hochomig, 1kOhm und 100nF sind da meist ein brauchbarer Anfang.

    n-Channel FET mit Widerstand geht auch.

    Ich kenne das nur mit J-FETs.
    Die meisten Mosfets sperren Spannungslos.

    Bei 10mA gibt es aber auch eine große Auswahl an LED-Stromquellen.
    Einige können für den Zweck gut brauchbar sein, andere eher nicht.
    Ich hatte vor einiger Zeit da mal ein paar Vergleiche angestellt.

    Für den Zweck könnte es aber auch ein 470Ohm Widerstand zu einer stabilisierten 5V-Spannung tun.
    Da sollte die Kennlinie eigentlich noch akzeptabel "gerade" sein.

    Bei 3,3V und kleinerem Widerstand wird es dann schon etwas krumm.
    Nicht ideal, kann man aber wahrscheinlich auch noch mit der Software gerade biegen.
    Man muss nur aufpassen, dass der Strom in der 0-Ohm-Stellung vom Poti nicht zu groß wird.

    Bei mir sieht die Stelle aktuell so aus:

    (Beschreibung im ersten Event etwas gekürzt [...])

    Was die EventID macht ist irgendwie komisch.
    Beim Ersten (39062) stimmt die noch überein, dann aber nicht mehr.
    Bei mir wird dann lückenlos bis 39466 hoch gezählt, dann springt es auf 38571 zurück.
    Die IDs 39470 und 39471 gibt es bei mir bei dem Kanal gar nicht.

    Auch die Version "FF" von dem "komischen" Event macht logisch keinen Sinn.
    Das bedeutet wohl aber, dass die Version nie gesetzt wurde.


    Ich habe mir das mir das mit Process nochmal angesehen.

    C++: filter.h
      bool Check(uchar Version, int SectionNumber);
          ///< Returns true if Version is not the current version, or the given SectionNumber has not
          ///< been marked as processed, yet. Sections are handled in ascending order, starting at 0,
          ///< unless Random is true in the constructor call.

    Ich interpretiere das so, dass, wenn Process false wird, keine neuen EPG-Informationen verfügbar sind.

    Warum wir dann in Zeile 93 eine Ausnahme für Tid 0x4E gemacht?
    Ich vermute mal eine Art Hack fürs VPS um den RunningStatus vom aktuellen Transponder zu bekommen?
    Aber sollte nicht eigentlich auch die Änderung des RunningStatus zu einem Process==true führen?

    Man beachte das e zu beginn der letzten Zeile

    Dann liefert die Grep-Regex in dem Fall das ganze Event.

    Irgendwie sehe aber auch keine ich Möglichkeit, wie sich ein Event an der Korrektur vorbei mogeln kann.

    Doch, es gibt genau eine Möglichkeit und die ist an sich völlig offensichtlich!
    Keine Ahnung, warum ich das gestern übersehen habe, aber ein continue (Zeile 230) liegt zwischen erstellen des Events (Zeile 177) und FixEpgBugs() (Zeile 411), das muss es sein.

    Das mit den obsoleten Kanälen würde da auch passen, wenn Process da false ist, aber normalerweise true wäre.

    Wenn man Zeile 229 wie folgt abändert, sollte eigentlich Schluss mit dem Spuk sein.
    if (!Process && !pEvent)
    Wobei es vermutlich logischer/sinnvoller wäre, das Event zu löschen und aus den Schedule zu entfernen.
    Das Process==false soll ja wohl bedeuten, dass man es nicht haben will ???

    Irgendwas ist an der Stelle aber komisch.
    Die Variable *newEvent wird eigentlich überhaupt nicht benötigt. Ich denke as hat mich gestern in die Irre geführt.
    newEvent wird nur 3 mal verwendet und ist immer gleich pEvent, da müsste man doch auch gleich pEvent schreiben können? Evtl. Altlast oder wollte man zB. in Zeile 229 nach !newEvent abfragen ???
    Und warum wird erst so spät nach Process abgefragt?

    Das muss man sich wohl erst mal in Ruhe ansehen, bevor man was ändert.
    Soweit ich das überblicke müsste es sich an der Stelle um now/next-Events handeln, da könnten sich Änderungen aufs VPS auswirken.
    Auch die EPG-Samples zeigen, dass es irgendetwas in der Art seine müsste. -Danke an die "EPG-Provider" ;)-
    Ob die Events allerdings "sinnvoll" kann ich momentan nicht beurteilen.
    Irgendwie passt das mit dem now/next auch nicht wirklich ?(. Für mich sieht es momentan eher nach "Datenmüll" aus.

    Dass ich die nicht habe kann an der VDR-Version liegen.
    Oder, falls die Events von einem anderen Transponder kommen an diesem Patch: RE: Arte EPG verhindert Suchtimeraufnahmen
    Oder einer Kombination aus beiden.
    Die ARD-Regionalen und Sky waren immer die Kandidaten mit den Transponder-übergreifenden Events.

    Was mich wundert ist, dass er bis jetzt (14 h später, EPGLinger = 60) noch nicht gelöscht ist. Der VDR wurde mindestens einmal neu gestartet, also auch die epg.data neu eingelesen und der Titel nicht korrigiert.

    Das hätte ich jetzt auch nicht erwartet.
    Evtl. wird die Korrektur beim nächsten EPG-Scan wieder kaputt korrigiert???

    Irgendwas ist bei den Events jedenfalls nicht ganz in Ordnung.

    Die beiden anderen leeren Events finde ich bei mir nicht. Interessant wäre aber deren Sender (in epg.data nach ^C davor suchen)

    Ich muss auch erst noch mal schauen, würde aber stark auf eine Variante des BR tippen.
    C S19.2E-1-1023-5809 Franken Plus HD

    entweder SD Karte (Datenverlust)

    Wieso Datenverlust???

    Man darf lediglich nicht dauernd auf der Karte rum schreiben, das ist aber machbar.

    Habe hier 3 Fujitsu Futro im Einsatz.

    Die Fujitsu Thin-Clients sind mir auch schon länger aufgefallen, ich dachte da aber eher an einen Einsatz als VDR(-Client).

    Einige Modell sollten inzwischen von der Grafik echt gut geeignet sein.
    Kompakt, leise, super verarbeitet und komplett für ~ 70-100€ gebraucht zu bekommen.
    (Man muss aber aufpassen, andere Modelle sind völlige Gurken und unterscheiden sich von der Bezeichnung oft nicht deutlich!)

    Die 12V Versorgung muss bei denen AFAIK aber stabilisiert sein!
    Ein direkter Anschluss an das KFZ-Netz ist also nicht möglich.

    Ich hatte für die Fehlersuche in cEvent::Title() und cEvent::SetTitle() jeweils eine Abfrage eingebaut, ob zu dem Zeitpunkt der jeweilige Thread einen Read- bzw. Write-Lock auf Schedules hat. Das war aber eine eher "krude" Angelegenheit, da ich dazu einen Pointer auf Schedules brauchte und Members von pthread_rwlock_t abfragen musste, die plattformabhängig sind (auf Raspberry Pi anders als auf Linux gcc). Das offiziell einzubauen würde ich gerne vermeiden.

    Ich bin nicht ganz sicher ob das funktioniert, aber könnte man nicht einfach die Threadid des erstellenden Threads im Statekey-Objekt mit speichern.
    Dann muss man nur prüfen, ob die Threadid des eigenen Thread in der Liste auftaucht und der Lock (read/write) stimmt, dann sollte alles o.k. sein.
    An die Threadid des aktuellen Prozesses sollte man mit gettid() (oder besser pthread_self() ???) doch überall recht einfach ran kommen.

    Eine einfache Möglichkeit die Locks zu prüfen wäre echt hilfreich.
    Da jetzt Jahre nach Einführung (die Locks dürften doch auch bald 10Jähriges Jubiläum haben ^^) sogar im VDR noch fehlende gefunden werden, befürchte ich, dass sich bei den Plugins Abgründe auftun werden :angst.

    dabei ist manchmal der Fall aufgetreten, dass ein cEvent entsteht, bei dem title==NULL ist, der aber anscheinend nicht durch FixEpgBugs() geht.

    Das wäre echt blöd, wenn das sporadisch auch mit "sinnvollen" Events passiert, einige von der Korrekturen sind ja nicht nur Kosmetik. Amok laufende Suchtimer wären dann das geringste Problem, was mir so einfällt...
    Irgendwie sehe aber auch keine ich Möglichkeit, wie sich ein Event an der Korrektur vorbei mogeln kann.

    Das SetTitle() in der epg.c kann man wohl ausschließen, da es nur beim einlesen der epg.data verwendet wird. Dann würden die Fehler nur nach einem Neustart des VDR Auftreten, das hätte auffallen müssen.

    Evtl. eine blöde Idee, aber ist wirklich sicher gestellt das FixEpgBugs() nicht aufgerufen wurde und dass das fragliche Event nie einen Titel hatte?
    Nicht dass es eine Fehlfunktion in FixEpgBugs() ist, die durch irgendwelche komischen Sonderzeichen ausgelöst wird oder wenn der Titel nach FixEpgBugs() am Ende dann leer ist.

    Wirklich gesehen habe ich da bislang nichts, aber könnte eine der Helper-Funktionen einen NULL-String zurück geben?

    Schon versucht eine Abfrage auf title==NULL ganz am Ende von FixEpgBugs() einbauen?
    Das wäre interessant, ob die anschlägt.


    Ehrlich gesagt, verstehe ich trotz der Beschreibung hier noch immer nicht wirklich, was das für Events sind.
    Mit ein Bisschen mehr Informationen könnte man vermutlich die Art des Fehlers deutlich eingrenzen.

    Gibt es Gemeisamkeiten (außer dass der Titel fehlt ;))?
    Trifft es immer den gleichen Kanal?
    Sind das echte, sinnvolle Events, also Startzeit in den nächsten Wochen, plausible Länge, ...?

    Existieren die Events wirklich im Schedule oder nur im Menü? Lassen sich zB. auch mit SVDRP ausgeben?
    Wenn nicht, fehlt wohl immer noch irgendwo ein Lock.

    Was passiert, wenn man das EPG mit CLRE komplett löscht und dann neu scannt? Tifft es dann die gleichen Everts erneut?

    Tauchen die Fehler auch in der epg.data auf der Festplatte auf?
    Wenn ich das richtig interpretiere, sollte da dann einfach der Titel fehlen.

    Ich habe bei mir eben gesucht und nichts gefunden.
    grep -zoP "\nE.+\n[^T]" ./epg.data (Liefert der Einfachheit halber nur die erste Zeile des Events!)
    Im Produktiv-system ist aber eine recht alte VDR-Version am laufen (längere Geschichte).
    Was, falls andere die Fehler finden, bedeuten müsste, dass der grundlegende Fehler erst später rein gekommen ist.

    Falls jemand so ein Event in der epg.data findet, dann bitte hier mal rein stellen, gern auch mehrere. Ich würde es mir gerne mal ansehen.

    Da das Problem anscheinend nicht viele haben und ORF erwähnt wurde, könnte es evtl. an der speziellen Emfangssituation liegen? An der Kombination DVB-S plus deutschem und österreichischem DVB-T, meine ich.

    Eine DVB-T2 Karte/Stick mit 2 Antennenanschlüssen ist mir nicht unter gekommen.
    Das hätte einem auffallen müssen, da sie ja sicher entsprechend beworben worden wäre.

    Zur Empfangsverbesserung ist normalerweise eine gescheite Antenne die beste Lösung.
    Zumal der DVB-T2-Empfang aus fahrenden Fahrzeugen heraus sowieso problematisch sein soll.