http://qs321.pair.com?node_id=286291


in reply to Astronomy Pic of the Day Grabber

Greetings OverlordQ and Fellow Monks I saw your Astronomy Pick Of The Day post, liked it, and thought it would be really cool taken one step further and put to Perl/Tk. So... I adapted the code from another post of mine Perl/Tk---Weather Map Grabber and appended the relevant code to your original.

So now the script does the following:
1) Grabs the Image
2) Saves it to a day specific filename yyyymmdd format as suggested by sauoq (I agree it does allow for easier filename sorting)
3) Displays it in a Tk Window!
4) Clicking on the Image displays a dialog box containing image source info.

Important Note for Windows ActiveState Perl 5.6.1 users: as of Build 635, their still appears to be a compatability issue with Tk::JPEG, a module used by this script. I have come up with a 'work-around' for this problem. If you encounter this issue please see my node that addresses this Re: Activestate TK::JPEG compatibility issue -- QUICK WORK AROUND FOUND, Any Better Ideas?. This should not be an issue for Unix/Linux users since they would compile the module on their own specific OS.

Anyway... enough said. The code is posted below.

As always, any input or suggestions for improvement of this code are greatly appreciated.
Enjoy and Have Fun!

UPDATE: 08/26/2003 -- Modified Perl/Tk Display section of the code to account for the possibility of grabbing a gif image. However, need to work on the proper functional display of an animated gif which it looks like today's image appears to be.
Any suggestions on how to do this in Perl/Tk? Thanks.


#!/usr/bin/perl use strict; use warnings; use URI::URL; use LWP::Simple qw/get/; use Tk; use Tk::DialogBox; use Tk::Photo; use Tk::JPEG; my $TOP = "http://antwrp.gsfc.nasa.gov/apod/"; my $IMGPATH = 'image/\d{4}/\w+.(gif|jpg|jpeg)'; my @timearray = gmtime(); #my $time = sprintf "%02d%02d%04d", ($timearray[4]+1), ($timearray[3]) +, ($timearray[5]+1900); my $time = sprintf "%04d%02d%02d", ($timearray[5]+1900),($timearray[4 +]+1), ($timearray[3]); my $titledate=sprintf "%02d-%-02d-%04d", ($timearray[4]+1), ($timearra +y[3]), ($timearray[5]+1900); my $content = get $TOP or die "Cannot get APOD Page\n"; my ($imgurl) = $content =~ m!($IMGPATH)!i; $imgurl = url($imgurl,$TOP)->abs; print "Acquiring Image File ....\n"; my $picture = get $imgurl or die "Cannot grab image: $!\n"; my $ext=$2; my $fmt="jpeg"; if ($ext =~ m/(gif)/ig){$fmt="gif";} my $imgfile="apod$time\.$ext"; print "Saving as $imgfile . \n"; open(OUT, ">$imgfile") or die "Cannot write to file: $!\n"; binmode(OUT); print OUT $picture; close OUT; my $MW=MainWindow->new(-title=>"Astronomy Pic of The Day $titledate"); ### --- Prevents Main Window Resizing $MW->bind('<Configure>' => sub{ my $xe = $MW->XEvent; $MW->maxsize($xe->w, $xe->h); $MW->minsize($xe->w, $xe->h); }); print "generating Tk Window ....\n"; # my $image = $MW->Photo('-format' => 'jpeg', -file=>'apod08222003.jpg +'); #my $image = $MW->Photo('-format' => 'jpeg', -file=>$imgfile); my $image = $MW->Photo('-format' => $fmt, -file=>$imgfile); $MW->Button(-image=>$image, -command => sub { my $dialogA = $MW->DialogBox( -title => "About This Image", -buttons => [ "OK" ], ); $dialogA->add("Label", -borderwidth => '2', -background => "#FAEBD7", #ANTIQUE WHITE -font => 'bold', -justify => 'left', -relief => 'sunken', -text => "This Image is Produced by: N +ASA GSFC,\n and can be found along with other Astronomy Related Image +s here:\nhttp://antwrp.gsfc.nasa.gov/apod/astropix.html")->pack; ### --- Prevents Dialog Box Resizing $dialogA->bind('<Configure>' => sub{ my $xeD = $dialogA->XEvent; $dialogA->maxsize($xeD->w, $xeD->h); $dialogA->minsize($xeD->w, $xeD->h); }); $dialogA->Show; } )->pack; MainLoop(); ## Original Astronomy POD code by OverlordQ 08/22/2003 ## http://www.perlmonks.org/index.pl?node_id=285690 ## Additional Perl/Tk code by: PERLscienceman 08/24/2003 ## Code by PERLscienceman updated 08/26/2003 to compensate for capture + of .gif ## http://www.perlmonks.org/index.pl?node_id=243154