#!/usr/bin/perl

# comics.pl
#
# A little, nice, almost working perl script to download and view on-the-fly
# comic strips from comics.com
# Still messy, unmaintainable, but well the idea is nice :)
#
# +mala, august 2003

use LWP::Simple;
use CGI;
use Time::Local;	# used to reverse given date into seconds since epoch

$MAIN_URL	=	"http://www.comics.com";
#$URL_TEMPLATE	=	"http://www.comics.com/comics/#COMIC#/archive/#COMIC#-#DATE#.html";
$URL_TEMPLATE	=	"http://www.comics.com/#COMIC#/#DATE#/";
$DILBERT_TEMPLATE = 	"http://dilbert.com/strips/comic/#DATE#/";

@DEFAULT_COMICS =	qw(get_fuzzy dilbert);
$DEFAULT_CGI_URL=	"/cgi-bin/comics.pl?";

# ---------------------------------------------------------------------------
sub makeurl{
	my ($url,$date) = @_;
   	$url =~ s/#DATE#/$date/g;
	return $url;
}

sub get_img_url{
	my ($url,$date) = @_;
	$url = makeurl($url, $date);
	my $page = get ($url);

	# this is a special case for dilbert, as it is not directly linked by
	# comics.com anymore
	if ($url =~ /dilbert/){
		if ($page =~ qr|http://dilbert\.com/strips/comic/[^>]*><img src="([^"]+)"|i){
			return $1;
		}
	}
	
	if ($page =~ /class="STR_StripImage"[^>]*><img src="([^"]+)"/i){
		return $1;
	}
}


sub to_date{
	my ($time) = @_;
	my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($time);
	$year+=1900; $mon=sprintf("%02d",$mon+1); $mday=sprintf("%02d",$mday); 
	#return "$year$mon$mday";
	return "$year-$mon-$mday";
}
# ---------------------------------------------------------------------------

print "Content-type: text/html\n\n";

# get CGI params
my $query = new CGI;
my $date 	= 	$query->param('date');
my $comics 	= 	$query->param('comics');
my $debug 	= 	$query->param('debug');

# now
my $time = time();
# today 
$TODAY = to_date ($time);

if ($date){
	$date =~ /(\d{4})-(\d{2})-(\d{2})/;
	my $year = $1; my $mon = $2; my $mday = $3;
	$time  = timelocal (0,0,0,$mday,$mon-1,$year);
}else{
	# if date's not specified use today's date
	$date = $TODAY;
}

# at this point:
# - $TODAY contains today's date - in YYYYMMDD format
# - $date  contains strip's date - in YYYYMMDD format
# - $time  contains strip's date - in epoch format

# yesterday
$YESTERDAY = to_date ($time - 86400);
# tomorrow
$TOMORROW  = to_date ($time + 86400);
$TOMORROW  = 0 if $TOMORROW > $TODAY;

# if comics are not specified use DEFAULT_COMICS
my $cgi_url;
if ($comics){
	@COMICS = split (",",$comics);
	$cgi_url = $DEFAULT_CGI_URL."comics=$comics&";
}else{
	@COMICS = @DEFAULT_COMICS;
	$cgi_url = $DEFAULT_CGI_URL;
}

# Write page header
print <<EOF;
<html>
<head><title>Malacomix</title></head>
<body>
<p align=center>
<font size="7">malacomix</font><font size="4">v1.1 (20101007)</font><br>
<font size="2">comix downloaded on the fly! --- 
<b>Usage:</b> <i>comics.pl?date=YYYYMMDD&comics=comic01,comic02,...</i><br>
see http://comics.com for strips names (ie. dilbert,get_fuzzy,franknernest,...) --- 
default is <i>get_fuzzy+dilbert</i></font>
<br><br>
EOF

# added for debugging purposes
# print ("$TODAY - $YESTERDAY - $date - $TOMORROW");

# Generate menu
print qq|[<a href="/index.html">back to index</a>] [|;
print qq|<a href="|.$cgi_url.qq|date=$YESTERDAY">prev</a>|;
print qq|-<a href="|.$cgi_url.qq|date=$TOMORROW">next</a>-<a href="/cgi-bin/comics.pl">Last</a>| if $TOMORROW;
print qq|]</p>\n|;

# now, for each comic, include strip image in a centered paragraph
for (@COMICS){
	# get page url for this comic
	my $page_url = $URL_TEMPLATE;
	   $page_url =~ s/#COMIC#/$_/g;

	if ($_ eq "dilbert"){
	   $page_url = $DILBERT_TEMPLATE;
	}

	my $full_url = get_img_url($page_url,$date);
	if ($full_url){
		print qq|<p align="center">|;
		print qq|$_<br/>|;
		print qq|<img src="$full_url"><br/>|;
		print qq|</p>\n|;
	}else{
		print "No images found for $_";
	}
}