diff options
| author | Anton Bobov <abobov@gmail.com> | 2012-01-30 20:45:23 +0600 |
|---|---|---|
| committer | Anton Bobov <abobov@gmail.com> | 2012-01-30 20:45:23 +0600 |
| commit | 5eb3384f04442becef4ca74ee51efed3a755ffd1 (patch) | |
| tree | 1f89d4626088f70251597269da345fc9da766aa2 /any2flac.sh | |
Initial commit.
Diffstat (limited to 'any2flac.sh')
| -rwxr-xr-x | any2flac.sh | 524 |
1 files changed, 524 insertions, 0 deletions
diff --git a/any2flac.sh b/any2flac.sh new file mode 100755 index 0000000..4d64094 --- /dev/null +++ b/any2flac.sh @@ -0,0 +1,524 @@ +#!/bin/bash + +# +# Version 0.2 +# +# +# + +# debug mode +# set -u +# set -o nounset + +# options +FLAC_SEEK=5s +NICE_PRIORITY=15 +TEST_AFTER_ENCODING=1 +CUE_ENCODING="WINDOWS-1251" + + +# executable +FLAC_BIN=`which flac` +METAFLAC_BIN=`which metaflac` +MAC_BIN=`which mac` +WVUNPACK_BIN=`which wvunpack` +SHNTOOL_BIN=`which shntool` +CUEPRINT_BIN=`which cueprint` +RECODE_BIN=`which recode` +ICONV_BIN=`which iconv` +NICE_BIN=`which nice` + +# =================== DONT EDIT ANYTHING BELOW THIS LINE ======================= +# +NEED_WRITE_TAGS=0 +FORMAT="" +FORMAT_EXT="" +CUE_FILE="" +TMP_WORKING_DIR="" +CANT_RECODE=0 + +# --== COLORS ==-- +#Tnx to cue2tracks project for idea +COLOR_DEFAULT='\033[00m' +COLOR_RED='\033[01;31m' +COLOR_GREEN='\033[01;32m' +COLOR_YELLOW='\033[01;33m' +COLOR_MAGENTA='\033[01;35m' +COLOR_CYAN='\033[01;36m' + + +# +[ -x "$NICE_BIN" ] && NICE="$NICE_BIN --adjustment=$NICE_PRIORITY" || NICE="" + + + + + + +# +# +# +e_warning() +{ + echo -e "${COLOR_YELLOW}WARNING:${COLOR_DEFAULT} $@" +} + + +# +# +# +e_error() +{ + echo -e "${COLOR_RED}ERROR:${COLOR_DEFAULT} $@" >&2 +} + + +# +# +# +e_die() +{ + echo -e "${COLOR_RED}CRITICAL ERROR:${COLOR_DEFAULT} $2" >&2 + exit $1 +} + + + +# +# +# +check_format() +{ + #FORMATS="ape wv wav flac" + for frm in "[Aa][Pp][Ee] ape" "[Ww][Vv] wv" "[Ww][Aa][Vv] wav" "[Ff][Ll][Aa][Cc] flac" + do + set -- $frm + NUM_FILES=`ls -1 ./*.$1 2>/dev/null | wc -l` + + if [[ "$NUM_FILES" -ge "1" ]] + then + [ ! -z "$FORMAT" ] && e_die "2" "Error: more than one format detected. Game over." + + FORMAT_EXT="$1" + FORMAT="$2" + fi + done + + [ -z "$FORMAT" ] && e_die "2" "Error: cant detect any format. Game over." +} + + +# +# +# +test_flac_files() +{ + if [[ $TEST_AFTER_ENCODING -eq 1 ]] + then + echo -e "\n=========== Start testing FLAC-files ============" + $NICE $FLAC_BIN --test ${TMP_WORKING_DIR}/*.flac + echo -e "\n================== Test is done ==================" + fi +} + + +# +# +# used from cuetag code (cuetools) +# Vorbis Comments +# for FLAC and Ogg Vorbis files +write_flac_tags() +{ + if [ $# -eq 3 ] + then + echo -n "Writing tags for '$2'... " + + fields='TITLE VERSION ALBUM TRACKNUMBER TRACKTOTAL ARTIST PERFORMER COPYRIGHT LICENSE ORGANIZATION DESCRIPTION GENRE DATE LOCATION CONTACT ISRC' + + + TITLE='%t' + VERSION='' + ALBUM='%T' + TRACKNUMBER='%n' + TRACKTOTAL='%N' + ARTIST='%c %p' + PERFORMER='%p' + COPYRIGHT='' + LICENSE='' + ORGANIZATION='' + DESCRIPTION='%m' + GENRE='%G' + DATE='' + LOCATION='' + CONTACT='' + ISRC='%i %u' + + # make tmp file for tags + TMP_TAGS_FILE=`mktemp -q -p "./" tags_tmp_XXXXXX` + + [[ ! -f "$TMP_TAGS_FILE" ]] && e_die "2" "Cant create temporary files: '$TMP_TAGS_FILE'" + + METAFLAC="$METAFLAC_BIN --remove-all-tags --no-utf8-convert --import-tags-from=$TMP_TAGS_FILE" + + # date + ALBUM_DATE=`grep -m 1 DATE "$3" | sed -r -e 's/(.?*)REM\ DATE\ //g'` + [ -n "${ALBUM_DATE}" ] || ALBUM_DATE=0000 + echo "DATE=$ALBUM_DATE" > "$TMP_TAGS_FILE" + + (for field in $fields + do + value="" + for conv in `eval echo \\$$field` + do + value=`$CUEPRINT_BIN -n "$1" -t "$conv\n" "$3"` + + if [ -n "$value" ] + then + echo "$field=$value" >> "$TMP_TAGS_FILE" + break + fi + done + done) && $METAFLAC "$2" + + rm -f "$TMP_TAGS_FILE" + + echo "done" + fi +} + + +# +# +# +recode_to_utf8() +{ + # recode + if [ -x "$RECODE_BIN" ] + then + $RECODE_BIN $CUE_ENCODING..UTF-8 "$1" + return $? + elif [ -x "$ICONV_BIN" ] + then + local TMP_CUE=`mktemp -q -p "./" cue_utf8_tmp_XXXXXX` && + { + $ICONV_BIN --from-code=$CUE_ENCODING --to-code=UTF-8 --output=$TMP_CUE "$1" + + if [[ $? -eq 0 ]] + then + mv -f "$TMP_CUE" "$1" + return $? + fi + } + fi + + return 2 +} + + +# +# +# +find_cue_file() +{ + CUE_FILE="${1/.$2}".cue + + if [[ ! -f "$CUE_FILE" ]] + then + CUE_FILE="$1.cue" + fi + + if [[ ! -f "$CUE_FILE" ]] + then + CUE_FILE=`ls -1 *.[Cc][Uu][Ee] | head -n 1` + fi + + if [[ -f "$CUE_FILE" && -s "$CUE_FILE" ]] + then + echo "Found CUE: '$CUE_FILE'" + + # check encodings of cue + if [[ `file "$CUE_FILE" | grep "ISO-8859 text"` ]] + then + echo -n "Converting CUE ($CUE_FILE) to UTF-8... " + recode_to_utf8 "$CUE_FILE" && echo "done" || { echo "error"; CANT_RECODE=1; } + fi + + # + LASTLINE=`tail -n 1 "$CUE_FILE" | tr -d [:blank:] | tr -d [:cntrl:]` + if [[ "$LASTLINE" != "" ]] + then + echo -e "\n" >> "$CUE_FILE" + fi + + else + unset CUE_FILE + fi + + +} + + +# +# +# +trap_int_cb() +{ + if [ -d "$TMP_WORKING_DIR" ] + then + echo -e -n "\n\n *** Got INT signal ***\nDeleting TMP dir... " + rm -f ${TMP_WORKING_DIR}/* && rmdir "$TMP_WORKING_DIR" + echo -e "done\nFinished work.\n\n" + exit 13 + fi +} + + +# +# +# +create_temp_dir() +{ + + TMP_WORKING_DIR=`mktemp -q -d -p "./" tmp_XXXXX` + + [[ ! -d "$TMP_WORKING_DIR" ]] && e_die "5" "Cant create temporary dir: '$TMP_WORKING_DIR'" || trap 'trap_int_cb' TERM INT +} + + +# +# +# +rename_temp_dir() +{ + if [[ -d "$TMP_WORKING_DIR" ]] + then + if [[ -n "$CUE_FILE" ]] + then + local NEW_DIR_NAME=`$CUEPRINT_BIN -d '%T' "$CUE_FILE"` + if [[ -n "$NEW_DIR_NAME" && ! -d "$NEW_DIR_NAME" && ! -f "$NEW_DIR_NAME" ]] + then + mv "$TMP_WORKING_DIR" "$NEW_DIR_NAME" && echo -e "\nYou can find converted files in '$NEW_DIR_NAME' directory" + return + fi + fi + + echo -e "\nYou can find converted files in '$TMP_WORKING_DIR'" + fi +} + + +# +# +# +bin_require() +{ + local FLAG=0 + + for P in "$@" + do + set -- $P + local BIN=$1 + local MAND=$2 + + case $BIN in + ape ) + if [[ ! -x "$MAC_BIN" && $MAND -eq 1 ]] + then + e_error "cant find 'mac' program -- install it" + FLAG=1 + fi + ;; + wv ) + if [[ ! -x "$WVUNPACK_BIN" && $MAND -eq 1 ]] + then + e_error "cant find 'wvunpack' program -- install it" + FLAG=1 + fi + ;; + flac ) + if [[ ! -x "$FLAC_BIN" && $MAND -eq 1 ]] + then + e_error "cant find 'flac' program -- install it" + FLAG=1 + fi + ;; + metaflac ) + if [[ ! -x "$METAFLAC_BIN" && $MAND -eq 1 ]] + then + e_error "cant find 'metaflac' program -- install it" + FLAG=1 + fi + ;; + cueprint ) + if [[ ! -x "$CUEPRINT_BIN" && $MAND -eq 1 ]] + then + e_error "cant find 'cueprint' program -- install it" + FLAG=1 + fi + ;; + shntool ) + if [[ ! -x "$SHNTOOL_BIN" && $MAND -eq 1 ]] + then + e_error "cant find 'shntool' program -- install it" + FLAG=1 + fi + ;; + + esac + done + + [[ $FLAG -ne 0 ]] && exit 5 +} + + +# +# +# +check_bin_require() +{ + [[ $2 -eq 1 ]] && SHN_MAND=1 || SHN_MAND=0 + + case $FORMAT in + ape ) bin_require "ape 1" "shntool $SHN_MAND" "flac 1";; + wv ) bin_require "wv 1" "shntool $SHN_MAND" "flac 1";; + wav ) bin_require "flac 1";; + flac ) bin_require "flac 1";; + * ) e_error "unknown format '$FORMAT'";; + esac + +} + + + + + + +# +# ================================================= +# # Let`s getting starting our party # # +# ================================================= +# + +# +check_format + + +NUM_W_FILES=`ls -1 ./*.$FORMAT_EXT 2>/dev/null | wc -l` + +[[ "$NUM_W_FILES" -lt "1" ]] && e_die "2" "Not found files for convert (detected format is '$FORMAT');-(" + + +if [[ "$NUM_W_FILES" -eq 1 ]] +then + W_FILE=`ls *.$FORMAT_EXT 2>&1` + echo "Found file: '$W_FILE'" + + # cue + find_cue_file "$W_FILE" "$FORMAT" + + if [[ -n "$CUE_FILE" ]] + then + if [[ -f "$W_FILE" && -s "$W_FILE" && -f "$CUE_FILE" && -s "$CUE_FILE" ]] + then + # + check_bin_require "$FORMAT" "$NUM_W_FILES" + + create_temp_dir + + if [[ $CANT_RECODE -eq 0 ]] + then + TRACK_FORMAT="%n - %t" + else + TRACK_FORMAT="%n" + echo "** Warning ** CUE file canot be converted to Unicode. No tags will be writed" + fi + + echo "" + # Converting and Spliting W->FLAC + $NICE $SHNTOOL_BIN split "$W_FILE" -d "$TMP_WORKING_DIR" -t "$TRACK_FORMAT" -o "flac" -f "$CUE_FILE" + NEED_WRITE_TAGS="1" + + # delete pregap + if [[ -f "${TMP_WORKING_DIR}/00 - pregap.flac" ]] + then + echo -e "Found and removed '00 - pregap.flac'... " + rm -f "${TMP_WORKING_DIR}/00 - pregap.flac" && echo "done" || echo "error" + fi + else + e_die "2" "not found valid $FORMAT file" + fi + else + e_die "2" "not found valid CUE file. Cant split file." + fi +else + # + check_bin_require "$FORMAT" "$NUM_W_FILES" + + # + create_temp_dir + + # Converting W->FLAC + for W_FILE in *.${FORMAT_EXT} + do + echo -n "Converting '$W_FILE' to FLAC... " + case $FORMAT in + ape ) + $NICE $MAC_BIN "$W_FILE" - -d | $NICE $FLAC_BIN --silent --seekpoint="$FLAC_SEEK" --output-name="${W_FILE/.${FORMAT_EXT}/.flac}" - + rm -f "$j" + NEED_WRITE_TAGS=1 + ;; + wv ) + $NICE $WVUNPACK_BIN -q -d -o - "$W_FILE" | $NICE $FLAC_BIN --silent --seekpoint="$FLAC_SEEK" --output-name="${TMP_WORKING_DIR}/${W_FILE/.${FORMAT_EXT}/.flac}" - + NEED_WRITE_TAGS=1 + ;; + + wav ) + $NICE $FLAC_BIN --silent --delete-input-file --seekpoint="$FLAC_SEEK" --output-name="${W_FILE/.${FORMAT_EXT}/.flac}" "$W_FILE" + NEED_WRITE_TAGS=1 + ;; + * ) + e_die "2" "unknown format" + ;; + esac + + [ $? -eq 0 ] && echo "done" + done +fi + +# ================================= + +if [[ "$NEED_WRITE_TAGS" -eq 1 && -n "$CUE_FILE" && $CANT_RECODE -eq 0 ]] +then + echo "" + # + bin_require "metaflac 1" "cueprint 1" + + NTRACK=`$CUEPRINT_BIN -d '%N' "$CUE_FILE"` + TRACKNO=1 + + + NUM_FLAC_FILES=`ls -1 ${TMP_WORKING_DIR}/*.flac 2>/dev/null | wc -l` + if [[ "$NUM_FLAC_FILES" -gt "0" ]] + then + if [[ "$NUM_FLAC_FILES" != "$NTRACK" ]] + then + e_warning "number of flac files ($NUM_FLAC_FILES) does not match number of tracks in cue file ($NTRACK)" + fi + + for FLAC_FILE in ${TMP_WORKING_DIR}/*.flac + do + write_flac_tags $TRACKNO "$FLAC_FILE" "$CUE_FILE" + TRACKNO=$(($TRACKNO + 1)) + done + + # test + test_flac_files + fi +fi + +# +rename_temp_dir + +echo -e "\nWork complete! Have a nice day ;-)\n" +exit 0 + |
