Datenbankanbindung

  • Quote

    Original von matrix79
    Saxman2k:

    ich habe da immer einen Fehler, wenn das php Skript aufgerufen wurde.
    schau hier:


    Lies mal etwas weiter oben die Angaben zu den Rechten der temporären Datei durch. "Dann klappts auch mit dem Nachbarn." :D

    Hardware: Gigabyte GA-970A-D3, AMD Athlon II X2 235e, 4GB RAM, Zotac GeForce 210 Synergy Edition 1GB, Corsair Force3 60GB SSD, Mystique SaTiX-S2 Dual, 6.4" TFT, Atric IR Einschalter Rev.5, Logitech Harmony 900, Samsung LE46A789 full HD LCD, Denon AVR-1910, USB Atmo-Light von Slime
    Software: yaVDR 0.5
    Streaming Client 1: Hauppauge MediaMVP
    Streaming Client 2: Telegant TG100 (wenn ich mal irgendwann die Zeit finde das UPnP-Plugin zu testen)

  • Quote

    Original von Saxman2k
    Und da ist auch schon der Knackpunkt: z. B. die Aufnahme "/video/%Quarks_&_Co./2004-02-11.10.45.88.88.rec" beinhaltet leider ein "&". Für das PHP-Script bedeutet das also: der nächste Parameter beginnt nach dem "&".
    Soweit mir bekannt gibt es keine Möglichkeit ein "&" in einem Parameter einzubauen (bitte belehrt mich eines besseren :]).

    vermutlich interessiert's zwar keinen mehr, aber es geht: als %26
    (26 ist hexadezimal fuer den '&') also dein Beispiel:

    Code
    /video/%25Quarks_%26_Co./2004-02-11.10.45.88.88.rec
  • Bistr-o-Math

    Das interessiertmich schon! Gibt es irgendwelche Shell-Funktionen, die einen String so aufbereiten können? Dann könnte ich mir die temporäre Datei sparen.

    EDIT:
    Man müßte also nur jedes Sonderzeichen (oder besser wirklich alle Zeichen) in ihrem Hexwert angeben. Das sollte doch irgendwie in der Shell machbar sein, oder?

    Shell-Gurus dieses Boards: Helft mir bitte! ;( ;D

    Hardware: Gigabyte GA-970A-D3, AMD Athlon II X2 235e, 4GB RAM, Zotac GeForce 210 Synergy Edition 1GB, Corsair Force3 60GB SSD, Mystique SaTiX-S2 Dual, 6.4" TFT, Atric IR Einschalter Rev.5, Logitech Harmony 900, Samsung LE46A789 full HD LCD, Denon AVR-1910, USB Atmo-Light von Slime
    Software: yaVDR 0.5
    Streaming Client 1: Hauppauge MediaMVP
    Streaming Client 2: Telegant TG100 (wenn ich mal irgendwann die Zeit finde das UPnP-Plugin zu testen)

    Edited 2 times, last by Saxman2k (March 1, 2004 at 6:43 PM).

  • Quote

    Original von Saxman2k
    Bistr-o-Math

    Das interessiertmich schon! Gibt es irgendwelche Shell-Funktionen, die einen String so aufbereiten können? Dann könnte ich mir die temporäre Datei sparen.

    sed oder perl sind zwar sicherlich die besseren Alternativen,
    aber da muesstest du einfach mal in dene man-pages fuer die extended regexps nachschau'n.
    hier ist ein kleines C-Prograemmchen, welches aus einem Zeichen die entsprechende
    %-Sequenz macht:

    kompillieren kann man's mit

    Code
    gcc test.c -s -o test

    Beispiel:

    Code
    # ./test "&"
    %26
    # ./test "%"
    %25
    #

    EDIT: PS: natuerlich muss dein php-Skript die Sequenzen zurueckumwandeln...

  • Quote

    Original von Bistr-o-Math
    EDIT: PS: natuerlich muss dein php-Skript die Sequenzen zurueckumwandeln...


    Das macht PHP von ganz alleine. Das ist ja das schöne daran!
    Noch mal vielen Dank für den Tip mit den Hexwerten!

    Hardware: Gigabyte GA-970A-D3, AMD Athlon II X2 235e, 4GB RAM, Zotac GeForce 210 Synergy Edition 1GB, Corsair Force3 60GB SSD, Mystique SaTiX-S2 Dual, 6.4" TFT, Atric IR Einschalter Rev.5, Logitech Harmony 900, Samsung LE46A789 full HD LCD, Denon AVR-1910, USB Atmo-Light von Slime
    Software: yaVDR 0.5
    Streaming Client 1: Hauppauge MediaMVP
    Streaming Client 2: Telegant TG100 (wenn ich mal irgendwann die Zeit finde das UPnP-Plugin zu testen)

  • Quote

    Original von Saxman2k
    EDIT:
    Man müßte also nur jedes Sonderzeichen (oder besser wirklich alle Zeichen) in ihrem Hexwert angeben. Das sollte doch irgendwie in der Shell machbar sein, oder?

    man kann alle Zeichen umwandeln, besser ist es jedoch nicht.
    da muesstest du z.B. hier schauen: rfc2141, z.B. 2.3.1

    es gibt auc einen RFC ueber andere Regeln, z.B. Space wird durch + ersetzt, + wird mit % codiert. usw.

    nur ich finde den gerade nicht.

  • Hallo matrix79,

    der Aufruf für das Suchen der Aufnahmen (Find) startet doch einen neuen Process, kann an dieser stelle nicht einfach ein kleines Script eine Datenbankabfrage machen und diese Werte zurückliefern?

    ... nur ein erster Gedanke zu diesem Thema ...

    Hardy

    Suche: 6 Richtige für die nächste Lottoziehung
    PS: Wer Rechtschreibfehler findet, darf sie behalten!

  • Quote

    Original von HFlor
    Hallo matrix79,

    der Aufruf für das Suchen der Aufnahmen (Find) startet doch einen neuen Process, kann an dieser stelle nicht einfach ein kleines Script eine Datenbankabfrage machen und diese Werte zurückliefern?

    ... nur ein erster Gedanke zu diesem Thema ...

    Hardy

    Das habe ich ja eigentlich vor.

    Ich habe in der recording.c folgendes gefunden:

    Code
    #define FINDCMD      "cd '%s' && find '%s' -follow -type d -name '%s' 2> /dev/null"
      asprintf(&cmd, FINDCMD, VideoDirectory, VideoDirectory, Deleted ? "*" DELEXT : "*" RECEXT);


    Jetzt weis ich eben nicht, ob es schon langt, wenn man das was bei define steht einfach ändert. Also so abändert, dass dort ein Befehl steht, der aus der Datenbank liest, bzw. ein shell skript aufruft, welches das macht.
    Wenn dieses shell skript auf std Ausgabe schreibt, dann müste es doch möglich sein einfach find durch den skript Namen zu ersetzen, oder?


    Gruß
    matrix79

  • Hallo,

    ich spinne mal die Idee weiter, wenn es mit einer Datenanbindung funktioniert.

    Also vorausgesetzt, man bekommt es hin, dass der VDR die Aufnahmen aus einer Datenbank liest und nicht mit find sucht...
    Dann könnte man den VDR Multiuser fähig machen.
    Ich meine das so, dass wenn mehrere Leute mit einem VDR etwas aufnehmen, dann auch nur ihre eigene Aufnahmen sehen, oder über eine zusätzlichen Eintrag in der Datenbank anderen usern erlauben den Film anschauen zu können, ihn aber nicht löschen können.

    Wenn man das gleiche auch mit den Timern macht, also die Timer in eine Datenbank schreibt und wer zuerst etwas programmiert, dessen wird dann auch aufgenommen.
    Jeder user sieht seine eigene Timerliste. Wenn ein zweiter user etwas Programmiert, was nciht aufgenommen werden kann, bekommt er eine Meldung. Wenn er die gleiche Sendung aufnehmen will, dann eben ein hinweis, dass diese schon gespeichert ist.


    Gruß
    matrix79

  • Hallo,

    habe das mit dem find mal ausprobiert.

    Ich habe diese Zeile

    Code
    #define FINDCMD      "cd '%s' && find '%s' -follow -type d -name '%s' 2> /dev/null"


    durch diese ersetzt:

    Code
    #define FINDCMD      "cd '%s' && /usr/bin/db_test 2> /dev/null"

    Dabei ist db_test ein shell skript, was wie folgt aussieht:

    Bash
    #!/bin/sh
    
    
    echo "/video0/!_geschnitten/Filme/E-Mail_für_Dich/2004-02-01.20.10.50.50.rec
    /video0/!_geschnitten/Filme/backup/American_History_X/2004-02-28.22.50.50.50.rec"

    Wenn man den VDR mit dieser änderung neu kompiliert hat. Und dann in Aufnahmen geht, sieht man nur die Aufnahmen, die in dem shell skript stehen.

    Da dies geht, dürfte es mit einer Datenbank auch gehen.


    Gruß
    matrix79

  • Hallo,

    ich habe es hinbekommen, dass der VDR die Aufnahmen aus der Datenbank ausliest.

    Dazu muß man in der recording.c
    diese Zeile:

    Code
    #define FINDCMD      "cd '%s' && find '%s' -follow -type d -name '%s' 2> /dev/null"


    duch diese ersetzen:

    Code
    #define FINDCMD      "cd '%s' && /usr/bin/db_test 2> /dev/null"

    Dabei ist db_test ein Shell Skript was unter /usr/bin liegt.
    diese sieht so aus:

    Bash
    #!/bin/sh
    
    
    echo "select records from vdr;" | mysql -u user -h host -p"passwort" datenbank

    Dann erstellt man sich eine Temp Datei z.B so:

    Code
    find /video0 -follow -type d -name *.rec > db_test.tmp

    Dann habe ich noch ein Skript was mir die Datenbank mit den jetzigen Einträgen füllt:

    Die Datenbank hat zum Testen nur zwei Spalten (id und records).

    Wenn die Datenbank läuft und die Aufnahmen in die Datenbank eingefügt sind, werden genau diese Aufnahmen dann im VDR angezeigt, wenn man auf Aufnahmen geht.

    Der hir beschrieben Weg ist nur zum Testen gedacht, dies muss natürlich automtisch in die Datenbank eingetragen werden, was über Parameter vom VDR ohne großen aufwand möglich ist.

    Viel mehr ist die Frage, wie lösche ich einen Eintrag in der Datenbank, wenn ich einen Film mit dem VDR lösche?
    Noch ein Nachteil, das Skript was nach einer Aufnahme ausgeführt wird und dieses den Film dann der Datenbank hinzufügt, dann ist der Film erst nach dem Ende einer Aufnahme im VDR zu sehen.

    Gruß
    matrix79

  • Hallo,
    Ich abe ich mir mal schnell folgendes gebastelt:

    Zum Anzeigen der Aufnahmen-Liste:

    Code
    #define FINDCMD "wget -q -O - 'http://herakles.zh.local/~vdr/video_db/video_simple.php?videodir1=%s&videodir2=%s&recext=%s'"

    video_simple.php:
    [PHP]
    <?php
    /* Datenbankserver - In der Regel die IP */
    $db_server = "localhost";
    /* Datenbankname */
    $db_name = "video1_db";
    /* Datenbankuser */
    $db_user = "video1_db";
    /* Datenbankpasswort */
    $db_passwort = "video1_db";
    /* Tabelle für die Datensätze */
    $tab_name = "recordings";

    $action = $_GET["action"];
    $recext = str_replace(".","\.", $_GET["recext"]);
    $videodir = $_GET["recording"];

    /* Erstellt Connect zu Datenbank her */
    $db = mysql_connect($db_server,$db_user,$db_passwort) or die ("Konnte keine Verbindung zur Datenbank herstellen");
    $db_check = mysql_select_db($db_name);
    if($db) {
    if ( $action == "add" ) {
    $recordingdir = $_GET["recording"];
    echo "<br><b>Verzeichnis:</b> " . $recordingdir . "<br>";
    $query = "SELECT * FROM ".$tab_name." WHERE videodir='".$recordingdir."' ";
    $result = mysql_query($query);

    if ( $result && ! mysql_num_rows($result) ) {
    $query = "INSERT INTO " . $db_name . "." . $tab_name . " (videodir) VALUES ('".$recordingdir."') ";
    $result = mysql_query($query, $db);
    }
    }
    if ( $recext ) {
    $query = "SELECT videodir FROM ".$tab_name." ";
    $result = mysql_query($query, $db);
    if ( $result ) {
    while ( $row = mysql_fetch_object($result) ) {
    if ( preg_match("/.".$recext."$/", $row->videodir) )
    echo $row->videodir."\n";
    }
    }
    }
    if ( $action == "remove" ) {
    $query = "DELETE FROM ".$tab_name." WHERE videodir='$videodir'";
    $result = mysql_query($query, $db);
    }
    if ( $action == "rename" ) {
    $videoneudir = str_replace(".rec", ".del", $videodir);
    $query = "UPDATE ".$tab_name." SET videodir='$videoneudir' WHERE videodir='$videodir'";
    $result = mysql_query($query, $db);
    }
    } else {
    echo "Konnte keine Verbindung zum Datenbankserver aufbauen!<br>";
    echo "Bitte Verbindungseinstellungen überprüfen!<br>";
    }
    ?>
    [/PHP]

    Das $recext ist wichtig, der VDR holt sich darüber getrennt die Verzeichnisse einmal mit der Endung .rec und einmal mit der Endung .del

    vdr mit Option "-r videodb_store.sh" starten,
    damit werden Aunahmen bei Aufnahmebeginn (before) und beim Schneiden (edited) hinzugefügt.

    videodb_store.sh:


    Zum löschen muß videodir.c geändert werden, hinzufügen:

    #define DELETECMD "videodb_store.sh %s '%s'"

    und dann die beiden folgenden Funktionen entsprechend ändern (hab leider kaum C-Kenntnisse)
    Die Zeilen mit den ">" am Zeilenanfang habe ich hinzugefügt.

    Aber vorsicht, ist noch nicht gut getestet und überhaupt nicht optimiert etc.! ?(
    Tabelle recordings mit feldern recid und videodir.

    Das ganze ist bei mir mit 220 Aufnahmen deutlich schneller :]

    VDR1: Gigabyte GA-M720-US3 (nVidia Corporation MCP78S [GeForce 8200]), Athlon II X2 240, 2GB RAM, Intel 82574L Gigabit, Debian Squeeze, Kernel 2.6.38.3 mit linux-media.tar.bz2 vom 20.04. 10:04, dvbhddevice fb6b1beedb72, VDR-1.7.22 (extension-Patch, 15 Plugins), epgsearch, extrecmenu, ...
    VDR2: Debian Etch, 2.6.21.3, K6-2 400, 192MB, NFS-Root, 466GiB über NFS, 1xNexus 2.1, 1xNova S, VDR-1.4.7
    Server: Debian Squeeze, 2.6.35.7, AMD X2 240e, 4GB, System: Raid1 2x500GB, Aufnahmen: Raid5 4TB + 1x 500GB, 1000MBit LAN
    Episodenlisten für epgsearch, VDRSeriesTimer

    Edited once, last by vejoun (March 2, 2004 at 10:11 PM).

  • vejoun: gibt es einen wichtigen Grund, warum du video_simple.php als php Skript gemacht hast? Müste doch auch mit shell skript gehen.

    Quote


    vdr mit Option "-r videodb_store.sh" starten,
    damit werden Aunahmen bei Aufnahmebeginn (before) und beim Schneiden (edited) hinzugefügt.

    wird von dem VDR die zusätzlichen Parameter wie before, edited und rename an das Skript übergeben oder wo kommen diese her?


    Gruß
    matrix79

  • Quote

    Original von vejoun
    Zum löschen muß videodir.c geändert werden, hinzufügen:

    #define DELETECMD "videodb_store.sh %s '%s'"

    und dann die beiden folgenden Funktionen entsprechend ändern (hab leider kaum C-Kenntnisse)

    Müssen den die Funktionen geändert werden?
    Ich könnte mir vorstellen, dass es langt die define Zeile zu ändern, denn dann wird in den Funktionen genau dieser Befehl aufgerufen, wo dort definiert ist.

    Gruß
    matrix79

  • Nein, es gibt keinen wichtigen Grund, aber auf meinem File-Server läuft sowieso LAMP und da hat sich das angeboten, kann ja jeder machen wie er möchte ;)

    Dem Script das man dem VDR mit -r übergibt hat als ersten Parameter "before" "edited" oder "after".
    "rename" und "remove" übergebe ich aus der videodir.c heraus.

    Man muss mit dem FINDCMD aufpassen, VDR verwendet den doppelt, einmal um die "normalen" Aufnahmen zu finden und einmal um die als gelöscht markierten (die .del Verzeichnisse) zu finden.

    Beim Original FINDCMD "cd '%s' && find '%s' -follow -type d -name '%s' 2> /dev/null"
    wird das letzte %s je nach Fall durch "*.rec" oder "*.del" ersetzt. Man sollte also, wenn VDR nach "*.del" sucht nicht den Datenbank-Inhalt (mit den .rec) zurückgeben.
    :] (Da bin ich zuerst drauf reingefallen) *g*

    Quote

    Müssen den die Funktionen geändert werden?
    Ich könnte mir vorstellen, dass es langt die define Zeile zu ändern, denn dann wird in den Funktionen genau dieser Befehl aufgerufen, wo dort definiert ist.


    Du meinst DELETECMD? Das gibt es normal gar nicht, VDR ruft nichts externes auf beim löschen... Oder habe ich etwas übersehen?

    Mike

    VDR1: Gigabyte GA-M720-US3 (nVidia Corporation MCP78S [GeForce 8200]), Athlon II X2 240, 2GB RAM, Intel 82574L Gigabit, Debian Squeeze, Kernel 2.6.38.3 mit linux-media.tar.bz2 vom 20.04. 10:04, dvbhddevice fb6b1beedb72, VDR-1.7.22 (extension-Patch, 15 Plugins), epgsearch, extrecmenu, ...
    VDR2: Debian Etch, 2.6.21.3, K6-2 400, 192MB, NFS-Root, 466GiB über NFS, 1xNexus 2.1, 1xNova S, VDR-1.4.7
    Server: Debian Squeeze, 2.6.35.7, AMD X2 240e, 4GB, System: Raid1 2x500GB, Aufnahmen: Raid5 4TB + 1x 500GB, 1000MBit LAN
    Episodenlisten für epgsearch, VDRSeriesTimer

    Edited once, last by vejoun (March 2, 2004 at 9:37 PM).

  • Quote

    Original von vejoun
    Dem Script das man dem VDR mit -r übergibt hat als ersten Parameter "before" "edited" oder "after".


    Also sie kommen vom VDR.

    Quote


    "rename" und "remove" übergebe ich aus der videodir.c heraus.


    Ist das beim dem orginal VDR oder bei der gepachten Version?
    Bzw. muss ich was ändern, dass dies übergeben werden?

    Quote


    Man muss mit dem FINDCMD aufpassen, VDR verwendet den doppelt, einmal um die "normalen" Aufnahmen zu finden und einmal um die als gelöscht markierten (die .del Verzeichnisse) zu finden.

    Beim Original FINDCMD "cd '%s' && find '%s' -follow -type d -name '%s' 2> /dev/null"
    wird das letzte %s je nach Fall durch "*.rec" oder "*.del" ersetzt. Man sollte also, wenn VDR nach "*.del" sucht nicht den Datenbank-Inhalt (mit den .rec) zurückgeben.
    :] (Da bin ich zuerst drauf reingefallen) *g*


    Das mit recext ist klar. Denn wenn der VDR keine Dateien mit *del bekommt, dann wird er wohl auch nichts löschen können.
    Ich hätte ihm bei jedem aufruf alle Daten mit *rec und *del gegeben. Hätte ich da probleme bekommen?
    Ich bin davon ausgegangen, dass er immer nur die del Dateien löscht. Löscht er etwa alles was er mit dem Befehl find (mit *del) findet?

    Quote


    Du meinst DELETECMD? Das gibt es normal gar nicht, VDR ruft nichts externes auf beim löschen... Oder habe ich etwas übersehen?


    Ja ich habe DELETECMD gemeint.
    Wenn ich dir richtig verstehe, dann sind die Funktionen, die du hier gepostest hast eigentlich ein Patch? Und sind ursprünglich nicht im VDR enthalten, oder?

    Gruß
    matrix79

  • Ich habe oben noch ein paar Fehler im Code behoben und gekennzeichet was ich in den beiden Funktionen hinzugefügt habe. Ich muss aber gestehen das ich noch nicht getestet habe ob das Löschen auch funktioniert wenn der VDR Aufnahmen von sich aus löscht, also wenn die lifetime abgelaufen ist und der Plattenplatz eng wird. Ich habe dir lifetime immer auf 99.

    Mike

    VDR1: Gigabyte GA-M720-US3 (nVidia Corporation MCP78S [GeForce 8200]), Athlon II X2 240, 2GB RAM, Intel 82574L Gigabit, Debian Squeeze, Kernel 2.6.38.3 mit linux-media.tar.bz2 vom 20.04. 10:04, dvbhddevice fb6b1beedb72, VDR-1.7.22 (extension-Patch, 15 Plugins), epgsearch, extrecmenu, ...
    VDR2: Debian Etch, 2.6.21.3, K6-2 400, 192MB, NFS-Root, 466GiB über NFS, 1xNexus 2.1, 1xNova S, VDR-1.4.7
    Server: Debian Squeeze, 2.6.35.7, AMD X2 240e, 4GB, System: Raid1 2x500GB, Aufnahmen: Raid5 4TB + 1x 500GB, 1000MBit LAN
    Episodenlisten für epgsearch, VDRSeriesTimer

  • Hallo,

    da auf meinem VDR kein Webserver läuft, habe ich mal ein shell Skript zusammen gestellt, was genau das macht, was das php Skript von vejoun macht.

    So sieht das Skript aus:

    Dieses Skript beim starten vom VDR als Option -r angeben.

    Und das Skript im gepatchten C Code wie folgt angeben:
    (recording.c)

    Code
    #define FINDCMD      "/usr/bin/skript.sh %s %s %s 2> /dev/null"


    (videodir.c)

    Code
    #define DELETECMD "skript.sh %s '%s'"


    Mit folgender MySql Datenbank Tabelle habe ich es getestet:

    Code
    CREATE TABLE vdr (
      id_vdr tinyint(4) NOT NULL auto_increment,
      records char(255) NOT NULL default '',
      PRIMARY KEY  (id_vdr),
      UNIQUE KEY records (records)
    ) TYPE=MyISAM;


    Gruß
    matrix79

    Edited 2 times, last by matrix79 (March 3, 2004 at 11:07 PM).

  • Wow, das ist schön kurz, dann kann ich ja jetzt meine überlangen Scripte entsorgen und dein Shell-Script nutzen :] Danke. ;)

    Hast Du das mal getestet? Wird es bei Dir deutlich schneller? Ich merke vor allem beim Schneiden etc. Es macht sich aber bestimmt noch stärker bemerkbar wenn video0 auf NFS liegt.

    Mike

    VDR1: Gigabyte GA-M720-US3 (nVidia Corporation MCP78S [GeForce 8200]), Athlon II X2 240, 2GB RAM, Intel 82574L Gigabit, Debian Squeeze, Kernel 2.6.38.3 mit linux-media.tar.bz2 vom 20.04. 10:04, dvbhddevice fb6b1beedb72, VDR-1.7.22 (extension-Patch, 15 Plugins), epgsearch, extrecmenu, ...
    VDR2: Debian Etch, 2.6.21.3, K6-2 400, 192MB, NFS-Root, 466GiB über NFS, 1xNexus 2.1, 1xNova S, VDR-1.4.7
    Server: Debian Squeeze, 2.6.35.7, AMD X2 240e, 4GB, System: Raid1 2x500GB, Aufnahmen: Raid5 4TB + 1x 500GB, 1000MBit LAN
    Episodenlisten für epgsearch, VDRSeriesTimer

  • Halllo matrix79 und vejoun,

    das ging ja schnell mit eurer Einarbeitung der Datenbank ... :)

    ich werde es gleich heute Abend mal auf meinem VDR probieren.

    Hardy

    Suche: 6 Richtige für die nächste Lottoziehung
    PS: Wer Rechtschreibfehler findet, darf sie behalten!

Participate now!

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