All pastes #1983996 Raw Edit

id3mv.pl

public text v1 · immutable
#1983996 ·published 2010-11-07 00:34 UTC
rendered paste body
#!/usr/bin/perl -w
#
# id3mv.pl - organize your entire music library!
#

use strict;
use File::Find;
use File::Copy;
use MP3::Tag;

our $DIR = "/path/to/music/library/"; #Don't forget the trailing slash
find (\&handle_file,$DIR);
print "Done!";

sub handle_file {
	unless ($_ =~ m/\.mp3$/) {
		return 0;
	}

	my $mp3 = MP3::Tag->new($File::Find::name);
	my @mp3data;
	if (defined($mp3)) {
		@mp3data = $mp3->autoinfo();
	} else {
		return 0; #fail quietly because there's nothing worse than having your perl
	}                 #script shit out on you after sorting through 2000 or so files
	
	my $sindex = rindex($mp3data[1],"/");
	if ($sindex != -1) {
		$mp3data[1] = substr($mp3data[1],0,$sindex);
	}

	my $artistdir = $newDIR . sanitize_ntfs($mp3data[2]) . "/";
	my $albumdir = $artistdir . sanitize_ntfs($mp3data[3]) . "/";
	my $file = $albumdir . $mp3data[1] . " " . sanitize_ntfs($mp3data[0]) . ".mp3";
	unless (-d $artistdir) {
		mkdir($artistdir);
	}
	unless (-d $albumdir) {
		mkdir($albumdir);
	}
	if (-e $file) {
		return 0;
	}

	print "Renaming $File::Find::name to $file" . "\n";
	move ($File::Find::name,$file) or die "Move failed: $!";
}

sub sanitize_ntfs { #make sure the file name won't break anything
	unless (defined($_[0])) { return "" }

	my $file = $_[0];
	$file =~ tr{?"\/<>|:*}{_};

	return $file;
}