--- comics/fetch.pl.new 2015/02/05 18:05:58 1.16
+++ comics/fetch.pl.new 2018/02/06 14:31:06 1.24
@@ -2,6 +2,38 @@
###############################################################################
# $Log: fetch.pl.new,v $
+# Revision 1.24 2018/02/06 14:31:06 nick
+# A status report is now generated in JSON that can easily be scanned so that
+# I can be alerted when there are failures that I miss if I don't read the
+# comics that day.
+#
+# Revision 1.23 2018/01/26 13:05:27 nick
+# Added a new config option to remove all newline from the resulting index.html
+# file. This allows for easier parsing for certain comics. I then updated
+# the URLs to search for and enabled the newline removal for a handful
+# of uComics.
+#
+# I believe I've also properly fixed the Comic Config version displayed on
+# the webpage itself.
+#
+# Revision 1.22 2017/12/05 13:37:40 nick
+# Added the CVS config version to the outpuit.
+#
+# Revision 1.21 2015/10/26 14:25:40 nick
+# Fixed a bug that was improperly including the day of week string preventing the weekend comics from fetching proproperly.
+#
+# Revision 1.20 2015/10/22 12:58:44 nick
+# Added the ability for Sunday only comics. Stonesoup is no longer weekdays, this has been added to Sunday only. I also added Foxtrot Classics for weekdays and Foxtrot for Sundays.
+#
+# Revision 1.19 2015/07/13 12:56:58 nick
+# Added Sally Forth and Pearls Before Swine. Adding Sally Forth required a change in the 'wget' command for fetching the index file to include 'user-agent' and 'referer'.
+#
+# Revision 1.18 2015/05/07 12:31:43 nick
+# Added favicon
+#
+# Revision 1.17 2015/02/19 14:56:10 nick
+# Fixed a problem that forced everything to JPG. This would kill GIF animations, but would not display the gifs either because 'convert' appends an index number to the end of the file name for each from of the GIF animation. I fixed this to maintain GIF compatibilty as well as rewritting how the script fetches the size of the file. Additionally, I updated the configuration for Questionable Content to search for GIF or JPG, which is what triggered this entire update.
+#
# Revision 1.16 2015/02/05 18:05:58 nick
# Changed the background and added a fancy title.
#
@@ -15,14 +47,16 @@ use File::Path;
use Data::Dumper;
use Pod::Usage;
use Getopt::Long;
-
-use Date::Calc qw/Date_to_Text_Long Today/;
+use JSON::Create 'create_json';
+use Date::Calc qw/Date_to_Text_Long Today Day_of_Week Day_of_Week_to_Text/;
##
## Some default values
##
-my $ver = '$Id: fetch.pl.new,v 1.16 2015/02/05 18:05:58 nick Exp $';
+my $ver = '$Id: fetch.pl.new,v 1.24 2018/02/06 14:31:06 nick Exp $';
my $comicFile = "comics.conf";
+my $comicConfigVer = "Unknown";
+my $reportFile = "/home/httpd/html/daily/comics/status_report.json";
my %comics = &readComicConfig ( $comicFile );
my %opts = &fetchOptions( );
my $days_ago = $opts{'days'} || 0;
@@ -45,18 +79,37 @@ print STDOUT "Starting comic fetch at $D
&writeTitle ( \%dates );
foreach my $comic ( sort keys %comics ) {
+
+ ## Skip if this is Sunday and the comic is weekdays only
next if ( $comic =~ m/config/ );
- if ( ( $dates{'day2'} eq "Sunday" ) &&
- ( $comics{$comic}{'sunday'} == 0 ) ) { print "Skipping.\n"; next; }
+ if (($dates{'wday'} eq "Sunday") &&
+ ($comics{$comic}{'sunday'} == 0)) {
+ print "Skipping '$comic'; Weekdays only.\n";
+ next;
+ }
+
+ ## Skip if Sunday only comic and it's not Sunday.
+ if (($dates{'wday'} ne "Sunday") &&
+ ($comics{$comic}{'sunday_only'} == 1)) {
+ print "Skipping '$comic' ($comics{$comic}{'sunday_only'}); Sunday only.\n";
+ next
+ }
+
$comics{$comic}{'error'} = &downloadComic ( \%comics, $comic, \%dates );
&writeComic ( \%comics, $comic, \%dates );
-}
-print "Finding in $imageDir/*-$dates{'day2'}.jpg\n";
-foreach my $file ( glob( "$imageDir/*-$dates{'day2'}.jpg" ) )
-{
- my $size = `/usr/bin/identify $file`;
- $size =~ s/.*\s(\d+)x\d+.*/$1/;
+ my $file = "$imageDir/$comic-$dates{'day2'}.$comics{$comic}{'ext'}";
+ my $size = 0;
+
+ my $cmd = "/usr/bin/identify -verbose $file|";
+ open(IMG, $cmd) || die ("Can't open: $!\n");
+ while() {
+ if ($_ =~ m/^\s+geometry:\s+(\d+)x\d+.*/i) {
+ $size = $1 if ( $size == 0);
+ }
+ }
+ close(IMG);
+
system( "/usr/bin/convert -resize 640 $file $file" )
if ( $size > 640 )
@@ -66,6 +119,9 @@ foreach my $file ( glob( "$imageDir/*-$d
&writeFooter( \%dates );
+print STDOUT "Status written to $reportFile.\n"
+ if (&writeStatusReportJSON(\%comics, $reportFile));
+
$DATE=`date`; chomp( $DATE );
print STDOUT "Completed comic fetch at $DATE\n";
@@ -112,6 +168,10 @@ sub readComicConfig ($$) {
open FILEN, "<$comicFile";
while () {
+ #if ($_ =~ m/^#.* \$[Ii][Dd]: fetch.pl.new,v 1.23 2018/01/26 13:05:27 nick Exp $/) {
+ if ($_ =~ m/^#.* \$[Ii][dD]: .*,v\ (.*)\ \d{4}\/.*\$$/) {
+ $comicConfigVer = $1;
+ }
if ( ( $_ !~ m/^#/ ) && ( $_ =~ m/,.*,/) ){
$_ =~ s/__YEAR__/$year/g;
$_ =~ s/__MON__/$mon/g;
@@ -123,7 +183,9 @@ sub readComicConfig ($$) {
$comicConfig{$res[0]}{'mode'} = $res[3];
$comicConfig{$res[0]}{'fullName'} = $res[4];
$comicConfig{$res[0]}{'ext'} = $res[5];
- $comicConfig{$res[0]}{'sunday'} = $res[6] || 1;
+ $comicConfig{$res[0]}{'sunday'} = sprintf("%d", $res[6] || 1);
+ $comicConfig{$res[0]}{'sunday_only'} = sprintf("%d", $res[7] || 0);
+ $comicConfig{$res[0]}{'remove_newlines'} = sprintf("%d", $res[8] || 0);
$comicConfig{$res[0]}{'error'} = 0;
}
elsif ( $_ =~ m/(.*)\s+=\s+(.*)/ ) {
@@ -137,6 +199,36 @@ sub readComicConfig ($$) {
#######################################################################
#######################################################################
+sub writeStatusReportJSON ($$) {
+ my ( $comicsRef, $filename ) = @_;
+ my %comics = %$comicsRef;
+ my %json = ('date' => $DATE, 'comics' => []);
+ my $totalErrors = 0;
+
+ foreach my $comic (sort keys %comics) {
+ next unless $comics{$comic}{'fullName'};
+ if ($comics{$comic}{'error'}) {
+ my %error = ('comicName' => "$comics{$comic}{'fullName'}",
+ 'error' => "$comics{$comic}{'error'}",
+ 'status' => "Error");
+ push $json{'comics'}, \%error;
+ $totalErrors += 1;
+ } else {
+ my %status = ('comicName' => "$comics{$comic}{'fullName'}",
+ 'error' => 0,
+ 'status' => "Successfull");
+ push $json{'comics'}, \%status;
+ }
+ }
+ $json{'totalErrors'} = $totalErrors;
+
+ open SR, ">$filename" or die ("ERROR: Failed to create status report: $!\n");
+ print SR create_json (\%json);
+ close(SR);
+}
+
+#######################################################################
+#######################################################################
sub writeComic ($$) {
my ( $comics, $comic, $date ) = @_;
my $sd = substr( join( '', $days[$date->{'dow'}] ), 0, 3 );
@@ -154,7 +246,7 @@ sub writeComic ($$) {
$comics->{$comic}{'url'}
-
+