Files
sumsel/sumsel.sh

203 lines
3.9 KiB
Bash
Executable File

#!/bin/bash
VERSION="0.3"
LOCK_DIR=/var/lock
SIM_EXAMPLE_FILE=./res/test.wav
#Laenge der WAV Dateien in Sekunden
REC_FILE_TIME=360
#Ordner, ind dem die WAV Dateien abgelegt werden
#wenn der Ordner nicht existiert, wird er angelegt
REC_DIR=./recordings
#Dateiname der WAV Dateien
# sums-01.wav, sums-02.wav, ...
REC_PREFIX=sums
#Ordner in dem die MP3 Dateien abgelegt werden
#wenn der Ordner nicht existiert, wird er angelegt
UPL_DIR=./upqueue
#Dateiname der MP3 Dateien
# 20210130101112-sumsi.mp3, 20210130101120-sumsi.mp3, ...
UPL_SUFFIX=sumsi
usage() {
echo "Usage: $0 [-h] (-s|-r|-t) [-C <configfile>]" 1>&2;
echo -e '\t-h Usage' 1>&2;
echo -e '\t-v Version' 1>&2;
echo -e '' 1>&2;
echo -e '\t-s Simulation' 1>&2;
echo -e '\t-r Aufnahme' 1>&2;
echo -e '\t-c Konvertierung' 1>&2;
echo -e '' 1>&2;
echo -e '\t-C <configfile> Konfiguration laden' 1>&2;
echo "" 1>&2;
echo "Doku: https://git.hs42.de/hs/sumsel" 1>&2;
exit 1;
}
mode=''
lock_mode=''
while getopts ":hsrcC:v" options;
do
case "${options}" in
v)
echo "$0 version ${VERSION}" 1>&2;
exit 1
;;
h)
usage
;;
"s" | "r" | "c") #simulate
mode=${options}
;;
C)
config=${OPTARG}
if [ -f ${config} ]; then
. ${config}
else
echo "config file not found: ${config}"
exit
fi
;;
*)
echo "unknown option"
usage
;;
esac
done
set_lockfile() {
local basename=$(basename "$0")
if [ ! -z ${1+x} ]; then
basename="${basename}_$1"
fi
local lock_file="${LOCK_DIR}/${basename}"
local random_file=$(mktemp --tmpdir=${LOCK_DIR})
echo $$ > ${random_file}
mv -n ${random_file} ${lock_file}
if [ -e ${random_file} ]; then
false
else
true
fi
}
del_lockfile() {
local basename=$(basename "$0")
if [ ! -z ${1+x} ]; then
basename="${basename}_$1"
fi
local lock_file="${LOCK_DIR}/${basename}"
rm ${lock_file}
}
cleanup() {
del_lockfile ${lock_mode}
exit 1
}
check_var_exists() {
local var_name=$1
if [[ ! -v ${var_name} ]]; then
echo "${var_name} not set"
cleanup
fi
}
ctrl_c() {
echo "** Trapped CTRL-C" 1>&2;
cleanup
}
simulate() {
check_var_exists "REC_DIR"
check_var_exists "REC_PREFIX"
check_var_exists "SIM_EXAMPLE_FILE"
local counter=0
local dst_fn=""
mkdir -p ${REC_DIR}
echo "Press [CTRL+C] to stop.." 1>&2;
trap ctrl_c INT
while :
do
sleep ${REC_FILE_TIME}
counter=$[$counter +1]
dst_fn="${REC_DIR}/${REC_PREFIX}-${counter}.wav"
cp ${SIM_EXAMPLE_FILE} ${dst_fn}
done
}
record() {
check_var_exists "REC_DEVICE"
check_var_exists "REC_FILE_TIME"
check_var_exists "REC_PREFIX"
check_var_exists "REC_DIR"
mkdir -p ${REC_DIR}
trap ctrl_c INT
arecord --format=cd --device=${REC_DEVICE} --buffer-size=192000 --max-file-time=${REC_FILE_TIME} --use-strftime ${REC_DIR}/${REC_PREFIX}%Y%m%d%H%M%v.wav
}
convert() {
check_var_exists "REC_DIR"
check_var_exists "UPL_DIR"
check_var_exists "UPL_SUFFIX"
check_var_exists "REMOTE_DIR"
mkdir -p ${REC_DIR}
mkdir -p ${UPL_DIR}
#Alle WAV Files ausser das letzte File.
#Das letzte File wird gerade recorded und wird beim naechsten Durchlauf verarbeitet
local FILES=$(ls -tr ${REC_DIR} |head -n -1)
for F in ${FILES}
do
#Ermittle ctime des WAV Files
local CTIME=$(date -r "${REC_DIR}/${F}" +"%Y%m%d%H%M%S")
ffmpeg -i "${REC_DIR}/${F}" -acodec mp3 "${UPL_DIR}/${CTIME}_${UPL_SUFFIX}.mp3"
rm "${REC_DIR}/${F}"
done
rsync -avzh --remove-source-files ${UPL_DIR} ${REMOTE_DIR}
}
case ${mode} in
s) #Simulation
lock_mode=record
func=simulate
;;
r) #Aufnahme
lock_mode=record
func=record
;;
c) #Konvertierung
lock_mode=convert
func=convert
;;
*)
echo "mode not set" 1>&2;
exit 1
;;
esac
if set_lockfile ${lock_mode}; then
${func}
del_lockfile ${lock_mode}
else
echo "LOCK error" 1>&2;
exit 1
fi