#!/usr/bin/perl -w # # # rhimport # # Copyright (C) 2009 Christian Pointner # # This file is part of rhimport. # # rhimport is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # any later version. # # rhimport 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 General Public License for more details. # # You should have received a copy of the GNU General Public License # along with rhimport. If not, see . # use strict; use Switch; use DBI; use Date::Calc; use Time::localtime; use IO::Handle; use IPC::Open3; use File::Slurp; use lib '/usr/local/share/rhimport/'; use rhimport; my $DBHOST = "airplay"; my $DBUSER = "rivendell"; my $DBPW = "lldriven"; my $DB = "rivendell"; my @STATIC_FILES = ($ENV{'HOME'} . "/frontex", $ENV{'HOME'} . "/maribor" ); my $STAT_FILE = $ENV{'HOME'} . "/rhimport-mz.stat"; my $ZF_NOTE_FILE = $ENV{'HOME'} . "/rhimport-zf.last_note"; my $ZF_NEW_FILE = $ENV{'HOME'} . "/rhimport-zf.is_new"; my $PV_ID = '352'; binmode(STDIN, ":utf8"); binmode(STDOUT, ":utf8"); binmode(STDERR, ":utf8"); if($#ARGV >= 0 && $ARGV[0] eq 'last') { print "!!!This is the last attempt, there won't be a retry on error!!!\n" } my $user = `/usr/bin/id -un`; $user =~ s/\n//; my @today = Date::Calc::Today(); my @next_day = Date::Calc::Add_Delta_Days(@today, 1); my $dow = Date::Calc::Day_of_Week(@today); if($dow == 5) { @next_day = Date::Calc::Add_Delta_Days(@today, 3); } print "today: " . Date::Calc::Date_to_Text(@today) . "\n"; print "next day would be: " . Date::Calc::Date_to_Text(@next_day) . "\n"; my @import_day = @next_day; if(localtime->hour < 12) { print "It's forenoon, assuming to import for today\n"; @import_day = @today; } print "day of broadcast: " . Date::Calc::Date_to_Text(@import_day) . "\n"; $dow = Date::Calc::Day_of_Week(@import_day); my $group = ""; switch($dow) { case 1 { $group = "mahlzeitMo" } case 2 { $group = "mahlzeitDi" } case 3 { $group = "mahlzeitMi" } case 4 { $group = "mahlzeitDo" } case 5 { $group = "mahlzeitFr" } else { print("invalid day of week?!\n"); exit 1; } } my $dbh = DBI->connect("DBI:mysql:$DB:$DBHOST","$DBUSER","$DBPW") or die "Database Error: $DBI::errstr"; my @allowed_dbs = rhimport::get_dropboxes($dbh, $user, $group); if(scalar(@allowed_dbs) != 1) { print "found no or more than one Dropboxes for this group?!\n"; $dbh->disconnect(); exit 1; } my $dropbox = $allowed_dbs[0]->{'PATH'}; my $import_date = sprintf("%04d-%02d-%02d", @import_day); my $current_date = `cat $STAT_FILE`; if($current_date eq $import_date) { print "Already downloaded file of day in question\n"; $dbh->disconnect(); exit 0; } unless(-e $ZF_NEW_FILE) { print "zip-fm not imported yet - "; if($#ARGV >= 0 && $ARGV[0] eq 'last') { print "giving up, rebroadcasting last show"; } else { print "will retry later\n"; exit 0, } } sub read_first_line { my ($file) = @_; my @lines = read_file($file, binmode => ':utf8', err_mode => 'quiet'); return "" unless ($lines[0]); chomp($lines[0]); return $lines[0]; }; sub get_note { my ($file) = @_; my @lines = read_file($file, binmode => ':utf8', err_mode => 'quiet'); return "" unless ($lines[0]); chomp($lines[0]); $lines[0] = "

$lines[0]

\n"; return join('',@lines); }; sub find_next_file { my ($dir, $current) = @_; my %files = (); opendir(my $dh, $dir) or die $!; while (my $file = readdir($dh)) { next if ($file =~ m/^\./); next if ($file =~ m/_notes$/); $files{$file} = 1; } closedir($dh); my $num = scalar keys %files; foreach my $file (sort keys %files) { if($file gt $current) { return $num, $file; } $num--; } return 0, ""; }; my $sum_title = "zip-fm (WH)"; my $sum_text = get_note($ZF_NOTE_FILE) . "
\n"; print "\nsearching local files:\n"; my @files = (); my %next_files = (); foreach my $dir (@STATIC_FILES) { my $file = read_first_line("$dir/.current"); if($file eq "") { print " $dir: skipped !!! (no .current file or no more files)\n"; next; } my ($remaining, $next_file) = find_next_file($dir, $file); if($remaining >= 1) { print " $dir: adding $file\n (next: $next_file, $remaining files remaining)\n"; } else { print " $dir: adding $file\n (this was the last file!!!!)\n"; } $next_files{$dir} = $next_file; $sum_title = "$sum_title, " . read_first_line("$dir/.sum_title"); $sum_text = $sum_text . "
\n" . get_note("$dir/$file" . "_notes"); foreach my $ext ("flac", "wav", "ogg", "mp3") { push(@files, "$dir/.jingle.$ext") if(-e "$dir/.jingle.$ext"); } push(@files, "$dir/$file"); } $sum_text = $sum_text . "

\n"; print "\nsummary:\n" . $sum_title . "\n\n" . $sum_text . "\n"; rhimport::pv_add_note($sum_title, $sum_text, $PV_ID, sprintf("%04d-%02d-%02d", @import_day), "1"); print "\n"; print "will import " . join(", ", @files) . " to dropbox $dropbox\n"; my $error_cb = sub { my ($text) = @_; print "\n$text"; return 0; }; rhimport::check_key_file() or die "Import Key not found, use rhimport-create-id to create one\n"; my $ret = 1; my $log = rhimport::clear_carts($dbh, $group, 0); my ($cart, $high_cart) = rhimport::get_cart_range($dbh, $group); foreach my $file (@files) { if($cart > $high_cart) { print "not enough carts - will ignore remaining files!!!"; last; } print " importing $file to cart $cart\n"; my $import_log; ($ret, $import_log) = rhimport::import_single($file, $dropbox, $user, 0, $error_cb); $log .= $import_log; last unless $ret; $cart++; } $dbh->disconnect(); if(!$ret) { print "\nImport Error:\n"; print $log; exit 1; } unlink($STAT_FILE); open(my $fhs, '>', $STAT_FILE); print $fhs $import_date; close($fhs); unlink($ZF_NEW_FILE); foreach my $dir (@STATIC_FILES) { open(my $fhs, '>', "$dir/.current"); print $fhs $next_files{$dir} if ($next_files{$dir}); close($fhs); } exit 0;