Avoid final extra \n at end of output.
[bkuhn:small-hacks.git] / conky-mythtv-weather-build.plx
1 #!/usr/bin/perl
2 # conky-mythtv-weather-build.plx
3 #
4 # Copyright (C) 2013, Bradley M. Kuhn
5 #
6 # This program gives you software freedom; you can copy, modify, convey,
7 # and/or redistribute it under the terms of the GNU General Public License
8 # as published by the Free Software Foundation; either version 3 of the
9 # License, or (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful, but
12 # WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 # General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License along
17 # with this program in a file called 'GPLv3'.  If not, write to the:
18 #    Free Software Foundation, Inc., 51 Franklin St, Fifth Floor
19 #                                    Boston, MA 02110-1301, USA.
20 #
21 # Quick hack to use mythtv scripts.
22
23 use strict;
24 use warnings;
25 use Date::Manip;
26 use utf8;
27 use feature 'unicode_strings';
28 use Encode qw(encode decode);
29
30 if (@ARGV != 6 and @ARGV != 7) {
31   print STDERR "usage: $0 /path/to/mythtv/git/checkout <units> <location> <text_voffset> <img_voffset> <fontsize_pixels> [hour-format]\n";
32   exit 1;
33 }
34 my($MYTH_PATH, $UNITS, $LOCATION, $VOFFSET_TEXT, $VOFFSET_IMAGE, $FONT_SIZE, $HOUR_FORMAT) = @ARGV;
35 $HOUR_FORMAT = "%a %H:%M" unless defined $HOUR_FORMAT;
36 my $degree;
37 if ($UNITS eq "SI") {
38   $degree = encode('utf8', "°C");
39 } elsif ($UNITS eq 'ENG') {
40   $degree = encode('utf8', "°F");
41 } else {
42   die "invalid units, $UNITS";
43 }
44
45 my($mythIconPath) = $MYTH_PATH .  "/mythplugins/mythweather/theme/default/icons";
46 my(%commands) = ('forecast' => $MYTH_PATH .
47                  "/mythplugins/mythweather/mythweather/scripts/us_nws/ndfd18.pl",
48                  'extended' => $MYTH_PATH .
49                  "/mythplugins/mythweather/mythweather/scripts/us_nws/ndfd.pl");
50
51 my %data;
52 foreach my $type (keys %commands) {
53   open(DATA, "-|", $commands{$type}, '-u', $UNITS, $LOCATION)
54     or die "unable to run: $commands{$type} -u $UNITS $LOCATION: $!";
55
56   while (my $line = <DATA>) {
57     die "bad line output in data: $line"
58       unless $line =~ /^\s*(\S+)\s*:\s*:\s*(.+)$/;
59     $data{$type}{$1} = $2;
60   }
61   close DATA;
62   die "error($?) running: $commands{$type} -u $UNITS $LOCATION: $!"
63     unless $? == 0;
64 }
65
66 $data{forecast}{updatetime} =~ s/\s*Last\s+Updated\s+on\s*//;
67 my $now =  ParseDate("now");
68 my $x = Delta_Format(DateCalc(ParseDate($data{forecast}{updatetime}), $now), 0,
69                      "%mt minutes ago");
70
71 $data{forecast}{updatetime} = $x if defined $x;
72 $data{forecast}{updatetime} = "as of $data{forecast}{updatetime}";
73 my %doneDays;
74 foreach my $ii (qw/0 1 2 3 4 5/) {
75   my $time = ParseDate($data{forecast}{"time-${ii}"});
76   if (defined $time) {
77     $time = DateCalc($time, "+ 1 day") if ($time lt $now);
78     $data{forecast}{"time-${ii}"} = UnixDate($time, $HOUR_FORMAT);
79     $doneDays{UnixDate($time, '%A')} = 'forecast';
80   }
81 }
82 my($xpos, $vpos) = ($FONT_SIZE * (3 + length($data{forecast}{"time-0"})),
83                     $VOFFSET_IMAGE + 37);
84 my $f = $FONT_SIZE + 5;
85 print '${voffset ', $VOFFSET_TEXT , '} ${font :size=', $f, '}${alignc}Weather:${font}', " $data{forecast}{'18hrlocation'}\n\n";
86 foreach my $ii (qw/0 1 2 3 4 5/) {
87   my($time, $temp, $pop, $icon) =
88     ($data{forecast}{"time-${ii}"}, $data{forecast}{"temp-${ii}"},
89      $data{forecast}{"pop-${ii}"}, $data{forecast}{"18icon-${ii}"});
90   $pop =~ s/\s+//g;
91   $pop = "  $pop" if length($pop) eq 2;
92   $pop = " $pop" if length($pop) eq 3;
93   print "\${font :size=${FONT_SIZE}px} $time: $temp $degree \${image $mythIconPath/$icon -p $xpos,$vpos  -s 25x18}     $pop chance\n";
94   $vpos += ($FONT_SIZE * 2) + 15;
95 }
96 ($xpos, $vpos) = ($FONT_SIZE * 26,
97                     $VOFFSET_IMAGE + 37 + 230);
98 foreach my $ii (qw/0 1 2 3 4 5/) {
99   next if defined $doneDays{$data{extended}{"date-${ii}"}};
100   my($day, $high, $low, $icon) =
101     ($data{extended}{"date-${ii}"}, $data{extended}{"high-${ii}"},
102      $data{extended}{"low-${ii}"}, $data{extended}{"icon-${ii}"});
103   print "\n\${font :size=${FONT_SIZE}px} $day:\${goto 120}High: $high $degree   Low: $low $degree \${image $mythIconPath/$icon -p $xpos,$vpos  -s 25x18}\n";
104   $vpos += ($FONT_SIZE * 2) + 15;
105 }
106
107 ###############################################################################
108 #
109 # Local variables:
110 # compile-command: "perl -c conky-mythtv-weather-build.plx"
111 # End:
112