diff options
author | Daniel Friesel <derf@finalrewind.org> | 2011-02-11 21:02:00 +0100 |
---|---|---|
committer | Daniel Friesel <derf@finalrewind.org> | 2011-02-11 21:02:00 +0100 |
commit | 0b7ca2504d7559195ef33c1c695d1007096d1aee (patch) | |
tree | 5772d566dc610b3b9137336088935b4aaced621c /bin | |
parent | 02689454299e5a3427a467543642a0706479df3e (diff) |
Add vweather
Diffstat (limited to 'bin')
-rwxr-xr-x | bin/vweather | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/bin/vweather b/bin/vweather new file mode 100755 index 0000000..06f6461 --- /dev/null +++ b/bin/vweather @@ -0,0 +1,147 @@ +#!/usr/bin/env perl +## Copyright © 2011 by Daniel Friesel <derf@finalrewind.org> +## 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 E<lt>derf@finalrewind.orgE<gt> + +=head1 LICENSE + + 0. You just DO WHAT THE FUCK YOU WANT TO. |