From 3276b3d2d44f6506f9384776516f7b5aedbeba7d Mon Sep 17 00:00:00 2001 From: Freya Murphy Date: Fri, 3 May 2024 13:59:07 -0400 Subject: scripts --- aconv | 128 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100755 aconv (limited to 'aconv') diff --git a/aconv b/aconv new file mode 100755 index 0000000..bcc739b --- /dev/null +++ b/aconv @@ -0,0 +1,128 @@ +#!/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" -- cgit v1.2.3-freya