| 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) |
| 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 |
| | 224 | sub 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 |
| | 233 | sub 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; |
| 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; |
| | 444 | sub 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 | } |