#!/usr/bin/env perl ## Copyright © 2011 by Daniel Friesel ## License: WTFPL: ## 0. You just DO WHAT THE FUCK YOU WANT TO. use strict; use warnings; use 5.010; use autodie; use Derf::Visual::WeatherIcons; use GD; use Getopt::Std; use Term::ANSIColor; use Weather::Google; my %opt; my $alpha; my $dump; my $iconstore = Derf::Visual::WeatherIcons->new(); my $icon_re = qr{ / (?: weather_ )? ([^/]+?) (?: -40 )? \. gif $ }x; my $weather = Weather::Google->new( 'Essen, Germany', { language => 'de', }, ); my $forecasts = $weather->forecast_conditions(); sub show_weather_console { for my $day(@{$forecasts}) { printf( "%-6s %s%3d°c%s %s%3d°c%s %s\n", $day->{'day_of_week'}, color('blue'), $day->{'low'}, color('reset'), color('red'), $day->{'high'}, color('reset'), $day->{'condition'}, ); if ($dump) { say ($day->{'icon'} =~ $icon_re); } } } sub show_weather_png { my ($w, $h) = (200, 32); my $im = GD::Image->new($w, $h); my $line_height = 16; my $offset_wday = 5; my $offset_icon = $offset_wday + 20; my $offset_low = $offset_icon + 22; my $offset_high = $offset_low + 2*7 + 4; my $white = $im->colorAllocateAlpha(255, 255, 255, $alpha); my $blue = $im->colorAllocateAlpha( 0, 0, 200, $alpha); my $red = $im->colorAllocateAlpha(200, 0, 0, $alpha); my $gray = $im->colorAllocateAlpha(127, 127, 127, $alpha); my $black = $im->colorAllocateAlpha( 0, 0, 0, $alpha); $im->filledRectangle(1, 1, $w - 2, $h - 2, $white); for my $i (0..3) { my $y_offset = ($i < 2 ? $i : ($i % 2)) * $line_height; my $x_offset = ($i < 2 ? 0 : ($w/2 + 10)); my $day = $forecasts->[$i]; my $wday = substr($day->{'day_of_week'}, 0, 2); my $low = sprintf('%2d', $day->{'low'}); my $high = sprintf('%2d', $day->{'high'}); my ($icon) = ($day->{'icon'} =~ $icon_re); if (not defined $day) { last; } $im->string(gdMediumBoldFont, $x_offset + $offset_wday, $y_offset, $wday , $black); $im->string(gdMediumBoldFont, $x_offset + $offset_low, $y_offset, $low , $blue); $im->string(gdMediumBoldFont, $x_offset + $offset_high, $y_offset, $high , $red); if ($dump) { say $icon; } if ($iconstore->exists($icon)) { my $tmp = GD::Image->newFromPngData($iconstore->get($icon), 1); $im->copy($tmp, $x_offset + $offset_icon, $y_offset, 0, 0, 16, 16); } } $im->rectangle(0, 0, $w -1, $h -1, $gray); open(my $out_fh, '>', '/tmp/vweather.png'); binmode $out_fh; print $out_fh $im->png(); close($out_fh); } getopts('a:cdfg', \%opt); $alpha = $opt{'a'} // 40; $dump = $opt{'d'} // 0; if ($opt{'c'}) { show_weather_console(); } elsif ($opt{'g'}) { show_weather_png(); } if ($opt{'f'}) { exec('feh', '/tmp/vweather.png'); } __END__ =head1 NAME =head1 SYNOPSIS =head1 DESCRIPTION =head1 OPTIONS =head1 EXIT STATUS =head1 CONFIGURATION =head1 DEPENDENCIES =head1 BUGS AND LIMITATIONS =head1 AUTHOR Copyright (C) 2011 by Daniel Friesel Ederf@finalrewind.orgE =head1 LICENSE 0. You just DO WHAT THE FUCK YOU WANT TO.