246 lines
4.3 KiB
Perl
Executable File
246 lines
4.3 KiB
Perl
Executable File
#!/usr/local/bin/perl
|
|
# A quick perl hack to get rename files pulled in with cdda2wav.
|
|
# by billo@billo.com
|
|
#
|
|
use Socket;
|
|
use IO::Handle;
|
|
use Env qw(USER);
|
|
use strict;
|
|
no strict 'subs'; # can't get it to stop complaining about SOCK
|
|
|
|
my $state = "header";
|
|
|
|
my $global_album = "Artist / Title";
|
|
my $global_title = "Title";
|
|
my $global_artist = "Artist";
|
|
my @global_tracks = ("") x 100;
|
|
my $global_ntracks = 0;
|
|
|
|
my @track_offsets = ();
|
|
my $disc_id = 0;
|
|
my $disc_time = 0;
|
|
|
|
|
|
if ($#ARGV != 1)
|
|
{
|
|
print "usage: cddbhack.pl CDDBHOST PORT < audio.cddb\n";
|
|
exit 0;
|
|
}
|
|
|
|
while (<STDIN>)
|
|
{
|
|
if ($state eq "header")
|
|
{
|
|
if (/#\s[\s]*(\d[\d]*)$/)
|
|
{
|
|
push @track_offsets, $1;
|
|
} elsif (/#\s[\s]*Disc length:\s(\d[\d]*)/) {
|
|
$disc_time = $1;
|
|
$state = "discid";
|
|
}
|
|
} elsif ($state eq "discid")
|
|
{
|
|
if (/DISCID=(\w[\w]*)/)
|
|
{
|
|
$disc_id = $1;
|
|
last;
|
|
}
|
|
}
|
|
}
|
|
|
|
my $query_string = "cddb query $disc_id " . ($#track_offsets + 1);
|
|
foreach my $offset (@track_offsets)
|
|
{
|
|
$query_string .= " $offset";
|
|
}
|
|
$query_string .= " $disc_time";
|
|
|
|
print "$query_string\n";
|
|
|
|
my $host = $ARGV[0];
|
|
my $port = $ARGV[1];
|
|
|
|
my $iaddr = inet_aton($host);
|
|
my $paddr = sockaddr_in($port, $iaddr);
|
|
|
|
|
|
socket(SOCK, AF_INET, SOCK_STREAM, getprotobyname('tcp')) or die "socket: $!";
|
|
|
|
connect(SOCK, $paddr) or die "connect: $!";
|
|
|
|
autoflush SOCK 1;
|
|
|
|
print "Connected.\n";
|
|
|
|
my ($status, $result) = &resp(\*SOCK);
|
|
|
|
if (int($status) != 201)
|
|
{
|
|
print "Unexpected status.\n";
|
|
close(\*SOCK);
|
|
exit 0;
|
|
}
|
|
|
|
$host = `hostname`;
|
|
|
|
$host =~ s/\n//g;
|
|
|
|
&cmd(\*SOCK, "cddb hello $USER $host billo-scan 0.1");
|
|
($status, $result) = &resp(\*SOCK);
|
|
if (int($status) != 200)
|
|
{
|
|
print "Unexpected status.\n";
|
|
close(\*SOCK);
|
|
exit 0;
|
|
}
|
|
|
|
&cmd(\*SOCK, "$query_string");
|
|
($status, $result) = &resp(\*SOCK);
|
|
if (int($status) != 200)
|
|
{
|
|
print "Unexpected status.\n";
|
|
close(\*SOCK);
|
|
exit 0;
|
|
}
|
|
|
|
my ($ignore, $cat, $id, @rest) = split (" ", $result);
|
|
|
|
|
|
|
|
my $read_string = "cddb read $cat $id";
|
|
|
|
&cmd(\*SOCK, $read_string);
|
|
&resp(\*SOCK);
|
|
while (<SOCK>)
|
|
{
|
|
if (/^\./)
|
|
{
|
|
# print $_;
|
|
# print "last line\n";
|
|
last;
|
|
} else {
|
|
&process($_);
|
|
# print $_;
|
|
}
|
|
}
|
|
|
|
&cmd(\*SOCK, "quit");
|
|
&resp(\*SOCK);
|
|
|
|
close(\*SOCK);
|
|
|
|
&rename;
|
|
|
|
exit 0;
|
|
|
|
sub cmd
|
|
{
|
|
my ($S, $cmd) = @_;
|
|
|
|
print "$cmd\n";
|
|
print $S "$cmd\r\n";
|
|
}
|
|
|
|
sub resp
|
|
{
|
|
my ($S) = @_;
|
|
my ($code, $message);
|
|
while (<$S>)
|
|
{
|
|
if (/^(\d[\d]*)\s.*/)
|
|
{
|
|
# print "\n$1\n";
|
|
print "$_\n";
|
|
$code = $1;
|
|
$message = $_;
|
|
last;
|
|
}
|
|
sleep(1);
|
|
}
|
|
my @return_array = ($code, $message);
|
|
return @return_array;
|
|
}
|
|
|
|
sub process
|
|
{
|
|
my ($line) = @_;
|
|
|
|
$_ = $line;
|
|
if (/^DTITLE=(.*)$/)
|
|
{
|
|
$global_album = $1;
|
|
$_ = $global_album;
|
|
if (m/([^\/][^\/]*)\s\/\s([^\/][^\/\n\r]*)/)
|
|
{
|
|
$global_artist = $1;
|
|
$global_title = $2;
|
|
}
|
|
print "$global_album\n";
|
|
print "$global_title\n";
|
|
print "$global_artist\n";
|
|
return;
|
|
}
|
|
if (/^TTITLE(\d[\d]*)=(.*)$/)
|
|
{
|
|
my $track = $1 + 1;
|
|
if ($track > $global_ntracks)
|
|
{
|
|
$global_ntracks = $track;
|
|
}
|
|
$global_tracks[$track] = sprintf ("%s-%02d-%s", $global_title,
|
|
$track, $2);
|
|
$global_tracks[$track] =~ s/\s$//g;
|
|
$global_tracks[$track] =~ s/'//g;
|
|
$global_tracks[$track] =~ s/\s/_/g;
|
|
$global_tracks[$track] =~ s/:/_/g;
|
|
$global_tracks[$track] =~ s/\?//g;
|
|
$global_tracks[$track] =~ s/\*//g;
|
|
$global_tracks[$track] =~ s/\\/_/g;
|
|
$global_tracks[$track] =~ s/\s/_/g;
|
|
$global_tracks[$track] =~ s/\//_/g;
|
|
print "Track match " . $global_tracks[$track] . "\n";
|
|
}
|
|
}
|
|
|
|
sub rename
|
|
{
|
|
my $i = 1;
|
|
|
|
for ($i = 1; $i <= $global_ntracks; $i++)
|
|
{
|
|
my $track_name = $global_tracks[$i];
|
|
if ($track_name ne "")
|
|
{
|
|
my $file_name = sprintf("audio_%02d.wav", $i);
|
|
my $new_file_name = sprintf("$track_name.wav", $i);
|
|
|
|
my $mv_cmd = "mv '" . $file_name . "' '"
|
|
. $new_file_name . "'";
|
|
print "$mv_cmd\n";
|
|
`echo $mv_cmd >> rename.sh`;
|
|
}
|
|
}
|
|
}
|
|
|
|
sub unrename
|
|
{
|
|
my $i = 1;
|
|
|
|
for ($i = 1; $i <= $global_ntracks; $i++)
|
|
{
|
|
my $track_name = $global_tracks[$i];
|
|
if ($track_name ne "")
|
|
{
|
|
my $file_name = sprintf("$track_name.wav", $i);
|
|
my $new_file_name = sprintf("audio_%02d.wav", $i);
|
|
|
|
my $mv_cmd = "mv '" . $file_name . "' '"
|
|
. $new_file_name . "'";
|
|
print "$mv_cmd\n";
|
|
`echo $mv_cmd >> unrename.sh`;
|
|
}
|
|
}
|
|
}
|
|
|
|
|