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 getopt’s 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
|
|
|
|
|
done < "/tmp/music-sync-filelist"
|
|
|
|
|
}
|
|
|
|
|
|
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 ""
|
|
|
|
|
ConvertFiles
|