#!/usr/bin/perl -w # # $Id: rss2.cgi,v 1.5 2007/05/11 07:02:29 jack Exp jack $ # # $Log: rss2.cgi,v $ # Revision 1.5 2007/05/11 07:02:29 jack # CGI::Carp barfings # # Revision 1.4 2007/05/11 07:01:38 jack # *** empty log message *** # # Revision 1.3 2007/02/22 00:48:35 jack # *** empty log message *** # # Revision 1.2 2007/02/15 15:17:38 jack # randomize support, use XML::RSS # # $baseURL = 'http://10.56.83.1/~jack/mp3/'; $baseDir = '/home/jack/mp3'; use CGI qw(:param); use CGI::Carp qw(fatalsToBrowser); use POSIX qw(strftime); use XML::RSS; sub dirLoop ($;$); sub dirLoop ($;$) { my $dir = shift; my $pfx = shift || ''; if (! opendir(DIRHANDLE, $dir)) { die "Couldn't opendir: $!\n"; } while (defined(my $de = readdir DIRHANDLE)) { my $lnk; next if (substr($de, 0, 1) eq '.'); if (-d $de) { dirLoop $de, $de; next; } next if ($de !~ /\.mp3$/i); $lnk = ($pfx ? $pfx . '/' : '') . $de; $pde = $lnk; $pde =~ s/([^a-zA-Z0-9\.\/])/sprintf "%%%02x", ord $1/eg; $pde =~ s/ /%20/g; # # Don't need to do HTML/XML quoting, XML::RSS does it for us # #$de =~ s/\&/\&/g; #$de =~ s//\>/g; $rss->add_item( 'title' => $de, 'description' => $de, 'pubDate' => $currentTime, 'enclosure' => { 'url' => $baseURL . $pde, 'type' => 'audio/mp3', }, ); } return; } # # main # $| = 1; $currentTime = strftime('%a, %d %b %Y %T %Z', localtime); print "Content-Type: application/rss+xml\n\n"; $cgi = CGI->new; $rss = XML::RSS->new('version' => '2.0'); my $randomize = $cgi->param('randomize') ? 1 : 0; $rss->channel( 'title' => 'MP3s' . ($randomize ? " (random)" : ""), 'link' => $baseURL, 'description' => $baseDir, 'language' => 'en-us', 'copyright' => 'None', 'pubDate' => $currentTime, 'lastBuildDate' => $currentTime, 'webMaster' => 'root@localhost', ); chdir $baseDir; dirLoop '.'; my $cgi = CGI->new; if ($randomize) { my @items = @{$rss->items}; @_ = (); while (@items) { push @_, (splice @items, int(rand @items), 1); } $rss->{'items'} = \@_; undef @items; } print $rss->as_string, "\n"; exit 0;