Batch MP3 transcoding.


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Batch MP3 transcoding.
# 1  
Old 12-22-2008
Batch MP3 transcoding.

Hello everyone, I've made a script and I want to share and get new ideas for improving it. So far, the script

1. Searches a directory tree for MP3 files;
2. Check their bitrates;
3. Change any bitrate higher than 128 kbps to VBR 4
(It ignores files with a bitrate lower or equal to 128, as well already with variable bitrate);
4. Remove original files.

The script uses MP3Info, Gawk, and Lame. I've made it for Bash, but I think it would work in others shells too.

Here it is:
Code:
#!/bin/bash
#Script made by Eduardo Xavier - eduardoc[dot]xavier[at]yahoo[dot]com[dot]br
#Script license: GPL v3

#Makes a MP3s list in the dir, with bitrates, in "allfiles.list":
find . -name "*.mp3" -exec mp3info -r v -p "%r \"%F\"\n" '{}' \; > allfiles.list

#Filter only files with 160, 192, 224, 256 or 320 bitrates:
gawk '$1 == 160 {$1 = ""; print}
$1 == 192 {$1 = ""; print}
$1 == 224 {$1 = ""; print}
$1 == 256 {$1 = ""; print}
$1 == 320 {$1 = ""; print}' allfiles.list > onlyhigh.list

#Change the filtered files to VBR, quality 4:
gawk '{system("lame -v" $0)}' onlyhigh.list

#Remove original files. Comment the line below if you don't want this happening.
gawk '{system("rm" $0)}' onlyhigh.list

#Remove os arquivos de listas que foram feitos.
rm onlyhigh.list allfiles.list

Troubles until now:
*IDE3 tags are lost (not a great deal since I name all my MP3s with the relevant info);
*The output files are all with extension ".mp3.mp3", I want the script renaming them automatically (however, I made this with KRename).
*The script is slow. Especially in the LAME part.

Anyone got ideas?
# 2  
Old 12-22-2008
One awk command is sufficient, try this:

Code:
find . -name "*.mp3" -exec mp3info -r v -p "%r \"%F\"\n" '{}' \; | 
gawk '$1 >= 160{$1 = "";system("lame -v" $0)}'

To rename the files you can use this:

Code:
ls *.mp3.mp3 | sed 's/\(.*\)\..*/mv & \1/' | sh

Make sure you get the right files and try it first without te coloured portion.

Regards
# 3  
Old 12-23-2008
Quote:
Originally Posted by Franklin52
One awk command is sufficient, try this:

Code:
find . -name "*.mp3" -exec mp3info -r v -p "%r \"%F\"\n" '{}' \; | 
gawk '$1 >= 160{$1 = "";system("lame -v" $0)}'

To rename the files you can use this:

Code:
ls *.mp3.mp3 | sed 's/\(.*\)\..*/mv & \1/' | sh

Make sure you get the right files and try it first without te coloured portion.

Regards
Thank you!

I was a bit afraid telling the gawk ">= 160", because I didn't know what it would do for non-number strings (as "variable").

Now the code is much simpler... I've tested it, the awk part works nice.

The renaming part, as you posted, wasn't working for file names with spaces; some quotes made the job Smilie . The last pipe was really needed for interpreting as a command.

Code:
find *.mp3.mp3 | sed 's/\(.*\)\..*/mv -f "&" "\1"/' | sh

The over-consuming step - LAME - still remains, but I think it can't be helped...

Just for curiosity... I've noticed that the find command works in a random order, not alphabetically, is this correct?

Regards!
[hr]
EDIT: Contrary what I said before... for gawk, "variable" >= 160. I changed the "more or equal" again to "exactly equal"... here's the code:

Code:
#!/bin/bash

find . -name "*.mp3" -exec mp3info -r v -p "%r \"%F\"\n" '{}' \; |
gawk '$1 == 160{$1 = "";system("lame -v" $0)}
$1 == 192{$1 = "";system("lame -v" $0)}
$1 == 256{$1 = "";system("lame -v" $0)}
$1 == 320{$1 = "";system("lame -v" $0)}'

find *.mp3.mp3 | sed 's/\(.*\)\..*/mv -f "&" "\1"/' | sh
echo UFA, TERMINOU =D


Last edited by lvxferre; 12-23-2008 at 02:01 PM.. Reason: Adicional info.
# 4  
Old 12-23-2008
Find has no option to sort the result, why don't you use ls instead of find or sort to sort the result?
Edit: I don't see any reason to sort the result of the find command here.

Regards

Last edited by Franklin52; 12-23-2008 at 02:25 PM..
Login or Register to Ask a Question

Previous Thread | Next Thread

5 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Executing a batch of files within a shell script with option to refire the individual files in batch

Hello everyone. I am new to shell scripting and i am required to create a shell script, the purpose of which i will explain below. I am on a solaris server btw. Before delving into the requirements, i will give youse an overview of what is currently in place and its purpose. ... (2 Replies)
Discussion started by: goddevil
2 Replies

2. Shell Programming and Scripting

Check file is mp3

Hello, I am trying to check if a file is an mp3. file -b file_path g ives me AUDIO for many MP3 but there are many working MP3 files that return something else. How can I get better result? Thank you (2 Replies)
Discussion started by: JCR
2 Replies

3. UNIX for Dummies Questions & Answers

mp3 codec

I just need a mp3 codec that will decode mp3s so I can play them with my media player (probably going to be using XMMS) (0 Replies)
Discussion started by: Synbios
0 Replies

4. Shell Programming and Scripting

Sorting mp3

Hi all... Here's my question: -> considering i've got thousands of mp3s', named like "Artist name - Track Name", how could i write a shell (ksh, or bash my favorite, not knowinf enough any other language) that would create a directory (if not existing already) with the Artist's name, and move... (3 Replies)
Discussion started by: penguin-friend
3 Replies

5. UNIX Desktop Questions & Answers

MP3 driver for Unix

I need to play mp3 sound files on unix platform. Is there any mp3 drivers available for unix (rue unix-64 and unixware 7.0)? (3 Replies)
Discussion started by: parbende
3 Replies
Login or Register to Ask a Question