2024-12-27 09:41:13 +00:00
|
|
|
#!/usr/bin/env bash
|
|
|
|
# Copyright Ken Fallon - Released into the public domain. http://creativecommons.org/publicdomain/
|
|
|
|
#============================================================
|
2024-12-24 12:45:42 +00:00
|
|
|
|
|
|
|
#
|
|
|
|
# Copied from a 'history' file on archive.org and turned into a script
|
|
|
|
#
|
|
|
|
|
|
|
|
set -o nounset # Treat unset variables as an error
|
|
|
|
|
|
|
|
SCRIPT=${0##*/}
|
|
|
|
|
|
|
|
#=== FUNCTION ================================================================
|
|
|
|
# NAME: cleanup_temp
|
|
|
|
# DESCRIPTION: Cleanup temporary files in case of a keyboard interrupt
|
|
|
|
# (SIGINT) or a termination signal (SIGTERM) and at script
|
|
|
|
# exit
|
|
|
|
# PARAMETERS: * - names of temporary files to delete
|
|
|
|
# RETURNS: Nothing
|
|
|
|
#===============================================================================
|
|
|
|
function cleanup_temp {
|
|
|
|
for tmp in "$@"; do
|
|
|
|
[ -e "$tmp" ] && rm --force "$tmp"
|
|
|
|
done
|
|
|
|
exit 0
|
|
|
|
}
|
|
|
|
|
|
|
|
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
if [[ $# -eq 0 ]]; then
|
|
|
|
echo "Usage: $SCRIPT audio_file"
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
AUDIO="$1"
|
|
|
|
IMAGE="${AUDIO%.*}.png"
|
|
|
|
|
|
|
|
if [[ ! -e $AUDIO ]]; then
|
|
|
|
echo "$SCRIPT: audio file $AUDIO not found"
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
#
|
|
|
|
# Make a temporary file (called /tmp/XXXX.png) and set traps to delete them
|
|
|
|
#
|
|
|
|
TMP1=$(mktemp -p /tmp XXXXXXXX.png) || {
|
|
|
|
echo "$SCRIPT: creation of temporary file failed!"
|
|
|
|
exit 1
|
|
|
|
}
|
|
|
|
trap 'cleanup_temp $TMP1' SIGHUP SIGINT SIGPIPE SIGTERM EXIT
|
|
|
|
|
|
|
|
#
|
|
|
|
# Make a temporary PNG file from the audio. The original uses a 'timeout' call
|
|
|
|
# but I can't get it to work for me.
|
|
|
|
#
|
|
|
|
ffmpeg -v 0 -analyzeduration 900000000000 -probesize 200M -threads 2 -i "$AUDIO" \
|
|
|
|
-filter_complex aformat=channel_layouts=mono,showwavespic=colors=white:s=3200x800 \
|
|
|
|
-frames:v 1 -f apng - 2>/dev/null | \
|
|
|
|
magick - -background black -alpha remove -alpha off "$TMP1" 2>/dev/null | cat > /dev/null 2>&1
|
|
|
|
|
|
|
|
#
|
|
|
|
# Not clear what's being done to the image here, but it produces a useful end
|
|
|
|
# result, or seems to!
|
|
|
|
#
|
|
|
|
magick -background black "$TMP1" -gravity center -background black -transparent white - | \
|
|
|
|
magick - -gravity South -background white -splice 0x5 -background black -splice 0x5 - | \
|
|
|
|
magick - -trim - | \
|
|
|
|
magick - -gravity South -chop 0x5 - | \
|
|
|
|
magick - -gravity North -background white -splice 0x5 -background black -splice 0x5 - | \
|
|
|
|
magick - -trim - | \
|
|
|
|
magick - -gravity North -chop 0x5 - | \
|
|
|
|
magick - -resize '800x200!' "$IMAGE"
|
|
|
|
|
|
|
|
#
|
|
|
|
# The original renamed the temporary file to be the target image file, but
|
|
|
|
# that's probably becausae part of this is done in a Docker container. Doesn't
|
|
|
|
# seem appropriate here
|
|
|
|
#
|
|
|
|
|
|
|
|
# vim: syntax=sh:ts=8:sw=4:ai:et:tw=78:fo=tcrqn21
|
|
|
|
|