Tagged: Perl

Perl MP3 ID3 Tags

I keep my mp3s in directories, separated by genre/artist – album.  I like to keep my tags clean and uniform (and I use Tag&Rename for that), but sometimes I let my collection get away from me a bit.  When that happens I bust out Perl because, well, I guess because it’s familiar.  I’ve written scripts to do simple things like remove non media files recursively from directory structures and alter file and or folder names (say, change underscores to spaces or remove common unwanted verbiage).  Because these scripts are for me, there’snever really any error handling or debugging.  They’re quick one-offs, written for no one but myself.  They’re rarely (never) written as efficiently as they could be.  They’re not like my production code, which I’m meticulous about.  These are sloppy little tools, written as quickly as possible, made to solve immediate irritations.  Here’s an example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
use File::Find::Rule;
use MP3::Tag;
use List::MoreUtils qw(uniq);

my @txt_files  = File::Find::Rule
    ->file
    ->name('1 *', '01 *','1_*', '01_*','1-*', '01-*')
    ->in('\\\\server\\music\\mall');

foreach (@txt_files)
{
    $mp3 = MP3::Tag->new($_);
    $mp3->get_tags();
    if (exists $mp3->{ID3v1})
    {
        $taggit = $mp3->{ID3v1}->artist . "\t" . $mp3->{ID3v1}->album . "\t" . $mp3->{ID3v1}->genre;
        push(@tags, $taggit);
        print "Filename: $_\n";
        print "Artist: " . $mp3->{ID3v1}->artist . "\t";
        print "Title: " . $mp3->{ID3v1}->title . "\t";
        print "Album: " . $mp3->{ID3v1}->album . "\t";
        print "Genre: " . $mp3->{ID3v1}->genre . "\n";
    }
$mp3->close();
}

@sortedtags = uniq(@tags);

open (OUTPUT, ">tags.txt");
foreach $tag (@sortedtags)
{
    print OUTPUT $tag . "\n";
}
close (OUTPUT);

This one finds all the files in the \\server\music\all\ path beginning with 1 or 01 (or 1_ or 01_ or 1- or… you get the picture), dumps their ID3V1 Artist, Album and Genre tags into an array, winnows that array down to unique values, and dumps that to a text file.  Why?  Because sometimes I’m unsure what genre I’ve labeled an artist/album (and let’s be fair here.  Are the Night Birds Punk or Rock?  The Ramones?  And is Thom Yorke Rock or Electronic?  Hmm?  If Tom Petty’s Damn The Torpedoes is Classic Rock, then is Hypnotic Eye as well?) and rather than have to open the directory and look at the tag on one of the songs, I wanted a way to just dump it to a file to refer to later.

Why is it listing the Filename, Artist, Title, Album etc in the CMD as it runs?  Because I’m a dork and like to watch things run in command lines.

Why didn’t I write some fancy regex to handle the file name match, or better yet write something that would just pull the data from a single file per subdirectory?  Because there’s a tipping point.  If you spend more time writing and testing your script than it would take doing manually whatever you’re writing your script to automate, you’re not being effectively lazy.

I’ve definitely been guilty of taking more time to write a script than what it would take to just do the task, but in those instances it’s because I’m enjoying writing and testing and learning.  Sometimes I don’t want to write and test and learn.  I want to kick some sloppy shit off in a CMD prompt and let it run in the background while I pick my nose and watch redlettermedia.  I don’t care how long it takes, so long as I’m not the one doing it anymore.  Somewhere there are probably nerds who are very unhappy with me for that statement.  Too bad.

Perl PPM etc. through proxy

In order for Perl to work through a proxy (for Perl Package Manager, etc) you need to define the proxy as a system environment variable:

Right click on “My Computer”, click on “Properties” and select the “Advanced” tab. Click the button marked “Environment Variables” and make the following changes in the “System Variables” window:

  1. With the “New” button, add the setting HTTP_proxy, with your proxy name as the value (you must include ”
    1
    http://

    “), followed by a colon and the proxy port, if applicable; e.g., ”

    1
    http://proxy:8080

  2. If you require a user name and/or password to access your proxy, use the “New” button to add the settings HTTP_proxy_user and HTTP_proxy_pass, with your user name and password as the respective values.

From the ActivePerl FAQ.