mocp / random / enqueue
After disk failure on our company music server, I lost my enqueue-some-random-music-script.
That shan’t happen again. So here, for my own enjoyment: autoenq.sh
#!/bin/sh
enqueue_app="mocp -a"
music_glob="*.mp3"
music_path="`dirname "$0"`"
list_path="$music_path/.autoenq.list"
if [ "$*" = "-c" ]; then
# Create list of all files
find . -type f -iname "$music_glob" > "$list_path.tmp" 2>/dev/null # no lost+found
# Create list of all dirs that have files
cat "$list_path.tmp" | sed -e 's/\/[^\/]*$//' | sort | uniq > "$list_path"
exit 0
fi
args="`echo "$*" | sed -e "s/['\\\\]//g"`" # no backslashes and single quotes please
args="`echo "$args" | sed -e 's/[[:blank:]]\+/.*/g'`" # replace blanks with .*
generator="grep -i '$args' '$list_path' | shuf"
exec 3<&0 # stdin as fd 3
eval $generator | while read -r dir; do
echo -n "Enqueue $dir [Y/n]? "
read answer <&3 # read from stdin
if [ -z "$answer" -o "$answer" = "y" -o "$answer" = "Y" ]; then
find "$dir" -maxdepth 1 -type f -iname "$music_glob" | xargs -d\\n $enqueue_app
exit 0
fi
done
Run /somewhere/autoenq.sh -c
nightly to update the file (directory)
list.
Example usage:
$ ./autoenq.sh ltj big bud
Enqueue ./LTJ/Big Bud - Fear of Flying/CD 2 [Y/n]? n
Enqueue ./LTJ/GLRMA 001 - Big Bud - Infinity & Infinity [Y/n]?
Now mocp
is populated with the files from that second path.
Noteworthy parts in the code above:
- We duplicate
stdin
to fd 3 in the main shell so we can use that in thewhile
-subshell. If we didn’t, theanswer
to the question would be read from the generator as well. - The
$generator
is created earlier for extensibility, you may want to addgrep -v
stuff (exclusions) for certain command line parameters in the future. - It takes care to only enqueue files, not directories. Otherwise
mocp
will recursively get directory contents, which is not what you want. (Especially not if you have a stray mp3 file in your root music directory.)