90 lines
1.8 KiB
Bash
Executable File
90 lines
1.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -o errexit
|
|
|
|
source="./"
|
|
dest=""
|
|
nproc="$(nproc)"
|
|
|
|
display_help() {
|
|
echo "Usage: $0 [option...] " >&2
|
|
echo
|
|
echo " -s, source directory [default: $source]"
|
|
echo " -d, destination directory (the structure of source will be replicated there)"
|
|
echo " -n, number of processes to use [default: $nproc]"
|
|
echo " -h, display this help and exit"
|
|
echo
|
|
}
|
|
|
|
parse_args() {
|
|
while getopts ":hs:d:n:" opt; do
|
|
case $opt in
|
|
h)
|
|
display_help
|
|
exit 0
|
|
;;
|
|
s)
|
|
source=$OPTARG/
|
|
;;
|
|
d)
|
|
dest=$OPTARG/
|
|
;;
|
|
n)
|
|
nproc=$OPTARG
|
|
;;
|
|
\?)
|
|
echo "Invalid option: -$OPTARG" >&2
|
|
display_help
|
|
exit 1
|
|
;;
|
|
:)
|
|
echo "Option -$OPTARG requires an argument." >&2
|
|
display_help
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
}
|
|
|
|
transcode() {
|
|
local input="$1"
|
|
local source="$2"
|
|
local dest="$3"
|
|
local tmp_dest="${input/$source/$dest}"
|
|
|
|
for ending in %.flac %.m4a; do
|
|
tmp_dest="${tmp_dest/$ending/.mp3}"
|
|
done
|
|
local final_dest="$tmp_dest"
|
|
|
|
local parent_dir
|
|
parent_dir="$(dirname "$final_dest")"
|
|
[[ -d "$parent_dir" ]] || mkdir -p "$parent_dir"
|
|
|
|
ffmpeg -y -i "$input" -c:a libmp3lame -qscale:a 4 "$final_dest"
|
|
}
|
|
export -f transcode
|
|
|
|
cover_process() {
|
|
local input="$1"
|
|
local source="$2"
|
|
local dest="$3"
|
|
local final_dest="${input/$source/$dest}"
|
|
|
|
local parent_dir
|
|
parent_dir="$(dirname "$final_dest")"
|
|
[[ -d "$parent_dir" ]] || mkdir -p "$parent_dir"
|
|
|
|
cp "$input" "$final_dest"
|
|
}
|
|
export -f cover_process
|
|
|
|
parse_args "$@"
|
|
|
|
SHELL="$(type -p bash) -exv" \
|
|
find "$source" -type f -name "*.flac" -o -name "*.mp3" -o -name "*.m4a" |
|
|
parallel -j"$nproc" transcode {} "$source" "$dest"
|
|
|
|
SHELL=$(type -p bash) \
|
|
find "$source" -type f -name "cover.jpg" |
|
|
parallel -j"$nproc" cover_process {} "$source" "$dest"
|