mp3 to m4b

#!/bin/bash

## The iPod Audiobook Encoder for Linux.

## Version 1.0.5

## Created by Jaroslaw Czarniak, 21 May, 2006.

## Released under the GPL.

##

##

## Changes:

## 1.0.2

## + Files split function added

##

## 1.0.3

## e mpg123 was changed to madplay due some errors

##

## 1.0.4

## + other types support

## r wavmerge required

## r mplayer required

## + automatic batches execution

## + output files are numbered

## + input files type detection

##

## 1.0.5

## + remove merged files

## + sort files

## f decode none-mp3 files

##

## To DO:

## add cover arts

##

########################################################

# Functions

function deps()

{

check1=`which faac`

if [ "$check1" = "" ]

then

echo "* faac is missing...."

echo "Check on http://www.audiocoding.com/"

echo ""

cont="n"

fi

check2=`which id3info`

if [ "$check2" = "" ]

then

echo "* id3info is missing...."

echo "Check on http://tangent.org/index.pl?node=libID3"

echo ""

cont="n"

fi

check3=`which mp3wrap`

if [ "$check3" = "" ]

then

echo "* mp3wrap is missing...."

echo "Check on http://mp3wrap.sourceforge.net/"

echo ""

cont="n"

fi

check4=`which madplay`

if [ "$check4" = "" ]

then

echo "* madplay is missing...."

echo "Check on http://www.underbit.com/products/mad/"

echo ""

cont="n"

fi

check5=`which id3v2`

if [ "$check5" = "" ]

then

echo "id3v2 is missing...."

echo "Check on http://id3v2.sourceforge.net/"

cont="n"

fi

check1=`which wavmerge`

if [ "$check1" = "" ]

then

echo "* wavmerge is missing...."

echo "Check on http://huli.org/wavbreaker/"

echo ""

cont="n"

fi

check1=`which mplayer`

if [ "$check1" = "" ]

then

echo "* mplayer is missing...."

echo "Check on http://www.mplayerhq.hu/"

echo ""

cont="n"

fi

if [ "$cont" = "n" ]

then

space

echo "Missing dependencies..."

echo "Can't continue..."

exit 0

fi

}

function clearmeta()

{

ALBUM=""

ARTIST=""

COMMENT=""

YEAR=""

TITLE=""

GENRE=""

TRACKNUMBER=""

}

function space()

{

echo ""

echo ""

}

function getmetamp3()

{

clearmeta

test -z "$(which id3info)" && return

echo "Getting metadata from MP3"

ALBUM="$(id3info "$1" |grep ^=== TALB|head -1|sed 's/.*: //g')"

ARTIST="$(id3info "$1" |grep ^=== TPE1|head -1|sed 's/.*: //g')"

COMMENT="$(id3info "$1" |grep ^=== COMM|head -1|sed 's/.*: //g')"

YEAR="$(id3info "$1" |grep ^=== TYER|head -1|sed 's/.*: //g')"

TITLE="$(id3info "$1" |grep ^=== TIT2|head -1|sed 's/.*: //g')"

GENRE="$(id3info "$1" |grep ^=== TCON|head -1|sed 's/.*: //g')"

TRACKNUMBER="$(id3info "$1" |grep ^=== TRCK|head -1|sed 's/.*: //g')"

}

function countall()

{

for pliki in *

do

rozmiarpl=`du -b "$pliki" |tr -cs '[a-zA-Z0-9._()]' '[n*]'|head -n 1`

total=$[total + rozmiarpl]

done

echo "Total files size in this directory is $total bytes"

}

function getdata()

{

space

sugestia=`pwd | mawk '{ print test[split($0,test,"/")];}'|tr -cs '[a-zA-Z0-9n*]' '.'`

echo "Enter output file name (without extension) ($sugestia)"

read plik

#if [ -e "$outputfile" ]

#then

# echo "File exist! Suggestions enabled"

# getmetamp3 "$outputfile"

#fi

echo "Enter title (${TITLE})"

read tytul

echo "Enter artist (${ARTIST})"

read autor

#echo "Enter album (${ALBUM})"

#read album

album="$tytul"

echo "Enter year (${YEAR})"

read rok

#sleep 1

#echo "If you want to add cover art to your audiobook, please"

#echo "copy it to just created "cover" directory"

#echo "and name it as "cover.jpg" "

#(or gif or png)

#echo "Also you can copy it there before running this script."

#sleep 3

#echo "3"

#sleep 3

#echo "2"

#sleep 3

#echo "1"

#space

#read track

coment="From Sir_Yaro2006 Collection"

}

function splitfiles()

{

splitval="150000000"

if [ "$typ" = "o" ]

then

splitval="1850000000"

fi

echo "Default split value for mp3 is about 150MB (150000000 bytes)"

echo "and for other files is 1.85GB (1850000000 bytes) because they're"

echo "decoded to wav format and its up limit is 2048MB."

countall

echo ""

echo "(current split value is $splitval bytes)"

echo ""

echo "Would you like to change it? (y/n) [n]"

read question

if [ "$question" = "y" ]

then

echo "Enter new value in bytes and press enter"

read splitval

fi

#

# Split start

#

licznik="1"

suma="0"

mkdir "batch_1"

echo ""

echo "Batch no 1 created"

if [ "$typ" = "m" ]

then

for file in *.mp3

do

rozmiar=`du -b "$file" |tr -cs '[a-zA-Z0-9.()_]' '[n*]'|head -n 1`

suma=$[suma + rozmiar]

if [ "$suma" -gt "$splitval" ]

then

licznik=$[licznik + 1]

echo "Batch no $licznik created"

mkdir "batch_$licznik"

suma=0

suma=$[suma + rozmiar]

fi

mv "$file" "batch_$licznik"

done

else

for file in *.wav

do

rozmiar=`du -b "$file" |tr -cs '[a-zA-Z0-9.()_]' '[n*]'|head -n 1`

suma=$[suma + rozmiar]

if [ "$suma" -gt "$splitval" ]

then

licznik=$[licznik + 1]

echo "Batch no $licznik created"

mkdir "batch_$licznik"

suma=0

suma=$[suma + rozmiar]

fi

mv "$file" "batch_$licznik"

done

fi

echo ""

echo "$licznik batches created."

space

echo "Done."

#

# Split end

#

#

# Encode loop

#

for batch in `seq 1 $licznik`;

do

space

echo "======================"

echo "Batch no $batch in progress"

echo "======================"

# echo ""

cd batch_$batch

checktype $batch $licznik

cd ..

rmdir "batch_$batch"

done

}

function checktype()

{

#getdata

space

if [ "$typ" = "m" ]

then

encodemp3 $1 $2

else

encodeothers $1 $2

fi

}

function encodemp3()

{

outputfile=${plik}_MP3WRAP.mp3

if [ `ls -1 *mp3| wc -l` -gt "1" ]

then

mp3wrap "$plik.mp3" *mp3

else

echo "Only one file found! Making file copy"

cp *mp3 "$outputfile"

fi

space

id3v2 -D "$outputfile"

track="$1/$2"

id3v2 --artist "$autor" --album "$album" --song "$tytul" --comment "":"$coment":"PL" --genre 101 --year "$rok" --track "$track" "$outputfile"

space

m4bname="$plik.cz.$1.m4b"

getmetamp3 "$outputfile"

space

echo "================================="

id3v2 --list "$outputfile"

echo "================================="

wielkosc=`du -b "$outputfile" |tr -cs '[a-zA-Z0-9._()]' '[n*]'|head -n 1`

if [ "$wielkosc" -gt "160000000" ]

then

space

echo "$outputfile seems to be to large to convert it to wav file."

echo "due header size limitation wav files can't be bigger than 2048MB."

echo ""

wielkosc2=`du -h "$outputfile"|tr -cs '[a-zA-Z0-9.()_]' '[n*]'|head -n 1`

wielkosc3=`du -h "$outputfile"|tr -cs '[a-ln-zA-LN-Z0-9.()_]' '[n*]'|head -n 1`

echo "Your mp3 file size is $wielkosc2, and wav size will be approximately"

echo "11x bigger, which is ~$(($wielkosc3*11))MB"

echo ""

echo "I recommend you split your files into few batches and convert then separately"

space

echo "Continue anyway? (y/n) [n]"

read odp

if [ "$odp" != "y" ]

then

odp="n"

fi

fi

if [ $odp = "y" ]

then

space

nice -10 madplay -q -o wave:- "$outputfile" | nice -10 faac -w --artist "${ARTIST}" --title "${TITLE} cz.$track" --album "${ALBUM}" --year "${YEAR}" --comment "${COMMENT}" --genre "Speech" --track "${TRACKNUMBER}" -q 80 -o "$m4bname" -

# nice -10 mpg123 --rate 44100 -m -w - "$outputfile" | nice -10 faac -w --artist "${ARTIST}" --title "${TITLE} cz.$track" --album "${ALBUM}" --year "${YEAR}" --comment "${COMMENT}" --genre "Speech" --track "${TRACKNUMBER}" -q 80 -o "$m4bname" -

# --cover-art "../cover/cover.jpg"

rm -f "$outputfile"

echo "File "$outputfile" deleted"

mv "$m4bname" ../Audiobook

echo "File "$m4bname" moved to "../Audiobook" located in parent directory"

mv *mp3 ..

echo "Source mp3 files moved to parent directory"

space

echo "Batch $1 done"

space

fi

}

function encodeothers()

{

echo "Merging wave files"

echo "Please wait..."

echo ""

wavmerge -o "merged.wav" *wav

ls -l "merged.wav"

echo "Merge done"

m4bname="$plik.cz.$1.m4b"

track="$1/$2"

faac -w --artist "$autor" --title "$tytul cz.$track" --album "$album" --year "$rok" --comment "$coment" --genre "Speech" --track "$track" -q 80 -o "$m4bname" "merged.wav"

# --cover-art "../cover/cover.jpg"

#rm -f "merged.wav"

#echo "File merged.wav deleted"

mv "$m4bname" ../Audiobook

echo "File "$m4bname" moved to "../Audiobook" located in parent directory"

rm -f *wav

echo "Wav files deleted"

mv * ..

echo "Source files moved to parent directory"

space

echo "Batch $1 done"

space

}

function decode()

{

for file in *.*

do

echo "================================="

echo "Processing $file file"

echo "================================="

echo ""

mplayer -really-quiet -channels 1 -nojoystick -nolirc -nortc -vo null -vc dummy -af resample=44100 -ao pcm:waveheader:file=$file.wav "$file"

done

space

echo "================================="

echo " Done"

echo "================================="

space

}

########################################################

## Functions end

########################################################

# Variables

clear

odp="y"

cont="y"

########################################################

# Start

deps

alias ls='ls'

echo "Welcome to the iPod Audiobook Encoder for Linux"

echo "Version 1.0.5"

echo "Created by Jaroslaw Czarniak, 21 May, 2006."

echo "Released under the GPL."

rename 'y/MP /mp./' *

getdata

space

typ=`ls -1 *.* | grep -o '.[^.]*$'|head -n 1`

if [ "$1" = "o" ]

then

typ=".other"

echo "Files type forced!"

space

fi

if [ "$typ" = ".mp3" ]

then

typ="m"

echo "Mp3 files detected."

echo "You may force to encode files as none mp3"

echo "by adding "o" as a parameter of the script"

space

else

typ="o"

echo "Files other than mp3 detected."

echo -e "You may need a E[033;01;32m_LOT_E[0m (gigabytes) of disk space"

echo -e "Decoding files... E[033;01;32mPlease wait...E[0m"

echo ""

echo -e "E[033;01;32mYour interaction will be required shortlyE[0m"

space

decode

space

space

fi

echo "Split files to batches? (y/n) [y]"

read split

mkdir "Audiobook"

#mkdir "cover"

if [ "$split" != "n" ]

then

# split

splitfiles

space

echo "All done!"

space

else

# don't split

checktype

fi