Changeset 555 for grabbers/yahoo7web

Show
Ignore:
Timestamp:
02/25/07 14:59:27 (6 years ago)
Author:
lincoln
Message:

yahoo7web: 1. harden use of Storable a bit, 2. cache day/summary pages for up to 4 hours so as to make micrograbbing more efficient

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • grabbers/yahoo7web

    r538 r555  
    88 
    99my $progname = "yahoo7web"; 
    10 my $version = "0.11"; 
     10my $version = "0.12"; 
    1111 
    1212use LWP::UserAgent; 
     
    166166sub read_cache 
    167167{ 
    168         # convert old-style Data::Dumper cache to new format 
    169         if (-r "yahoo7web.cache") { 
    170                 local (@ARGV, $/) = ("yahoo7web.cache"); 
    171                 no warnings 'all'; eval <>; die "$@" if $@; 
    172  
    173                 &write_cache; 
    174                 unlink "yahoo7web.cache"; 
    175         } 
    176  
    177168        if (-r $opt->{cache_file}) { 
    178                 my $store = Storable::retrieve($opt->{cache_file}); 
    179                 $data_cache = $store->{data_cache}; 
     169                my $store; 
     170                eval { $store = Storable::retrieve($opt->{cache_file}); }; 
     171                $data_cache->{progs} = $store->{data_cache} if (defined $store->{data_cache}); 
     172 
     173                if (defined $store->{day_cache}) { 
     174                        $data_cache->{day} = $store->{day_cache}; 
     175 
     176                        # age day cache on reading.. 
     177                        for my $url (keys %{($data_cache->{day})}) { 
     178                                if ($data_cache->{day}->{$url}->{fetched} < (time-(4*3600))) { 
     179                                        delete $data_cache->{day}->{$url}; 
     180                                        $stats{expired_url_from_cache}++; 
     181                                } 
     182                        } 
     183                } 
    180184        } else { 
    181185                printf "WARNING: no programme cache $opt->{cache_file} - have to fetch all details\n"; 
     
    191195sub write_cache 
    192196{ 
    193         # cleanup old entries from cache 
    194         for my $cache_key (keys %{$data_cache}) { 
    195                 my ($starttime, @rest) = split(/:/,$cache_key); 
    196                 if ($starttime < (time-86400)) { 
    197                         delete $data_cache->{$cache_key}; 
    198                         $stats{expired_from_cache}++; 
     197        # cleanup old prog entries from cache 
     198        if (defined $data_cache->{progs}) { 
     199                for my $cache_key (keys %{($data_cache->{progs})}) { 
     200                        my ($starttime, @rest) = split(/:/,$cache_key); 
     201                        if ($starttime < (time-86400)) { 
     202                                delete $data_cache->{progs}->{$cache_key}; 
     203                                $stats{expired_from_cache}++; 
     204                        } 
    199205                } 
    200206        } 
    201207 
    202208        my $store; 
    203         $store->{data_cache} = $data_cache; 
     209        $store->{data_cache} = $data_cache->{progs} if (defined $data_cache->{progs}); 
     210        $store->{day_cache} = $data_cache->{day} if (defined $data_cache->{day}); 
    204211 
    205212        Storable::store($store, $opt->{cache_file}); 
     
    485492 
    486493                        my $url = sprintf "http://au.tv.yahoo.com/tv-guide/?hour=%s&min=%s&date=%s&mon=%s&year=%s&tvrg=%s&next=%s", 
    487                                 POSIX::strftime("%H",localtime($starttime)), 
    488                                 POSIX::strftime("%M",localtime($starttime)), 
    489                                 POSIX::strftime("%d",localtime($starttime)), 
    490                                 POSIX::strftime("%m",localtime($starttime)), 
    491                                 POSIX::strftime("%Y",localtime($starttime)), 
     494                                POSIX::strftime("%H",localtime($starttime_midnight)), 
     495                                POSIX::strftime("%M",localtime($starttime_midnight)), 
     496                                POSIX::strftime("%d",localtime($starttime_midnight)), 
     497                                POSIX::strftime("%m",localtime($starttime_midnight)), 
     498                                POSIX::strftime("%Y",localtime($starttime_midnight)), 
    492499                                $opt->{region}, $currtime; 
    493500 
     
    515522        my ($url, $day_num, $day_start) = @_; 
    516523        my %chan_map = &build_channel_quirks_map; 
    517  
    518         my $data = &get_url($url,5); 
    519         return if (!$data); 
     524        my $data; 
     525 
     526        if ((defined $data_cache->{day}->{$url}) && 
     527            (defined $data_cache->{day}->{$url}->{data})) { 
     528                $data = $data_cache->{day}->{$url}->{data}; 
     529                $stats{used_cached_day_page}++; 
     530        } else { 
     531                $data = &get_url($url,5); 
     532                return if (!$data); 
     533                $data_cache->{day}->{$url}->{fetched} = time; 
     534                $data_cache->{day}->{$url}->{data} = $data; 
     535        } 
    520536 
    521537        my $tree = HTML::TreeBuilder->new_from_content($data); 
     
    635651                $prog_count++; 
    636652 
    637                 if ((!defined $data_cache->{$cache_key}) && 
     653                if ((!defined $data_cache->{progs}->{$cache_key}) && 
    638654                    (!defined $opt->{no_details}) && 
    639655                    (defined $prog->{event_id}) && 
     
    650666 
    651667                # if we got additional details from the cache, add them now 
    652                 if (defined $data_cache->{$cache_key}) { 
    653                         foreach my $key (keys %{($data_cache->{$cache_key})}) { 
    654                                 $prog->{$key} = $data_cache->{$cache_key}->{$key}; 
     668                if (defined $data_cache->{progs}->{$cache_key}) { 
     669                        foreach my $key (keys %{($data_cache->{progs}->{$cache_key})}) { 
     670                                $prog->{$key} = $data_cache->{progs}->{$cache_key}->{$key}; 
    655671                        } 
    656672                } 
     
    708724                                ; # nothing 
    709725                        } elsif ($f eq "subtitle") { 
    710                                 $data_cache->{$cache_key}->{'sub-title'} = [[ $v, $opt->{lang} ]]; 
     726                                $data_cache->{progs}->{$cache_key}->{'sub-title'} = [[ $v, $opt->{lang} ]]; 
    711727                        } elsif ($f eq "description") { 
    712                                 $data_cache->{$cache_key}->{desc} = [[ $v, $opt->{lang} ]]; 
     728                                $data_cache->{progs}->{$cache_key}->{desc} = [[ $v, $opt->{lang} ]]; 
    713729                        } elsif ($f eq "genre") { 
    714730                                push(@genre, translate_category($v)); 
    715731                        } elsif ($f eq "captions") { 
    716                                 $data_cache->{$cache_key}->{subtitles} = [ { 'type' => 'teletext' } ] if ($v eq "true"); 
     732                                $data_cache->{progs}->{$cache_key}->{subtitles} = [ { 'type' => 'teletext' } ] if ($v eq "true"); 
    717733                        } elsif ($f eq "start_date") { 
    718734                                ; # nothing 
     
    740756                        } 
    741757 
    742                         $data_cache->{$cache_key}->{category} = [[ @genre ]] if ($#genre != -1); 
     758                        $data_cache->{progs}->{$cache_key}->{category} = [[ @genre ]] if ($#genre != -1); 
    743759 
    744760                } else { 
     
    748764        } 
    749765 
    750         printf "DEBUG: cached entries for '$cache_key': ".Dumper($data_cache->{$cache_key}) 
     766        printf "DEBUG: cached entries for '$cache_key': ".Dumper($data_cache->{progs}->{$cache_key}) 
    751767          if (defined $opt->{debug}); 
    752768}