129 lines
2.4 KiB
Text
129 lines
2.4 KiB
Text
|
#!/bin/sh
|
||
|
|
||
|
ACONV_OUTDIR="./converted"
|
||
|
ACONV_CODEC="libopus"
|
||
|
ACONV_BITRATE="128k"
|
||
|
ACONV_CONTAINER="ogg"
|
||
|
ACONV_QUIET=0
|
||
|
ACONV_THREADS=$(nproc --ignore=2)
|
||
|
|
||
|
chk_command() {
|
||
|
if ! command -v "$1" > /dev/null; then
|
||
|
>&2 echo "error: command '$1' could not be found"
|
||
|
exit 1
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
chk_command "ffmpeg"
|
||
|
chk_command "getopts"
|
||
|
chk_command "parallel"
|
||
|
chk_command "find"
|
||
|
|
||
|
usage() {
|
||
|
printf "usage: aconv [-hs] [options] dir\n"
|
||
|
}
|
||
|
|
||
|
help() {
|
||
|
printf "usage: aconv [-hs] [options] dir\n\n"
|
||
|
printf "\t-h\t\tprint this message\n"
|
||
|
printf "\t-q\t\tset quiet output (only errors)\n"
|
||
|
printf "\t-o OUTDIR\tset the output directory\n"
|
||
|
printf "\t-c CODEC\tset the output codec\n"
|
||
|
printf "\t-C CONTAINER\tset the output container\n"
|
||
|
printf "\t-b BITRATE\tset the output bitrate\n"
|
||
|
printf "\t-j THREADS\tset the number of threads (default all but 2)\n"
|
||
|
}
|
||
|
|
||
|
while getopts "hqo:c:C:b:j:" arg > /dev/null; do
|
||
|
case $arg in
|
||
|
h)
|
||
|
help
|
||
|
exit 0
|
||
|
;;
|
||
|
q)
|
||
|
ACONV_QUIET=1
|
||
|
;;
|
||
|
o)
|
||
|
ACONV_OUTDIR=${OPTARG}
|
||
|
;;
|
||
|
c)
|
||
|
ACONV_CODEC=${OPTARG}
|
||
|
;;
|
||
|
C)
|
||
|
ACONV_CONTAINER=${OPTARG}
|
||
|
;;
|
||
|
b)
|
||
|
ACONV_BITRATE=${OPTARG}
|
||
|
;;
|
||
|
j)
|
||
|
ACONV_THREADS=${OPTARG}
|
||
|
;;
|
||
|
?)
|
||
|
>&2 echo "error: unknown option"
|
||
|
usage
|
||
|
exit 1
|
||
|
;;
|
||
|
esac;
|
||
|
done;
|
||
|
|
||
|
ACONV_DIR=${@:$OPTIND:1}
|
||
|
|
||
|
if [ "$ACONV_DIR" = "" ]; then
|
||
|
usage
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
if [ ! -d "$ACONV_DIR" ]; then
|
||
|
>&2 echo "error: input directory '$ACONV_DIR' does not exist"
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
|
||
|
convert_file() {
|
||
|
# get arguments
|
||
|
file="$1"
|
||
|
ext="$2"
|
||
|
name=${file%.*};
|
||
|
# print log
|
||
|
if [ "$ACONV_QUIET" -eq 0 ]; then
|
||
|
printf "\x1b[34m CONV \x1b[0m%s\n" "$ACONV_OUTDIR/$name.$ACONV_CONTAINER"
|
||
|
fi
|
||
|
# do the thing
|
||
|
ffmpeg -nostdin -y -i "$file" -c:a "$ACONV_CODEC" -b:a "$ACONV_BITRATE" "$ACONV_OUTDIR/$name.$ACONV_CONTAINER" -loglevel fatal
|
||
|
}
|
||
|
|
||
|
export ACONV_OUTDIR
|
||
|
export ACONV_CODEC
|
||
|
export ACONV_BITRATE
|
||
|
export ACONV_CONTAINER
|
||
|
export ACONV_QUIET
|
||
|
export ACONV_THREADS
|
||
|
export -f convert_file
|
||
|
|
||
|
convert_type() {
|
||
|
# get arguments
|
||
|
dir="$1"
|
||
|
ext="$2"
|
||
|
# convert the files
|
||
|
find "$dir" -type f -name "*.$ext" | parallel -j "$ACONV_THREADS" convert_file "{}" "$ext"
|
||
|
}
|
||
|
|
||
|
convert_dir() {
|
||
|
# get arguments
|
||
|
dir="$1"
|
||
|
|
||
|
# make the output dirs
|
||
|
find "$dir" -type d -print0 |xargs -0 -I{} mkdir -p "$ACONV_OUTDIR/{}"
|
||
|
|
||
|
# convert the things
|
||
|
convert_type "$dir" "mp3"
|
||
|
convert_type "$dir" "m4a"
|
||
|
convert_type "$dir" "ogg"
|
||
|
convert_type "$dir" "flac"
|
||
|
convert_type "$dir" "wav"
|
||
|
convert_type "$dir" "avif"
|
||
|
}
|
||
|
|
||
|
# do the thing
|
||
|
convert_dir "$ACONV_DIR"
|