mit Perl-Skript auf die SD-Karte zugreifen
Hallo zusammen,
auf einem BananaPi (Raspberry sollte genauso gehen, ebenso alle Linux-Rechner und vermutlich auch Mac’s) nun eine Lösung gebastelt, bei der die Videos von der SD-Karte abgeholt werden.
Die Daten werden dann lokal (oder auf ein gemountetes Verzeichnis auf einem entfernten Rechner) abgelegt. Das Ganze habe ich in Perl (Version größer 5.10) geschrieben.
Wenn man das unter Windows nutzen will, muss man ggf. die direkten Betriebssystemkommandos (z.B. grep) anders lösen. Auch nutzt das Skript cURL und wget. Das kann Windows nur mit Zusatzsoftware.
Das Skript macht folgendes:
Es guckt für den aktuellen Tag auf der SD-Karte nach, wie viele record00n-Verzeichnisse es gibt. Diese werden auf Links nach Dateien durchsucht. Anschließend werden alle Videos der aktuellen Stunde mit wget geladen, sofern sie nicht schon im Zielverzeichnis vorhanden sind.
Bei mir läuft das alle paar Minuten als Cron-Job.
Vielleicht kann der ein oder andere was damit anfangen.
Gruß Ralf
Der Code sieht beispielhaft so aus:
#!/usr/bin/perl -w
use strict;
use Time::Piece;
use Time::Seconds;
Script to get new videos from SD card of Instar Camera to local file system
created 2016 May 15
2016 May 17 added Time::Piece and Time::Seconds modules and changed time commands
Requires curl and wget being installed
########### do not edit above! ###############
my $hostname = „192.168.178.123:234/sd“;# enter your local IP adress and port here
my $user = „admin“; #enter your username here
my $pw = „instar“; #enter user password here
my $target = „/home/pi/instar/avi“; #enter your target directory here
########### do not edit below! ###############
variables:
my $numrecords; #number of record0* directories on SD card for today
my @moviedir; #array with record0* directories
my @avis; #videos taken
my $movienum; #number of videos recorded
my $filename; #video filename
my $i; #counter
#getting current time and date
my $now = Time::Piece->new;
my $datestring = $now->strftime(’%Y%m%d’); #eg 20160517 for 17 May 2016
my $hourstring = $now->strftime(’%y%m%d_%H’); #to get files with string 160517_15 eg. on 17 May 2016 15:nn h
#counting number of „record“ drectories at current day
$numrecords = curl -s -u $user:$pw $hostname/$datestring/ | grep -c record
;chomp $numrecords;
#debug
#print STDOUT "number of record directories is $numrecords
";
#creating directory name of movies
$numrecords–;
for $i(0…$numrecords) {
if ($i > 9) {push @moviedir, „record0$i“}
if ($i > 99) {push @moviedir, „record$i“}
else {push @moviedir, „record00$i“}
}
#debug
#debug foreach (@moviedir) {print STDOUT "$_
"}
#getting file names of all .avi files on the SD card today, indicated by links in the web side
foreach (@moviedir) {
#debug
#print STDOUT "curl -u $user:$pw http://$hostname/$datestring/$/ | grep -c avi
";
$movienum = curl -s -u $user:$pw http://$hostname/$datestring/$_/ | grep -c avi
; chomp $movienum;
#debug
#print STDOUT "There are $movienum videos in $
";
@avis = curl -s -u $user:$pw http://$hostname/$datestring/$_/ | grep avi
;
#debug
#foreach (@avis) {chomp; print STDOUT „$_
„}
foreach $filename(@avis) {
chomp $filename;
$filename =~ s/^<tr><td><a href=“/sd/$datestring/$_///;
$filename =~ s/“.//;
# only get filesnames that do not yet exist, that are ready (!~ 999999) and that are from current hour
if ((! -e „$target/$filename“) and ($filename !~ /999999/) and ($filename =~ m/$hourstring/)) {
#if ((! -e „$target/$filename“) and ($filename !~ /999999/)) {
#print STDOUT "copy $filename to $target/
";
wget -q -np -nd --user $user --password $pw --output-document $target/$filename http://$hostname/$datestring/$_/$filename
;
}
}
}