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