Changeset 3

Show
Ignore:
Timestamp:
10/03/06 23:55:08 (7 years ago)
Author:
max
Message:

Lincoln's first pass at XML analysis.

Files:
2 modified

Legend:

Unmodified
Added
Removed
  • shepherd

    r1 r3  
    33# "Shepherd" 
    44 
    5 my $version = '0.2.3'; 
     5my $version = '0.2.5ng'; 
    66 
    77# A wrapper for various Aussie TV guide data grabbers 
     
    1919# 0.2.2   : --check 
    2020# 0.2.3   : Bugfix: archives correctly 
     21# 0.2.5ng : multi-grabber (potentially with partial data) & postprocessor support 
    2122# 
    2223# ToDo: 
     
    2425#   than whuffy. Store this in shepherd.conf. Whuffy is merely the first 
    2526#   mirror. 
    26 # * parse that XMLTV output and do something smart with it! 
    2727# * Make it check compilation after installing by calling --version or 
    2828#   --desc or --ready 
     
    6262my $debug = 1; 
    6363my $grabbers = { }; 
     64my $preferred; # obsolete but may still exist in shepherd.conf 
    6465my $region; 
    6566my $channels; 
    66 my $preferred; 
    6767my $config_file =   "$CWD/$progname.conf"; 
    6868my $channels_file = "$CWD/channels.conf"; 
    6969my $days; 
     70my $grabber_data = { }; 
     71my $master_starttime = time; 
    7072 
    7173# --------------------------------------------------------------------------- 
     
    113115} 
    114116 
    115 if ($opt->{prefer}) 
    116 { 
    117     set_preferred($opt->{prefer}); 
    118 } 
     117&set_order($opt->{setorder}) if ($opt->{setorder}); 
    119118 
    120119if ($opt->{check}) 
     
    123122} 
    124123 
    125 if ($opt->{enable} or $opt->{disable} or $opt->{prefer} or $opt->{check}) 
     124if ($opt->{enable} or $opt->{disable} or $opt->{setorder} or $opt->{check}) 
    126125{ 
    127126    write_config_file(); 
     
    168167sub grab_data 
    169168{ 
    170     my $grabber = choose_grabber(); 
    171  
    172     unless ($grabber) 
     169    my $used_grabbers = 0; 
     170    my $need_more_data = 1; 
     171 
     172    # iterate across grabbers until we have all our data we want (or need) 
     173    foreach my $grabber (sort { $grabbers->{$a}->{order} <=> $grabbers->{$b}->{order} } keys %$grabbers) { 
     174        next if ($grabbers->{$grabber}->{disabled}); 
     175        $used_grabbers++; 
     176 
     177        print "\nUsing grabber: $grabber.\n\n"; 
     178 
     179        my $output = $opt->{output}; 
     180        $output ||= "$CWD/output.xmltv"; 
     181        my $comm = "$GRABBER_DIR/$grabber/$grabber " . 
     182                   "--region $region " . 
     183                   "--channels_file $channels_file " . 
     184                   "--output $output"; 
     185 
     186        # NOTE: ideally a grabber could be instructed to fetch partial data through --channel, --starttime & --endtime 
     187        # we don't have that for now so instead whenever there is missing data, ALL 7 days for all channels will be collected 
     188        # FIXME FUTURE: call grabbers just with what we want... 
     189        $comm .= " --days $days" if ($days); 
     190        $comm .= " --offset $opt->{offset}" if ($opt->{offset}); 
     191        $comm .= " --debug" if ($debug); 
     192        $comm .= " @ARGV" if (@ARGV); 
     193        print "Excuting command:\n$comm\n\n"; 
     194 
     195        chdir "$GRABBER_DIR/$grabber/"; 
     196        system($comm); 
     197        chdir $CWD; 
     198 
     199        # soak up the data we just collected 
     200        &soak_up_grabber_data($grabber, $output); 
     201 
     202        # check to see if we have all the data we want 
     203        $need_more_data = &analyze_grabber_data(); 
     204 
     205        last if (!$need_more_data); 
     206    } 
     207 
     208 
     209    if ($used_grabbers == 0) 
    173210    { 
    174211        print "No valid grabbers installed/enabled!\n"; 
    175212        return; 
    176213    } 
    177     print "\nUsing grabber: $grabber.\n\n"; 
    178  
    179     my $output = $opt->{output}; 
    180     $output ||= "$CWD/output.xmltv"; 
    181     my $comm = "$GRABBER_DIR/$grabber/$grabber " . 
    182                "--region $region " . 
    183                "--channels_file $channels_file " . 
    184                "--output $output"; 
    185     $comm .= " --days $days" if ($days); 
    186     $comm .= " --offset $opt->{offset}" if ($opt->{offset}); 
    187     $comm .= " --debug" if ($debug); 
    188     $comm .= " @ARGV" if (@ARGV); 
    189     print "Excuting command:\n$comm\n\n"; 
    190  
    191     chdir "$GRABBER_DIR/$grabber/"; 
    192     system($comm); 
    193     chdir $CWD; 
    194 } 
    195  
    196 sub choose_grabber 
    197 { 
    198     return $preferred if ($preferred  
    199             and $grabbers->{$preferred}  
    200             and !$grabbers->{$preferred}->{disabled}); 
    201     foreach (keys %$grabbers) 
    202     { 
    203         return $_ unless ($grabbers->{$_}->{disabled}); 
    204     } 
    205     return undef; 
     214 
     215    if ($need_more_data) 
     216    { 
     217        print "Ran through all grabbers but still missing data!!! :(\n"; 
     218        return; 
     219    } 
     220} 
     221 
     222 
     223# interpret xmltv data from this grabber 
     224sub soak_up_grabber_data 
     225{ 
     226    my ($grabber, $output) = @_; 
     227    eval { $grabber_data->{$grabber} = XMLTV::parsefiles($output); }; 
     228} 
     229 
     230 
     231# analyze grabber data - do we have all the data we want? 
     232# returns 1 if we need more data, 0 if we have all we want 
     233sub analyze_grabber_data 
     234{ 
     235    # normalize starttime to beginning of hour 
     236    my ($sec,$min,@rest) = localtime($master_starttime); 
     237    my $starttime = $master_starttime - ((60 * $min) + $sec); 
     238    my $endtime; 
     239 
     240    if ($days) { 
     241        $endtime = $starttime + ($days * 86400); 
     242    } else { 
     243        $endtime = $starttime + (7*86400); 
     244    } 
     245    $starttime += (86400 * $opt->{offset}; 
     246 
     247    # XXX TODO!  for now just return 0 - we got all our data! 
     248    return 0; 
     249 
     250    # iterate across channels 
     251    #foreach my $channel (sort keys %{$channels}) { 
     252        # iterate across days 
     253 
     254    return 0; 
    206255} 
    207256 
     
    393442} 
    394443 
    395 sub set_preferred 
    396 { 
    397     my $proggy = shift; 
    398  
    399     if (!$grabbers->{$proggy}) 
    400     { 
    401         print "No such grabber: \"$proggy\".\n"; 
    402     } 
    403     else 
    404     { 
    405         $preferred = $proggy; 
     444sub set_order 
     445{ 
     446    my $order = shift; 
     447    my $all_ok = 1; 
     448 
     449    # first check that user supplied a valid list of grabbers 
     450    if ($order) { 
     451        foreach my $proggy (split(/,/,$order)) { 
     452            next if !$proggy; 
     453            if (!$grabbers->{$proggy}) { 
     454                $all_ok = 0; 
     455                print "Invalid grabber: \"$proggy\".\n"; 
     456            } 
     457        } 
     458    } 
     459    if ($all_ok) { 
     460        # if list was ok then first reset current order to zero 
     461        foreach my $proggy (keys %$grabbers) { 
     462            $grabbers->{$proggy}->{order} = 0; 
     463        } 
     464 
     465        # and now set order 
     466        my $order_num = 1; 
     467        if ($order) { 
     468            foreach my $proggy (split(/,/,$order)) { 
     469                $grabbers->{$proggy}->{order} = $order_num; 
     470                $order_num++; 
     471            } 
     472        } 
     473 
     474        # set order of any grabbers not specified in a random manner 
     475        foreach my $proggy (sort keys %$grabbers) { 
     476            if ($grabbers->{$proggy}->{order} == 0) { 
     477                $grabbers->{$proggy}->{order} = $order_num+int(rand(100)); 
     478            } 
     479        } 
     480 
     481        # .. and finally normalize the order (& show the user the order we chose) 
     482        print "Grabber order set as follows:\n"; 
     483        $order_num = 0; 
     484        $opt->{setorder} = ""; 
     485        foreach my $proggy (sort { $grabbers->{$a}->{order} <=> $grabbers->{$b}->{order} } keys %$grabbers) { 
     486            $order_num++; 
     487            $grabbers->{$proggy}->{order} = $order_num; 
     488            $opt->{setorder} .= "$proggy" . ","; 
     489            printf " #%d. %s%s\n",$grabbers->{$proggy}->{order},$proggy,($grabbers->{$proggy}->{disabled} ? " [disabled]" : ""); 
     490        } 
    406491    } 
    407492} 
     
    429514{ 
    430515    read_file($config_file, 'configuration'); 
     516 
     517    # if we are updating from a previous rev of shepherd.conf we may not 
     518    # have any 'order' fields set .. check here 
     519    my $found_order = 1; 
     520    foreach (keys %$grabbers) 
     521    { 
     522        $found_order = 0 if (!defined $grabbers->{$_}->{order}); 
     523    } 
     524    if (($found_order == 0) && (!$opt->{setorder})) 
     525    { 
     526        # at least one 'order' was missing .. we need to put it in! 
     527        printf "Legacy shepherd.conf file didn't contain any grabber order! Automatically updating using a random order, use --setorder to manually set this if you care.\n"; 
     528        &set_order(); 
     529        $opt->{setorder} = ""; 
     530    } 
    431531} 
    432532 
     
    466566    open(CONF, ">$config_file") or die "cannot write to $config_file: $!"; 
    467567    print CONF Data::Dumper->Dump( 
    468         [$region,  $preferred,  $grabbers ], 
    469         ["region", "preferred", "grabbers" ]); 
     568        [$region,  $grabbers ], 
     569        ["region", "grabbers" ]); 
    470570    close CONF; 
    471571    print "\nUpdated configuration file $config_file.\n" if ($debug); 
     
    499599              'noupdate'        => \$opt->{noupdate}, 
    500600 
    501               'prefer=s'        => \$opt->{prefer}, 
    502601              'disable=s'       => \$opt->{disable}, 
    503602              'enable=s'        => \$opt->{enable}, 
     603              'setorder=s'      => \$opt->{setorder}, 
    504604 
    505605              'days=i'          => \$days, 
     
    576676 
    577677 
    578     print "\nRandomly selecting preferred grabber.\n\n"; 
    579     set_preferred(choose_grabber()); 
     678    print "\nRandomly selecting grabber order.\n\n"; 
     679    set_order(); 
    580680 
    581681    show_channels(); 
     
    657757sub status 
    658758{ 
    659     print "    Grabber               Version  Enabled  Ready    Last Data\n" . 
    660           "    -----------------------------------------------------------\n"; 
     759    print " Grabber                     Version  Enabled  Ready    Last Data\n" . 
     760          " -----------------------------------------------------------------\n"; 
    661761    my $star; 
    662     foreach (sort keys %$grabbers) 
     762    foreach (sort { $grabbers->{$a}->{order} <=> $grabbers->{$b}->{order} } keys %$grabbers) 
    663763    { 
    664764        my $h = $grabbers->{$_}; 
    665         printf  "%-3s %-20s %8s %5s %7s %10s\n", 
    666                 $_ eq $preferred ? '(*)' : '', 
    667                 $_, 
     765        printf  " %-26s %8s %5s %7s %10s\n", 
     766                "$h->{order}. $_", 
    668767                $h->{ver}, 
    669768                $h->{disabled} ? '' : 'Y', 
     
    672771    } 
    673772 
    674     print "\n(*) = Preferred\n"; 
     773    printf "Grabbers shown in order of preference.\n"; 
    675774} 
    676775 
     
    687786    --show-config         Print setup details 
    688787 
    689     --prefer <s>          Designate <s> as your preferred grabber 
     788    --setorder <s>        Set order of grabbers to <s> (comma-seperated list of grabbers) 
    690789    --disable <s>         Don't ever use grabber <s> 
    691790    --enable <s>          Okay, maybe use it again then 
  • status

    r2 r3  
    1 shepherd:0.2.3 
     1shepherd:0.2.5ng 
    22rex:3.0.1 
    33ltd:1.51