blob: 3fa45634f37a4f626be333c9c9e44fd7e055fc79 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
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
|