#!/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") sfdeps=("ffmpeg") 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"