Das ist ein globales Objekt, den kannst du direkt benutzen, wenn du vdr/recording.h einbindest.
Lars
Das ist ein globales Objekt, den kannst du direkt benutzen, wenn du vdr/recording.h einbindest.
Lars
Moin,
Nur zur Info:
Bei vdr 2.0.x muss man wie live das Verzeichnis umbenennen - ob nun über ein Shellscript oder direkt ist egal.
So habe ich es jetzt gemacht und einfach das vom live übertragen.
Damit funktioniert das Verschieben oder Kopieren innerhalb des Video-Verzeichnis.
Das Löschen nach Dateinamen habe ich bei der Gelegenheit gleich mit eingebaut.
Api.html habe ich noch nicht angepasst, die Funktionsweise ist aber erkennbar:
https://github.com/Saman-VDR/v…edddc3a43739d399e8b1327d8
Grüsse
Super! Funktioniert.
Als Kritikpunkt hätte ich anzubringen, das man die Verzeichnisse per URL Parameter übertragen muss, obwohl es ein POST Request ist bzw. ich habe es zumindest nicht anders hinbekommen. Vielleicht bin ich ja auch einfach zu blöd.
So habe ich es gemacht:
$.ajax({
url:"http://192.168.3.99:8002/recordings/move?source=/media/daten/Filme/Aufnahmen/Auf_den_Spuren_des_Marsupilami/2014-04-18.16.33.16-0.rec&target=Kids/Auf den Spuren des Marsupilami",
method:"POST"
}).done(function (result) {
console.log(result);
})
source: voller Dateipfad vs. target: relativer Pfad ohne den .rec Folder muss man auch erst mal wissen
In meinem Git https://github.com/hannemann/v…lapi/tree/move-recordings habe ich eine Version erstellt, die vom aktuellen Master des yavdr git abgezweigt ist. Vielleicht möchte das ja jemand mergen...
Vielen Dank. Das Feature hat mir echt gefehlt.
Moin,
Als Kritikpunkt hätte ich anzubringen, das man die Verzeichnisse per URL Parameter übertragen muss, obwohl es ein POST Request ist
Das ist ein berechtigter Einwand, darum habe ich das auch mit folgendem Commit geändert:
https://github.com/Saman-VDR/v…d1382f48d2709a148d2535473
Damit werden die Optionen jetzt aus dem Body gelesen.
Ich habe nur xml getestet und da sollte man die Leerstelle am Ende des Strings nicht vergessen!
Grüsse und danke für das Feedback.
Cool... Danke
Die Methode delByName hast Du eingebaut, weil sich nach dem Verschieben die Nummer der Aufnahme ändert?
Der einzige Usecase, der mir spontan einfällt wäre, das man nach dem Verschieben/Umbenennen einer Aufnahme diese dann doch lieber löschen möchte.
deleteRecordingByName habe ich eingebaut, weil sich die Nummer im VDR auch ändern kann und das so IMHO die einzig sichere Methode ist, die richtige Aufnahme zu erwischen.
In meiner App habe ich das bisher abgefangen, in dem ich mit der Nummer noch mal die Aufnahme geholt und dann erst die Pfade verglichen habe...
deleteRecordingByName habe ich eingebaut, weil sich die Nummer im VDR auch ändern kann und das so IMHO die einzig sichere Methode ist, die richtige Aufnahme zu erwischen.
Ja, "byName" ist am besten. Die Aufnahmen des vdr haben ja keine unveränderliche ID o.ä., deshalb ist es am sinnvollsten, solch wichtige Dinge per Name zu machen.
Man muss dann eben nur den Fall abfangen, falls die Aufnahme nicht existiert. Aber das muss man auch mit Nummern...
Lars.
Moin,
hannemann
wenn du möchtest, kannst du das mal probieren:
https://github.com/Saman-VDR/v…4316fb3cead80486f93ad6b08
Hallo Saman,
Es baut gerade...
Mir ist an der MoveRecording Methode aufgefallen, das ich Dateien mit einem Slash im Namen wie z.B. Episode-bla (1/12) nicht richtig verschieben kann, da er mir dann das Verzeichnis /12) anlegt.
Ich glaube da ist noch ein Bug in recordings.cpp ,Zeile 138
if (recording && !VdrExtension::MoveRecording(recording, VdrExtension::FileSystemExchangeChars(StringExtension::replace(targetDir, "/", "~").c_str(), true), copy_only)) {
IMO müsste es heissen
if (recording && !VdrExtension::MoveRecording(recording, VdrExtension::FileSystemExchangeChars(targetDir.c_str(), true), copy_only)) {
da die Ersetzung der Verseichnis delimiter glaube ich in FileSystemExchangeChars bereits vorgenommen wird.
Ändere ich es so ab, kann ich jedenfalls Dateien mit Slash im Namen speichern. Der wird dann auf Dateisystemebene in eine Tilde gewandelt.
Ich arbeite gerade daran, das die Move Geschichte den neuen relativen Dateiname zurückgibt, da ich es für unzuverlässig halte, da eine Logik im Client einzubauen, die versucht den Dateinamen zu erstellen. Ich habe da ein Problem mit UTF-8. Kannst Du mir da einen Tipp geben?
Die Aufnahme (Datei) die ich umbenennn möchte heisst 'Dino-Planet#3A_T-Rex_und_seine_Brüder_(2~3)'
Er gibt mir als JSON zurück: {"new_relative_file_name":"Dokus\/Terra_X\/Dino-Planet#3A_T-Rex_und_seine_Brüder_(2~3)bla\/2014-06-02.00.58.1777-0.rec"}
Den Code dazu habe ich mir zusammengeklaut.
if (recording) {
string newRelFileName = VdrExtension::MoveRecording(recording, VdrExtension::FileSystemExchangeChars(targetDir.c_str(), true), copy_only);
if ("" == newRelFileName) {
LOG_ERROR_STR(sourceDir.c_str());
reply.httpReturn(503, "File copy failed!");
}
reply.addHeader("Content-Type", "application/json; charset=utf-8");
cxxtools::JsonSerializer serializer(out);
serializer.serialize(newRelFileName, "new_relative_file_name");
serializer.finish();
} else {
Recordings.Update(false);
}
Alles anzeigen
string VdrExtension::MoveRecording(cRecording const * recording, string const & name, bool copy)
{
if (!recording)
return "";
esyslog("restfulapi: newname: %s", name.c_str());
string oldname = recording->FileName();
size_t found = oldname.find_last_of("/");
if (found == string::npos)
return "";
string newname = string(VideoDirectory) + "/" + name + oldname.substr(found);
if (!MoveDirectory(oldname.c_str(), newname.c_str(), copy)) {
esyslog("[Restfulapi]: renaming failed from '%s' to '%s'", oldname.c_str(), newname.c_str());
return "";
}
if (!copy)
Recordings.DelByName(oldname.c_str());
Recordings.AddByName(newname.c_str());
cRecordingUserCommand::InvokeCommand(*cString::sprintf("rename \"%s\"", *strescape(oldname.c_str(), "\\\"$'")), newname.c_str());
return name + oldname.substr(found);
}
Alles anzeigen
Der Returnvalue der MoveRecording Methode müsste wohl korrekt kodiert werden. Wie kann ich das umsetzen?
(XML und HTML baue ich dann auch noch ein...)
Ach ja... VPS setzt er mir noch, wenn ich einen Timer anlege und aktivieren bzw. deaktivieren geht auch
Hab die encodeToJson Methode gefunden... UTF-8 Problem gelöst
Moin,
Ich glaube da ist noch ein Bug in recordings.cpp ,Zeile 138
Aufgerufen wird mit bool ToFileSystem = true
VdrExtension::FileSystemExchangeChars(StringExtension::replace(targetDir, "/", "~").c_str(), true)
aus vdr/recording.c
if (ToFileSystem) {
switch (*p) {
// characters that can be mapped to other characters:
case ' ': *p = '_'; break;
case FOLDERDELIMCHAR: *p = '/'; break;
case '/': *p = FOLDERDELIMCHAR; break;
FOLDERDELIMCHAR ist dabei die Tilde (~)
Damit aus / am Ende auch wieder / werden, muss also vorher getauscht werden.
So kann der Pfad aus / und oder ~ zusammen gesetzt werden.
Die Tilde in Aufnahme Titeln ist IMHO tabu.
ZitatDer Returnvalue der MoveRecording Methode müsste wohl korrekt kodiert werden. Wie kann ich das umsetzen?
Im Original wird das benutzt:
ZitatAch ja... VPS setzt er mir noch, wenn ich einen Timer anlege und aktivieren bzw. deaktivieren geht auch
Super!
Es geht mir ja auch nicht um eine Tilde in Aufnahme Titeln, sondern um einen Slash, was relativ häufg vorkommt.
z.B. Episodenname (2/25) oder wie in meinem Beispiel: Dino-Planet: T-Rex und seine Brüder (2/3)
Ersetze ich in dem Aufruf StringExtension::replace(targetDir, "/", "~").c_str() mit targetDir, so macht er es richtig.
Der Aufruf müsste demnach IMO so lauten
Ich habe die Rückantwort für moveRecording fertig
https://github.com/hannemann/v…2bcc3b99885d105d0adaddf94
Sie enthält lediglich den neuen relativen Dateinamen. Den Rest kann man ja im Client aktualisieren...
Der Code ist sicherlich verbesserungswürdig... Ich hab ja von C++ keine Ahnung. Vor allem die Rückgabewerte in tools.cpp VdrExtension::MoveRecording
Das kann man bestimmt besser machen. Da die Methode nun aber einen String zurückgeben soll, fiel mir statt false im Fehlerfall nichts besseres ein als ein Leerstring.
Ach ja... Ich wollte auch einen Slash vorne anfügen. Das habe ich aber nicht hinbekommen...
ZitatEs geht mir ja auch nicht um eine Tilde in Aufnahme Titeln, sondern um einen Slash, was relativ häufg vorkommt.
Ok, den kannst du so nicht setzen. Dein Aufruf passt aber trotzdem nicht, da aus "neue/verzeichnisse/alte_Aufnahme.rec" so nur ein Verzeichnis "neue~verzeichnisse~alte_Aufnahme.rec" wird.
So wie es jetzt ist, ist es uncool aber safe
Die Premium Lösung muss dann wohl auf ExchangeChars verzichten und den String selbst aufzubereiten...
Edit: ein Hack könnte natürlich sein, doppelte Slashes zu verwenden, um nachher eines anzuzeigen.
Transparenz geht aber anders...
"neue/verzeichnisse/alte_Aufnahme.rec"
Hmmmm....
Ich kenne das von Live so, das wenn ich ein Verzeichnis anlegen will ich als Separator die Tilde angeben muss:
mein~neues~verzeichnis~dateiname
wird im Dateisystem zu:
mein/neues/verzeichnis/dateiname/timestamp.rec
kommt irgendwo ein Slash vor, so wird dieser im Dateisystem zu einer Tilde.
Und genau so funktioniert die Restfulapi mit meiner Änderung auch.
Dokus~Terra_X~Dino-Planet:_T-Rex_und_seine_Brüder_(2/3)
wird zu
/Dokus/Terra_X/Dino-Planet#3A_T-Rex_und_seine_Brüder_(2~3)/2014-06-02.00.58.1777-0.rec/
Da ich das nicht anders kenne und das OSD die verschobenen Aufnahmen korrekt anzeigt, ging ich davon aus, das das Verhalten so gewünscht ist.
Das Problem, was ich dabei mit restfulapi sehe, ist das filename usw überall mit Slashes ausgeben werden. Beim verschieben müssen dann für das Target auf einmal Tilden benutzt werden. Das fand ich beim ausprobieren komisch.
Mir ist das aber auch nicht so wichtig, wie wir das einbauen. Ich kann das ja in meiner App auch abfangen.
Da das Slash so nicht funktioniert, muss es letztlich wohl angepasst werden...
Alles anzeigenIch habe die Rückantwort für moveRecording fertig
https://github.com/hannemann/v…2bcc3b99885d105d0adaddf94
Sie enthält lediglich den neuen relativen Dateinamen. Den Rest kann man ja im Client aktualisieren...
Der Code ist sicherlich verbesserungswürdig... Ich hab ja von C++ keine Ahnung. Vor allem die Rückgabewerte in tools.cpp VdrExtension::MoveRecording
Das kann man bestimmt besser machen. Da die Methode nun aber einen String zurückgeben soll, fiel mir statt false im Fehlerfall nichts besseres ein als ein Leerstring.
Ach ja... Ich wollte auch einen Slash vorne anfügen. Das habe ich aber nicht hinbekommen...
string newRelFileName = VdrExtension::MoveRecording(recording, VdrExtension::FileSystemExchangeChars(targetDir.c_str(), true), copy_only);
Und das funktioniert so? Weil:
static bool MoveRecording(cRecording const * recording, std::string const & name, bool copy = false);
Aber wofür machst du dir die Mühe überhaupt? Wenn kein http error zurück kommt, hat das verschieben funktioniert und target ist gleich dem relativen Dateinamen.
Ich werde jetzt bei mir die directory Option einbauen und damit probieren. Da wird dann Slash gegen Tilde getauscht. Beim target selber nehme ich es erstmal raus.
Eventuell ist damit ja dann allen geholfen:
cRecording* recording = Recordings.GetByName(source.c_str());
string filename = directory.empty() ? target : StringExtension::replace(directory, "/", "~") + "~" + target;
if (recording && !VdrExtension::MoveRecording(recording, VdrExtension::FileSystemExchangeChars(filename.c_str(), true), copy_only)) {
Bei den Timern kommen die Dateinamen mit Tilde als Separator zurück, bei den Aufnahmen mit Slashes.
Aber wofür machst du dir die Mühe überhaupt? Wenn kein http error zurück kommt, hat das verschieben funktioniert und target ist gleich dem relativen Dateinamen.
-bool VdrExtension::MoveRecording(cRecording const * recording, string const & name, bool copy)
+string VdrExtension::MoveRecording(cRecording const * recording, string const & name, bool copy)
Das mache ich wegen Sonderzeichen wie z.B. ':' Die sind dann ja irgendwie kodiert: Name "Dino Planet: T-Rex und seine Brüder (2/3)" = Dateiname "Dino-Planet#3A_T-Rex_und_seine_Brüder_(2~3)"
So stelle ich sicher, das ich meine Objekte im Client richtig Updaten kann, ohne die gesamten Recordings neu laden zu müssen. Ich könnte das auch in JavaScript nachimplementieren, aber so finde ich es Sauberer. Eigentlich müsste die gesamte Aufnahme zurückgegeben werden, wie bei den Timern.
Das austauschen des Slash gegen eine Tilde kannst du dir IMO jedenfalls sparen, da VdrExtension::FileSystemExchangeChars genau das sowieso macht.
Ich denke mal wir sollten uns einigen, wie wir die Dateinamen übergeben wollen. Das der Verzeichnis Separator die Tilde ist, hat ja auch irgendeinen Grund, den ich allerdings nicht kenne. In vdr/recording gibt es z.B. auch sowas
Ich bin dafür, das der Verzeichnis Separator als Tilde übergeben werden muss, da ich das von Live so kenne und bei den Timern auch so implementiert ist. Ausserdem kann ich dann Slashes im Dateinamen verwenden, was bei Episoden Nummerierungen ständig vorkommt.
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!