Restfulapi-Plugin

  • 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:

    Code
    $.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.

    Grüße


    Hannemann

  • 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.

    Grüße


    Hannemann

  • 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

  • Saman: Du bist schon die ganze Zeit schwer am Aufräumen. Danke dir!


    Gerald


    HP Proliant MicroServer Gen8, Xeon E3-1230, 12 GB RAM, 3xWD red 2TB im RAID 5, 2xSundtek MediaTV Home DVB-C/T, L4M TWIN-C/T, Ubuntu Server 14.04.1, Plex Media Server
    Samsung UE55H6470

  • 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

    Code
    if (recording && !VdrExtension::MoveRecording(recording, VdrExtension::FileSystemExchangeChars(StringExtension::replace(targetDir, "/", "~").c_str(), true), copy_only)) {

    IMO müsste es heissen

    Code
    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.



    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...)

    Grüße


    Hannemann

  • Ach ja... VPS setzt er mir noch, wenn ich einen Timer anlege und aktivieren bzw. deaktivieren geht auch ;)

    Grüße


    Hannemann

  • Hab die encodeToJson Methode gefunden... UTF-8 Problem gelöst :)

    Grüße


    Hannemann

  • Moin,


    Ich glaube da ist noch ein Bug in recordings.cpp ,Zeile 138


    Aufgerufen wird mit bool ToFileSystem = true

    Code
    VdrExtension::FileSystemExchangeChars(StringExtension::replace(targetDir, "/", "~").c_str(), true)


    aus vdr/recording.c

    Code
    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.


    Quote

    Der Returnvalue der MoveRecording Methode müsste wohl korrekt kodiert werden. Wie kann ich das umsetzen?

    Im Original wird das benutzt:

    Code
    serRecording.FileName = StringExtension::UTF8Decode(recording->FileName());


    Quote

    Ach 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

    Code
    VdrExtension::MoveRecording(recording, VdrExtension::FileSystemExchangeChars(targetDir.c_str(), true), copy_only);

    Grüße


    Hannemann

  • 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...

    Grüße


    Hannemann

  • Quote

    Es 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.

    Grüße


    Hannemann

  • 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...


  • Code
    string newRelFileName = VdrExtension::MoveRecording(recording, VdrExtension::FileSystemExchangeChars(targetDir.c_str(), true), copy_only);

    Und das funktioniert so? Weil:

    Code
    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:

    Code
    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.


    Code
    -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

    Code
    name = strdup(cString::sprintf("%s~%s", Timer->File(), Subtitle));


    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.

    Grüße


    Hannemann

Participate now!

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