bash-music-sync/music-sync.sh

158 lines
3.7 KiB
Bash
Raw Normal View History

2018-11-30 10:48:04 +01:00
#!/bin/bash
# saner programming env: these switches turn some bugs into errors
set -o errexit -o pipefail -o noclobber -o nounset
source="-"
dest="-"
verbose=true
help=false
GetOptions() {
# https://stackoverflow.com/a/29754866
! getopt --test > /dev/null
if [[ ${PIPESTATUS[0]} -ne 4 ]]; then
VerboseOutput "Fatal" "\`getopt --test\` failed"
echo "Sorry, It seems that your shell is not supported"
echo "If you're using mac or another unix-like system, please install GNU getopt"
exit 1
fi
2018-11-30 11:27:32 +01:00
# Parsing style without -s or -d
source=${*: -2:1}
dest=${*: -1:1}
2018-11-30 10:48:04 +01:00
OPTIONS=s:d:vh
LONGOPTS=source:,dest:,verbose,help
# -use ! and PIPESTATUS to get exit code with errexit set
# -temporarily store output to be able to check for errors
# -activate quoting/enhanced mode (e.g. by writing out “--options”)
# -pass arguments only via -- "$@" to separate them correctly
! PARSED=$(getopt --options=$OPTIONS --longoptions=$LONGOPTS --name "$0" -- "$@")
if [[ ${PIPESTATUS[0]} -ne 0 ]]; then
# e.g. return value is 1
# then getopt has complained about wrong arguments to stdout
Usage
exit 2
fi
# read getopts output this way to handle the quoting right:
eval set -- "$PARSED"
verbose=false
# now enjoy the options in order and nicely split until we see --
while true; do
case "$1" in
-v|--verbose)
verbose=true
shift
;;
-h|--help)
help=true
shift
;;
-s|--source)
source="$2"
shift 2
;;
-d|--dest)
dest="$2"
shift 2
;;
--)
shift
break
;;
*)
echo "Programming error"
return 3
;;
esac
done
}
2018-11-30 10:58:16 +01:00
Usage() {
2018-11-30 11:27:32 +01:00
echo ""
2018-11-30 10:58:16 +01:00
echo "Usage:"
2018-11-30 11:27:32 +01:00
echo "music-sync <options> -s|--source <source> -d|--dest <destination>"
echo "music-sync <options> <source> <destination>"
2018-11-30 10:58:16 +01:00
echo ""
echo "Syncronises music from one folder to another."
echo ""
echo "Options:"
echo " -s, --source <source> The source folder of the music"
echo " -d, --dest <destination> The destionation folder of the music"
echo " -v, --verbose Enable verbose output"
echo " -h, --help Display this help text"
2018-11-30 11:05:31 +01:00
echo ""
2018-11-30 10:58:16 +01:00
}
2018-11-30 10:48:04 +01:00
VerboseOutput() {
2018-11-30 11:05:31 +01:00
if [[ "$verbose" = true ]]; then
2018-11-30 10:48:04 +01:00
echo "[$1] $2" >&2
fi
}
2018-11-30 13:02:34 +01:00
CreateFileList() {
# ${1} /mnt/hdd/Example-Artist/Example-Album
# ${2} /mnt/mtp/Example-Artist/Example-Album
# ${3} Example-Artist/Example-Album/
IFS=""
sourcepath="${1}/*"
for file in $sourcepath; do
relfile="${file#"$1/"}"
if [[ -d "${1}/$relfile" ]]; then
newdir="${3}/$relfile"
newdir=${newdir#"/"}
VerboseOutput "Info" "Entering $newdir"
CreateFileList "${1}/$relfile" "${2}/$relfile" "$newdir"
elif [[ ! -f "${2}/$relfile" || "${2}/$relfile" -nt "${1}/$relfile" ]]; then
echo ${3}/$relfile >> /tmp/music-sync-filelist
VerboseOutput "Info" "Added: ${3}/${relfile}"
fi
done
}
2018-11-30 13:28:29 +01:00
ConvertFiles() {
mkdir -p /tmp/converted
while read -r line
do
VerboseOutput "Info" "Converting $line"
if [[ "/tmp/converted/$line" = */* ]]; then
mkdir -p "/tmp/converted/${line%/*}";
fi;
lame -q 0 -b 192 $source/$line /tmp/converted/$line 1>/dev/null 2>/dev/null
2018-11-30 13:43:21 +01:00
VerboseOutput "Info" "Converted $line"
2018-11-30 13:28:29 +01:00
done < "/tmp/music-sync-filelist"
}
2018-11-30 13:41:26 +01:00
CopyFiles() {
while read -r line
do
VerboseOutput "Info" "Copy $line"
if [[ "$dest/$line" = */* ]]; then
mkdir -p "$dest/${line%/*}";
fi;
cp -f $source/$line $dest/$line # 1>/dev/null 2>/dev/null
done < "/tmp/music-sync-filelist"
2018-11-30 13:43:21 +01:00
VerboseOutput "Info" "Copied $line"
2018-11-30 13:41:26 +01:00
}
2018-11-30 13:42:00 +01:00
CleanUp() {
2018-11-30 13:43:21 +01:00
VerboseOutput "Info" "Cleaning Up"
2018-11-30 13:42:00 +01:00
rm "/tmp/music-sync-filelist"
2018-11-30 13:45:34 +01:00
rm -rf "/tmp/converted"
2018-11-30 13:43:21 +01:00
VerboseOutput "Info" "Done"
2018-11-30 13:42:00 +01:00
}
2018-11-30 10:48:04 +01:00
GetOptions $@
2018-11-30 11:05:31 +01:00
if [[ "$help" == true ]]; then
2018-11-30 10:58:16 +01:00
Usage
2018-11-30 11:27:32 +01:00
exit
2018-11-30 10:58:16 +01:00
fi
2018-11-30 13:28:29 +01:00
CreateFileList $source $dest ""
2018-11-30 13:41:26 +01:00
ConvertFiles
2018-11-30 13:42:00 +01:00
CopyFiles
CleanUp