James Miller wrote:
Among various frustrations recently I've had the gratifying success of learning how to use streamripper to augment my music collection. Streamripper is a program that writes an audio stream (e.g., from internet radio) to your hard drive as an mp3 file. This is about the closest thing to the mythical "Rivo" (Tivo for radio) that currently exists, I think, and could maybe serve as the basis for a *real* Rivo-type program, should someone really decide to develop one.

Despite the success, there are some problems--mainly having to do with file names. I've found a nice commercial-free classical (Baroque) station and have been happily recording away for the last 24 hrs or so. The streamripper program was evidently written for rock or more popular genres and tries to detect breaks between songs so as to make discrete files from them. For whatever strange reason, it has a problem detecting beginnings and endings between movements in classical music (despite the noticeable pause) and wants to break between movements about 30 seconds into the next movement, rather than at the pause. The cat command seems to fix this, though:

cat movement1.mp3 >full-piece.mp3
cat movement2.mp3 >>full-piece.mp3
cat movement3.mp3 >>full-piece.mp3

The breaks at 30 seconds into the following movement are hardly even noticeable in the full-piece.mp3 (I don't have the kind of purist standards I used to when it comes to audio quality, though).

But, on to file names. unfortunately, the names for the pieces I'm recording from this station follow Windows long-file-naming conventions. Even worse, the names tend to be quite complex and long. Here are a couple of examples:

Anton\ Reicha-\ Albert\ Schweitzer\ Quintett\ -\ Wind\ Quintet\ No.9\ in\ D\ major\ Op.91\ No.3-\ Finale-\ Allegretto.mp3

Patrick\ Cohen\ \&\ Mosaiques\ Quartet\ -\ Quintet\ For\ Piano\ \&\ Strings\ In\ D\ Major\,\ Op.565\,\ G411\ -.\ Andante\ Come\ Prima.mp3

Feeding those names to cat so I can join the movements into a single file is going to be a major pain in the wazoo, as they say down at symphony hall. What I was hoping to find is a script that would automatically convert all the wierd characters into more standard Unix file-naming characters. But so far I've come up empty-handed. Can anyone point me to some utility that might do what I need?

As a last resort, I might try to write my own script. I'm not too hot on doing that though, since I'm at an extremely rudimentary level when it comes to script writing. If it comes to that, could someone maybe help me get started by giving an example for a script that would do the renaming I want? I'd like to retain the bulk of the information, though I don't mind truncating words at, say 5 letters. I suppose the main thing would be replaing all the spaces and/or punctuation with dashes and/or underscores.

Thanks, Jam
es

You can use my little perl script for that.

#!/usr/bin/perl


# remove_invalid - Removes invalid characters from filenames. # Copyright (C) 2004 Flemming Greve Skovengaard # # 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.


# File: remove_invalid # Version: 0.4.6 # Date (YYYY-MM-DD): 2004-07-24 # Author: Flemming Greve Skovengaard # Contact: [EMAIL PROTECTED]

## Version 0.1.0        
## Date: 2004-04-15
##              Replaces spaces with underscores.
##
## Version 0.2.0
## Date: 2004-05-13
##              Replaces !, @, $, & (, ), {, }, [, ], <, >, ' and ".
##
## Version 0.3.0
## Date 2004-05-14
##              Removes any leading - (minus/dash).
##
## Version 0.4.0
## Date: 2004-05-15
##              Added option 'verbose' and 'help'.
##              Added 'Files renamed: x'.
##
## Version 0.4.1
## Date: 2004-05-15
##              Added option 'version'.
##
## Version 0.4.2
## Date: 2004-05-15
##              Removes ,'s (comma).
##
## Version 0.4.3
## Date: 2004-06-29
##              Uses File::Basename to get basename if --help
##
## Version 0.4.4
## Date: 2004-07-23
##              Simplified substitute procedure.
##
## Version 0.4.5
## Date: 2004-07-23
##              Now removes ':' and ';'.
##
## Version 0.4.6
## Date: 2004-08-03
##              Correctly removes '!' and '$'.

## Removes all invalid characters in filenames in the current directory.

use strict;
use warnings;
use Getopt::Long;
use File::Basename qw/ basename /;

Getopt::Long::Configure("gnu_getopt");

my ($verbose, $help, $version);
my $current_version = "0.4.6";    # REMEMBER TO UPDATE.
my $dir = '.';
my $num_renamed = 0;

GetOptions('v|verbose' => \$verbose,
                   'help' => \$help,
                   'V|version' => \$version,
);

if ($help) {
        print "Version: $current_version\n";
        print "Usage: ", basename($0), " [-v|--verbose]\n";
        exit 0;
}

if ($version) {
        print "File:\t\tremove_invalid.pl\n";
        print "Version:\t$current_version\n";
        print "Written by Flemming Greve Skovengaard.\n";
        exit 0;
}

sub rename_file {
        my ($old, $new) = @_;
        
        rename $old, $new
        or warn "Could not rename '$old' to '$new': $!\n";
        
        return 0;
}

opendir DH, $dir or die "Cannot opendir '$dir': $!\n";

foreach my $file (sort readdir DH) {
        my $new_name = $file;
        my $rename_failed = 1;
        
        if ($new_name =~ m/(^[-+]|[ (){},'":;<>\!\$\&[EMAIL PROTECTED]|])/) {
                $new_name =~ s/^[-+]//;
                $new_name =~ s/ /_/g;
                $new_name =~ s/,/./g;
                $new_name =~ s/\@/_at_/g;
                $new_name =~ s/\&/_and_/g;
                $new_name =~ s/['":;\$\!]//g;
                $new_name =~ s/[({<]/_ld_/g;
                $new_name =~ s/[)}>]/_rd_/g;
                $new_name =~ s/\[/_ld_/g;
                $new_name =~ s/\]/_rd_/g;
                
                if ($verbose) {
                        print "'$file' => '$new_name'\n";
                        $rename_failed = rename_file($file, $new_name);
                }
                else {
                        $rename_failed = rename_file($file, $new_name);
                }
                ++$num_renamed unless $rename_failed;
        }
}

print "Files renamed: $num_renamed\n";

--
Flemming Greve Skovengaard           FAITH, n.
a.k.a Greven, TuxPower                   Belief without evidence in what is told
<[EMAIL PROTECTED]>              by one who speaks without knowledge,
4112.38 BogoMIPS                         of things without parallel.

-
To unsubscribe from this list: send the line "unsubscribe linux-newbie" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.linux-learn.org/faqs

Reply via email to