rss logo

Bash script to cut first and last 15 seconds audio files

Here is a Bourne Shell script that I use to automatically cut the first and the last 15 seconds of mp3 files. Indeed I download mp3 podcast which include advertising at the beginning and at the end of the file.

vlc playing Jimmy Hendrix Live at Woodstock

Configuration

Code

#! /bin/bash

# auto-mp3-cut.sh version 1.0
# 2018.10.27  shebangthedolphins.net first version
#---------------------------------------------------
# this script automatically cut mp3 audio files
# needs mediainfo to work
#---------------------------------------------------

## If no arguments found
option_found=0

#Functions
FunctionDuration()
{
        duration_source=$(mediainfo "$1" | grep Duration | head -n 1 | cut -d ":" -f2 | sed 's/[a-z]//g' | tr -s ' ' | sed -e 's/^\s//' -e 's/\s$//'  -e 's/\s/:/g') #get the duration thanks to mediainfo command
        duration_temp=$(date -d "1983-12-12 00:$duration_source" +%s) #create a fake date, here only $duration_source is important
        duration_diff=$(( (duration_temp - 15) ))
        duration_dest=$(date -d"@$duration_diff" "+%M:%S") #calculate the new time thanks to date command
}

usage()
{
        echo "usage: ./auto-mp3-cut.sh -d [DIRECTORY_TO_WORK]"
        echo "ex : ./auto-mp3-cut.sh -d /tmp/mp3/"
        echo ""
        exit 3
}

while getopts d: OPTNAME; do
        case "$OPTNAME" in
        d)
                ROOT="$OPTARG"
                option_found=1
                ;;

        *)
                usage
                ;;
        esac
done

if [ "$option_found" -eq "0" ] || [ -d "ROOT" ] ; then
        usage
fi

FOLDER=$(echo "$ROOT" | sed 's/\/$//') #remove "/" if present at the end of the ROOT variable

cd "$ROOT"                 #go to the destination folder
rc=$?; if [[ $rc != 0 ]]; then echo "ERROR : directory doesn't exist"; exit $rc; fi #exit if directory is not found

for i in *3; do			#for each mp3 file
        i="${i%.[mM][Pp]3}"     #we remove .mp3 from the file name
        ffmpeg -y -ss 15 -i "$i".[mM][Pp]3 -acodec copy -async 1 "$i"_NEW.mp3   #we cut 15 s from the beginning and create temporary NEW files
        FunctionDuration "$i"_NEW.mp3  #We call FunctionDuration funtion to get the mm:ss information
        ffmpeg -y -t "$duration_dest" -i "$i"_NEW.mp3 -acodec copy -async 1 "$i".mp3    #we remove 15 s from the end and replace the original file
        rm "$i"_NEW.mp3; rm "$i".MP3	#we remove the temporary NEW files
done
Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

Contact :

contact mail address