ffutils/bin/ffconv
2022-01-12 02:21:06 +01:00

63 lines
2 KiB
Bash
Executable file

#!/usr/bin/env bash
# sf variables
sfdesc="Convert multiple media files from one format to another.\nSubdirectories are visited recursively."
sfargs+=("FROM_FORMAT;From format")
sfargs+=("TO_FORMAT;To format")
sfargs+=("directory;d;DIRECTORY;current work directory;Convert files in DIRECTORY")
sfargs+=("keep;k;Keep original files")
sfargs+=("list;l;List files which match the FROM_FORMAT")
sfargs+=("move;m;DIRECTORY;;Move old files to DIRECTORY (omits --keep)")
sfexamples+=("ffconv mp3 opus;Convert all mp3 files to opus")
sfexamples+=("ffconv -m trash mp4 mkv;Convert all mp4 to mkv and move the original ones to './trash'")
sfexamples+=("ffconv -d ~/music -l wma mp3;List all wma files from '~/music' and ask for converting them to mp3")
source "$(dirname $0)/../lib/sf"
# Handle default directory
[ "$directory" == "current work directory" ] && directory="."
# Get files
mapfile -d $'\0' files < <(find "$directory" -name "*.$FROM_FORMAT" -print0)
# Check number of files
if [ "${#files[@]}" == 0 ]; then
echo "No files of format ${sftbf}$FROM_FORMAT${sftrs} found"
exit
fi
# Create move directory if set
if [ "$move" != "" ]; then
mkdir -p "$move"
fi
# List files
if [ "$list" == true ]; then
for file in "${files[@]}"; do
echo "$file"
done
echo
sfask "Do you want to convert the files to ${sftbf}$TO_FORMAT${sftrs}" "no"
[ "$sfin" == false ] && exit
fi
echo -e "Converting ${sftbf}${#files[@]}${sftrs} files from ${sftbf}$FROM_FORMAT${sftrs} to ${sftbf}$TO_FORMAT${sftrs}\n"
# Convert files
for i in "${!files[@]}"; do
file="${files[$i]}"
filename=$(basename "${file%.*}")
echo "${sftclr}Processing file ${sftbf}$((i+1))${sftrs}/${sftbf}${#files[@]}${sftrs}: ${sftbf}$filename${sftrs}"
ffmpeg -hide_banner -loglevel error -nostdin -i "$file" "${file%.*}.$TO_FORMAT"
if [ "$?" != 0 ]; then
echo
elif [ "$move" != "" ]; then
mv --backup=t "$file" "$move"
elif [ "$keep" == false ]; then
rm "$file"
fi
done
echo "done"