#!/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 GD; use Getopt::Std; use Term::ANSIColor; use Weather::Google; my %opt; my $alpha; my $dump; my $share = $0; 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'}; } } } sub show_weather_png { my ($w, $h) = (140, 64); my $im = GD::Image->new($w, $h); 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 $offset = $i * 16; my $day = $forecasts->[$i]; my $wday = substr($day->{'day_of_week'}, 0, 2); my $low = sprintf('%3dc', $day->{'low'}); my $high = sprintf('%3dc', $day->{'high'}); my ($icon) = ($day->{'icon'} =~ m{ / ([^/]+) \. gif $ }x); if (not defined $day) { last; } $im->string(gdMediumBoldFont, 10, $offset, $wday , $black); $im->string(gdMediumBoldFont, 60, $offset, $low , $blue); $im->string(gdMediumBoldFont, 95, $offset, $high , $red); if ($dump) { say "${share}/weather/${icon}"; } if (-e "${share}/weather/${icon}") { my $tmp = GD::Image->newFromPng("${share}/weather/${icon}", 1); $im->copy($tmp, 40, $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 (-l $share) { my $link = readlink($share); $share =~ s{ [^/]+ $ }{}x; $link =~ s{ / bin / vweather $ }{}x; $share .= "${link}/share"; } else { $share =~ s{ / bin / vweather $ }{}x; $share .= '/share'; } 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.