summaryrefslogtreecommitdiff
path: root/plex.pls
diff options
context:
space:
mode:
authorivan <ivan>2003-06-16 11:38:34 +0000
committerivan <ivan>2003-06-16 11:38:34 +0000
commitf447e74c146d83b9348ed3dcb32104d2b2991ac9 (patch)
tree175c6936a276742501b6e40265bc2efe910f22dc /plex.pls
initial importSTART
Diffstat (limited to 'plex.pls')
-rw-r--r--plex.pls90
1 files changed, 90 insertions, 0 deletions
diff --git a/plex.pls b/plex.pls
new file mode 100644
index 0000000..a1bd1cc
--- /dev/null
+++ b/plex.pls
@@ -0,0 +1,90 @@
+#!/usr/bin/perl -w
+#
+# iceplex
+#
+# Copyright (c) 2003 Ivan Kohler
+# All rights reserved.
+# This program is free software; you can redistribute it and/or modify it under
+# the same terms as Perl itself.
+
+use strict;
+use subs qw(pick_server);
+use CGI;
+use CGI::Carp qw(fatalsToBrowser);
+use Digest::MD5;
+use Net::SSH qw(ssh);
+
+# pull in configuration
+use vars qw($dsn $user $pass $mp3path $port);
+use vars qw($override_query $fileno_query);
+use vars qw(%extension2type);
+require "/etc/iceplex.conf";
+
+#detect .pls or .m3u filetype
+$0 =~ /\.(pls|m3u)$/i or die "must be named with .pls or .m3u extension";
+my $extension = lc($1);
+
+#connect to database
+my $dbh = DBI->connect($dsn, $user, $pass) or die $DBI::errstr;
+
+#pick a server
+my $server = pick_server();
+
+#get customer & user from client browser
+my $cgi = new CGI;
+$cgi->param('customer') =~ /^(\d{1,10})$/ or die 'illegal customer numer';
+my $customer = sprintf("%6d", $1); #!! how many digits in customer #?
+$cgi->param('user') =~ /^(\d{1,10})$/ or die 'illegal user numer';
+my $user = sprintf("%4d", $1); #!! how many digits in user #?
+
+#get file number
+my $fileno = '';
+if ( $override_query ) {
+ my $sth = $dbh->prepare( $override_query ) or die $dbh->errstr;
+ $sth->execute($customer, $user) or die $sth->errstr;
+ my $row = $sth->fetchrow_arrayref;
+ $fileno = $row->[0] if $row;
+}
+if ( !length($fileno) && $fileno_query ) {
+ my $sth = $dbh->prepare( $fileno_query ) or die $dbh->errstr;
+ $sth->execute($customer, $user) or die $sth->errstr;
+ my $row = $sth->fetchrow_arrayref;
+ die "No files for user $user of customer $customer" unless $row;
+ $fileno = $row->[0];
+}
+$fileno = '000' unless length($fileno); #default
+
+#genarate filename
+my $filename = "$mp3path/$customer-$user-$fileno.mp3";
+
+#disconnect from database
+$dbh->disconnect;
+
+#generate a mountpoint
+my $mountpoint = md5_hex($cgi->remote_host. $$. time. int(rand(4294967296)));
+
+#signal encoder to start streaming to mountpoint & wait for confirmation
+ssh($server, 'yashout', $filename, $mountpoint );
+
+#send file back to client browser
+
+print $cgi->header( -type => $extension2type{$extension} );
+print "[playlist]\nNumberOfEntries=1\n" if $extension eq 'pls';
+print "http://$server:$port/$mountpoint\n";
+
+###
+# subroutiens
+###
+
+sub pick_server {
+ my $sth = $dbh->prepare(
+ "SELECT servername FROM iceplex_servers ".
+ "WHERE status = 'online' ".
+ "ORDER BY listeners ASC LIMIT 1"
+ ) or die $dbh->errstr;
+ $sth->execute() or die $sth->errstr;
+ my $row = $sth->fetchrow_arrayref;
+ die "No servers online!" unless $row;
+ $row->[0];
+}
+