[solved] vdr-2.3.1-hide-first-recording-level-v1.patch - Absturz beim sortieren der Aufnahmen
-
-
Ich hatte bisher noch keine Zeit, den Patch an vdr 2.3.x anzupassen. Deshalb weiß ich auch noch nicht, wo es haken könnte.
Lars
-
bisher noch nicht bemwerkt aber kann ich so bestätigen, ist momentan das einzig ungereimte Stelle in meinem 2.3.9
Christian
-
Wer möchte, kann das mal an einem gepatchten VDR testen:
Diff
Display Morepi@raspberrypi:~/Entwicklung $ diff -ruN vdr-2.3.9++/menu.c vdr-2.3.9/menu.c --- vdr-2.3.9++/menu.c 2018-03-26 20:16:28.134379878 +0200 +++ vdr-2.3.9/menu.c 2018-04-08 13:03:20.346681250 +0200 @@ -3009,7 +3009,8 @@ CurrentRecording = *fileName ? *fileName : cReplayControl::LastReplayed(); int current = Current(); Clear(); - GetRecordingsSortMode(DirectoryName(Recordings)); +// GetRecordingsSortMode(DirectoryName(Recordings)); + GetRecordingsSortMode(DirectoryName()); Recordings->Sort(); cMenuRecordingItem *CurrentItem = NULL; cMenuRecordingItem *LastItem = NULL; @@ -3066,11 +3067,13 @@ fileName = FileName; } -cString cMenuRecordings::DirectoryName(const cRecordings *Recordings) +//cString cMenuRecordings::DirectoryName(const cRecordings *Recordings) +cString cMenuRecordings::DirectoryName() { cString d(cVideoDirectory::Name()); if (base) { if (cVideoDirectory::HideFirstRecordingLevel()) { + LOCK_RECORDINGS_READ; cRecordings::cFolderInfos::cFolderInfo* info = Recordings->GetFolderInfo(base); if (info) { if (info->FirstFolderNames.Size() > 0) @@ -3263,8 +3266,9 @@ return osContinue; if (const cMenuRecordingItem *ri = (cMenuRecordingItem *)Get(Current())) SetRecording(ri->Recording()->FileName()); // makes sure the Recordings menu will reposition to the current recording - cRecordings *Recordings = cRecordings::GetRecordingsWrite(recordingsStateKey); // write access is necessary for sorting! - IncRecordingsSortMode(DirectoryName(Recordings)); +// cRecordings *Recordings = cRecordings::GetRecordingsWrite(recordingsStateKey); // write access is necessary for sorting! +// IncRecordingsSortMode(DirectoryName(Recordings)); + IncRecordingsSortMode(DirectoryName()); recordingsStateKey.Reset(); Set(true); return osContinue; pi@raspberrypi:~/Entwicklung $ diff -ruN vdr-2.3.9++/menu.h vdr-2.3.9/menu.h --- vdr-2.3.9++/menu.h 2018-03-26 17:20:13.376544110 +0200 +++ vdr-2.3.9/menu.h 2018-04-08 12:34:13.683106263 +0200 @@ -224,7 +224,8 @@ eOSState Sort(void); eOSState Commands(eKeys Key = kNone); protected: - cString DirectoryName(const cRecordings *Recordings); +// cString DirectoryName(const cRecordings *Recordings); + cString DirectoryName(void); public: cMenuRecordings(const char *Base = NULL, int Level = 0, bool OpenSubMenus = false, const cRecordingFilter *Filter = NULL); ~cMenuRecordings();
Oder im Patch den Teil für menu.c etwa so anpassen und den Teil für menu.h ganz raus nehmen:
Diff
Display More--- a/menu.c +++ b/menu.c @@ -823,7 +823,7 @@ else { cStringList Dirs; for (const cRecording *Recording = Recordings->First(); Recording; Recording = Recordings->Next(Recording)) { - cString Folder = Recording->Folder(); + cString Folder = Recording->FileFolder(); strreplace((char *)*Folder, FOLDERDELIMCHAR, FOLDERDELIMCHARSUBST); // makes sure parent folders come before subfolders if (Dirs.Find(Folder) < 0) Dirs.Append(strdup(Folder)); @@ -2582,7 +2582,7 @@ SetMenuCategory(mcRecordingEdit); recording = Recording; originalFileName = recording->FileName(); - strn0cpy(folder, recording->Folder(), sizeof(folder)); + strn0cpy(folder, recording->FileFolder(), sizeof(folder)); strn0cpy(name, recording->BaseName(), sizeof(name)); priority = recording->Priority(); lifetime = recording->Lifetime(); @@ -2667,7 +2667,7 @@ eOSState cMenuRecordingEdit::Folder(void) { - return AddSubMenu(new cMenuFolder(tr("Select folder"), &Folders, recording->Name())); + return AddSubMenu(new cMenuFolder(tr("Select folder"), &Folders, *recording->FullName())); } eOSState cMenuRecordingEdit::Action(void) @@ -2748,7 +2748,7 @@ cString OldFolder = Recording->Folder(); cString NewName = *folder ? cString::sprintf("%s%c%s", folder, FOLDERDELIMCHAR, name) : name; NewName.CompactChars(FOLDERDELIMCHAR); - if (strcmp(NewName, Recording->Name())) { + if (strcmp(NewName, *Recording->FullName())) { if (!Recording->ChangeName(NewName)) { StateKey.Remove(Modified); Skins.Message(mtError, tr("Error while changing folder/name!")); @@ -3068,6 +3068,16 @@ { cString d(cVideoDirectory::Name()); if (base) { + if (cVideoDirectory::HideFirstRecordingLevel()) { + LOCK_RECORDINGS_READ; + cRecordings::cFolderInfos::cFolderInfo* info = Recordings->GetFolderInfo(base); + if (info) { + if (info->FirstFolderNames.Size() > 0) + d = AddDirectory(d, info->FirstFolderNames.At(0)); + delete info; + } + } + char *s = ExchangeChars(strdup(base), true); d = AddDirectory(d, s); free(s);
-
Wer möchte, kann das mal an einem gepatchten VDR testen:
Diff
Display Morepi@raspberrypi:~/Entwicklung $ diff -ruN vdr-2.3.9++/menu.c vdr-2.3.9/menu.c --- vdr-2.3.9++/menu.c 2018-03-26 20:16:28.134379878 +0200 +++ vdr-2.3.9/menu.c 2018-04-08 13:03:20.346681250 +0200 @@ -3009,7 +3009,8 @@ CurrentRecording = *fileName ? *fileName : cReplayControl::LastReplayed(); int current = Current(); Clear(); - GetRecordingsSortMode(DirectoryName(Recordings)); +// GetRecordingsSortMode(DirectoryName(Recordings)); + GetRecordingsSortMode(DirectoryName()); Recordings->Sort(); cMenuRecordingItem *CurrentItem = NULL; cMenuRecordingItem *LastItem = NULL; @@ -3066,11 +3067,13 @@ fileName = FileName; } -cString cMenuRecordings::DirectoryName(const cRecordings *Recordings) +//cString cMenuRecordings::DirectoryName(const cRecordings *Recordings) +cString cMenuRecordings::DirectoryName() { cString d(cVideoDirectory::Name()); if (base) { if (cVideoDirectory::HideFirstRecordingLevel()) { + LOCK_RECORDINGS_READ; cRecordings::cFolderInfos::cFolderInfo* info = Recordings->GetFolderInfo(base); if (info) { if (info->FirstFolderNames.Size() > 0) @@ -3263,8 +3266,9 @@ return osContinue; if (const cMenuRecordingItem *ri = (cMenuRecordingItem *)Get(Current())) SetRecording(ri->Recording()->FileName()); // makes sure the Recordings menu will reposition to the current recording - cRecordings *Recordings = cRecordings::GetRecordingsWrite(recordingsStateKey); // write access is necessary for sorting! - IncRecordingsSortMode(DirectoryName(Recordings)); +// cRecordings *Recordings = cRecordings::GetRecordingsWrite(recordingsStateKey); // write access is necessary for sorting! +// IncRecordingsSortMode(DirectoryName(Recordings)); + IncRecordingsSortMode(DirectoryName()); recordingsStateKey.Reset(); Set(true); return osContinue; pi@raspberrypi:~/Entwicklung $ diff -ruN vdr-2.3.9++/menu.h vdr-2.3.9/menu.h --- vdr-2.3.9++/menu.h 2018-03-26 17:20:13.376544110 +0200 +++ vdr-2.3.9/menu.h 2018-04-08 12:34:13.683106263 +0200 @@ -224,7 +224,8 @@ eOSState Sort(void); eOSState Commands(eKeys Key = kNone); protected: - cString DirectoryName(const cRecordings *Recordings); +// cString DirectoryName(const cRecordings *Recordings); + cString DirectoryName(void); public: cMenuRecordings(const char *Base = NULL, int Level = 0, bool OpenSubMenus = false, const cRecordingFilter *Filter = NULL); ~cMenuRecordings();
Oder im Patch den Teil für menu.c etwa so anpassen und den Teil für menu.h ganz raus nehmen:
Diff
Display More--- a/menu.c +++ b/menu.c @@ -823,7 +823,7 @@ else { cStringList Dirs; for (const cRecording *Recording = Recordings->First(); Recording; Recording = Recordings->Next(Recording)) { - cString Folder = Recording->Folder(); + cString Folder = Recording->FileFolder(); strreplace((char *)*Folder, FOLDERDELIMCHAR, FOLDERDELIMCHARSUBST); // makes sure parent folders come before subfolders if (Dirs.Find(Folder) < 0) Dirs.Append(strdup(Folder)); @@ -2582,7 +2582,7 @@ SetMenuCategory(mcRecordingEdit); recording = Recording; originalFileName = recording->FileName(); - strn0cpy(folder, recording->Folder(), sizeof(folder)); + strn0cpy(folder, recording->FileFolder(), sizeof(folder)); strn0cpy(name, recording->BaseName(), sizeof(name)); priority = recording->Priority(); lifetime = recording->Lifetime(); @@ -2667,7 +2667,7 @@ eOSState cMenuRecordingEdit::Folder(void) { - return AddSubMenu(new cMenuFolder(tr("Select folder"), &Folders, recording->Name())); + return AddSubMenu(new cMenuFolder(tr("Select folder"), &Folders, *recording->FullName())); } eOSState cMenuRecordingEdit::Action(void) @@ -2748,7 +2748,7 @@ cString OldFolder = Recording->Folder(); cString NewName = *folder ? cString::sprintf("%s%c%s", folder, FOLDERDELIMCHAR, name) : name; NewName.CompactChars(FOLDERDELIMCHAR); - if (strcmp(NewName, Recording->Name())) { + if (strcmp(NewName, *Recording->FullName())) { if (!Recording->ChangeName(NewName)) { StateKey.Remove(Modified); Skins.Message(mtError, tr("Error while changing folder/name!")); @@ -3068,6 +3068,16 @@ { cString d(cVideoDirectory::Name()); if (base) { + if (cVideoDirectory::HideFirstRecordingLevel()) { + LOCK_RECORDINGS_READ; + cRecordings::cFolderInfos::cFolderInfo* info = Recordings->GetFolderInfo(base); + if (info) { + if (info->FirstFolderNames.Size() > 0) + d = AddDirectory(d, info->FirstFolderNames.At(0)); + delete info; + } + } + char *s = ExchangeChars(strdup(base), true); d = AddDirectory(d, s); free(s);
Patch 1 scheint ok - zumindest kein Absturz mehr.
Danke
-
Danke für die Rückmeldung.
Habe es bei mir über den Tag auch so laufen lassen.
Kein Absturz mehr und das Sortieren funktioniert auch noch.
Deswegen hier noch der komplette Patch gegen vanilla vdr-2.3.9
Edit: Basierend auf dem Patch aus dem ppa von seahawk1986 und mit den Änderungen von oben.
-
Danke für den angepassten Patch, ich packe den mal ins PPA für den VDR 2.3.9 (und lasse danach die Plugins neu bauen).
-
mir war da noch was aufgefallen, damals mit der 2.3.4 - vllt könnt ihr das einmal verifizieren ob das noch so ist und gfs wenn Saman grad son lauf hat auch mal ansehen
ich hatte das seinerzeit mal aufgeschrieben:
QuoteIm Hauptverzeichnis Ordner alphabetisch oben ist => super
Im Hauptverzeichnis kann ich die Sortierung wie immer mit 0 von Datum auf alphanumerisch umschalten => auch super
In den Unterverzeichnissen leider nicht umschaltbar und immer nach Datum => wie krieg ich das auf alphanumerisch damit die Episoden in der richtigen Reihenfolge stehen?
Christian
-
Hallo Christian,
das ist leider schon bei der 2.20 so. Würde mich auch über eine Lösung freuen....
Gruß Micha
-
Hallo Christian,
das ist leider schon bei der 2.20 so. Würde mich auch über eine Lösung freuen....
Gruß Micha
Bei mir nicht. Ich kann auch in Unterverzeichnissen mit der Taste "0" nach Alphabet oder Datum sortieren.
-
und du hast auch das "hide-first-recording-level" feature aktiviert?
-
Die Ursache für das Problem konnte ich ausmachen:
Der VDR sucht im 'local' Verzeichnis nach der '.sort' Datei, findet sie aber nicht und kann auch keine anlegen, da das zu sortierende Verzeichnis dort nicht existiert.
Als Test oder workaround könnt ihr einfach ein leeres Verzeichnis (mit dem selben Namen wie das zu sortierende) im 'local' Verzeichnis erstellen.
Darin legt der VDR dann beim drücken auf '0' eine eigene '.sort' Datei ab. (Bedenkt aber, das leere Verzeichnisse beim Aufräumen entfernt werden!)
Jetzt stellt sich die Frage, ob alle Clients die selbe Sortierung nutzen wollen/sollen oder nicht.
Je nachdem, wäre das dann ein Bug oder ein Feature
-
Hi,
Wäre das nicht noch ein Bug der 2.3.9,der abgestellt werden sollte?
MfG Stefan
-
ja ich glaube auch, der workaround taugt maximal für eine Demonstration das es so funktioniert.
mE sollte das an der Wurzel gefixt werden.
Christian
-
Da das Sortieren funktioniert, wenn der Patch deaktiviert ist oder nicht angewandt wurde, ist das IHMO kein Bug - eher ein 'Feature Request'.
Für den Patch könnte man natürlich über sowas wie '.sort.local' oder '.sort.$hostname' nachdenken.
-
Moin, ich habe mir mal ein paar Debug Ausgaben in menu.c eingebaut.
Das Problem liegt wohl in cMenuRecordings::DirectoryName()
Codeif (cVideoDirectory::HideFirstRecordingLevel()) { LOCK_RECORDINGS_READ; cRecordings::cFolderInfos::cFolderInfo* info = Recordings->GetFolderInfo(base); if (info) { if (info->FirstFolderNames.Size() > 0) d = AddDirectory(d, info->FirstFolderNames.At(0)); delete info; } }
Beim öffnen des Aufnahmen-Menüs gibt die Funktion '/srv/vdr/video' zurück.
Öffnet man dann ein Verzeichnis, das in 'local' liegt, kommt zB '/srv/vdr/video/local//TEST'.
Öffnet man stattdessen ein externes Verzeichnis, kommt zB '/srv/vdr/video/local//Spielfilme'.
Merkwürdig an dieser Stelle finde ich, das 'FirstFolderNames' nur 'local/' enthält.
Sollte das nicht auch die anderen Verzeichnisse aus '/srv/vdr/video' beinhalten?
Dann könnte in einem Loop geprüft werden, ob/bis das Verzeichnis existiert...
Ich denke, das wäre die allgemein gültigste Variante.
Wer die Aufnahmen ausschließlich auf einem Server liegen hat, kann es auch hart kodieren:
-
So, ich glaube, ich hab es jetzt und das von oben ist zum Teil Blödsinn
Es fehlte einfach das == 0 Mit dieser Änderung kann ich jetzt alle Verzeichnisse sortieren.
Code
Display MorecRecordings::cFolderInfos::cFolderInfo *cRecordings::cFolderInfos::cFolderTree::GetInfo(void) const { cFolderInfo *info = new cFolderInfo(*name, *FullName(), count, latest, *latestFileName); // take care that LOCALRECFOLDER is the first item bool addLocal = false; for (int i = 0; i < firstFolderNames.Size(); i++) { if (strcmp(firstFolderNames.At(i), LOCALRECFOLDER) == 0) addLocal = true; else info->FirstFolderNames.Append(strdup(firstFolderNames.At(i))); } info->FirstFolderNames.Sort(); if (addLocal) info->FirstFolderNames.Insert(strdup(LOCALRECFOLDER)); return info; }
-
Prima, damit klappt die Sortierung der Aufnahmen in Unterverzeichnissen wieder
-
Hallo Christian,
das ist leider schon bei der 2.20 so. Würde mich auch über eine Lösung freuen....
Gruß Micha
Ich habe eben noch mal im vdr-2.2.0-hide-first-recording-level-v5.patch geschaut, da fehlt das == 0 auch.
-
dann kann die Version 2.4.0 ja zum WE kommen!
Vielen Dank für den Fix
Participate now!
Don’t have an account yet? Register yourself now and be a part of our community!