#!/bin/sh
# Copyright (c) 2009 Serge "ftrvxmtrx" Ziryukin
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
CONFIG="${HOME}/.split2flac"
TMPCUE="${HOME}/.split2flac_sheet.cue"
TMPPIC="${HOME}/.split2flac_cover.jpg"
NOSUBDIRS=0
NORENAME=0
NOPIC=0
PIC_SIZE="192x192"
# load settings
eval `cat "${CONFIG}" 2>/dev/null`
DRY=0
SAVE=0
unset PIC
unset FILE
unset CUE
HELP="Usage: split2flac.sh [OPTIONS] FILE
-o DIRECTORY * - set output directory
-cue FILE - use file as a cue sheet
-c FILE * - use file as a cover image
-nc * - do not set any cover images
-cs WxH * - set cover image size (current is ${PIC_SIZE})
-d * - create artist/album subdirs
-nd * - do not create any subdirs
-r * - rename tracks to include title
-nr * - do not rename tracks (numbers only, e.g. '01.flac')
-p - dry run
-s - save configuration to \"${CONFIG}\"
-h - print this message
-H - print README
* - option has effect on configuration if -s option passed.
NOTE: '-c some_file.jpg -s' only allows cover images, it doesn't set a default one."
README="split2flac.sh splits one big APE/FLAC/WV file to FLAC tracks with tagging and renaming.
It's better to pass '-p' option to see what will happen when actually splitting tracks.
You may want to pass '-s' option for the first run to save default configuration
(output dir, cover image size, etc.) so you won't need to pass a lot of options
every time, only a filename.
Script will try to find CUE sheet if it wasn't specified."
# parse arguments
while [ "$1" ]
do
case $1 in
-o) DIR=$2; shift;;
-cue) CUE=$2; shift;;
-c) NOPIC=0; PIC=$2; shift;;
-nc) NOPIC=1;;
-cs) PIC_SIZE=$2; shift;;
-d) NOSUBDIRS=0;;
-nd) NOSUBDIRS=1;;
-r) NORENAME=0;;
-nr) NORENAME=1;;
-p) DRY=1;;
-s) SAVE=1;;
-h) echo "${HELP}"; exit 0;;
-H) echo "${README}"; exit 0;;
*)
if [ -r "${FILE}" ]
then
echo "Unknown option $1"
echo "${HELP}"
exit 1
elif [ ! -r "$1" ]
then
echo "Unable to read $1"
exit 1
else
FILE="$1"
fi;;
esac
shift
done
# search for a cue sheet if not specified
if [ -z "${CUE}" ]
then
CUE="${FILE}.cue"
if [ ! -r "${CUE}" ]
then
CUE="`echo ${FILE} | sed 's/[^\.]*$//'`cue"
if [ ! -r "${CUE}" ]
then
# try to extract internal one
CUESHEET="`metaflac --show-tag=CUESHEET \"${FILE}\" 2>/dev/null | sed 's/CUESHEET=//I'`"
if [ -z "${CUESHEET}" ]
then
CUESHEET="`wvunpack -q -c \"${FILE}\" 2>/dev/null`"
fi
if [ "${CUESHEET}" ]
then
CUE="${TMPCUE}"
echo "${CUESHEET}" > "${CUE}"
if [ $? -ne 0 ]
then
echo "Unable to save internal cue sheet"
exit 1
fi
else
unset CUE
fi
fi
fi
fi
# print some info and check arguments
echo "Input file :" ${FILE:?"${HELP}"}
echo "Cue sheet :" ${CUE:?"No cue sheet"}
# search for a front cover image
if [ "${NOPIC}" -eq 1 ]
then
unset PIC
elif [ -z "${PIC}" ]
then
# try common names
SDIR="`dirname \"${FILE}\"`"
for i in cover.jpg front_cover.jpg folder.jpg
do
if [ -r "${SDIR}/$i" ]
then
PIC="${SDIR}/$i"
break
fi
done
# try to extract internal one
if [ -z "${PIC}" ]
then
metaflac --export-picture-to="${TMPPIC}" "${FILE}" 2>/dev/null
if [ $? -ne 0 ]
then
echo "Unable to export internal front cover image"
unset PIC
else
PIC="${TMPPIC}"
fi
fi
fi
echo "Cover image :" ${PIC:-"not set"}
echo "Output dir :" ${DIR:?"Output directory wasn't set"}
# save configuration if needed
if [ "${SAVE}" -eq 1 ]
then
echo "DIR=\"${DIR}\"" > "${CONFIG}"
echo "NOSUBDIRS=${NOSUBDIRS}" >> "${CONFIG}"
echo "NORENAME=${NORENAME}" >> "${CONFIG}"
echo "NOPIC=${NOPIC}" >> "${CONFIG}"
echo "PIC_SIZE=${PIC_SIZE}" >> "${CONFIG}"
echo "Configuration saved"
fi
GETTAG="cueprint -n 1 -t"
VALIDATE="tr -d -C \"[:space:][:alnum:]&\-_#,.'\""
# get common tags
TAG_ARTIST="`${GETTAG} %P \"${CUE}\"`"
TAG_ALBUM="`${GETTAG} %T \"${CUE}\"`"
TRACKS_NUM="`${GETTAG} %N \"${CUE}\"`"
YEAR="`awk '{ if (/REM[ \t]+DATE/) { printf \"%i\", $3; exit } }' < \"${CUE}\"`"
if [ "${YEAR}" -a "${YEAR}" -ne 0 ]
then
TAG_DATE="${YEAR}"
else
unset TAG_DATE
fi
echo
echo "Artist : ${TAG_ARTIST}"
echo "Album : ${TAG_ALBUM}"
echo "Year : ${TAG_DATE}"
echo "Tracks : ${TRACKS_NUM}"
echo
# prepare output directory
OUT="${DIR}"
if [ "${NOSUBDIRS}" -ne 1 ]
then
DIR_ARTIST="`echo ${TAG_ARTIST} | ${VALIDATE}`"
DIR_ALBUM="`echo ${TAG_ALBUM} | ${VALIDATE}`"
if [ "${TAG_DATE}" ]
then
DIR_ALBUM="${TAG_DATE} - ${DIR_ALBUM}"
fi
OUT="${OUT}/${DIR_ARTIST}/${DIR_ALBUM}"
fi
echo "Saving tracks to \"${OUT}\""
if [ "${DRY}" -ne 1 ]
then
# create output dir
mkdir -p "${OUT}"
if [ $? -ne 0 ]
then
echo "Failed to create output directory"
exit 1
fi
# split to tracks
cuebreakpoints "${CUE}" | \
shnsplit -O never -o "flac flac -8 - -o %f" -d "${OUT}" -t "%n" "${FILE}"
if [ $? -ne 0 ]
then
echo "Failed to split"
exit 1
fi
# prepare cover image
if [ "${PIC}" ]
then
convert "${PIC}" -resize "${PIC_SIZE}" "${TMPPIC}"
if [ $? -eq 0 ]
then
PIC="${TMPPIC}"
else
echo "Failed to convert cover image"
unset PIC
fi
fi
fi
# set tags and rename
echo
echo "Setting tags"
i=1
while [ $i -le ${TRACKS_NUM} ]
do
TAG_TITLE="`cueprint -n $i -t %t \"${CUE}\"`"
f="${OUT}/`printf %02i $i`.flac"
FILE_TRACK="`basename \"$f\" .flac`"
FILE_TITLE="`echo ${TAG_TITLE} | ${VALIDATE}`"
echo "$i: ${TAG_TITLE}"
if [ "${NORENAME}" -ne 1 ]
then
FINAL="${OUT}/${FILE_TRACK} - ${FILE_TITLE}.flac"
else
FINAL="$f"
fi
if [ "${DRY}" -ne 1 ]
then
metaflac --remove-all-tags \
--set-tag="ARTIST=${TAG_ARTIST}" \
--set-tag="ALBUM=${TAG_ALBUM}" \
--set-tag="TITLE=${TAG_TITLE}" \
--set-tag="TRACKNUMBER=$i" \
"$f"
[ "${TAG_DATE}" ] && metaflac --set-tag="DATE=${TAG_DATE}" "$f"
[ "${PIC}" ] && metaflac --import-picture-from="${PIC}" "$f"
if [ "${NORENAME}" -ne 1 ]
then
mv "$f" "${FINAL}"
fi
fi
echo " -> ${FINAL}"
i=$(($i + 1))
done
rm -f "${TMPPIC}"
rm -f "${TMPCUE}"
echo
echo "Finished"