QuoteOriginal 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."
QuoteOriginal 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."
QuoteOriginal 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:
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!
QuoteOriginal von Saxman2k
Bistr-o-MathDas 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:
#include <stdio.h>
int main(int argc, char **argv) {
if (argc < 2)
return 1;
printf("%%%02X\n", argv[1][0]);
return 0;
}
Display More
kompillieren kann man's mit
Beispiel:
EDIT: PS: natuerlich muss dein php-Skript die Sequenzen zurueckumwandeln...
QuoteOriginal 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!
QuoteOriginal 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
QuoteOriginal 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:
#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
durch diese ersetzt:
Dabei ist db_test ein shell skript, was wie folgt aussieht:
#!/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:
duch diese ersetzen:
Dabei ist db_test ein Shell Skript was unter /usr/bin liegt.
diese sieht so aus:
Dann erstellt man sich eine Temp Datei z.B so:
Dann habe ich noch ein Skript was mir die Datenbank mit den jetzigen Einträgen füllt:
#!/bin/sh
z=1
anzahl=`wc -l db_test.tmp`
while [ $z -lt $anzahl];
do
eintrag=`cat db_test.tmp | head -n $z | tail -n 1`
echo "INSERT INTO vdr (records) VALUES ('$eintrag');" | mysql -u user -h host -p"passwort" datenbank
z=`expr $z + 1`
done
Display More
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:
#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:
#!/bin/bash
VIDEODIR="$2"
VIDEODIR="$(echo "$VIDEODIR" | sed -e "s/%/%25/")"
VIDEODIR="$(echo "$VIDEODIR" | sed -e "s/&/%26/")"
if [ "$1" == "before" -o "$1" == "edited" ]
then
wget -q -O - "http://herakles.zh.local/~vdr/video_db/video_simple.php?action=add&recording=$VIDEODIR" >/dev/null
logger videodb_store: add: "$2"
fi
if [ "$1" == "rename" ]
then
wget -q -O - "http://herakles.zh.local/~vdr/video_db/video_simple.php?action=$1&recording=$VIDEODIR" >/dev/null
logger videodb_store: rename: "$2"
fi
if [ "$1" == "remove" ]
then
wget -q -O - "http://herakles.zh.local/~vdr/video_db/video_simple.php?action=$1&recording=$VIDEODIR" >/dev/null
logger videodb_store: remove: "$2"
fi
Display More
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.
bool RenameVideoFile(const char *OldName, const char *NewName)
{
> char *cmd = NULL;
// Only the base video directory entry will be renamed, leaving the
// possible symlinks untouched. Going through all the symlinks and disks
// would be unnecessary work - maybe later...
if (rename(OldName, NewName) == -1) {
LOG_ERROR_STR(OldName);
return false;
}
> else {
> asprintf(&cmd, DELETECMD, "rename", OldName);
> FILE *p = popen(cmd, "r");
> free(cmd);
> }
return true;
}
bool RemoveVideoFile(const char *FileName)
{
> char *cmd = NULL;
> asprintf(&cmd, DELETECMD, "remove", FileName);
> FILE *p = popen(cmd, "r");
> free(cmd);
return RemoveFileOrDir(FileName, true);
}
Display More
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
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
QuoteOriginal 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)
Code Display Morebool RenameVideoFile(const char *OldName, const char *NewName) { char *cmd = NULL; // Only the base video directory entry will be renamed, leaving the // possible symlinks untouched. Going through all the symlinks and disks // would be unnecessary work - maybe later... if (rename(OldName, NewName) == -1) { LOG_ERROR_STR(OldName); return false; } else { asprintf(&cmd, DELETECMD, "rename", OldName); FILE *p = popen(cmd, "r"); free(cmd); } return true; } bool RemoveVideoFile(const char *FileName) { char *cmd = NULL; asprintf(&cmd, DELETECMD, "remove", FileName); FILE *p = popen(cmd, "r"); free(cmd); return RemoveFileOrDir(FileName, true); }
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*
QuoteMü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
QuoteOriginal 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
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:
#!/bin/sh
# Datenbankserver
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="vdr"
#################################################
function mysql_connect()
{
echo $1 | mysql -s -u$db_user -h$db_server -p$db_passwort $db_name
}
# Programm Anfang
if [ "$1" = "before" -o "$1" = "edited" ] ; then
mysql_connect "INSERT INTO $tab_name (records) VALUES ('$2');"
elif [ "$1" = "remove" ] ; then
mysql_connect "DELETE FROM $tab_name WHERE records='$2';"
elif [ "$1" = "rename" ] ; then
record_del=`echo $2 | sed -n 's/\(.*\).rec$/\1.del/p'
mysql_connect "UPDATE $tab_name SET records='$record_del' WHERE records='$2'";
else
videodir=$2
datei_endung=$3
if [ $datei_endung ] ; then
mysql_connect "SELECT records FROM ${tab_name} WHERE records REGEXP '.${datei_endung}$';"
fi
fi
exit 0
Display More
Dieses Skript beim starten vom VDR als Option -r angeben.
Und das Skript im gepatchten C Code wie folgt angeben:
(recording.c)
(videodir.c)
Mit folgender MySql Datenbank Tabelle habe ich es getestet:
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
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
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
Don’t have an account yet? Register yourself now and be a part of our community!