134 lines
3.7 KiB
Bash
Executable File
134 lines
3.7 KiB
Bash
Executable File
#! /usr/bin/env bash
|
|
# Compress wav to flac and archive them as zip
|
|
|
|
# Requires: tar, gzip, ffmpeg
|
|
|
|
set -e
|
|
|
|
DEBUG=${DEBUG:-0}
|
|
debug() {
|
|
[[ $DEBUG -eq 1 ]] && echo "$@"
|
|
}
|
|
error() {
|
|
echo 1>&2 "$@"
|
|
}
|
|
|
|
audio_compress() {
|
|
local filepath
|
|
filepath="$1"
|
|
if [[ "$DRY" -eq 1 ]]; then
|
|
debug "Would compress $filepath to flac"
|
|
return 0
|
|
else
|
|
debug "Compressing $filepath"
|
|
ffmpeg -i "$filepath" -acodec flac -compression_level 10 "${filepath%.wav}.flac"
|
|
fi
|
|
}
|
|
|
|
all_audio_compress() {
|
|
local dir
|
|
dir="$1"
|
|
debug "Compressing all .wav audio in $dir"
|
|
for filepath in "$dir"/*.wav; do
|
|
if [[ "$DRY" -eq 1 ]]; then
|
|
debug "Would convert $filepath to flac and remove it"
|
|
else
|
|
audio_compress "$filepath"
|
|
debug "Removing $filepath"
|
|
rm "$filepath"
|
|
fi
|
|
done
|
|
}
|
|
|
|
record_datetime() {
|
|
source_wav=$1
|
|
source_base=$(basename "$source_wav" ".wav")
|
|
record_date=$(echo "$source_base" | cut -d"_" -f2)
|
|
record_time=$(echo "$source_base" | cut -d"_" -f3)
|
|
YYYY=$(echo "$record_date" | cut -c 1-4)
|
|
MM=$(echo "$record_date" | cut -c 5-6)
|
|
DD=$(echo "$record_date" | cut -c 7-8)
|
|
HH=$(echo "$record_time" | cut -c 1-2)
|
|
MI=$(echo "$record_time" | cut -c 3-4)
|
|
SS=$(echo "$record_time" | cut -c 5-6)
|
|
SSS="000"
|
|
date="$YYYY-$MM-$DD $HH:$MI:$SS.$SSS"
|
|
echo "$date"
|
|
}
|
|
|
|
source_wav() {
|
|
model_output_dir="$1"
|
|
wav=$(basename "$model_output_dir" | rev | cut --complement -d"." -f1 | rev)
|
|
echo "$wav"
|
|
}
|
|
|
|
birdnet_archive_older_than() {
|
|
local days
|
|
days="$1"
|
|
local date
|
|
date=$(date +"%Y-%m-%d")
|
|
local date_pivot
|
|
date_pivot=$(date -d "$date + $days days" +"%Y-%m-%d")
|
|
move_records_to_archive "$date_pivot"
|
|
zip_archives
|
|
}
|
|
|
|
move_records_to_archive() {
|
|
local date
|
|
date="$1"
|
|
local archives_dir
|
|
archives_dir="$2"
|
|
archive_path="${ARCHIVE_DIR}/$date"
|
|
debug "Moving records from $CHUNK_FOLDER/out to $archives_path"
|
|
for filepath in $(find "$CHUNK_FOLDER/out/" -name '*.wav.d'); do
|
|
wav=$(source_wav "$filepath")
|
|
dir=$(dirname "$filepath")
|
|
record_datetime=$(record_datetime "$wav")
|
|
if [[ "$record_datetime" == "$date" ]]; then
|
|
debug "Moving $filepath to $archive_path"
|
|
if [[ ! -d "$archive_path" ]]; then
|
|
mkdir -p "$archive_path"
|
|
fi
|
|
mv "$filepath" "$archive_path"
|
|
debug "Moving model output directory to archive"
|
|
mv "$dir" "$archive_path/"
|
|
debug "Moving wav to archive"
|
|
mv "$CHUNK_FOLDER/out/$wav" "$archive_path/"
|
|
fi
|
|
done
|
|
}
|
|
|
|
zip_archives() {
|
|
debug "Zipping archives in ${ARCHIVE_DIR}"
|
|
for archive_path in $(find "${ARCHIVE_DIR}" -type d); do
|
|
archive_name="birdnet_$(basename "$archive_path" | tr '-' '').tar.gz"
|
|
if [[ "$DRY" -eq 1 ]]; then
|
|
debug "Would zip $archive_path to $archive_name"
|
|
else
|
|
debug "Zipping $archive_path to $archive_name"
|
|
tar -czf "$archive_name" -C "$archive_path" .
|
|
debug "Removing temporary archive folder in ${ARCHIVE_DIR}"
|
|
rm -rf "$archive_path"
|
|
fi
|
|
done
|
|
}
|
|
|
|
main() {
|
|
config_filepath="./config/birdnet.conf"
|
|
[ -f "$config_filepath" ] || {
|
|
error "Config file not found: $config_filepath"
|
|
exit 1
|
|
}
|
|
source "$config_filepath"
|
|
if [[ -z "CHUNK_FOLDER" ]]; then
|
|
error "CHUNK_FOLDER not set in config file"
|
|
exit 1
|
|
fi
|
|
if [[ -z "ARCHIVE_FOLDER" ]]; then
|
|
error "ARCHIVE_FOLDER not set in config file"
|
|
exit 1
|
|
fi
|
|
debug "Launch birdnet archive script from $CHUNK_FOLDER to $ARCHIVE_FOLDER"
|
|
birdnet_archive_older_than $DAYS_TO_KEEP
|
|
}
|