#!/usr/bin/perl
use XML::Simple;
use XML::Writer;
use Time::Local;
use Date::Format;
use Getopt::Long;
use strict;
my $generator = "ComicsFeedParser.pl @ARGV";
my $publisherfilter;
my $comicfilter;
my $pricefilter;
my $filter;
my $feedtitle = 'Published Comic Books';
my $silent = 0;
GetOptions(
'publisher=s' => \$publisherfilter,
'comic=s' => \$comicfilter,
'price=f' => \$pricefilter,
'filter=s' => \$filter,
'title=s' => \$feedtitle,
'silent!' => \$silent,
);
my $curlurl = 'http://feedproxy.google.com/comiclistfeed';
my $curloptions = $silent ? '--silent' : undef;
my $data = `curl $curlurl $curloptions`;
my $xs1 = XML::Simple->new();
my $doc = $xs1->XMLin($data);
my $pagelink = $doc->{channel
}->{link};
my $writer = XML::Writer->new();
$writer->xmlDecl();
$writer->startTag('rss', 'version' => '2.0');
$writer->startTag('channel');
$writer->startTag('title');
$writer->characters($feedtitle);
$writer->endTag('title');
$writer->startTag('link');
$writer->characters($pagelink);
$writer->endTag('link');
$writer->startTag('description');
$writer->characters('Newly Published Comic Books');
$writer->endTag('description');
$writer->startTag('pubDate');
$writer->characters(strftime('%a, %d %b %Y %H:%M:%S %Z', @now, 'GMT'));
$writer->endTag('pubDate');
$writer->startTag('generator');
$writer->characters($generator);
$writer->endTag('generator');
foreach my $item (@{$doc->{channel}->{item}}) {
my @gmt;
if ($item->{title} =~ /(\d\d)\/(\d\d)\/(\d\d\d\d)/) {
@gmt = gmtime(timelocal
(0,0,0,$2,$1-1,$3-1900
));
}
else {
}
my $date = strftime('%a, %d %b %Y %H:%M:%S %Z', @gmt, 'GMT');
my $link = $item->{'feedburner:origLink'};
my @lines = split("\n", $item->{description
});
my $publisher;
my $publisherlink;
foreach my $line (@lines) {
$line =~ s/\s+/ /g;
my $itemlink;
if ($line =~ s/<a href
="(.*)">(.*)<\
/a
>/$2/) {
$itemlink = $1;
}
if ($line =~ /<p><b><u>(.*)<\/u><\/b>/) {
$publisher = $1 unless ($1 eq 'PUBLISHER');
$publisherlink = $itemlink;
}
my $comic;
if ($line =~ /(.*)<br \/>/) {
$comic = $1;
}
elsif ($line =~ /(.*)<\/p>/) {
$comic = $1;
}
if ($comic) {
my $title;
my $price;
if ($comic =~ /(.*), (.*)$/) {
$title = $1;
$price = $2;
}
else {
$title = $comic;
}
my $comiclink = $itemlink;
my $filterresults = 1;
if ($filter) {
$filterresults = eval $filter;
if ($@) {
$filterresults = 1;
}
}
if ((!$publisherfilter || $publisher =~ /$publisherfilter/) &&
(!$comicfilter || $title =~ /$comicfilter/) &&
(!$pricefilter || $price <= $pricefilter) &&
$filterresults) {
$writer->startTag('item');
$writer->startTag('title');
$writer->characters("$publisher: $title");
$writer->endTag('title');
$writer->startTag('link');
$writer->characters($comiclink || $publisherlink || $link || $pagelink);
$writer->endTag('link');
$writer->startTag('description');
$writer->characters("$publisher: $title, $price");
$writer->endTag('description');
$writer->startTag('pubDate');
$writer->characters($date);
$writer->endTag('pubDate');
$writer->endTag('item');
}
}
if ($line =~ /(.*)<\/p>/) {
}
}
}
}
$writer->endTag('channel');
$writer->endTag('rss');
$writer->end();