VDR 2.7.8: "Deleted recordings" im Hauptmenü

  • Eigentlich wollte ich die Frage schon ganz am Anfang stellen...

    Wäre es nicht einfacher und weniger fehleranfällig Recording->Delete() usw. so zu ändern, dass es wie früher funktioniert? Also alles macht, um eine Aufzeichnung korrekt zu löschen. (Die Aufzeichnung umbenennt, aus dem Menü löscht, (neu) bei den deletet recordings einträgt, bzw. daraus entfernt falls endgültig gelöscht, ...)
    Eventuell mit einem zusätzlichen, optionalen Parameter, falls irgendwo das aktuelle Verhalten notwendig ist.

    Die Beschreibung im Header pass aktuell auch nicht mehr.
    Changes the file name so that it will no longer be visible in the "Recordings" menu

    Das Löschen von Aufzeichnungen ist jetzt echt kompliziert geworden. Ich habe mir das jetzt über eine Stunde angeschaut und überblicke noch immer nicht alles....

    Gruss
    SHF

    Mein (neuer) VDR:

    Software:
    Debian Wheezy mit Kernel 3.14
    VDR 2.0.7 & div. Plugins aus YaVDR-Paketen
    noad 0.8.6

    Hardware:
    MSI C847MS-E33, onboard 2x1,1GHz Sandybridge Celeron 847, 4GiB RAM
    32GB SSD (System), 4TB 3,5" WD-Red HDD (Video)
    TT FF DVB-S 1.5 FullTS-Mod PWM-Vreg-Mod, DVB-Sky 852 Dual DVB-S2
    Das ganze im alten HP Vectra VLi8-Gehäuse versorgt von:
    PicoPSU-160-XT und Meanwell EPP-150 im ATX-NT-Gehäuse

  • Das Menü zeigt nur "Kürzlich Gelöschte Aufzeichnungen" an, nicht alle gelöschten Aufzeichnungen. Darauf wollte ich hinaus.

    Das stimmt so nicht. Im VDR gibt es nur aktive und gelöschte (als gelöscht markierte) Aufzeichnungen. Bei letzteren wird keineswegs zwischen kürzlich und schon vor längerem gelöschten Aufzeichnungen differenziert. Und in diesem Menü kann man die als gelöscht markierten Aufzeichnungen manuell endgültig löschen (also tatsächlich von der Festplatte löschen), wenn man nicht warten möchte, bis die Verwahrdauer abgelaufen ist und sie zeitgesteuert entsorgt werden.

    Hardware: Antec NSK2480, Asus P8B75-M LX, Intel Core i5-3570T, 4 GB RAM, NVIDIA GT610, TT-Premium S2-6400, 128 GB SSD, 14 TB HDD, Pioneer BDR-207EBK
    Software: Ubuntu 22.04 LTS mit Kernel 6.8 und VDR 2.7.9 (mit offiziellen und eigenen Patches)
    Plugins: devstatus, dvbhddevice, dvd, dvdswitch, epgsearch, extrecmenu, recsearch, femon, live, markad, mlist, osdteletext, remote, satip, screenshot, skinnopacity, streamdev, systeminfo, undelete, xineliboutput
    Addons: VDR Convert 0.1.0 (angepasst)

  • Wäre es nicht einfacher und weniger fehleranfällig Recording->Delete() usw. so zu ändern, dass es wie früher funktioniert? Also alles macht, um eine Aufzeichnung korrekt zu löschen. (Die Aufzeichnung umbenennt, aus dem Menü löscht, (neu) bei den deletet recordings einträgt, bzw. daraus entfernt falls endgültig gelöscht, ...)

    cRecording::Delete() kann sich nicht selber aus Recordings bzw. DeletedRecordings löschen bzw. dort eintragen, da es keinen Zugriff auf diese Listen hat. Auch aus dem Menü kann es sich nicht selber löschen, weil es auch darauf keinen Zugriff hat. Ein cRecording ist ja nicht einmal selber in einem Menü, sondern ein cMenuRecordingItem hat einen Pointer auf das cRecording.

    Die Beschreibung im Header pass aktuell auch nicht mehr.

    Das mit "...so that it will no longer be visible in the "Recordings" menu" hat eigentlich so direkt noch nie gestimmt, denn mit dem Aufruf von Delete() allein war es auch bisher nicht getan. Der Aufrufer musste es auch selber aus der Liste der Recordings (und ggf. das zugehörige cMenuRecordingItem aus dem Menü) entfernen.

    Und "Changes the file name..." hat eigentlich auch nur halb gestimmt, denn es wurde zwar der Dateiname auf der Platte geändert, aber nicht der cRecording::fileName im Objekt. Deshalb hat der Undelete-Patch ja auch

    Code
    +#define RECEXT       ".rec" 
    +#define DELEXT       ".del"

    dupliziert, was mir nicht gefallen hat.
    Ich werde die Beschreibung so ändern:

  • Zunächst der Hintergrund, warum ich die Frage erst jetzt gestellt habe:
    Bislang ging ich von einem reinen Darstellungsproblem im Menü aus, wenn man darin eine Aufzeichnung gelöscht hat. Nach dem letzten Patch bin ich da nicht mehr so sicher.

    Inzwischen sind mir auch immer mehr Plugins und Erweiterungen eingefallen, die irgendwie mit den Recordings zu tun haben, sei es über die Recordings Liste oder über SVDRP.
    zB. vnsi, epgsearch, vdr-admin
    Nicht alle haben dabei so etwas wie Aufzeichnungs-Menü.

    Da frage ich mich jetzt, ob man die jetzt auch alle anpassen muss?
    epgsearch beispielsweise vergleicht erledigte Aufzeichnungen und löscht ggf. sogar Aufzeichnungen, wenn diese Funktion aktiviert ist (die Recordings werden dafür natürlich entsprechend gelockt). Wenn da was bei den Aufzeichnungen durcheinander gerät merkt man das also nur indirekt und das kann dauern.

    Bei allem über SVDRP sollte doch der VDR alles nötige erledigen?
    Bei vdr-admin (kommuniziert nur über SVDRP mit dem VDR) sollte also alle in Ordnung sein?

    Das mit "...so that it will no longer be visible in the "Recordings" menu" hat eigentlich so direkt noch nie gestimmt, denn mit dem Aufruf von Delete() allein war es auch bisher nicht getan. Der Aufrufer musste es auch selber aus der Liste der Recordings (und ggf. das zugehörige cMenuRecordingItem aus dem Menü) entfernen.

    Das erklärt einiges.
    Ich ging davon aus, dass Liste der Recordings irgendwie aktuell gehalten wurde.
    (Wie das Menü aktuell gehalten wird hatte ich bislang noch nicht angesehen, die Liste ist mein primäres Interesse.)

    Die Frage ist dann also, ob das was ein Plugin zur Zeit macht um die Liste(n) aktuell zu halten, auch in Zukunft reicht.
    Kann man da was pauschal sagen oder ausschließen, oder muss man jedes Plugin einzeln ansehen?

    Gruss
    SHF

    Mein (neuer) VDR:

    Software:
    Debian Wheezy mit Kernel 3.14
    VDR 2.0.7 & div. Plugins aus YaVDR-Paketen
    noad 0.8.6

    Hardware:
    MSI C847MS-E33, onboard 2x1,1GHz Sandybridge Celeron 847, 4GiB RAM
    32GB SSD (System), 4TB 3,5" WD-Red HDD (Video)
    TT FF DVB-S 1.5 FullTS-Mod PWM-Vreg-Mod, DVB-Sky 852 Dual DVB-S2
    Das ganze im alten HP Vectra VLi8-Gehäuse versorgt von:
    PicoPSU-160-XT und Meanwell EPP-150 im ATX-NT-Gehäuse

  • Man sollte auch die SVDRP-Schnittstelle nicht vergessen, halb-gelöschte Aufnahmen anzeigen, forced Löschen, ...?

    vdr-2.7.9

    softhddevice, dbus2vdr, dvd, epgsearch, femon, graphtftng, web, menuorg,
    osdteletext, radio, recsearch, satip, tvguide, vnsiserver
    ubuntu focal, yavdr-ansible, linux-6.17, AsRock J4105, CIne CT-V7 DVB-C

  • Das Problem waren Sequenzen wie diese:

    Code
    if (Recording->Delete()) {
       Recordings->DelByName(Recording->FileName());

    Wegen der Änderung in cRecording::Delete(), dass der interne FileName jetzt auch von "*.rec" nach "*.del" geändert wird, konnte DelByName() das Recording nicht mehr finden und löschte es damit nicht aus Recordings.

    Dieser Patch sollte das fixen:

    Erklärung:
    - Zunächst wird geprüft, ob es sich auch wirklich um die Recordings Liste handelt. Das sollte zwar immer der Fall gewesen sein, aber sicher ist sicher.
    - Dann wird die Extension von ".del" nach ".rec" geändert, falls nötig.
    - Danach wird verfahren wie bisher, wobei der Fall, dass es in Recordings keinen Eintrag mit FileName gibt, als Fehler ins Log geschrieben wird, denn das sollte an der Aufrufstelle geändert werden.

    Hiermit sollte sowohl VDR als auch Plugins, die solche Sequenzen verwenden, wieder funktionieren.


    In VDR selber werde ich DelByName() nicht mehr verwenden, sondern es so machen:

    cRecordings::DelByName() sollte man nicht mehr verwenden, daher [[deprecated]], um die Aufrufstellen anzumeckern.

  • Die Frage ist dann also, ob das was ein Plugin zur Zeit macht um die Liste(n) aktuell zu halten, auch in Zukunft reicht.

    EPGsearch macht derzeit folgendes:

    Code
            cRecording *Recording = Recordings->GetByName(FileName);
            if (!Recording || Recording->Delete()) {
               cReplayControl::ClearLastReplayed(FileName);
    #if APIVERSNUM >= 30010
               Recordings->Del(Recording, false);
               DeletedRecordings->Add(Recording);
    #else
               Recordings->DelByName(FileName);
    #endif

    Das sollte nach meinem Kenntnisstand eigentlich korrekt sein.

    Hardware: Antec NSK2480, Asus P8B75-M LX, Intel Core i5-3570T, 4 GB RAM, NVIDIA GT610, TT-Premium S2-6400, 128 GB SSD, 14 TB HDD, Pioneer BDR-207EBK
    Software: Ubuntu 22.04 LTS mit Kernel 6.8 und VDR 2.7.9 (mit offiziellen und eigenen Patches)
    Plugins: devstatus, dvbhddevice, dvd, dvdswitch, epgsearch, extrecmenu, recsearch, femon, live, markad, mlist, osdteletext, remote, satip, screenshot, skinnopacity, streamdev, systeminfo, undelete, xineliboutput
    Addons: VDR Convert 0.1.0 (angepasst)

    • Und wenn es einen Timer gibt, der die Aufnahme gerade aufzeichnet, sollte man den Timer vorher auf inaktiv setzen oder löschen
    • Und wenn die Aufnahme gerade wiedergegeben wird, vorher die Wiedergabe stoppen
    • Und wenn die Aufnahme gerade geschnitten wird (Quelle), dann warten, bis das Schneiden fertig ist. Und dann löschen. Alternative: Fehler zurückgeben und nicht löschen. Dann kann der Aufrufer etwas in den Hintergrund schieben.
    • Und wenn die Aufnahme gerade geschnitten wird (Ziel), dann das Schneiden abbrechen und dann löschen.
    • Beim Kopieren analog verfahren wie beim Schneiden
    • Beim Verschieben / Umbenennen: warten, bis das Verschieben / Umbenennen fertig ist. Und dann löschen
    • ... habe ich noch was vergessen?

    Wäre natürlich super, wenn VDR eine API für Plugins anbieten würde, die das alles macht. Und dabei nicht nur die eigenen Aktionen berücksichtigt, sondern auch die Aktionen anderer VDR Instanzen, die auf die gleichen Videos zugreifen. Diese API könnte dann auch gleich von SVDRP verwendet werden.

    Und dann noch eine andere API die prüft, ob eines der oben genannten "Probleme" vorliegt und dann eine Liste dieser Probleme zurückgibt. Dann kann das Plugin erst diese API aufrufen und bei Bedarf erst noch mal den Anwender fragen.


    OK, das ist jetzt vermutlich zu umfangreich. Aber bereits ein Teil der hier genannten Features würde helfen.


    Dann noch eine API für "endgültig löschen" und eine für "wiederherstellen" ... Träum... Ist nicht bald Weihnachten?

  • Wegen der Änderung in cRecording::Delete(), dass der interne FileName jetzt auch von "*.rec" nach "*.del" geändert wird, konnte DelByName() das Recording nicht mehr finden und löschte es damit nicht aus Recordings.

    Dann war das ByName das Problem, immer diese Details ...

    cRecordings::DelByName() sollte man nicht mehr verwenden, daher [[deprecated]], um die Aufrufstellen anzumeckern.

    Das das oft eigentlich unnötig verwendet wurde, war mir auch schon aufgefallen. Besonders beliebt scheint Konstrukt: Recordings->DelByName(Recording->FileName());
    Da wäre doch schon immer Recordings->Del(Recording); sinnvoller gewesen?

    Als Kochrezept für so einen Fall würde ich jetzt so verfahren:

    Einwände?

    OK, das ist jetzt vermutlich zu umfangreich. Aber bereits ein Teil der hier genannten Features würde helfen.

    Es würde eigentlich schon reichen, wenn man sicher wüsste, ob schon irgendwer lesend/schreibend auf eine Aufzeichnung zugreift.
    Da das auch externe Scripte sein können, ist schon das nicht so einfach.
    Die aktuellen Ansätze über lsof fuser oder atime haben alle so ihre Tücken.

    Gruss
    SHF

    Mein (neuer) VDR:

    Software:
    Debian Wheezy mit Kernel 3.14
    VDR 2.0.7 & div. Plugins aus YaVDR-Paketen
    noad 0.8.6

    Hardware:
    MSI C847MS-E33, onboard 2x1,1GHz Sandybridge Celeron 847, 4GiB RAM
    32GB SSD (System), 4TB 3,5" WD-Red HDD (Video)
    TT FF DVB-S 1.5 FullTS-Mod PWM-Vreg-Mod, DVB-Sky 852 Dual DVB-S2
    Das ganze im alten HP Vectra VLi8-Gehäuse versorgt von:
    PicoPSU-160-XT und Meanwell EPP-150 im ATX-NT-Gehäuse

    Edited 2 times, last by SHF (February 4, 2026 at 11:37 PM).

  • Das sollte ein .diff sein, da ist aber was bei der Darstellung schief gegangen. Ist jetzt korrigiert.

    Funktionell sollte das #30 entsprechen, nur habe ich das DelByName() ganz raus geschmissen.
    Recordings->Del() konnte man doch immer schon verwenden?

    Bei dem LOCK_DELETEDRECORDINGS_WRITE müsste man dann ggf. schauen, ob das an der Stelle passt.
    Aber nötig ist der Block in der Klammer {} jetzt nach jedem Recordings->Del() , wenn ich das richtig verstanden habe.

    Das ist jetzt primär mal als Merkzettel gedacht gewesen, auf was man da jetzt achten muss.

    Gruss
    SHF

    Mein (neuer) VDR:

    Software:
    Debian Wheezy mit Kernel 3.14
    VDR 2.0.7 & div. Plugins aus YaVDR-Paketen
    noad 0.8.6

    Hardware:
    MSI C847MS-E33, onboard 2x1,1GHz Sandybridge Celeron 847, 4GiB RAM
    32GB SSD (System), 4TB 3,5" WD-Red HDD (Video)
    TT FF DVB-S 1.5 FullTS-Mod PWM-Vreg-Mod, DVB-Sky 852 Dual DVB-S2
    Das ganze im alten HP Vectra VLi8-Gehäuse versorgt von:
    PicoPSU-160-XT und Meanwell EPP-150 im ATX-NT-Gehäuse

  • Wenn du möchtest, dass es auch mit älteren Versionen funktioniert, dann solltest du das eher so machen:

    Code
    #if APIVERSNUM >= 30011
                    Recordings->Del(Recording, false);
                    LOCK_DELETEDRECORDINGS_WRITE;
                    DeletedRecordings->Add(Recording);
    #else
                    Recordings->DelByName(Recording->FileName());
    #endif

    Beachte APIVERSNUM >= 30011!

  • Dummer Frage: Müsste da nicht auch noch ein Recordings->SetModified() rein, und warum braucht man dies nicht für DeletedRecordings?

    Hardware: Antec NSK2480, Asus P8B75-M LX, Intel Core i5-3570T, 4 GB RAM, NVIDIA GT610, TT-Premium S2-6400, 128 GB SSD, 14 TB HDD, Pioneer BDR-207EBK
    Software: Ubuntu 22.04 LTS mit Kernel 6.8 und VDR 2.7.9 (mit offiziellen und eigenen Patches)
    Plugins: devstatus, dvbhddevice, dvd, dvdswitch, epgsearch, extrecmenu, recsearch, femon, live, markad, mlist, osdteletext, remote, satip, screenshot, skinnopacity, streamdev, systeminfo, undelete, xineliboutput
    Addons: VDR Convert 0.1.0 (angepasst)

  • Modified ist automatisch beim Writelock gesetzt, ausser man ruft direkt SetExplicitModify() auf, dann wird die Statusänderung nur nach SetModified() durchgeführt. Das macht man immer dann, wenn man sich einen WRITE-Lock holt, aber noch nicht weiss, ob man wirklich was ändert.

    vdr-2.7.9

    softhddevice, dbus2vdr, dvd, epgsearch, femon, graphtftng, web, menuorg,
    osdteletext, radio, recsearch, satip, tvguide, vnsiserver
    ubuntu focal, yavdr-ansible, linux-6.17, AsRock J4105, CIne CT-V7 DVB-C

  • Wenn du möchtest, dass es auch mit älteren Versionen funktioniert, dann solltest du das eher so machen:

    Danke!
    Wäre ja blöde, wenn man es korrigiert und es dann trotzdem nicht funktioniert ;).

    Beachte APIVERSNUM >= 30011!

    Sicher?
    Im git steht aktuell noch #define APIVERSNUM   30010, ich dachte, die müsste ich einschließen?

    Gruss
    SHF

    Mein (neuer) VDR:

    Software:
    Debian Wheezy mit Kernel 3.14
    VDR 2.0.7 & div. Plugins aus YaVDR-Paketen
    noad 0.8.6

    Hardware:
    MSI C847MS-E33, onboard 2x1,1GHz Sandybridge Celeron 847, 4GiB RAM
    32GB SSD (System), 4TB 3,5" WD-Red HDD (Video)
    TT FF DVB-S 1.5 FullTS-Mod PWM-Vreg-Mod, DVB-Sky 852 Dual DVB-S2
    Das ganze im alten HP Vectra VLi8-Gehäuse versorgt von:
    PicoPSU-160-XT und Meanwell EPP-150 im ATX-NT-Gehäuse

Participate now!

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