Changeset 29

Show
Ignore:
Timestamp:
10/05/06 20:20:11 (7 years ago)
Author:
max
Message:

Choose grabber order more intelligently (added structure; in practice
it's still random for the moment)

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • shepherd

    r27 r29  
    5959 
    6060my $timeslot_size = (15 * 60);                  # 15 minute slots 
    61 my $channel_ok_threshold_percent = 90;          # 90% these may need to be tweaked but look ok for now 
    62 my $postprocessor_ok_threshold_percent = 80;    # 80% these may need to be tweaked but look ok for now 
    63 my $postprocessor_disable_failure_threshold = 5; # number of times a postprocessor has to fail in a row before it is automatically disabled 
     61my $channel_ok_threshold_percent = 90;          # 90% these may need to be  
     62                                                # tweaked but look ok for now 
     63my $postprocessor_ok_threshold_percent = 80;    # 80% these may need to be  
     64                                                # tweaked but look ok for now 
     65my $postprocessor_disable_failure_threshold = 5;# number of times a  
     66                                                # postprocessor has to fail  
     67                                                # in a row before it is  
     68                                                # automatically disabled 
    6469 
    6570my $opt; 
     
    6974my $debug = 1; 
    7075my $grabbers = { }; 
    71 my $postprocessors = { }; 
     76my $gscore; 
    7277my $preferred; # obsolete but may still exist in shepherd.conf 
    7378my $region; 
     
    7883 
    7984# postprocessing 
     85my $postprocessors = { }; 
    8086my $langs = [ 'en' ]; 
    8187my $num_timeslots; 
     
    130136} 
    131137 
    132 &set_order(0,$opt->{setorder}) if ($opt->{setorder}); 
    133 &check() if ($opt->{check}); 
    134  
    135 if ($opt->{enable} or $opt->{disable} or $opt->{setorder} or $opt->{check} or $opt->{mirror}) 
     138if ($opt->{setorder}) 
     139{ 
     140    set_order(0, $opt->{setorder});  
     141} 
     142 
     143if ($opt->{check}) 
     144{ 
     145    check(); 
     146} 
     147 
     148if ($opt->{enable} or 
     149    $opt->{disable} or 
     150    $opt->{setorder} or 
     151    $opt->{check} or 
     152    $opt->{mirror}) 
    136153{ 
    137154    set_order(1) if $made_changes; 
     
    187204    my $need_more_data = 1; 
    188205 
    189     printf "\nGrabber stage:\n"; 
    190  
    191     # iterate across grabbers until we have all our data we want (or need) 
    192     foreach my $grabber (sort { $grabbers->{$a}->{order} <=> $grabbers->{$b}->{order} } keys %$grabbers) { 
    193         next if ($grabbers->{$grabber}->{disabled}); 
     206    print "\nGrabber stage:\n"; 
     207 
     208    my $grabber; 
     209     
     210    while ($grabber = choose_grabber()) 
     211    { 
    194212        $used_grabbers++; 
    195213 
     
    197215        $grabbers->{$grabber}->{laststatus} = "unknown"; 
    198216 
    199         printf "\nSHEPHERD: Using grabber: (%d) %s\n",$grabbers->{$grabber}->{order},$grabber; 
     217        printf "\nSHEPHERD: Using grabber: (%d) %s\n", $used_grabbers, $grabber; 
    200218 
    201219        my $output = "$GRABBER_DIR/$grabber/output.xmltv"; 
     
    243261        return; 
    244262    } 
     263} 
     264 
     265sub choose_grabber 
     266{ 
     267    unless (defined $gscore) 
     268    { 
     269        foreach (keys %$grabbers) 
     270        { 
     271            unless ($grabbers->{$_}->{disabled}) 
     272            { 
     273                $gscore->{$_} = 0; 
     274            } 
     275        } 
     276    } 
     277 
     278    my $total = score_grabbers(); 
     279 
     280    print "Scoring unused valid grabbers:\n" . Dumper($gscore); 
     281 
     282    return undef unless (scalar keys %$gscore); 
     283 
     284    my $r = int(rand($total)); 
     285#    print "Total score: $total.\nRand: $r.\n"; 
     286 
     287    my $c = 0; 
     288    foreach (keys %$gscore) 
     289    { 
     290        if ($r >= $c and $r < ($c + $gscore->{$_})) 
     291        { 
     292            delete $gscore->{$_}; 
     293            return $_; 
     294        } 
     295        $c += $gscore->{$_}; 
     296    } 
     297    die "ERROR: failed to choose grabber."; 
     298} 
     299 
     300sub score_grabbers 
     301{ 
     302    my ($score, $total); 
     303    foreach (keys %$gscore) 
     304    { 
     305        $score = 10; 
     306        $gscore->{$_} = $score; 
     307        $total += $score; 
     308    } 
     309    return $total; 
    245310} 
    246311