1#!/usr/local/bin/perl 2# A quick perl hack to get rename files pulled in with cdda2wav. 3# by billo@billo.com 4# 5use Socket; 6use IO::Handle; 7use Env qw(USER); 8use strict; 9no strict 'subs'; # can't get it to stop complaining about SOCK 10 11my $state = "header"; 12 13my $global_album = "Artist / Title"; 14my $global_title = "Title"; 15my $global_artist = "Artist"; 16my @global_tracks = ("") x 100; 17my $global_ntracks = 0; 18 19my @track_offsets = (); 20my $disc_id = 0; 21my $disc_time = 0; 22 23 24if ($#ARGV != 1) 25{ 26 print "usage: cddbhack.pl CDDBHOST PORT < audio.cddb\n"; 27 exit 0; 28} 29 30while (<STDIN>) 31{ 32 if ($state eq "header") 33 { 34 if (/#\s[\s]*(\d[\d]*)$/) 35 { 36 push @track_offsets, $1; 37 } elsif (/#\s[\s]*Disc length:\s(\d[\d]*)/) { 38 $disc_time = $1; 39 $state = "discid"; 40 } 41 } elsif ($state eq "discid") 42 { 43 if (/DISCID=(\w[\w]*)/) 44 { 45 $disc_id = $1; 46 last; 47 } 48 } 49} 50 51my $query_string = "cddb query $disc_id " . ($#track_offsets + 1); 52foreach my $offset (@track_offsets) 53{ 54 $query_string .= " $offset"; 55} 56$query_string .= " $disc_time"; 57 58print "$query_string\n"; 59 60my $host = $ARGV[0]; 61my $port = $ARGV[1]; 62 63my $iaddr = inet_aton($host); 64my $paddr = sockaddr_in($port, $iaddr); 65 66 67socket(SOCK, AF_INET, SOCK_STREAM, getprotobyname('tcp')) or die "socket: $!"; 68 69connect(SOCK, $paddr) or die "connect: $!"; 70 71autoflush SOCK 1; 72 73print "Connected.\n"; 74 75my ($status, $result) = &resp(\*SOCK); 76 77if (int($status) != 201) 78{ 79 print "Unexpected status.\n"; 80 close(\*SOCK); 81 exit 0; 82} 83 84$host = `hostname`; 85 86$host =~ s/\n//g; 87 88&cmd(\*SOCK, "cddb hello $USER $host billo-scan 0.1"); 89($status, $result) = &resp(\*SOCK); 90if (int($status) != 200) 91{ 92 print "Unexpected status.\n"; 93 close(\*SOCK); 94 exit 0; 95} 96 97&cmd(\*SOCK, "$query_string"); 98($status, $result) = &resp(\*SOCK); 99if (int($status) != 200) 100{ 101 print "Unexpected status.\n"; 102 close(\*SOCK); 103 exit 0; 104} 105 106my ($ignore, $cat, $id, @rest) = split (" ", $result); 107 108 109 110my $read_string = "cddb read $cat $id"; 111 112&cmd(\*SOCK, $read_string); 113&resp(\*SOCK); 114while (<SOCK>) 115{ 116 if (/^\./) 117 { 118 # print $_; 119 # print "last line\n"; 120 last; 121 } else { 122 &process($_); 123 # print $_; 124 } 125} 126 127&cmd(\*SOCK, "quit"); 128&resp(\*SOCK); 129 130close(\*SOCK); 131 132&rename; 133 134exit 0; 135 136sub cmd 137{ 138 my ($S, $cmd) = @_; 139 140 print "$cmd\n"; 141 print $S "$cmd\r\n"; 142} 143 144sub resp 145{ 146 my ($S) = @_; 147 my ($code, $message); 148 while (<$S>) 149 { 150 if (/^(\d[\d]*)\s.*/) 151 { 152 # print "\n$1\n"; 153 print "$_\n"; 154 $code = $1; 155 $message = $_; 156 last; 157 } 158 sleep(1); 159 } 160 my @return_array = ($code, $message); 161 return @return_array; 162} 163 164sub process 165{ 166 my ($line) = @_; 167 168 $_ = $line; 169 if (/^DTITLE=(.*)$/) 170 { 171 $global_album = $1; 172 $_ = $global_album; 173 if (m/([^\/][^\/]*)\s\/\s([^\/][^\/\n\r]*)/) 174 { 175 $global_artist = $1; 176 $global_title = $2; 177 } 178 print "$global_album\n"; 179 print "$global_title\n"; 180 print "$global_artist\n"; 181 return; 182 } 183 if (/^TTITLE(\d[\d]*)=(.*)$/) 184 { 185 my $track = $1 + 1; 186 if ($track > $global_ntracks) 187 { 188 $global_ntracks = $track; 189 } 190 $global_tracks[$track] = sprintf ("%s-%02d-%s", $global_title, 191 $track, $2); 192 $global_tracks[$track] =~ s/\s$//g; 193 $global_tracks[$track] =~ s/'//g; 194 $global_tracks[$track] =~ s/\s/_/g; 195 $global_tracks[$track] =~ s/:/_/g; 196 $global_tracks[$track] =~ s/\?//g; 197 $global_tracks[$track] =~ s/\*//g; 198 $global_tracks[$track] =~ s/\\/_/g; 199 $global_tracks[$track] =~ s/\s/_/g; 200 $global_tracks[$track] =~ s/\//_/g; 201 print "Track match " . $global_tracks[$track] . "\n"; 202 } 203} 204 205sub rename 206{ 207 my $i = 1; 208 209 for ($i = 1; $i <= $global_ntracks; $i++) 210 { 211 my $track_name = $global_tracks[$i]; 212 if ($track_name ne "") 213 { 214 my $file_name = sprintf("audio_%02d.wav", $i); 215 my $new_file_name = sprintf("$track_name.wav", $i); 216 217 my $mv_cmd = "mv '" . $file_name . "' '" 218 . $new_file_name . "'"; 219 print "$mv_cmd\n"; 220 `echo $mv_cmd >> rename.sh`; 221 } 222 } 223} 224 225sub unrename 226{ 227 my $i = 1; 228 229 for ($i = 1; $i <= $global_ntracks; $i++) 230 { 231 my $track_name = $global_tracks[$i]; 232 if ($track_name ne "") 233 { 234 my $file_name = sprintf("$track_name.wav", $i); 235 my $new_file_name = sprintf("audio_%02d.wav", $i); 236 237 my $mv_cmd = "mv '" . $file_name . "' '" 238 . $new_file_name . "'"; 239 print "$mv_cmd\n"; 240 `echo $mv_cmd >> unrename.sh`; 241 } 242 } 243} 244 245 246