5 # Copyright (c) 2003 Ivan Kohler
7 # This program is free software; you can redistribute it and/or modify it under
8 # the same terms as Perl itself.
11 use subs qw(pick_server);
13 use CGI::Carp qw(fatalsToBrowser);
17 # pull in configuration
18 use vars qw($dsn $user $pass $mp3path $port);
19 use vars qw($override_query $fileno_query);
20 use vars qw(%extension2type);
21 require "/etc/iceplex.conf";
23 #detect .pls or .m3u filetype
24 $0 =~ /\.(pls|m3u)$/i or die "must be named with .pls or .m3u extension";
25 my $extension = lc($1);
28 my $dbh = DBI->connect($dsn, $user, $pass) or die $DBI::errstr;
31 my $server = pick_server();
33 #get customer & user from client browser
35 $cgi->param('customer') =~ /^(\d{1,10})$/ or die 'illegal customer numer';
36 my $customer = sprintf("%6d", $1); #!! how many digits in customer #?
37 $cgi->param('user') =~ /^(\d{1,10})$/ or die 'illegal user numer';
38 my $user = sprintf("%4d", $1); #!! how many digits in user #?
42 if ( $override_query ) {
43 my $sth = $dbh->prepare( $override_query ) or die $dbh->errstr;
44 $sth->execute($customer, $user) or die $sth->errstr;
45 my $row = $sth->fetchrow_arrayref;
46 $fileno = $row->[0] if $row;
48 if ( !length($fileno) && $fileno_query ) {
49 my $sth = $dbh->prepare( $fileno_query ) or die $dbh->errstr;
50 $sth->execute($customer, $user) or die $sth->errstr;
51 my $row = $sth->fetchrow_arrayref;
52 die "No files for user $user of customer $customer" unless $row;
55 $fileno = '000' unless length($fileno); #default
58 my $filename = "$mp3path/$customer-$user-$fileno.mp3";
60 #disconnect from database
63 #generate a mountpoint
64 my $mountpoint = md5_hex($cgi->remote_host. $$. time. int(rand(4294967296)));
66 #signal encoder to start streaming to mountpoint & wait for confirmation
67 ssh($server, 'yashout', $filename, $mountpoint, $port );
69 #send file back to client browser
71 print $cgi->header( -type => $extension2type{$extension} );
72 print "[playlist]\nNumberOfEntries=1\n" if $extension eq 'pls';
73 print "http://$server:$port/$mountpoint\n";
80 my $sth = $dbh->prepare(
81 "SELECT servername FROM iceplex_servers ".
82 "WHERE status = 'online' ".
83 "ORDER BY listeners ASC LIMIT 1"
84 ) or die $dbh->errstr;
85 $sth->execute() or die $sth->errstr;
86 my $row = $sth->fetchrow_arrayref;
87 die "No servers online!" unless $row;