"Мопед не мой". (с) :) Скрипт был нагло уперт где-то в инете. Из названия ясно что он перекодирует все что не поподя во flac. Что могу сказать? Работает. :)
#!/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
Комментариев нет:
Отправить комментарий