Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- PATH=${PATH}:/bin:/usr/bin:/usr/local/bin
- [ ${SHELL} = "/bin/bash" ] || exit "Bash required!"
- # set CPU_NUMBER to the number of your CPUs. This variable is used by FlaCuda.
- CPU_NUMBER=1
- # --== ERRORS ==--
- chk_error=0
- NO_ERR=0
- E_UNK=1
- E_TOOL_NOT_FOUND=2
- E_UNK_OUT_CODEC=3
- E_UNK_IN_CODEC=4
- E_IN_FILE_NOT_FOUND=5
- E_TOOL_CBP_NOT_FOUND=6
- E_TOOL_CP_NOT_FOUND=7
- E_TOOL_ST_NOT_FOUND=8
- E_TOOL_F_NOT_FOUND=9
- E_TOOL_IC_NOT_FOUND=10
- E_TAG_APE_NOT_FOUND=11
- E_TAG_FLAC_NOT_FOUND=12
- E_TAG_MP3_NOT_FOUND=13
- E_TAG_OGG_NOT_FOUND=14
- E_CODEC_FLAC_NOT_FOUND=15
- E_CODEC_FLAKE_NOT_FOUND=16
- E_CODEC_APE_NOT_FOUND=17
- E_CODEC_WVp_NOT_FOUND=18
- E_CODEC_WVu_NOT_FOUND=19
- E_CODEC_OFR_NOT_FOUND=20
- E_CODEC_SHN_NOT_FOUND=21
- E_CODEC_TTA_NOT_FOUND=22
- E_CODEC_MP3_NOT_FOUND=23
- E_CODEC_OGGd_NOT_FOUND=24
- E_CODEC_OGGe_NOT_FOUND=25
- E_CODEC_FLACUDA_NOT_FOUND=66
- E_UNK_CODEPAGE=26
- E_CODEPAGE_NOT_SET=27
- E_CANT_CONVERT_CUE=28
- E_CANT_SPLIT=29
- E_CANT_READ_CUE=30
- E_CANT_TAG_FLAC=31
- E_CANT_TAG_APE=32
- E_CANT_TAG_MP3=33
- E_CANT_TAG_OGG=34
- E_CANT_MKDIR=35
- E_CANT_MOVE_FILE=36
- E_WRONG_NUM_TRACKS=37
- E_NOT_CUE_FILE=38
- E_CANT_FIX_CUE=39
- E_TAG_M4A_NOT_FOUND=40
- E_CODEC_M4Ae_NOT_FOUND=41
- E_CODEC_M4Ad_NOT_FOUND=42
- E_CANT_TAG_M4A=43
- E_OPTERROR=65
- # --== VARIABLES ==--
- NO_ARGS=0
- NAME="CUE 2 Tracks"
- DESC="Tool for spliting audio CD image to tracks with cue sheet info."
- VER="0.2.11"
- AUTHOR="Sergey (sergey.dryabzhinsky@gmail.com)"
- # (tool|tag|codec)_* - set to <file> if its exists, "" otherwise
- MIN_SHNTOOL_VERSION=300
- tool_CBP=""
- tool_CP=""
- tool_ST=""
- tool_F=""
- tool_IC=""
- tag_APE=""
- tag_FLAC=""
- tag_MP3=""
- tag_OGG=""
- tag_M4A=""
- codec_FLAC=""
- codec_FLAKE=""
- codec_APE=""
- codec_WVp=""
- codec_WVu=""
- codec_OFR=""
- codec_SHN=""
- codec_TTA=""
- codec_FLACUDA=""
- codec_MP3=""
- codec_OGGd=""
- codec_OGGe=""
- codec_M4Ae=""
- codec_M4Ad=""
- codec_IN=""
- codec_OUT=""
- # (tool|tag|codec)_*_needed - set to 1 if its needed, 0 otherwise
- tool_CBP_needed=1
- tool_CP_needed=1
- tool_ST_needed=1
- tool_F_needed=1
- tool_IC_needed=0
- tag_APE_needed=0
- tag_FLAC_needed=0
- tag_MP3_needed=0
- tag_OGG_needed=0
- tag_M4A_needed=0
- codec_FLAC_needed=0
- codec_FLAKE_needed=0
- codec_APE_needed=0
- codec_WVp_needed=0
- codec_WVu_needed=0
- codec_OFR_needed=0
- codec_SHN_needed=0
- codec_TTA_needed=0
- codec_MP3_needed=0
- codec_OGGd_needed=0
- codec_OGGe_needed=0
- codec_M4Ae_needed=0
- codec_M4Ad_needed=0
- codec_FLACUDA_needed=0
- cueFile=""
- inFile=""
- inFileDir=""
- file_splitlog=""
- file_splitlogwork=""
- outCodec="flac"
- toolCodec="flac"
- outCodecLevel=0 # best
- outCodecParam=""
- outCodecQuality="4"
- outCodecBitRate=128
- outCodecMode="V"
- outExt="flac"
- inCodec=""
- inCodecParam=""
- inFile2WAV=0
- fromCP=""
- locCP="ASCII"
- outFormatStr="%N"
- outFileName=""
- tempDirName="."
- scriptName=`basename "$0"`
- onlyTest=1
- quiteMode=0
- splitInTest=0
- niceness=0
- putTags=1
- useColors=0
- useXTitle=0
- pre_ALBUM_DATE=""
- pre_ALBUM_GENRE=""
- pre_ALBUM_DISCID=""
- pre_ALBUM_NUMBER=""
- tags_ALBUM_TITLE=""
- tags_ALBUM_PERFORMER=""
- tags_ALBUM_COMPOSER=""
- tags_ALBUM_GENRE=""
- tags_ALBUM_DATE=""
- tags_ALBUM_TRACKS=0
- tags_ALBUM_DISCID=""
- tags_ALBUM_NUMBER=""
- tags_TRACK_TITLE=""
- tags_TRACK_PERFORMER=""
- tags_TRACK_COMPOSER=""
- tags_TRACK_GENRE=""
- tags_TRACK_NUMBER=0
- tags_TRACK_ZNUMBER=0
- # --== COLORS ==--
- 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'
- # --== FUNCTIONS ==--
- set_xterm_title() {
- [ ${useXTitle} -ne 0 ] && echo -ne "\033]0;${NAME} v${VER} -= $1 =- \007"
- }
- print_error() {
- echo -e "${color_red}Error${color_default}: $1" >&2
- }
- print_message() {
- if [[ "$1" == "-n" ]]
- then
- [ ${quiteMode} -eq 0 ] && echo -e -n "$2"
- else
- [ ${quiteMode} -eq 0 ] && echo -e "$1"
- fi
- }
- # function for checking existance of tools
- checktool() {
- tool="$1"
- pk="$2"
- print_message -n "\t${color_yellow}*${color_default} Checking for '${color_cyan}${tool}${color_default}'..." >&2
- ctool=`which "${tool}" 2>/dev/null`
- if [ ! -n "${ctool}" ]
- then
- print_message "\t[${color_red}failed${color_default}]! Install '${pk}'!\n" >&2
- return ${E_TOOL_NOT_FOUND}
- else
- print_message "\t[${color_green}ok${color_default}]" >&2
- echo "${ctool}"
- fi
- }
- # check shntool version
- check_shntool_version() {
- print_message -n "\t${color_yellow}*${color_default} Checking '${color_cyan}shntool${color_default}' version..."
- ver=`shntool -v 2>&1 | grep shntool | awk '{print $2}'`
- ver_clean=`echo ${ver} | sed -e 's:\.::g'`
- if ((${ver_clean}>=${MIN_SHNTOOL_VERSION}))
- then
- print_message "\t[${color_green}${ver}${color_default}]"
- return 0
- else
- print_message "\t[${color_red}${ver}${color_default}]! Install version 3.0 or higher!\n"
- return 1
- fi
- }
- # function for printing codecs
- print_codecs() {
- echo -e "\tCodecs may be:\n\
- \t\twav : no encode, raw sound wave,\n\
- \t\tflac : (default) Free Lossless Audio Codec,\n\
- \t\tflake : FLAC realisation via FFmpeg (beta),\n\
- \t\tape : Monkey's Audio Codec,\n\
- \t\twv : WavPack,\n\
- \t\tofr : OptimFrog,\n\
- \t\tshn : shorten,\n\
- \t\tmp3 : mpeg 1 layer 3 via lame,\n\
- \t\togg : ogg vorbis\n\
- \t\tm4a : aac with m4a container,\n\
- \t\tflacuda : cuda-accelerated flac-encoder,\n\
- " >&2
- }
- # function for printing levels
- print_levels() {
- echo -e "\tLevels may be:\n\
- \t\t'best' or 0 : Best for store (default),\n\
- \t\t'fast' or 1 : Fastest processing,\n\
- \t\t'mid' or 2 : Fairly good for portable hardware\n\
- " >&2
- }
- # function for printing naming scheme
- print_naming_scheme() {
- echo -e "\tNaming scheme is:\n\
- \t\t%A : Album title\n\
- \t\t%a : Album disc number\n\
- \t\t%P : Album performer\n\
- \t\t%D : Album date\n\
- \t\t%G : Album genre\n\
- \t\t%t : Track title\n\
- \t\t%p : Track performer\n\
- \t\t%g : Track genre\n\
- \t\t%n : Track number\n\
- \t\t%N : Track number with leading zero\n\
- " >&2
- }
- # function for print some program info
- print_info() {
- echo -e "\n${color_yellow}${NAME}, ${DESC}${color_default}\n\tVersion: ${color_cyan}${VER}${color_default}\n\tAuthor : ${color_cyan}${AUTHOR}${color_default}\n" >&2
- }
- # function for printing some help info
- print_help() {
- print_info
- echo -e "\
- Usage: ${scriptName} [options] <cue file>\n\
- Options:\n\
- \t-R : Disable testing and doing nothing - starts Real work\n\
- \t-C : Use colored messages\n\
- \t-X : Set XTerm title\n\
- \t-i <image file> : Set CD image file. If not set - read from cue\n\
- \t-c <codec> : Set output codec" >&2
- print_codecs
- echo -e "\
- \t-l <level> : Set level of output codec compression rate.\
- " >&2
- print_levels
- echo -e "\
- \t-f <codepage> : Convert to UTF-8 from this 'codepage'\n\
- \t-d : Disable taging of output files with cue info\n\
- \t-A <album> : Set album title\n\
- \t-P <performer> : Set album performer\n\
- \t-K <composer> : Set album composer\n\
- \t-D <date> : Set album date\n\
- \t-G <genre> : Set album genre\n\
- \t-I <id> : Set album disk ID\n\
- \t-N <number> : Set album disc number\n\
- \t-o <format string> : Set naming scheme for output files\
- " >&2
- print_naming_scheme
- echo -e "\
- \t-V : Print version and exit\n\
- \t-h : Print this help and exit\n\
- \t-q : Quite mode - only errors to stderr\n\
- \t-s : Start spliting even in testing mode (to /dev/null)\n\
- \t-n <level> : Nice level (process scheduling priority):\n\
- \t From high (-19) to low (19)\n\
- \n\
- \tOptions only for mp3, ogg:\n\
- \t-Q <quality> : Set quality of codec compression (4 - default)\n\
- \tQuality may be:\n\
- \t\tMP3 : 0 - high, 9 - low\n\
- \t\tM4A : 500 - high, 10 - low\n\
- \t\tOGG : 10 - high, -1 - low\n\
- \t-B <bitrate> : Set compression bitrate in kbps (default to 'high')\n\
- \t-M <bitrate mode> : C - Constant, V - Variable (default)\n\
- \t\tNote: If choosen V - then -B specifies maximum bitrate (only mp3)\n\
- \n\
- To get some action run:\n\
- \t${scriptName} -c flac -f cp1251 -o \"/path/to/music/%P/%D - %A/%N\" CDimage.cue\n\
- " >&2
- }
- # function for print program version
- print_version() {
- echo "${VER}"
- }
- # function for checking output codecs
- check_outCodec() {
- [ ! -n "${outCodec}" ] && outCodec="flac"
- outCodec=`echo ${outCodec} | tr [:upper:] [:lower:]`
- case "${outCodec}" in
- "flac" )
- codec_FLAC_needed=1
- if [ ${putTags} -eq 1 ]; then tag_FLAC_needed=1; fi
- outExt="flac"
- toolCodec="${outCodec}"
- outCodecParam=" flac -8 -o %f -"
- [ ${outCodecLevel} -eq 1 ] && outCodecParam=" flac -1 -o %f -"
- [ ${outCodecLevel} -eq 2 ] && outCodecParam=" flac -4 -o %f -"
- codec_OUT="flac"
- ;;
- "flake" )
- codec_FLAKE_needed=1
- if [ ${putTags} -eq 1 ]; then tag_FLAC_needed=1; fi
- outExt="flac"
- toolCodec="${outExt}"
- outCodecParam=" flake -12 - %f"
- [ ${outCodecLevel} -eq 1 ] && outCodecParam=" flake -1 - %f"
- [ ${outCodecLevel} -eq 2 ] && outCodecParam=" flake -4 - %f"
- codec_OUT="flake"
- ;;
- "flacuda" )
- codec_FLACUDA_needed=1
- if [ ${putTags} -eq 1 ]; then tag_FLAC_needed=1; fi
- outExt="flac"
- toolCodec="${outExt}"
- outCodecParam=" flacuda --cpu-threads ${CPU_NUMBER} -8 -o %f -"
- [ ${outCodecLevel} -eq 1 ] && outCodecParam=" flacuda -1 -o %f -"
- [ ${outCodecLevel} -eq 2 ] && outCodecParam=" flacuda -4 -o %f -"
- codec_OUT="flacuda"
- ;;
- "ape" )
- codec_APE_needed=1
- if [ ${putTags} -eq 1 ]; then tag_APE_needed=1; fi
- outExt="ape"
- toolCodec="${outCodec}"
- outCodecParam=" mac - %f -c5000"
- [ ${outCodecLevel} -eq 1 ] && outCodecParam=" mac - %f -c1000"
- [ ${outCodecLevel} -eq 2 ] && outCodecParam=" mac - %f -c3000"
- codec_OUT="mac"
- ;;
- "wv" )
- codec_WVp_needed=1
- if [ ${putTags} -eq 1 ]; then tag_APE_needed=1; fi
- outExt="wv"
- toolCodec="${outCodec}"
- outCodecParam=" wavpack -hh -x6 - -o %f"
- [ ${outCodecLevel} -eq 1 ] && outCodecParam=" wavpack -f - -o %f"
- [ ${outCodecLevel} -eq 2 ] && outCodecParam=" wavpack -h - -o %f"
- codec_OUT="wavpack"
- ;;
- "ofr" )
- codec_OFR_needed=1
- toolCodec="${outCodec}"
- outExt="ofr"
- codec_OUT="optimfrog"
- ;;
- "shn" )
- codec_SHN_needed=1
- toolCodec="${outCodec}"
- outExt="shn"
- codec_OUT="shorten"
- ;;
- "mp3" )
- codec_MP3_needed=1
- if [ ${putTags} -eq 1 ]; then tag_MP3_needed=1; fi
- outExt="mp3"
- toolCodec="cust"
- outCodecParam=" ext=mp3 lame -S -m j -q ${outCodecQuality}"
- if [ "${outCodecMode}" = "C" ]
- then
- outCodecParam=" ${outCodecParam} --cbr -b ${outCodecBitRate}"
- else
- outCodecParam=" ${outCodecParam} -v --vbr-new -B ${outCodecBitRate} -V ${outCodecQuality}"
- fi
- outCodecParam=" ${outCodecParam} - %f"
- codec_OUT="lame"
- ;;
- "m4a" )
- codec_M4Ae_needed=1
- if [ ${putTags} -eq 1 ]; then tag_M4A_needed=1; fi
- outExt="m4a"
- toolCodec="cust"
- outCodecParam=" ext=m4a faac"
- if [ "${outCodecMode}" = "C" ]
- then
- outCodecParam=" ${outCodecParam} -b ${outCodecBitRate}"
- else
- outCodecParam=" ${outCodecParam} -q ${outCodecQuality}"
- fi
- outCodecParam=" ${outCodecParam} -w - -o %f"
- codec_OUT="faac"
- ;;
- "ogg" )
- codec_OGGe_needed=1
- if [ ${putTags} -eq 1 ]; then tag_OGG_needed=1; fi
- outExt="ogg"
- toolCodec="cust"
- outCodecParam=" ext=ogg oggenc -Q"
- if [ "${outCodecMode}" = "C" ]
- then
- outCodecParam=" ${outCodecParam} -b ${outCodecBitRate}"
- else
- outCodecParam=" ${outCodecParam} -q ${outCodecQuality}"
- fi
- outCodecParam=" ${outCodecParam} -o %f -"
- codec_OUT="oggenc"
- ;;
- "wav" )
- outExt="wav"
- toolCodec="wav"
- putTags=0
- ;;
- * )
- print_error "Output codec '${color_cyan}${outCodec}${color_default}' not supported."
- [ ${quiteMode} -eq 0 ] && print_codecs
- return ${E_UNK_OUT_CODEC}
- ;;
- esac
- print_message "\tSetting output codec to '${color_cyan}${outCodec}${color_default}'"
- }
- check_inCodec() {
- [ ! -n "${inFile}" ] && inFile=`grep -m 1 FILE "${cueFile}" | sed -r 's/(.?*)\"(.?*)\"(.?*)/\2/g'`
- print_message "\tFile to split: '${color_cyan}${inFileDir}/${inFile}${color_default}'"
- if [ ! -e "${inFileDir}/${inFile}" ]
- then
- print_error "File '${color_cyan}${inFileDir}/${inFile}${color_default}' not founded!"
- [ ${onlyTest} -eq 0 ] && return ${E_IN_FILE_NOT_FOUND}
- fi
- inCodec="${inFile##*.}"
- inCodec=`echo ${inCodec} | tr [:upper:] [:lower:]`
- case "${inCodec}" in
- "flac" )
- codec_FLAC_needed=1
- codec_IN="flac"
- ;;
- "ape" )
- codec_APE_needed=1
- codec_IN="mac"
- ;;
- "wv" )
- codec_WVu_needed=1
- codec_IN="wvunpack"
- ;;
- "ofr" )
- codec_OFR_needed=1
- codec_IN="optimfrog"
- ;;
- "shn" )
- codec_SHN_needed=1
- codec_IN="shorten"
- ;;
- "tta" )
- codec_TTA_needed=1
- codec_IN="ttaenc"
- ;;
- "mp3" )
- codec_MP3_needed=1
- codec_IN="wav"
- inFile2WAV=1
- ;;
- "m4a" )
- codec_M4Ad_needed=1
- codec_IN="wav"
- inFile2WAV=1
- ;;
- "ogg" )
- codec_OGGe_needed=1
- codec_IN="wav"
- inFile2WAV=1
- ;;
- "wav" )
- ;;
- * )
- print_error "Input codec '${color_cyan}${inCodec}${color_default}' not supported."
- return ${E_UNK_IN_CODEC}
- ;;
- esac
- print_message "\tSetting input codec to '${color_default}${inCodec}${color_default}'"
- }
- # function for search tools
- search_tools() {
- if [ ${tool_CBP_needed} -eq 1 ]
- then
- tool_CBP=`checktool cuebreakpoints cuetools`
- [ -n "${tool_CBP}" ] || return ${E_TOOL_CBP_NOT_FOUND}
- fi
- if [ ${tool_CP_needed} -eq 1 ]
- then
- tool_CP=`checktool cueprint cuetools`
- [ -n "${tool_CP}" ] || return ${E_TOOL_CP_NOT_FOUND}
- fi
- if [ ${tool_ST_needed} -eq 1 ]
- then
- tool_ST=`checktool shntool shntool`
- [ -n "${tool_ST}" ] || return ${E_TOOL_ST_NOT_FOUND}
- check_shntool_version || return ${E_TOOL_ST_NOT_FOUND}
- fi
- if [ ${tool_F_needed} -eq 1 ]
- then
- tool_F=`checktool file file`
- [ -n "${tool_F}" ] || return ${E_TOOL_F_NOT_FOUND}
- fi
- if [ ${tool_IC_needed} -eq 1 ]
- then
- tool_IC=`checktool iconv glibc`
- [ -n "${tool_IC}" ] || return ${E_TOOL_IC_NOT_FOUND}
- fi
- }
- # function for searching (de|en)coders
- search_dencoders() {
- if [ ${codec_WVp_needed} -eq 1 ]
- then
- codec_WVp=`checktool wavpack wavpack`
- [ -n "${codec_WVp}" ] || return ${E_CODEC_WVp_NOT_FOUND}
- fi
- if [ ${codec_WVu_needed} -eq 1 ]
- then
- codec_WVu=`checktool wvunpack wavpack`
- [ -n "${codec_WVu}" ] || return ${E_CODEC_WVu_NOT_FOUND}
- fi
- if [ ${codec_SHN_needed} -eq 1 ]
- then
- codec_SHN=`checktool shorten shorten`
- [ -n "${codec_SHN}" ] || return ${E_CODEC_SHN_NOT_FOUND}
- fi
- if [ ${codec_APE_needed} -eq 1 ]
- then
- codec_APE=`checktool mac mac`
- [ -n "${codec_APE}" ] || return ${E_CODEC_APE_NOT_FOUND}
- fi
- if [ ${codec_FLAC_needed} -eq 1 ]
- then
- codec_FLAC=`checktool flac flac`
- [ -n "${codec_FLAC}" ] || return ${E_CODEC_FLAC_NOT_FOUND}
- fi
- if [ ${codec_FLAKE_needed} -eq 1 ]
- then
- codec_FLAKE=`checktool flake flake`
- [ -n "${codec_FLAKE}" ] || return ${E_CODEC_FLAKE_NOT_FOUND}
- fi
- if [ ${codec_OFR_needed} -eq 1 ]
- then
- codec_OFR=`checktool ofr optimfrog`
- [ -n "${codec_OFR}" ] || return ${E_CODEC_OFR_NOT_FOUND}
- fi
- if [ ${codec_TTA_needed} -eq 1 ]
- then
- codec_TTA=`checktool ttaenc ttaenc`
- [ -n "${codec_TTA}" ] || return ${E_CODEC_TTA_NOT_FOUND}
- fi
- if [ ${codec_MP3_needed} -eq 1 ]
- then
- codec_MP3=`checktool lame lame`
- [ -n "${codec_MP3}" ] || return ${E_CODEC_MP3_NOT_FOUND}
- fi
- if [ ${codec_M4Ae_needed} -eq 1 ]
- then
- codec_M4Ae=`checktool faac faac`
- [ -n "${codec_M4Ae}" ] || return ${E_CODEC_M4Ae_NOT_FOUND}
- fi
- if [ ${codec_M4Ad_needed} -eq 1 ]
- then
- codec_M4Ad=`checktool faad faad`
- [ -n "${codec_M4Ad}" ] || return ${E_CODEC_M4Ad_NOT_FOUND}
- fi
- if [ ${codec_OGGd_needed} -eq 1 ]
- then
- codec_OGGd=`checktool oggdec oggdec`
- [ -n "${codec_OGGd}" ] || return ${E_CODEC_OGGd_NOT_FOUND}
- fi
- if [ ${codec_OGGe_needed} -eq 1 ]
- then
- codec_OGGe=`checktool oggenc oggenc`
- [ -n "${codec_OGGe}" ] || return ${E_CODEC_OGGe_NOT_FOUND}
- fi
- if [ ${codec_FLACUDA_needed} -eq 1 ]
- then
- codec_FLACUDA=`checktool flacuda flacuda`
- [ -n "${codec_FLACUDA}" ] || return ${E_CODEC_FLACUDA_NOT_FOUND}
- fi
- }
- # function for search taging tools
- search_tagers() {
- if [ ${tag_APE_needed} -eq 1 ]
- then
- tag_APE=`checktool apetag apetag`
- [ -n "${tag_APE}" ] || return ${E_TAG_APE_NOT_FOUND}
- fi
- if [ ${tag_FLAC_needed} -eq 1 ]
- then
- tag_FLAC=`checktool metaflac flac`
- [ -n "${tag_FLAC}" ] || return ${E_TAG_FLAC_NOT_FOUND}
- fi
- if [ ${tag_MP3_needed} -eq 1 ]
- then
- tag_MP3=`checktool id3v2 id3v2`
- [ -n "${tag_MP3}" ] || return ${E_TAG_MP3_NOT_FOUND}
- fi
- if [ ${tag_M4A_needed} -eq 1 ]
- then
- tag_M4A=`checktool mp4tags mpeg4ip-utils`
- [ -n "${tag_M4A}" ] || return ${E_TAG_M4A_NOT_FOUND}
- fi
- if [ ${tag_OGG_needed} -eq 1 ]
- then
- tag_OGG=`checktool vorbiscomment vorbis-tools`
- [ -n "${tag_OGG}" ] || return ${E_TAG_OGG_NOT_FOUND}
- fi
- }
- #function for trying codepage
- try_codepage() {
- tcp=$1
- if [ -n "${tcp}" ]
- then
- trycdp=`${tool_IC} -l | grep -i "${tcp}"`
- if [ ! -n "$trycdp" ]
- then
- print_error "Unknown codepage: '${color_cyan}${tcp}${color_default}..."
- return ${E_UNK_CODEPAGE}
- fi
- else
- return ${E_CODEPAGE_NOT_SET}
- fi
- }
- # function for geting ocale codepage
- get_local_codepage() {
- if [ -n "${LANG}" ]
- then
- locCP=`echo ${LANG} | sed -r 's/(.?*)\.(.?*)/\2/g'`
- [ ! -n "${locCP}" ] && locCP="ASCII"
- else
- locCP="ASCII"
- fi
- }
- is_file_unicode() {
- # Check for BOM simbol
- [ ! -f "$1" ] && return -1
- bom=`head -c 3 "$1"`
- [ ${bom} = $'\357\273\277' ] && return 1
- return 0
- }
- prepare_and_fix_cue() {
- is_file_unicode "${cueFile}"
- # Remove BOM record?
- if [ $? -eq 1 ]
- then
- print_message "\t${color_yellow}Fix${color_default}: Now we try to remove BOM record..."
- bnc=`basename "${cueFile}" .cue`
- ncn="${tempDirName}/${bnc}.nobom.cue"
- symbols=`cat "${cueFile}" | wc -c`
- ((symbols-=3))
- tail -c ${symbols} "${cueFile}" > "${ncn}"
- [ $? -ne 0 ] && return ${E_CANT_FIX_CUE}
- cueFile="${ncn}"
- print_message "\tNew cue sheet file name: '${color_cyan}${cueFile}${color_default}'"
- fi
- lastline=`tail -n 1 "${cueFile}" | tr -d [:blank:] | tr -d [:cntrl:]`
- if [[ "${lastline}" != "" ]]
- then
- print_message "\t${color_yellow}Fix${color_default}: Last empty line missing..."
- bnc=`basename "${cueFile}" .cue`
- ncn="${tempDirName}/${bnc}.line.cue"
- cp "${cueFile}" "${ncn}"
- echo -e "\n" >> "${ncn}"
- [ $? -ne 0 ] && return ${E_CANT_FIX_CUE}
- cueFile="${ncn}"
- print_message "\tNew cue sheet file name: '${color_cyan}${cueFile}${color_default}'"
- fi
- }
- # function for recode cue sheet file
- recode_cue() {
- isutf=""
- if [ -n "${tool_F}" ]
- then
- isutf=`${tool_F} "${cueFile}" | grep "UTF-8"`
- else
- isutf=""
- fi
- isascii=""
- if [ -n "${tool_F}" ]
- then
- isascii=`${tool_F} "${cueFile}" | grep "ASCII"`
- else
- isascii=""
- fi
- if [ -n "${isutf}" ]
- then
- print_message "\tSeems like cue sheet already in UTF-8 encoding. ${color_green}Good${color_default}! ;)"
- else
- if [ -n "${isascii}" ]
- then
- print_message "\tSeems like cue sheet in ASCII encoding. ${color_yellow}Not bad${color_default}... :|"
- [ ! -n "${fromCP}" ] && return 0
- else
- print_message "\tSeems like cue sheet not in UTF-8 encoding. ${color_red}Bad${color_default}! :("
- fi
- if [ -n "${tool_IC}" ]
- then
- if [ -n "${fromCP}" ]
- then
- get_local_codepage
- chk_error=0
- try_codepage ${fromCP}
- chk_error=$?
- [ ${chk_error} -ne 0 ] && fromCP=${locCP}
- print_message "\tNow we try to recode cue sheet to ${color_green}UTF-8${color_default} from ${color_yellow}${fromCP}${color_default}..."
- bnc=`basename "${cueFile}" .cue`
- cat "${cueFile}" | ${tool_IC} -f "${fromCP}" -t "UTF-8" > "${tempDirName}/${bnc}.utf8.cue"
- [ $? -ne 0 ] && return ${E_CANT_CONVERT_CUE}
- cueFile="${tempDirName}/${bnc}.utf8.cue"
- print_message "\tNew cue sheet file name: '${color_cyan}${cueFile}${color_default}'"
- fi
- fi
- fi
- }
- recode_to_wav() {
- inFileWAV="${inFile}.wav"
- [ ${onlyTest} -ne 0 ] && return
- errors=0
- FullPathIN="${inFileDir}/${inFile}"
- FullPathOUT="${tempDirName}/${inFileWAV}"
- print_message "\tRecoding '${color_cyan}${inFile}${color_default}' to WAV..."
- case "${inCodec}" in
- "flac" )
- flac -d -f -o "${FullPathOUT}" "${FullPathIN}"
- errors=$?
- ;;
- "ape" )
- mac "${FullPathIN}" "${FullPathOUT}" -d
- errors=$?
- ;;
- "wv" )
- wvunpack -y -o "${FullPathOUT}" "${FullPathIN}"
- errors=$?
- ;;
- "ofr" )
- ;;
- "shn" )
- shorten -x "${FullPathIN}" "${FullPathOUT}"
- errors=$?
- ;;
- "tta" )
- ttaenc -d -o "${FullPathOUT}" "${FullPathIN}"
- errors=$?
- ;;
- "mp3" )
- lame -S --decode "${FullPathIN}" "${FullPathOUT}"
- errors=$?
- ;;
- "m4a" )
- faad -q -o "${FullPathOUT}" "${FullPathIN}"
- errors=$?
- ;;
- "ogg" )
- oggdec -Q --decode -o "${FullPathOUT}" "${FullPathIN}"
- errors=$?
- ;;
- "wav" )
- ;;
- * )
- print_error "Decode '${color_cyan}${inCodec}${color_default}' to WAV not supported."
- return ${E_UNK_IN_CODEC}
- ;;
- esac
- [ ${errors} -ne 0 ] && return -1
- inFile="${inFileWAV}"
- inFileDir="${tempDirName}"
- inCodec="wav"
- codec_IN="wav"
- print_message "\tSetting new input file to '${color_cyan}${inFile}${color_default}'"
- }
- # function for split condition
- split_cond() {
- tlc=$1
- ttl="$2"
- (( tlc < tags_ALBUM_TRACKS )) && return 0
- [ ! -n "${ttl}" ] && return 0
- return 1
- }
- # function for image splitting
- split_image() {
- runopt=""
- [ ${quiteMode} -ne 0 ] && runopt="-q"
- file_splitlog="${tempDirName}/split.log"
- file_splitlogwork="${file_splitlog}.work"
- err=0
- _outCodecOpts=""
- if [ ${onlyTest} -eq 0 ]
- then
- _outCodecOpts="${toolCodec}${outCodecParam}"
- else
- [ ${splitInTest} -eq 0 ] && return 0
- _outCodecOpts="null"
- fi
- cd "${inFileDir}"
- ${tool_CBP} "${cueFile}" | ${tool_ST} split ${runopt} -d "${tempDirName}" -O always -t %n ${inCodecParam} -o "${_outCodecOpts}" "./${inFile}" &> "${file_splitlog}" &
- disown %1
- cd "${OLDPWD}"
- lc=0
- tl=""
- cl=""
- llc=${lc}
- lw=0
- split_cond ${lc} "${tl}"
- sc=$?
- while [ ${sc} -eq 0 ]
- do
- if [ -e "${file_splitlog}" ]
- then
- cp "${file_splitlog}" "${file_splitlogwork}"
- cl=`tail -n 1 "${file_splitlogwork}" | awk 'BEGIN {FS="\b\b\b\b\b"} { if ( NF > 1 ) print $1, $NF; else print $1}' | sed -e 's/\ \ 0%\ \ //g' -e 's/Splitting\ //g'`
- if [ -n "${cl}" ]
- then
- llc=${lc}
- lc=`cat "${file_splitlogwork}" | wc -l`
- ((lc++))
- spl=`echo ${cl} | tr -d [:cntrl:] | awk 'BEGIN {FS=" : "} {print $1}' | sed -e "s:${tempDirName}/::g" -e "s:\./::g"`
- prc=`echo ${cl} | awk 'BEGIN {FS=" : "} {print $2}'`
- if (( lc <= tags_ALBUM_TRACKS ))
- then
- bs="\b"
- for ((i=1;i<lw;i++))
- do
- bs="${bs}\b"
- done
- if (( llc != lc ))
- then
- if (( lc > 1 ))
- then
- print_message "${bs}${color_green}100%${color_default}"
- else
- print_message ""
- fi
- print_message -n "Track ${color_green}${lc}${color_default}: ${spl} : ${color_yellow}${prc}${color_default}"
- lw=${#prc}
- else
- print_message -n "${bs}${color_yellow}${prc}${color_default}"
- lw=${#prc}
- fi
- set_xterm_title "Splitting Track ${lc} of ${tags_ALBUM_TRACKS}, Progress: ${prc}"
- else
- print_message "${bs}${color_green}100%${color_default}"
- fi
- fi
- tl=`echo "${cl}" | grep "100% OK"`
- split_cond ${lc} "${tl}"
- sc=$?
- fi
- str=`ps ax | grep shntool | grep -v grep`
- if [[ "${str}" == "" ]]
- then
- if [ ${sc} -eq 0 ]
- then
- # err=1
- sc=1
- fi
- fi
- sleep 1s
- done
- if [ ${err} -ne 0 ]
- then
- print_error "Some error occured while spliting file '${color_cyan}${inFileDir}/${inFile}${color_default}'!"
- return ${E_CANT_SPLIT}
- fi
- }
- # function for reading album info
- read_album_info() {
- test=`${tool_CP} -d %N "${cueFile}" 2>&1 | grep error`
- if [ -n "${test}" ]
- then
- print_error "Some error occured while reading CUE sheet!"
- return ${E_CANT_READ_CUE}
- fi
- if [ ! -n "${pre_ALBUM_PERFORMER}" ]
- then
- tags_ALBUM_PERFORMER=`${tool_CP} -d %P "${cueFile}"`
- else
- tags_ALBUM_PERFORMER=${pre_ALBUM_PERFORMER}
- fi
- print_message "\tAlbum Performer = ${color_cyan}${tags_ALBUM_PERFORMER}${color_default}"
- if [ ! -n "${pre_ALBUM_COMPOSER}" ]
- then
- tags_ALBUM_COMPOSER=`${tool_CP} -d %C "${cueFile}"`
- else
- tags_ALBUM_COMPOSER=${pre_ALBUM_COMPOSER}
- fi
- [ -n "${tags_ALBUM_COMPOSER}" ] && print_message "\tAlbum Performer = ${color_cyan}${tags_ALBUM_PERFORMER}${color_default}"
- if [ ! -n "${pre_ALBUM_TITLE}" ]
- then
- tags_ALBUM_TITLE=`${tool_CP} -d %T "${cueFile}"`
- else
- tags_ALBUM_TITLE=${pre_ALBUM_TITLE}
- fi
- print_message "\tAlbum Title = ${color_cyan}${tags_ALBUM_TITLE}${color_default}"
- if [ ! -n "${pre_ALBUM_GENRE}" ]
- then
- tags_ALBUM_GENRE=`${tool_CP} -d %G "${cueFile}"`
- else
- tags_ALBUM_GENRE=${pre_ALBUM_GENRE}
- fi
- [ -n "${tags_ALBUM_GENRE}" ] || tags_ALBUM_GENRE=`grep -m 1 GENRE "${cueFile}" | sed -r -e 's/.?*REM\ GENRE\ (.?*)/\1/g' -e 's:"::g' | tr -d [:cntrl:]`
- [ -n "${tags_ALBUM_GENRE}" ] || tags_ALBUM_GENRE="Other"
- print_message "\tAlbum Genre = ${color_cyan}${tags_ALBUM_GENRE}${color_default}"
- [ -n "${pre_ALBUM_NUMBER}" ] && tags_ALBUM_NUMBER=${pre_ALBUM_NUMBER}
- [ -n "${tags_ALBUM_NUMBER}" ] && print_message "\tAlbum Disc Number = ${color_cyan}${tags_ALBUM_NUMBER}${color_default}"
- [ -n "${pre_ALBUM_DISCID}" ] && tags_ALBUM_DISCID=${pre_ALBUM_DISCID}
- [ -n "${tags_ALBUM_DISCID}" ] || tags_ALBUM_DISCID=`grep -m 1 DISCID "${cueFile}" | sed -r -e 's/.?*REM\ DISCID\ (.?*)/\1/g' -e 's:"::g' | tr -d [:cntrl:]`
- [ -n "${tags_ALBUM_DISCID}" ] && print_message "\tAlbum Disc ID = ${color_cyan}${tags_ALBUM_DISCID}${color_default}"
- if [ ! -n "${pre_ALBUM_DATE}" ]
- then
- tags_ALBUM_DATE=`grep -m 1 DATE "${cueFile}" | sed -r -e 's/.?*REM\ DATE\ (\d)/\1/g' -e 's:"::g' | tr -d [:cntrl:] | tr -d " " | tr -d [:alpha:]`
- else
- tags_ALBUM_DATE=${pre_ALBUM_DATE}
- fi
- [ -n "${tags_ALBUM_DATE}" ] || tags_ALBUM_DATE=0000
- print_message "\tAlbum Date = ${color_cyan}${tags_ALBUM_DATE}${color_default}"
- tags_ALBUM_TRACKS=`${tool_CP} -d %N "${cueFile}"`
- print_message "\tNumber of Tracks = ${color_cyan}${tags_ALBUM_TRACKS}${color_default}"
- }
- # function for track taging
- tag_track() {
- case "${outCodec}" in
- "flac" | "flake" | "flacuda" )
- if [ ${onlyTest} -eq 0 ]
- then
- optional=""
- [ -n "${tags_ALBUM_DISCID}" ] && optional="${optional} --set-tag=DISCID=${tags_ALBUM_DISCID}"
- [ -n "${tags_ALBUM_NUMBER}" ] && optional="${optional} --set-tag=DISCNUMBER=${tags_ALBUM_NUMBER}"
- [ -n "${tags_TRACK_COMPOSER}" ] && optional="${optional} --set-tag=COMPOSER=${tags_TRACK_COMPOSER}"
- ${tag_FLAC} \
- --set-tag="TITLE=${tags_TRACK_TITLE}" \
- --set-tag="ALBUM=${tags_ALBUM_TITLE}" \
- --set-tag="ARTIST=${tags_TRACK_PERFORMER}" \
- --set-tag="DATE=${tags_ALBUM_DATE}" \
- --set-tag="TRACKNUMBER=${tags_TRACK_ZNUMBER}" \
- --set-tag="GENRE=${tags_TRACK_GENRE}" \
- --set-tag="COMMENT=${NAME} v${VER}" \
- ${optional} \
- "${tempDirName}/${tags_TRACK_ZNUMBER}.${outExt}" &>/dev/null
- if [ $? -ne 0 ]
- then
- print_error "Cant tag '${color_cyan}${tempDirName}/${tags_TRACK_ZNUMBER}.${outExt}${color_default}'"
- return ${E_CANT_TAG_FLAC}
- fi
- fi
- ;;
- "ape" | "wv" )
- if [ ${onlyTest} -eq 0 ]
- then
- [ -n "${tags_ALBUM_DISCID}" ] && optional="${optional} -p DISCID=${tags_ALBUM_DISCID}"
- [ -n "${tags_ALBUM_NUMBER}" ] && optional="${optional} -p MEDIA=${tags_ALBUM_NUMBER}"
- [ -n "${tags_TRACK_COMPOSER}" ] && optional="${optional} -p COMPOSER=${tags_TRACK_COMPOSER}"
- ${tag_APE} -i "${tempDirName}/${tags_TRACK_ZNUMBER}.${outExt}" -m update \
- -p TITLE="${tags_TRACK_TITLE}" \
- -p ALBUM="${tags_ALBUM_TITLE}" \
- -p ARTIST="${tags_TRACK_PERFORMER}" \
- -p YEAR="${tags_ALBUM_DATE}" \
- -p TRACK="${tags_TRACK_ZNUMBER}" \
- -p GENRE="${tags_TRACK_GENRE}" \
- ${optional} \
- -p COMMENT="${NAME} v${VER}" &>/dev/null
- if [ $? -ne 0 ]
- then
- print_error "Cant tag '${color_cyan}${tempDirName}/${tags_TRACK_ZNUMBER}.${outExt}${color_default}'"
- return ${E_CANT_TAG_APE}
- fi
- fi
- ;;
- "mp3" )
- if [ ${onlyTest} -eq 0 ]
- then
- gn=`${tag_MP3} -L | grep -E -e "(.?*): ${tags_TRACK_GENRE}$" | awk '{print $1}' | sed -e 's/://g' -e 's/\ //g'`
- [ ! -n "${gn}" ] && gn=12
- ${tag_MP3} -2 \
- -t "${tags_TRACK_TITLE}" \
- -A "${tags_ALBUM_TITLE}" \
- -a "${tags_TRACK_PERFORMER}" \
- -y "${tags_ALBUM_DATE}" \
- -T "${tags_TRACK_ZNUMBER}" \
- -g "${gn}" \
- -c "${NAME} v${VER}" \
- "${tempDirName}/${tags_TRACK_ZNUMBER}.${outExt}" &>/dev/null
- if [ $? -ne 0 ]
- then
- print_error "Cant tag '${color_cyan}${tempDirName}/${tags_TRACK_ZNUMBER}.${outExt}${color_default}'"
- return ${E_CANT_TAG_MP3}
- fi
- fi
- ;;
- "ogg" )
- if [ ${onlyTest} -eq 0 ]
- then
- optional=""
- [ -n "${tags_ALBUM_DISCID}" ] && optional="${optional} -t DISCID=${tags_ALBUM_DISCID}"
- [ -n "${tags_ALBUM_NUMBER}" ] && optional="${optional} -t DISCNUMBER=${tags_ALBUM_NUMBER}"
- [ -n "${tags_TRACK_COMPOSER}" ] && optional="${optional} -t COMPOSER=${tags_TRACK_COMPOSER}"
- ${tag_OGG} -w \
- -t TITLE="${tags_TRACK_TITLE}" \
- -t ALBUM="${tags_ALBUM_TITLE}" \
- -t ARTIST="${tags_TRACK_PERFORMER}" \
- -t DATE="${tags_ALBUM_DATE}" \
- -t TRACKNUMBER="${tags_TRACK_ZNUMBER}" \
- -t GENRE="${tags_TRACK_GENRE}" \
- -t COMMENT="${NAME} v${VER}" \
- ${optional} \
- "${tempDirName}/${tags_TRACK_ZNUMBER}.${outExt}" &>/dev/null
- if [ $? -ne 0 ]
- then
- print_error "Cant tag '${color_cyan}${tempDirName}/${tags_TRACK_ZNUMBER}.${outExt}${color_default}'"
- return ${E_CANT_TAG_OGG}
- fi
- fi
- ;;
- "m4a" )
- if [ ${onlyTest} -eq 0 ]
- then
- optional=""
- optionalComment=""
- [ -n "${tags_ALBUM_DISCID}" ] && optionalComment="${optionalComment}, DISCID=${tags_ALBUM_DISCID}"
- [ -n "${tags_ALBUM_NUMBER}" ] && optionalComment="${optional} -disk ${tags_ALBUM_NUMBER}"
- [ -n "${tags_TRACK_COMPOSER}" ] && optional="${optional} -writer ${tags_TRACK_COMPOSER}"
- ${tag_M4A} \
- -song "${tags_TRACK_TITLE}" \
- -album "${tags_ALBUM_TITLE}" \
- -artist "${tags_TRACK_PERFORMER}" \
- -year "${tags_ALBUM_DATE}" \
- -track "${tags_TRACK_NUMBER}" \
- -tracks "${tags_ALBUM_TRACKS}" \
- -genre "${tags_TRACK_GENRE}" \
- -comment "${NAME} v${VER}${optionalComment}" \
- ${optional} \
- "${tempDirName}/${tags_TRACK_ZNUMBER}.${outExt}" # &>/dev/null
- if [ $? -ne 0 ]
- then
- print_error "Cant tag '${color_cyan}${tempDirName}/${tags_TRACK_ZNUMBER}.${outExt}${color_default}'"
- return ${E_CANT_TAG_M4A}
- fi
- fi
- ;;
- esac
- }
- # function for decode naming scheme with bash
- get_out_file_name() {
- temp_AT=${tags_ALBUM_TITLE//\//\\}
- temp_AP=${tags_ALBUM_PERFORMER//\//\\}
- temp_AG=${tags_ALBUM_GENRE//\//\\}
- temp_AD=${tags_ALBUM_DATE//\//\\}
- temp_TT=${tags_TRACK_TITLE//\//\\}
- temp_TP=${tags_TRACK_PERFORMER//\//\\}
- temp_TG=${tags_TRACK_GENRE//\//\\}
- tstr="${outFormatStr}.${outExt}"
- tstr=${tstr//\%A/${temp_AT}}
- tstr=${tstr//\%G/${temp_AG}}
- tstr=${tstr//\%P/${temp_AP}}
- tstr=${tstr//\%D/${temp_AD}}
- tstr=${tstr//\%t/${temp_TT}}
- tstr=${tstr//\%p/${temp_TP}}
- tstr=${tstr//\%g/${temp_TG}}
- tstr=${tstr//\%n/${tags_TRACK_NUMBER}}
- tstr=${tstr//\%N/${tags_TRACK_ZNUMBER}}
- tstr=${tstr//\%a/${tags_ALBUM_NUMBER}}
- echo ${tstr}
- }
- # function for track moving
- move_track() {
- outFileName=`get_out_file_name`
- outDirName=`dirname "${outFileName}"`
- print_message -n " to '${color_cyan}${outFileName}${color_default}'..."
- if [ ${onlyTest} -eq 0 ]
- then
- if [ ! -d "${outDirName}" ]
- then
- mkdir -p "${outDirName}"
- [ $? -eq 0 ] || return ${E_CANT_MKDIR}
- fi
- mv "${tempDirName}/${tags_TRACK_ZNUMBER}.${outExt}" "${outFileName}"
- [ $? -eq 0 ] || return ${E_CANT_MOVE_FILE}
- fi
- }
- # function for tracks processing
- process_tracks() {
- [[ "${tags_ALBUM_TRACKS}" == "" || "${tags_ALBUM_TRACKS}" == "0" ]] && return ${E_WRONG_NUM_TRACKS}
- for (( i=1; i<=${tags_ALBUM_TRACKS}; i++ )) {
- if (( $i < 10 ))
- then
- tags_TRACK_ZNUMBER="0$i"
- else
- tags_TRACK_ZNUMBER="$i"
- fi
- tags_TRACK_NUMBER="$i"
- set_xterm_title "Processing ${tags_TRACK_NUMBER} of ${tags_ALBUM_TRACKS} [pre]"
- tags_TRACK_TITLE=`${tool_CP} -n $i -t %t "${cueFile}"`
- tags_TRACK_PERFORMER=`${tool_CP} -n $i -t %p "${cueFile}"`
- tags_TRACK_COMPOSER=`${tool_CP} -n $i -t %c "${cueFile}"`
- tags_TRACK_GENRE=`${tool_CP} -n $i -t %g "${cueFile}"`
- print_message "\tTrack ${color_green}${tags_TRACK_NUMBER}${color_default}: ${color_magenta}${tags_TRACK_TITLE}${color_default}"
- if [[ "${tags_TRACK_PERFORMER}" != "${tags_ALBUM_PERFORMER}" && "${tags_TRACK_PERFORMER}" != "" ]]
- then
- print_message "\t\tPerformer: ${tags_TRACK_PERFORMER}"
- else
- tags_TRACK_PERFORMER=${tags_ALBUM_PERFORMER}
- fi
- if [[ "${tags_TRACK_COMPOSER}" != "${tags_ALBUM_COMPOSER}" && "${tags_TRACK_COMPOSER}" != "" ]]
- then
- print_message "\t\tComposer: ${tags_TRACK_COMPOSER}"
- else
- tags_TRACK_COMPOSER=${tags_ALBUM_COMPOSER}
- fi
- if [[ "${tags_TRACK_GENRE}" != "${tags_ALBUM_GENRE}" && "${tags_TRACK_GENRE}" != "" ]]
- then
- print_message "\t\tGenre: ${tags_TRACK_GENRE}"
- else
- tags_TRACK_GENRE=${tags_ALBUM_GENRE}
- fi
- if [ ${putTags} -eq 1 ]
- then
- set_xterm_title "Processing ${tags_TRACK_NUMBER} of ${tags_ALBUM_TRACKS} [tag]"
- print_message -n "\t${color_green}*${color_default} Taging..."
- chk_error=0
- tag_track
- chk_error=$?
- if [ ${chk_error} -eq 0 ]
- then
- print_message "\t[${color_green}ok${color_default}]."
- else
- print_message "\t[${color_red}failed${color_default}]"
- [ ${onlyTest} -eq 0 ] && return ${chk_error}
- fi
- fi
- print_message -n "\t${color_green}*${color_default} Moving..."
- set_xterm_title "Processing ${tags_TRACK_NUMBER} of ${tags_ALBUM_TRACKS} [move]"
- chk_error=0
- move_track
- chk_error=$?
- if [ ${chk_error} -eq 0 ]
- then
- print_message "\t[${color_green}ok${color_default}]."
- else
- print_message "\t[${color_red}failed${color_default}]"
- [ ${onlyTest} -eq 0 ] && return ${chk_error}
- fi
- }
- }
- # function called on exit
- onexit() {
- echo ""
- str=`ps ax | grep shntool | grep -v grep`
- if [ -n "${str}" ]
- then
- killall -Iq ${codec_OUT}
- killall -Iq ${codec_IN}
- killall -Iq shntool
- killall -Iq cuebreackpoints
- fi
- if [[ "${tempDirName}" != "." ]]
- then
- [ -d "${tempDirName}" ] && rm -rf "${tempDirName}"
- else
- rm -f "${file_splitlog}" "${file_splitlogwork}"
- fi
- ${PROMPT_COMMAND}
- [[ "$1" == "halt" ]] && exit ${E_UNK}
- ecode=$1
- [ ! -n "${ecode}" ] && ecode=0
- exit ${ecode}
- }
- onhalt() {
- print_message "\n${color_red}Halted!${color_default}"
- onexit halt
- }
- run_section() {
- title=$1
- func=$2
- msg=$3
- set_xterm_title "${title}"
- print_message "${color_yellow}${title}${color_default}"
- chk_error=0
- ${func}
- chk_error=$?
- if [ ${chk_error} -ne 0 ]
- then
- [ ${onlyTest} -eq 0 ] && onexit ${chk_error}
- fi
- print_message "${msg}"
- }
- # --== MAIN PROGRAM ==--
- while getopts ":CXRVc:f:o:dD:G:l:qsn:Q:M:B:I:i:hA:P:K:N:W" Option
- do
- case ${Option} in
- W )
- inFile2WAV=1
- ;;
- C )
- useColors=1
- ;;
- X )
- useXTitle=1
- ;;
- c )
- outCodec=`echo ${OPTARG} | tr [:upper:] [:lower:]`
- ;;
- f )
- fromCP=${OPTARG}
- tool_F_needed=1
- tool_IC_needed=1
- ;;
- o )
- outFormatStr=${OPTARG}
- ;;
- d )
- putTags=0
- ;;
- R )
- onlyTest=0
- ;;
- V )
- print_version
- onexit
- ;;
- A )
- pre_ALBUM_TITLE="${OPTARG}"
- ;;
- P )
- pre_ALBUM_PERFORMER="${OPTARG}"
- ;;
- K )
- pre_ALBUM_COMPOSER="${OPTARG}"
- ;;
- D )
- pre_ALBUM_DATE="${OPTARG}"
- ;;
- G )
- pre_ALBUM_GENRE="${OPTARG}"
- ;;
- N )
- pre_ALBUM_NUMBER=${OPTARG}
- ;;
- I )
- pre_ALBUM_DISCID="${OPTARG}"
- ;;
- l )
- outCodecLevel=`echo ${OPTARG} | tr [:upper:] [:lower:]`
- ;;
- q )
- quiteMode=1
- ;;
- s )
- splitInTest=1
- ;;
- n )
- niceness=`echo ${OPTARG} | sed -r 's/[^-0-9](.?*)$//'`
- (( ${niceness} < -19 )) && niceness=-19
- (( ${niceness} > 19 )) && niceness=19
- ;;
- Q )
- outCodecQuality=`echo ${OPTARG} | sed -r 's/[^-0-9](.?*)$//'`
- (( ${outCodecQuality} < -1 )) && outCodecQuality=-1
- (( ${outCodecQuality} > 10 )) && outCodecQuality=10
- outCodecLevel=3
- ;;
- M )
- outCodecMode=`echo ${OPTARG} | tr [:lower:] [:upper:]`
- if [[ "${outCodecMode}" != "C" && "${outCodecMode}" != "V" ]]
- then
- outCodecMode="V"
- fi
- ;;
- B )
- outCodecBitRate=`echo ${OPTARG} | sed -r 's/[^-0-9](.?*)$//'`
- (( ${outCodecBitRate} < 32 )) && outCodecBitRate=32
- (( ${outCodecBitRate} > 500 )) && outCodecBitRate=500
- outCodecLevel=3
- ;;
- i )
- inFile=${OPTARG}
- ;;
- h )
- print_help
- onexit
- ;;
- * ) print_error "Unimplemented option chosen." ;; # DEFAULT
- esac
- done
- # Reset all colors to None
- if [ ${useColors} -eq 0 ]
- then
- color_default=""
- color_red=""
- color_green=""
- color_yellow=""
- color_cyan=""
- color_magenta=""
- fi
- # --== Check options ==--
- if [ $# -eq "$NO_ARGS" ] # Script invoked with no command-line args?
- then
- print_help
- onexit $E_OPTERROR # Exit and explain usage, if no argument(s) given.
- fi
- shift $(($OPTIND - 1))
- set_xterm_title "Starting..."
- cueFile="$1"
- if [ ! -n "${cueFile}" ]
- then
- print_help
- exit $E_OPTERROR
- fi
- print_info
- trap onhalt SIGTERM
- trap onhalt SIGKILL
- trap onhalt SIGINT
- [ ! ${niceness} -eq 0 ] && print_message "\tSetting niceness level to '${color_yellow}${niceness}${color_default}'\n"
- renice ${niceness} $$ &>/dev/null
- if [[ ! -e "${cueFile}" || ! -f "${cueFile}" ]]
- then
- print_error "File '${color_cyan}${cueFile}${color_default}' dont exists or not a regular file!"
- onexit ${E_NOT_CUE_FILE}
- fi
- if [ -n "${inFile}" ]
- then
- if [ -e "${inFile}" ]
- then
- inFileDir=`dirname "${inFile}"`
- inFile=`basename "${inFile}"`
- else
- print_error "File '${inFile}' not found! Setting to default path..."
- inFile=""
- fi
- else
- inFileDir=`dirname "${cueFile}"`
- fi
- [[ "${inFileDir}" == "." ]] && inFileDir=`pwd`
- tempDirName=`mktemp -q -d /tmp/${scriptName}-XXXXXX`
- [ -n "${tempDirName}" ] || tempDirName="."
- testformat=`echo ${outFormatStr} | sed -e 's:%n::' -e 's:%N::' -e 's:%t::'`
- if [[ "${outFormatStr}" == "${testformat}" ]]
- then
- print_error "Put any of '%n, %N, %t' changable tag descriptors or file writing errors may be occured! Setting to default '%N'..."
- outFormatStr="%N"
- fi
- run_section "Searching for tools..." search_tools
- run_section "Fixing CUE if needed..." prepare_and_fix_cue
- run_section "Recode CUE if needed..." recode_cue
- # setup quality
- _echoCodecLevel=""
- case ${outCodecLevel} in
- "best" | 0 )
- outCodecLevel=0
- _echoCodecLevel="best"
- case ${outCodec} in
- "mp3" )
- outCodecMode="V"
- outCodecQuality=0
- ;;
- "ogg" )
- outCodecMode="V"
- outCodecQuality=10
- ;;
- "m4a" )
- outCodecMode="V"
- outCodecQuality=500
- ;;
- esac
- ;;
- "fast" | 1 )
- outCodecLevel=1
- _echoCodecLevel="fast"
- case ${outCodec} in
- "mp3" )
- outCodecMode="V"
- outCodecQuality=7
- ;;
- "ogg" )
- outCodecMode="V"
- outCodecQuality=1
- ;;
- "m4a" )
- outCodecMode="V"
- outCodecQuality=20
- ;;
- esac
- ;;
- "mid" | 2 )
- outCodecLevel=2
- _echoCodecLevel="mid"
- case ${outCodec} in
- "mp3" )
- outCodecMode="V"
- outCodecQuality=2
- ;;
- "ogg" )
- outCodecMode="V"
- outCodecQuality=6
- ;;
- "m4a" )
- outCodecMode="V"
- outCodecQuality=192
- ;;
- esac
- ;;
- "custom" | 3 )
- outCodecLevel=3
- _echoCodecLevel="custom"
- ;;
- * )
- print_error "Unknown compression level '${outCodecLevel}'..."
- print_levels
- outCodecLevel=0
- _echoCodecLevel="best"
- ;;
- esac
- # setup codecs quality limits
- case "${outCodec}" in
- "mp3")
- (( ${outCodecQuality} < 0 )) && outCodecQuality=0
- (( ${outCodecQuality} > 9 )) && outCodecQuality=9
- if (( ${outCodecBitRate} > 256 ))
- then
- outCodecBitRate=320
- elif (( ${outCodecBitRate} > 192 ))
- then
- outCodecBitRate=256
- elif (( ${outCodecBitRate} > 128 ))
- then
- outCodecBitRate=192
- elif (( ${outCodecBitRate} > 96 ))
- then
- outCodecBitRate=128
- elif (( ${outCodecBitRate} > 64 ))
- then
- outCodecBitRate=96
- elif (( ${outCodecBitRate} > 32 ))
- then
- outCodecBitRate=64
- else
- outCodecBitRate=32
- fi
- ;;
- "m4a")
- (( ${outCodecQuality} < 10 )) && outCodecQuality=10
- (( ${outCodecQuality} > 500 )) && outCodecQuality=500
- (( ${outCodecBitRate} < 10 )) && outCodecBitRate=10
- (( ${outCodecBitRate} > 500 )) && outCodecBitRate=500
- ;;
- "ogg")
- (( ${outCodecQuality} < -1 )) && outCodecQuality=-1
- (( ${outCodecQuality} > 10 )) && outCodecQuality=10
- (( ${outCodecBitRate} < 32 )) && outCodecBitRate=32
- (( ${outCodecBitRate} > 500 )) && outCodecBitRate=500
- ;;
- esac
- run_section "Check output codec..." check_outCodec "\tSetting output codec compression level to '${color_yellow}${_echoCodecLevel}${color_default}'\n"
- run_section "Check input codec..." check_inCodec
- run_section "Searching for encoder/decoder tools..." search_dencoders
- if [ ${putTags} -eq 1 ]
- then
- run_section "Searching for taging tools..." search_tagers
- fi
- run_section "Reading album info..." read_album_info
- [ ${inFile2WAV} -ne 0 ] && run_section "Recode to WAV..." recode_to_wav
- run_section "Start splitting..." split_image
- run_section "Processing tracks..." process_tracks
- if [ ${onlyTest} -eq 1 ]
- then
- print_message "\n${color_magenta}${NAME} executed in testing mode! To get real work rerun it with -R option.${color_default}"
- fi
- onexit
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement