Archive

Posts Tagged ‘audio’

Convert flac and wav files to mp3

October 22nd, 2009 No comments

In case it might be useful to others, here’s a script that can be used to convert a bunch of *.wav files to *.flac and *.flac files to *.mp3. The script will first first convert all *.wav files (if any) to *.flac, then it will convert all *.flac files to *.mp3. See the usage instructions starting on line 31 below for more details.

I called the script

Watch Full Movie Online Streaming Online and Download

flac2mp3dir.sh

#!/bin/bash

# Author: Gabriel Burca (gburca dash flac2mp3dir at ebixio dot com)
# Version: 1.0
#
# Copyright (C) 2006-2009  Gabriel Burca (gburca dash flac2mp3dir at ebixio dot com)
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.


set -o nounset
set -o errexit

function usage () {
    cat << EOF
Usage:
$0 source/dir dest/dir

All wav/flac files in source/dir and its subdirectories will be converted to
mp3 and placed in dest/dir while maintaining the directory structures. ID3
tags will also be copied from flac to mp3 files.

Existing files (mp3 or flac) will not be overwritten.
Source and destination directories can be the same.

EOF
}

function absname () {
        # Returns the absolute filename of a given file or directory.
        if [ -d "$1" ] ; then   # Only a directory name.
                dir="$1"
                #unset file
                file=""
        elif [ -f "$1" ] ; then # Strip off and save the filename.
                dir=$(dirname "$1")
                file="/"$(basename "$1")
        else
                # The file did not exist.
                # Return null string as error.
                echo
                return 1
        fi
 
        # Change to the directory and display the absolute pathname.
        cd "$dir"  > /dev/null
        echo "${PWD}${file}"
}

function flac2mp3 () {
        INF="$1"
        OUTF=`echo "$INF" | sed 's/\.flac$/.mp3/'`
        PWD=`pwd`
        SUBDIR=${PWD:$SRCDIRLEN}
        #SUBDIR=${PWD#$SRCDIR}

        INF="$PWD/$INF"
        OUTF="$DESTDIR$SUBDIR/$OUTF"
        #echo "$INF ... $PWD $SRCDIRLEN $SUBDIR $OUTF"

        if [ -e "$OUTF" ] ; then
                if [ "$OUTF" -ot "$INF" ] ; then
                        echo "*** Re-converting old file: $OUTF"
                        # rm -f "$OUTF"
                else
                        echo "*** Skip flac2mp3! Output file already exists: $OUTF"
                        return
                fi
        fi

        if [ ! -e "$DESTDIR$SUBDIR" ] ; then
                mkdir -p "$DESTDIR$SUBDIR"
        fi

        # Convert flac to mp3
        echo "${INDENT}flac2mp3 Converting $INF => $OUTF"
        #touch "$OUTF"
        flac -c -d "$INF" | lame --preset standard --replaygain-accurate - "$OUTF"

        # Copy tags to new file
        id3 -D "$INF" -1 -2 "$OUTF"

        # Copy non-flac/non-wav (folder.jpg, etc...) files to dest/dir
        if [[ ! -e "$DESTDIR$SUBDIR/folder.jpg" && -e "folder.jpg" ]] ; then
                cp folder.jpg "$DESTDIR$SUBDIR"
        fi
}

function wav2mp3 () {
        INF="$1"
        OUTF=`echo "$INF" | sed 's/\.wav$/.flac/'`

        if [ -e "$OUTF" ] ; then
                echo "*** Skip wav2mp3! Output file already exists: $OUTF"
                return
        fi

        echo "${INDENT}wav2mp3 Converting $INF => $OUTF"
        #touch "$OUTF"
        flac -V -o "$OUTF" "$INF"
        flac2mp3 "$OUTF"
}

function traveldir ()
{
        dir="$1"

        pushd "$dir" > /dev/null
        echo "Entering: `pwd`"

        for a in *
        do
                if test -d "$a" ; then
                        traveldir "$a"
                else
                        if [[ `expr match "$a" '.*\\.flac$'` > 0 ]] ; then
                                flac2mp3 "$a"
                        elif [[ `expr match "$a" '.*\\.wav$'` > 0 ]] ; then
                                wav2mp3 "$a"
                        else
                                echo "${INDENT}Skipping: $a"
                        fi
                fi
        done
        popd > /dev/null
}

################################################################################
# main()
################################################################################

if [[ $# < "2" ]] ; then
        usage
        exit 1
fi

SRCDIR="$1"
DESTDIR="$2"

if [[ ! -e "$DESTDIR" ]] ; then
        mkdir -p "$DESTDIR"
fi

if [[ ! -e "$SRCDIR" ]] ; then
        echo "$SRCDIR does not exist!"
        exit 2
fi

# Get absolute directories
SRCDIR=$(absname "$SRCDIR")
DESTDIR=`absname "$DESTDIR"`

SRCDIRLEN=`expr length "$SRCDIR"`
INDENT="    "

pushd . > /dev/null
traveldir "$SRCDIR"
popd > /dev/null
Categories: Uncategorized Tags: , , , , , ,