#!/usr/bin/perl -w # # rhrdlibs # # Copyright (C) 2015-2016 Christian Pointner # # This file is part of rhrdlibs. # # rhrdlibs is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # any later version. # # rhrdlibs is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with rhrdlibs. If not, see . # use strict; # TODO: remove me!!! use lib "../lib/"; use Data::Dumper::Simple; use RHRD::rddb; use RHRD::utils; use DateTime; use Date::Calc; use DateTime::Format::Strptime; sub print_usage { print STDERR "Usage: rhrd-schedules generate YYYY-MM-DD\n" . " rhrd-schedules show (W1|W2|W3|W4|ALL) (MO|TU|WE|TH|FR|SA|SU|ALL)\n"; } sub generate { my ($ctx, $year, $month, $day) = @_; my ($ret, $data) = RHRD::utils::fetch_parse_json("https://pv.helsinki.at/export/day_schedule/$year/$month/$day", "rhrd-schedules"); if(!$ret) { print STDERR "Error fetching export from PV: $data\n"; return 1; } for my $entry (@{$data}) { my $start = DateTime::Format::Strptime::strptime("%Y-%m-%d_%H:%M:%S", ${$entry}{'start'}); my $title = ${$entry}{'title'}; my $showid = ${$entry}{'id'}; print "$start: ($showid) $title\n"; } # TODO: create day log in rddb return 0; } sub show__day { my ($ctx, $year, $month, $day) = @_; print "https://pv.helsinki.at/export/day_schedule/$year/$month/$day\n"; my ($ret, $data) = RHRD::utils::fetch_parse_json("https://pv.helsinki.at/export/day_schedule/$year/$month/$day", "rhrd-schedules"); if(!$ret) { print STDERR "Error fetching export from PV: $data\n"; return 1; } my $dow = Date::Calc::Day_of_Week($year, $month, $day); my $week = RHRD::utils::get_rd_week(DateTime->new(year => $year, month => $month, day => $day, hour => 12)); my $errcnt = 0; for my $entry (@{$data}) { my $start = DateTime::Format::Strptime::strptime("%Y-%m-%d_%H:%M:%S", ${$entry}{'start'}); my $start_short = DateTime::Format::Strptime::strftime("%H:%M", $start); my $end = DateTime::Format::Strptime::strptime("%Y-%m-%d_%H:%M:%S", ${$entry}{'end'}); my $duration = $start->delta_ms($end); my $title = ${$entry}{'title'}; my $pvid = ${$entry}{'id'}; my $showid = ${$entry}{'automation-id'}; next if $pvid == 1; # 'Unmoderiertes Musikprogramm' print " " . DateTime::Format::Strptime::strftime("%H:%M:%S", $start) . ": ($showid) -> "; if($showid > 0) { my ($show, $status, $errorstring) = RHRD::rddb::get_show_info($ctx, $showid); if(!defined $show) { print "$status: $errorstring\n"; $errcnt++; } else { my @weeks = split('', ${$show}{'RHYTHM'}); if ($title ne ${$show}{'TITLE'}) { print "WARNING: title mismatch (PV: '$title' != RD: '" . ${$show}{'TITLE'} . "')\n"; $errcnt++; } elsif ($dow != ${$show}{'DOW'}) { print "WARNING: wrong day of week (PV: " . Date::Calc::Day_of_Week_to_Text($dow) . " != RD: " . Date::Calc::Day_of_Week_to_Text(${$show}{'DOW'}) . ")\n"; $errcnt++; } elsif ($weeks[$week-1] != '1') { print "WARNING: this is week $week but show rhythm is: " . ${$show}{'RHYTHM'} . " -> show shouldn't air in this week.\n"; $errcnt++; } elsif ($duration->{'minutes'} != ${$show}{'LEN'}) { print "WARNING: wrong show length (PV: " . $duration->minutes . " != RD: " . ${$show}{'LEN'} . ")\n"; $errcnt++; } elsif ($start_short ne ${$show}{'STARTTIME'}) { print "WARNING: wrong show start-time (PV: " . $start_short . " != RD: " . ${$show}{'STARTTIME'} . ")\n"; $errcnt++; } else { print "OK: $title\n"; } } } else { print "ERROR: show '$pvid|$title' not configured\n"; $errcnt++; } } return $errcnt; } sub show { my ($ctx, $week, $dow) = @_; my @dates = (); # TODO: parse week number and day my @d1 = (2016, 4, 14); my @d2 = (2016, 4, 15); $dates[0] = \@d1; $dates[1] = \@d2; for my $date (@dates) { print Date::Calc::Date_to_Text(@{$date}) . ":\n"; my $errcnt = show__day($ctx, @{$date}); print " -> $errcnt errors.\n\n"; } return 0; } my $num_args = $#ARGV + 1; if($num_args < 1) { print_usage(); exit(1); } my $cmd = $ARGV[0]; my $ret = 0; my ($ctx, undef, $errorstring) = RHRD::rddb::init(); if(defined $ctx) { if($cmd eq "generate") { if($num_args == 2 && $ARGV[1] =~ m/^(\d{4})-(\d{2})-(\d{2})$/) { $ret = generate($ctx, $1, $2, $3); } else { print_usage(); $ret = 1; } } elsif($cmd eq "show") { if($num_args != 3) { print_usage(); $ret = 1; } else { $ret = show($ctx, $ARGV[1], $ARGV[2]); } } else { print_usage(); $ret = 1; } RHRD::rddb::destroy($ctx); } else { print STDERR "$errorstring\n"; $ret = 1; } exit $ret;