APOD to Desktop Wallpaper

Recently I had a meeting with one of our customers. I was setting up my laptop, plugging it into the beamer. Immediately the customer raised a brow. The beamer was showing a gorgeous HD image of the deepwater horizon oil rig blowing up. The following smalltalk was interesting.

I decided to show some nicer images the next time I'd meet them and this evening I got around to writing a little Perl snippet to download the Astronomy Picture of the Day from apod.nasa.gov <http://apod.nasa.gov>_ and set it as the Windows wallpaper. It uses LWP::get to fetch the main page. It fiddles with the text and downloads the linked image to $dlbase, finally using Win32::API to call SystemParametersInfo to set the background.

Be warned: during testing not every valid .jpeg actually would display as a desktop wallpaper. Another thing is that you really want to specify an absolute path, when calling SystemParametersInfo, or it wont display correctly after logging out and back in again, hence the $dlbasew variable.

    #!/usr/bin/perl  
    use strict;  
    use warnings;  

    use Win32;  
    use Win32::API;  
    use LWP::Simple;  
    require Carp;  

    # for both constants see winuser.h  

    use constant SPI_SETDESKWALLPAPER  => 20;  
    use constant SPIF_UPDATEANDSENDINI => 3; # SPIF_UPDATEINIFILE || SPIF_SENDWININICHANGE  

    my $apodbase = 'http://apod.nasa.gov/';  
    my $dlbase = 'c:/Users/mmeyer/Downloads';  
    my $dlbasew = 'c:\\Users\\mmeyer\\Downloads\\';  

    chdir $dlbase or die "Couldnt chdir to $dlbase: $!";  

    my $content = get($apodbase) or die "Couldn't download image: $!";  

    Carp::croak 'Content doesn\'t match' unless $content =~ m/<IMG SRC="(.*)"/g;  

    my $urlend = $1;  

    Carp::croak 'No url found' unless $urlend =~ m|([^/]+)$|;  
    my $targ = $1;  

    my $status = getstore($apodbase . $urlend, $targ);  
    Carp::croak "Couldn't store image: $status" unless is_success($status);  

    my $spf = Win32::API->new('user32','SystemParametersInfo', 'IIPI', 'I')  
      or Carp::croak "Could not import function.\n";  

    $spf->Call(SPI_SETDESKWALLPAPER, 0, $dlbasew . $targ, SPIF_UPDATEANDSENDINI)  
      or Carp::croak "Could not set wallpaper:\n" . Win32::GetLastError();  

    exit;  

See my github scratch repo.

comments powered by Disqus