#!/bin/bin/bash########################################################################################################
#ipc3hour.sh Kamera IPC3, Igelhaus, Aufnahme vom Innenbereich
# Sammelt die jeweils in der vergangenen Stunde aufgelaufenen Videodateien ein,
# ändert die Dateinamen und fügt sie zu einem Video zusammen.
# Diese können nach Ablauf des Tages zu einem Tagesvideo zusammngefaßt werden.
# Neuer Kameratyp (Oktober 2021) dahua DH-IPC-K42AP
# Script wird jede Stunde zur 5. Minute mittels Crontab gestartet.
# Änderungen an der Verzeichnisstruktur Januar 2022
# Erweiterung um den Versand auf den Webserver im Februar 2022, SFTP
# Änderung der Ausgabedatei für den Webserver auf Dateinamen V640480.mp4 16.02.2022
# Änderungen an den Logdateien: 14.03.2022
# Umstrukturierung der Rechnerumgebung: Programmumzug auf den Raspberry DENDROBATES von AGALCHYNIS
# 18.03.2022 leichte Korrekturen zur Anpassung der Logfiles
# 21.03.2022 Erweiterte Korrekturen der Logfiles, Umsetzung des Programms auf AGALCHYNIS (IPC5)
# 22.03.2022 Überarbeitung des sftp-Zuganges zur Telekom
# 23.05.2022 Anpassung an die (vorübergehend) am Eingang des Igelhauses angebrachte Kamera
# 24.05.2022 Verteilung auf anderen Rehner zur Sicherung
# 24.05.2022 Einbindung ESCULENTA als Fileserver IPC2, IPC3, IPC4, IPC5 gegen MANTELLA
# 07.06.2022 Erneute Änderung des Scripts wegen Wegfall des Servers Osteopilus
#######################################################################################################
# Variabeln
# Allgemein
# Vorsicht, diese Variable hat je nach Kameratyp einen anderen Wert
videoname="-Igelhaus" # Videoname als Anhamg zu den Zeitdaten der mp4-Datei
camname="IPC3" # Kameraname im Heimnetzwerk
today=$(date '+%d-%m-%Y')
videodetail=$(date '+%d%m%Y') # War entworfen für die bessere Sortierbarkeit
under="_"
yesterday=$(date -d "yesterday" '+%d-%m-%Y')
actualhour=$(date '+%H')
recactualhour=$( date '+%F_%H_%M_%S' )
starttime=$( date '+%F_%H:%M:%S' )
startscript=$( date '+%s' )
camsafedir="dav" # Auch dies ist eine Vorgabe bei Kameras des Herstellers DAHUA uns Replikas wie Blaupunkt etc.
sep="/" #Trennen der Verzeichnisse
texthour="hour" # Erweiterung der Stunde mit der Endung hour (von der Kamera vorgegeben)
lasthour=$(date -d "-1 hours" '+%H')
recdateyesterday=$(date -d "yesterday" '+%Y-%m-%d') # Die Aufzeichnungen wurden von 23-24 Uhr des Vortages erzeugt
recdateactual=$(date '+%Y-%m-%d') # Aktueller Tag
yesterday=$(date -d "yesterday" '+%d-%m-%Y')
actualhour=$(date '+%H')
recactualhour=$( date '+%F_%H_%M_%S' )
starttime=$( date '+%F_%H:%M:%S' )
TOTALSTART=$( date '+%s' )
homeshare="/home/pi/Share/NAS1/Igel/Igel1/Innenbereich"
webshare="public_html/IPC/Ige11/Innenbereich"
extmp4=".mp4"
# Letzte Stunde muß von OKTAL auf STRING gewandelt werden
lasthour=$(date -d "-1 hours" '+%H')
# Parameter lasthour für die vergangene Stunde nur zum Testen ändern, Format "00"
#lasthour="13"
longlast="AAAA"$lasthour
echo "Das Program bereitet den Start vor!"
echo "Stundenstring, alt: "$longlast
newlast="${longlast:4:7}"
echo "Stundenstring, neu: "$newlast
lasthour=$newlast
# Das Haupverzeichnis ist ein Network File System auf dem Server esculenta
maindir="/home/pi/Share/esculenta/Igel/Igel1"$sep$camname # Das Hauptverzeichnis für die Kamera, steht im Igelhaus im Innenbereich
#sudo chown -R pi:users $maindir
# Log-Dateien
logname=$lasthour"-"$actualhour$videoname".txt"
logfiles="logfiles"
logdir=$maindir
logname=$maindir$sep$logname
# Setze die Vergleichsstunden
echo "Programmstart: "$actualhour > $logname
# Prüfe ob das Verzeichnis korrekt montiert ist
if [ -d "$maindir" ]; then
sudo echo "Hauptverzeichnis existiert, Bearbeitung wird fortgesetzt." >> $logname
else
sudo echo "Hauptverzeichnis existiert nicht, Programm wird beendet." > Fehler.txt
exit 0
fi
# Vorsicht, diese Variable hat je nach Kameratyp einen anderen Wert
today=$(date '+%d-%m-%Y')
under="_"
yesterday=$(date -d "yesterday" '+%d-%m-%Y')
actualhour=$(date '+%H')
actualtime=$(date '+%F_%H:%M:%S' )
recactualhour=$( date '+%F_%H_%M_%S' )
starttime=$( date '+%F_%H:%M:%S' )
startscript=$( date '+%s' )
camsafedir="dav" # Auch dies ist eine Vorgabe bei Kameras des Herstellers DAHUA uns Replikas wie Blaupunkt etc.
sep="/" # Trennen der Verzeichnisse
texthour="hour" # Erweiterung der Stunde mit der Endung hour (von der Kamera vorgegeben)
rechour=$( date '+%F_%H:%M:%S' ) # Aufnahmezeit
# Den Parameter für manuellen Start für Aufnahme des Vortages von 23 - 24 Uhr festlegen
# Auch diesen Parameter nur zum Testen ändern
sav=".sav"
extmp4=".mp4"
extmkv=".mkv"
camsafedir="dav" # Dies ist eine Vorgabe bei Kameras des Herstellers DAHUA und Replikas wie Blaupunkt etc.
camcopydir="HOURCOPY"
camdaydir="DAYCOPY"
mp4hour=$videodetail$videoname # Das ist der Name der Videodatei mit Datum, aber noch ohne Zeitraum und Endung
echo "Das Script zur Erzeugung der Videozusammenfassung wurde um "$starttime" gestartet!" > $logname
echo "Ich werde die Daten zur Stunde: "$lasthour" verarbeiten!" >> $logname
echo "Die Videodatei wird folgenden Namen tragen: "$mp4hour >> $logname
# Falls die letzte Stunde 23 lautet wird in das Vortagesverzeichnis gewechselt
if [[ $lasthour = "23" ]] ;then
camworkdir=$maindir$sep$recdateyesterday$sep$lasthour$texthour$sep$camsafedir
echo "Arbeitsverzeichnis liegt im Vortag: "$camworkdir >> $logname
echo "Stundenvideo des Tages: "$recdateyesterday" zur Stunde "$lasthour" Uhr wird um "$recactualhour" erzeugt!" >> $logname
else
camworkdir=$maindir$sep$recdateactual$sep$lasthour$texthour$sep$camsafedir
echo "Arbeitsverzeichnis liegt im aktuellen Tag: "$camworkdir >> $logname
echo "Stundenvideo des Tages: "$recdateactual" zur Stunde "$lasthour" Uhr wird um "$rechour" erzeugt!" >> $logname
fi
# Setze die Zugriffsrechte auf pi:users
#sudo chown -R pi:users $maindir $logdir $camworkdir
# Setze die Variable für die Speicherung auf dem Webserver für die jeweilige Stundehourdir=""
if [[ $lasthour = "00" ]] ;then
hourdir="00-01"
elif [[ $lasthour = "01" ]] ;then
hourdir="01-02"
elif [[ $lasthour = "02" ]] ;then
hourdir="02-03"
elif [[ $lasthour = "03" ]] ;then
hourdir="03-04"
elif [[ $lasthour = "04" ]] ;then
hourdir="04-05"
elif [[ $lasthour = "05" ]] ;then
hourdir="05-06"
elif [[ $lasthour = "06" ]] ;then
hourdir="06-07"
elif [[ $lasthour = "07" ]] ;then
hourdir="07-08"
elif [[ $lasthour = "08" ]] ;then
hourdir="08-09"
elif [[ $lasthour = "09" ]] ;then
hourdir="09-10"
elif [[ $lasthour = "10" ]] ;then
hourdir="10-11"
elif [[ $lasthour = "11" ]] ;then
hourdir="11-12"
elif [[ $lasthour = "12" ]] ;then
hourdir="12-13"
elif [[ $lasthour = "13" ]] ;then
hourdir="13-14"
elif [[ $lasthour = "14" ]] ;then
hourdir="14-15"
elif [[ $lasthour = "15" ]] ;then
hourdir="15-16"
elif [[ $lasthour = "16" ]] ;then
hourdir="16-17"
elif [[ $lasthour = "17" ]] ;then
hourdir="17-18"
elif [[ $lasthour = "18" ]] ;then
hourdir="18-19"
elif [[ $lasthour = "19" ]] ;then
hourdir="19-20"
elif [[ $lasthour = "20" ]] ;then
hourdir="20-21"
elif [[ $lasthour = "21" ]] ;then
hourdir="21-22"
elif [[ $lasthour = "22" ]] ;then
hourdir="22-23"
elif [[ $lasthour = "23" ]] ;then
hourdir="23-00"
else hourdir="XX"
fi
# Prüfe zuerst, ob das Stundenverzeichnis existiert, sonst wurden in der betreffenden Stunde gar keine Bewegungen erkannt
# und somit auch keine MP4-Dateien erzeugt
# Protokolliere den Start
echo "Script wurde um: "$starttime" gestartet!" > $logname
echo "Das Protokoll wird in die Datei: "$logname" im Verzeichnis "$logdir" geschrieben!" >> $logname
echo "Arbeitsverzeichnis ist: "$camworkdir >> $logname
# Prüfe, ab das Verzeichnis für die Stundenaufnahme überhaupt existiert
if [ -d "$camworkdir" ]; then
echo "Arbeitsverzeichnis existiert, Bearbeitung wird fortgesetzt." >> $logname
else
echo "Arbeitsverzeichnis existiert nicht, Programm wird beendet." >> $logname
exit 0
fi
# Prüfe, ob das Verzeichnis für die MP4-Dateien der vergangenen Stunden existiert
# und lege es sonst neu an
if [ -d $camworkdir$sep$camcopydir ]
then
echo "Verzeichnis für zu bearbeitende MP4 der vergangenen Stunde ist bereits vorhanden." >> $logname
else
echo "Lege das Verzeichnis "$camworkdir$sep$camcopydir" zur Bearbeitung der MP-Dateien der vergangenen Stunde neu an!" >> $>
sudo mkdir $camworkdir$sep$camcopydir
fi
# Prüfe, ob das Verzeichnis für die Tageszusammenfassung der einzelnen MP-Dateien der Stunden existiert
if [ -d $camworkdir$sep$camdaydir ]
then
echo "Verzeichnis für die zu bearbeitenden MP4-Dateien des Tages ist bereits vorhanden." >> $logname
else
echo "Lege das Verzeichnis "$camworkdir$sep$camdaydir" zur Bearbeitung der MP-Dateien des Tages "$today" neu an!" >> $logna>
sudo mkdir $camworkdir$sep$camdaydir
fi
# Wechsele in das Arbeitsverzeichnis
cd $camworkdir$sep$copydir
# Lese Anzahl der vorhandenen Videos aus
total="`ls *.mp4 | wc -l`"
echo "Anzahl vorhandener Videos für den Zeitraum "$hourdir": "$total >> $logname
# Lese alle vorhandenen Videos in einer Schleife und benenne sie um
# Lösche Index-Dateien
rm *.idx
i="0"
counter="1"
for i in *.mp4; do
oldname=$i
echo "Zähler: "$counter
echo "Alter Name: "$oldname
newname=$counter$extmp4
echo "NeuerName: "$newname
# Kopiere die umbenannten Dateien in das Berarbeitungsverzeichnis
sudo cp $oldname $camworkdir$sep$camcopydir$sep$newname
echo "Datei Nummer: "$counter" wird angelegt: "$camworkdir$sep$camcopydir$sep$newname >> $logname
((counter=counter+1))
# Prüfe, ob die Datei im Arbeitsvereichnis korrekt angelegt/kopiert wurde,
# in diesem Fall können die vorhandenen IDX-Dateien und MP4-Dateien gelöscht werden
# Sollten die umbenannten Datein nicht kopiert worden sein, wirde die Verarbeitung abgebrochen
if [ -f $camworkdir$sep$camcopydir$sep$newname ]
then
echo "Die zu verarbeitende Datei: "$newname" wurde ín das Arbeitsverzeichnis "$camworkdir$sep$camcopydir" kopiert!" >
else
echo "FEHLER !!! Die MP4-Datei "$newname" wurde nicht in das Arbeitsverzeichnis "$camworkdir$sep$camcopydir"kopiert!>
echo "Beende das Programm!" >> $logname
exit 0
fi
done
# Wechsele in das Verzeichnis der umbenannten Dateien der jeweiligen Stunde
cd $camworkdir$sep$camcopydir
# Füge die MP4-Dateien der vergangenen Stunde zu einer Datei zusammen
# Erweitere den Videonamen um den Zeitraum und die Dateiendung
mp4hour=$mp4hour"-"$hourdir$extmp4
echo "Dieses Video wird aus den einzelnen Videos zusammengefügt: " $mp4hour >> $logname
for f in *.mp4 ; do echo file \'$f\' >> mp4list.txt;
done
# Sortiere die erzeugte Liste in ein für ffmpeg mit concatenate gültiges Format absolut aufsteigend
sort -n -k1.7,1.8 mp4list.txt > sorted.txt
# Nun beginnt die Zusammensetzung der einzelnen MP4-Dateien zu einem Stundenvideo
echo "Erzeuge MP4-Datei: "$mp4hour >> $logname
startmp4=$( date '+%s' )
ffmpeg -safe 0 -f concat -i sorted.txt -c copy $hourdir$extmp4
stopmp4=$( date '+%s' )
secmp4=`echo "$stopmp4-$startmp4" |bc`
echo "Erzeugungsdauer: "$hourdir$extmp4"in Sekunden: "$secmp4 >> $logname
# Verkleinere die DateiGröße
echo "Verkleinere das Format von: "$hourdir$extmp4" auf 640x480 Pixel in die Datei "$mp4hour >>$logname
startmkv=$( date '+%s' )
ffmpeg -i $hourdir$extmp4 -vf "scale='min(640,iw)':'min(480,ih)'" $mp4hour
#ffmpeg -i $hourdir$extmp4 -s 640x480 -b 512k -async 50 -acodec libmp3lame -ar 11025 -ab 16k $videoname$hourdir$extmkv
stopmkv=$( date '+%s' )
secmkv=`echo "$stopmkv-$startmkv" |bc`
echo "Konvertierungsdauer von "$hourdir$extmp4" zu "$mp4hour" in Sekunden: "$secmkv >> $logname
# Schreibe Daten des Speicherverzeichnisses für die Logdatei
df -h . > dirmp4.txt
dirmp4='dirmp4.txt'
nummer=1
while read zeile[nummer]
do
echo "$nummer. Zeile: ${zeile[nummer]}"
nummer=$((nummer+1))
done < "$dirmp4"
echo "${zeile[2]}" > dateisystem.txt
# Datei mit der zweiten Zeile einlesen und Zeichenkette zerlegen
IFS=" "
read zeile < dateisystem.txt
echo "Zeile: "$zeile
set " " $zeile
echo "$1 $2 $3 $4 $5 $6 $7 $8"
dateisystem=$2
groesse=$3
benutzt=$4
verfuegbar=$5
verwendet=$6
arbeitsverzeichnis=$7
echo "Dateisystem: "$dateisystem >> $logname
echo "Größe: "$groesse >> $logname
echo "Benutzt: "$benutzt >> $logname
echo "Verfügbar: "$verfuegbar >> $logname
echo "Verwendet: "$verwendet >> $logname
echo "Arbeitsverzeichnis: "$arbeitsverzeichnis >> $logname
# Verschiebe die Datei für die Bearbeitung als Tagesvideo in das Tagesverzeichnis
# Aktualisiere den Zeitpunkt der Erzeugung des Videos
rechour=$( date '+%F_%H:%M:%S' )
echo "Das Video "$mp4hour" wurde um "$rechour" erzeugt!" >> $logname
mv $hourdir$extmp4 $camworkdir$sep$camdaydir
# Prüfe, ob das Verzeichnis für die Tageszusammenfassung der einzelnen MP-Datei der vergangenen Stunde existiert,
# wenn nicht hat keine Verarbeitung stattgefunden und die weitere Verarbeitung ist sinnlos
if [ -f $camworkdir$sep$camdaydir$sep$hourdir$extmp4 ]
then
echo "Die MP4-Datei: "$hourdir$extmp4" wurde ín das Tagesverzeichnis "$camdaydir" kopiert!" >> $logname
else
echo "FEHLER !!! Die MP4-Datei "$hourdir$extmp4" wurde nicht in das Tagesverzeichnis "$camdaydir"kopiert!" >> $logname
echo "Hier liegt ein Problem vor. Bitte prüfen!" >> $logname
#exit 0
fi
# Protokolldatei
stopscript=$( date '+%s' )
starttime=$startscript
stoptime=$stopscript
secs=`echo "$stoptime-$starttime" |bc`
echo "Laufzeit bisher in Sekunden: "$secs >> $logname
tage=$(($secs/86400))
stunden=$(($secs%86400/3600))
minuten=$(($secs%3600/60))
sekunden=$(($secs%60))
echo "Programmlaufzeit: "$tage" Tage, "$stunden" Stunden, "$minuten" Minuten und "$sekunden" Sekunden." >> $logname
# Lösche nun die verarbeiteten Dateien im Tagesverzeichnis, die erzeugte Zusammenfassung wird danach umbenannt
cd $camworkdir$sep$camcopydir
echo "Ich verarbeite die Datei: "$mp4hour >> $logname
# Lese die Eigenschaften der erzeugten Videodatei (MP4) ein und gebe Laufzeit und Größe aus
mediainfo $mp4hour --Logfile=mp4.txt
datmp4='mp4.txt'
# Lese die Eckdaten der MP4-Datei ein
nummer=1
while read zeile[nummer]
do
# echo "$nummer. Zeile: ${zeile[nummer]}"
nummer=$((nummer+1))
done < "$datmp4"
echo "Dateigröße: "${zeile[6]}
echo "${zeile[6]}" > dateigroesse.txt
echo "Videolaufzeit: "${zeile[7]}
echo "${zeile[7]}" > videolaufzeit.txt
# Dateigröße einlesen und Zeichenkette zerlegen
IFS=" "
read zeile < dateigroesse.txt
ifs=" "
set " " $zeile
dateigroesse=$5
mb=$6
echo "Dateigröße: "$dateigroesse" "$mb >> $logname
# Laufzeit einlesen und Zeichenkette zerlegen
IFS=" "
read zeile < videolaufzeit.txt
set " " $zeile
dauermin=$4
echo "Minuten: "$dauermin
dauersec=$6
echo "Sekunden: "$dauersec
echo "Videolaufzeit: "$dauermin" Minuten und "$dauersec" Sekunden" >> $logname
# Übertragung auf den Webserver
echo "Folgende Dateien sollen übertragen werden: "$mp4hour
startftp=$( date '+%s' )
echo "Verbindungsaufbau mit hosting.telekom.de um "$actualtime >> $logname
echo "Verbindungsaufbau mit hosting.telekom.de um "$actualtime
echo "Das Stundenverzeichnis lautet: /home/www/public_html/IPC/Igel1/"$hourdir >>$logname
if [ -f $camworkdir$sep$camdaydir$sep$hourdir$extmp4 ]
then
echo "Die MP4-Datei: "$hourdir$extmp4" liegt im Tagesverzeichnis "$camdaydir
else
echo "Es liegt ein Problem vor!"
fi
if [ -f $mp4hour ]
then
echo "Die MP4-Datei: "$mp4hour" liegt im Stundenverzeichnisverzeichnis "$maindir"/"$HOURCOPY >>$logname
else
echo "Es liegt ein Problem mit der Datei "$mp4hour" vor!" >>$logname
fi
export SSHPASS=DAS FTP-Passwort
sshpass -e sftp -oBatchMode=no -b - admin@commentum.de@hosting.telekom.de<< !
cd public_html/IPC/Igel1/Innenbereich
pwd
ls
put $mp4hour
bye
!
stopftp=$( date '+%s' )
secftp=`echo "$stopftp-$startftp" |bc`
echo "Übertragungsdauer in Sekunden: "$secftp >> $logname
# Verschiebe die Stundendatei zum Homeserver
mv $mp4hour $homeshare
# Prüfe ob Kopie werfolgreich war, dann können verarbeitete MP$ gelöscht werden
cd $homeshare
if [ -f ]
then
echo "Die zu verarbeitende Datei "$mp4hour" wurde in das Verzeichnis "$homeshare" übertragen !" >> $logname
echo "Die verbliebenen MP4-Dateien werden gelöscht!" >> $logname
#rm *.mp4
else
echo "Die zu verarbeitende Datei "$mp4hour" wurde nicht verschoben!" >> $logname
echo "Bitte den Programmstatus prüfen!" >> $logname
fi
cd $camworkdir
# Lösche nun die bereits verabeiteten MP4
#rm *.mp4
# Protokolldatei der gesamten Laufzeit
TOTALSTOP=$( date '+%s' )
echo "Startscript: "$TOTALSTART >> $logname
echo "Stopscript: "$TOTALSTOP >> $logname
starttime=$TOTALSTART
stoptime=$TOTALSTOP
secs=`echo "$stoptime-$starttime" |bc`
tage=$(($secs/86400))
echo "Tage: "$tage >> $logname
stunden=$(($secs%86400/3600))
echo "Stunden: "$stunden >> $logname
minuten=$(($secs%3600/60))
echo "Minuten: " $minuten >> $logname
sekunden=$(($secs%60))
echo "Sekunden: "$sekunden >> $logname
echo "Programmlaufzeit insgesamt: "$tage" Tage, "$stunden" Stunden "$minuten" Minuten und "$sekunden" Sekunden." >> $logname