summaryrefslogtreecommitdiff
path: root/bin/vweather
diff options
context:
space:
mode:
authorDaniel Friesel <derf@finalrewind.org>2011-02-11 21:02:00 +0100
committerDaniel Friesel <derf@finalrewind.org>2011-02-11 21:02:00 +0100
commit0b7ca2504d7559195ef33c1c695d1007096d1aee (patch)
tree5772d566dc610b3b9137336088935b4aaced621c /bin/vweather
parent02689454299e5a3427a467543642a0706479df3e (diff)
Add vweather
Diffstat (limited to 'bin/vweather')
-rwxr-xr-xbin/vweather147
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.