diff options
Diffstat (limited to 'dotfiles')
| -rwxr-xr-x | dotfiles/system/.local/bin/any2opus | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/dotfiles/system/.local/bin/any2opus b/dotfiles/system/.local/bin/any2opus new file mode 100755 index 0000000..3fa4563 --- /dev/null +++ b/dotfiles/system/.local/bin/any2opus @@ -0,0 +1,101 @@ +#!/bin/env bash +# Craig Jennings <c@cjennings.net> +# convenience utility to convert all media files not in opus format in current directory to opus. +# flags for recursive or specific filename supported. + +# Default values of arguments +delete_after_conversion=false +filename="" +recursive=false + +# Usage info +show_help() { + cat << EOF +Usage: ${0##*/} [-h] [-d] [-r] [-f FILE] +Convert audio/video files to the Opus format. + + -h display this help and exit + -d delete source files after conversion + -r convert files recursively in current and subdirectories + -f FILE convert a specific file. + +Note: The '-f' and '-r' options are mutually exclusive. + If no file is given, works on all non-opus media files in the current directory. + Requires the ffmpeg installation. +EOF +} + +# Check for the existence of ffmpeg +if ! command -v ffmpeg &> /dev/null; then + echo "Cannot proceed: ffmpeg not found on path." + exit 1 +fi + +# Identify arguments; quit if invalid argument +while getopts ":df:rh" opt; do + case ${opt} in + d) + delete_after_conversion=true + ;; + f) + filename=$OPTARG + ;; + r) + recursive=true + ;; + h) + show_help + exit 0 + ;; + \?) + echo "Invalid option: -$OPTARG" >&2 + show_help + exit 1 + ;; + esac +done + +# Display error and quit if incompatible arguments +if [ "$recursive" = true ] && [ -n "$filename" ] +then + echo "The -f and -r options cannot be used together." + show_help + exit 1 + +# Convert function checks mime-type and converts/deletes a single file +convert() { + f=$1 + # Check the mime-type of the file + mime_type=$(file -b --mime-type "$f") + # If the file is an audio or video file and not already in opus format then convert it to opus + if [[ $mime_type == video/* || $mime_type == audio/* ]] && [[ $f != *.opus ]]; then + ffmpeg -i "$f" "${f%.*}.opus" + # If the '-d' option was specified, delete the original file after conversion + if $delete_after_conversion; then + rm "$f" + fi + fi +} + +# Use above convert function based on user's intended set of files +if [ "$recursive" = true ] +then + # convert all media files in current and child directories + find . -type f -exec bash -c 'convert "$0"' {} \; +elif [[ -n $filename ]] +then + # if filename is not empty, convert only this file + convert $filename +else + # Convert all + echo "All non-opus media files in the current directory will be converted. Originals are kept." + read -p "Proceed? (Y/n) " -n 1 -r + echo + if [[ $REPLY =~ ^[Yy]$ ]] + then + # Iterate over each file in the directory and convert + for f in *; do + convert $f + done + fi +fi |
