Changeset 1531


Ignore:
Timestamp:
03/06/17 04:00:08 (6 months ago)
Author:
mbarry
Message:

rex updates from Mark, incl. removal of Date::Parse dependency

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/grabbers/rex

    r1530 r1531  
    33# "Rex" 
    44 
    5 my $version  = '10.1.0a';  
     5my $version  = '10.3.2';  
    66 
    77# An Australian TV Guide Grabber (a.k.a. tv_grab_au) 
     
    1818#  
    1919# 10.1.0 - updated 17th Feb 2017 - interim fixes to parsing and URL changes 
     20# 10.2.0 - updated 3rd Mar 2017  - version step with push to testing repo 
     21# 10.3.0 - updated 4th Mar 2017  - updated to be a bit more tidy 
     22#                                - remove dependency on Date::Parse that was 
     23#                                  added in 10.1.0 and promptly forgotten about. 
     24#                                - removed ugly ugly duration hack and replaced with 
     25#                                  proper solution 
     26#                                - cache fixes. 
     27#                                - various misc others. 
     28# 10.3.1 - updated 6th Mar 2017  - override for SBS v SBS ONE incorrect naming on yourtv.com.au 
     29# 10.3.2 - updated 6th Mar 2017  - reverting the override from 10.3.1 
     30# 
     31# 
     32# 
     33# 
     34# 
     35# todo 
     36# guard against program running over midnight (ie over two days) 
    2037 
    2138use strict; 
     
    2340use Getopt::Long; 
    2441use Date::Manip; 
    25 use Date::Parse; 
    2642use File::Path; 
    2743use File::Basename; 
     
    228244  my $pid = shift; 
    229245 
     246# disabled cache verify on the stop time and subtitle as the precache wont hold those values from 
     247# the new guide at this point and the subsequent compare just returns a valid compare regardless. 
     248# 
     249# disabled cache verify on the title because it appears that the shepherd cache implementation 
     250# stores the title using the reconciler title. This will often fail the compare even just om 
     251# successive runs and causes a much slower execution. 
     252# 
     253# in my opinion the cache verify on starttime combined with the cache clean on open combined with 
     254# using the show id as the key should be sufficient to prevent the cache returning false positives. 
     255 
    230256  my @c = (  
    231             [  
    232               'Title',  
    233               $cached->{$pid}->{title}[0][0],  
    234               $precache->{$pid}->{title}  
    235             ], 
     257#            [  
     258#             'Title',  
     259#             $cached->{$pid}->{title}[0][0],  
     260#             $precache->{$pid}->{title}  
     261#           ], 
    236262            [  
    237263              'Start time', 
     
    239265              $precache->{$pid}->{start} 
    240266            ], 
    241             [ 
    242               'Stop time', 
    243               $cached->{$pid}->{stop}, 
    244               $precache->{$pid}->{stop} 
    245             ], 
    246             [ 
    247               'Subtitle', 
    248               ($cached->{$pid}->{'sub-title'} ? $cached->{$pid}->{'sub-title'}[0][0] : undef), 
    249               $precache->{$pid}->{'sub-title'} 
    250             ] 
     267#           [ 
     268#             'Stop time', 
     269#             $cached->{$pid}->{stop}, 
     270#             $precache->{$pid}->{stop} 
     271#           ], 
     272#           [ 
     273#             'Subtitle', 
     274#             ($cached->{$pid}->{'sub-title'} ? $cached->{$pid}->{'sub-title'}[0][0] : undef), 
     275#             $precache->{$pid}->{'sub-title'} 
     276#           ] 
    251277          );  
    252278  foreach my $cmp (@c) 
     
    272298 
    273299  print "$name mismatch: \"$arg1\" vs \"$arg2\".\n" if ($debug); 
     300print "$name mismatch: \"$arg1\" vs \"$arg2\".\n"; 
    274301  return 0; 
    275302} 
     
    395422sub clean_cache 
    396423{ 
    397     my $r = expand_date(localtime($runtime - (3*3600)).""); 
     424    my $r = expand_date(localtime($runtime - (27*3600)).""); 
    398425    my $c = 0; 
    399426    print "Removing cache items that finish earlier than $r.\n" if ($debug); 
     
    403430        { 
    404431            print "Removing $cached->{$_}->{title}[0][0] (" . Ymd($cached->{$_}->{stop}). ")\n" if ($debug); 
     432print "Removing $cached->{$_}->{title}[0][0] (" . Ymd($cached->{$_}->{stop}). ")\n"; 
    405433            delete $cached->{$_}; 
    406434            $c++; 
     
    496524    foreach my $row (@$rows) 
    497525    { 
    498    my $channame = $row->{name}; 
     526        my $channame = $row->{name}; 
    499527        my $curchan = translate_channel_name($channame, scalar(grep($_ eq $channame, @channels_seen))); 
    500528        push @channels_seen, $channame; 
     
    502530        {  
    503531            print "Ignoring unsubscribed channel $curchan.\n" if ($debug); 
     532print "Ignoring unsubscribed channel $curchan.\n"; 
    504533            next; 
    505534        } 
    506535        print "Channel: $curchan.\n" if ($debug); 
    507536 
    508         foreach my $block (@{$row->{blocks}}) 
     537        foreach my $block (@{$row->{blocks}}) 
    509538        { 
    510        my $duration = $block->{offsets}; 
    511  
    512        # if the text margin-left appears in the duration going to assume that the program 
    513        # was included in the previous days results and will ignore it here 
    514        if ($duration =~ /margin-left/) { 
    515        next; 
    516        } 
    517  
    518        # no endtime or duration in the json guide data 12th Feb 2017 
    519        # so attempt to spoof a valid duration from available info 
    520             $duration =~ s#[%].*##g; 
    521             $duration =~ s#.*[ ]##g; 
    522        $duration = $duration * 100000; 
    523        $duration = $duration / 6944; 
    524             $duration =~ s#[.].*##g; 
    525        $duration = $duration * 60; 
     539            my $duration = $block->{offsets}; 
     540            my $ignore_first_show = 0; 
     541            # if the text margin-left appears in the duration it means that the first show in this block 
     542            # is actually from the previous day and needs to be ignored. 
     543            # note - its the first show in the block not the whole block. But assuming whole block for debugging 
     544            if ($duration =~ /margin-left/) { 
     545                $ignore_first_show = 1; 
     546            } 
    526547 
    527548            foreach my $show (@{$block->{shows}}) 
    528549            { 
    529 #      addme($show, $curchan); 
    530                 addme($show, $curchan, $duration, $date); 
    531  
     550                if ($ignore_first_show == 1) 
     551                { 
     552                    $ignore_first_show = 0; 
     553                    next; 
     554                } 
     555                my $pid = $show->{id}; 
     556 
     557                $precache->{$pid} = { 
     558                    'title' => $show->{title}, 
     559                    'start' => convert_date(sprintf "%s %s", $date, $show->{date}), 
     560#                    'stop' => $real_end_time, # cannot do stop time here if using duration from details page 
     561#                    'debug_showid' => $show->{id}, 
     562#                    'debug_programid' => $show->{programId}, 
     563                    'channel' => $channels->{$curchan}, 
     564                }; 
    532565            } 
    533566        } 
    534567    } 
    535 } 
    536  
    537 sub addme 
    538 { 
    539     my ($show, $curchan, $duration, $date) = @_; 
    540  
    541     my $pid = $show->{id}; 
    542  
    543     my $text_start_time = $show->{date}; 
    544     $text_start_time = $date . " " . $text_start_time; 
    545     my $real_start_time = str2time($text_start_time); 
    546     my $real_end_time = $real_start_time + $duration; 
    547     $real_start_time = strftime '%Y%m%d%H%M%S', localtime $real_start_time; 
    548     $real_end_time = strftime '%Y%m%d%H%M%S', localtime $real_end_time; 
    549  
    550     $precache->{$pid} = { 
    551         'title' => $show->{title}, 
    552    'start' => $real_start_time, 
    553    'stop' => $real_end_time, 
    554 #        'debug_rex_id1' => $show->{id}, 
    555 #        'debug_rex_id2' => $show->{programId}, 
    556         'channel' => $channels->{$curchan}, 
    557     }; 
    558  
    559     my %type; 
    560     $type{'movie'} = 1 if ($show->{movie} and lc $show->{movie} ne 'false'); 
    561568} 
    562569 
     
    576583 
    577584    my $region = $opt->{region}; 
     585 
    578586    return $chan unless ($rchans->{$region} and $rchans->{$region}->{$chan}); 
    579587    return $rchans->{$region}->{$chan}->[$seen_before]; 
     
    598606    $show->{language} = [ $lang ]; 
    599607 
    600     $show->{desc} = [[ $data->{synopsis}, $lang ]] || [[ $data->{program}->{longSynopsis}, $lang ]] || [[ $data->{program}->{mediumSynopsis}, $lang ]] || [[ $data->{program}->{shortSynopsis}, $lang ]] || [[ $data->{synopsis}, $lang ]]; 
    601  
    602     if (!($show->{desc}[0][0])) 
    603     { 
    604         $show->{desc} = [[ $data->{synopsis}, $lang ]]; 
    605     } 
    606     if (!($show->{desc}[0][0])) 
    607     { 
    608         $show->{desc} = [[ $data->{program}->{longSynopsis}, $lang ]]; 
    609     } 
    610     if (!($show->{desc}[0][0])) 
    611     { 
    612         $show->{desc} = [[ $data->{program}->{mediumSynopsis}, $lang ]]; 
    613     } 
    614     if (!($show->{desc}[0][0])) 
    615     { 
    616         $show->{desc} = [[ $data->{program}->{shortSynopsis}, $lang ]]; 
    617     } 
    618     if (!($show->{desc}[0][0])) 
    619     { 
    620    $show->{desc} = [[ $data->{program}->{title}, $lang ]]; 
    621     } 
    622     if (!($show->{desc}[0][0])) 
    623     { 
    624         $show->{desc} = [[ "Failed to parse a valid description, shouldn't be possible", $lang ]]; 
    625     } 
     608    if (!$data->{synopsis}) { 
     609        $show->{desc} = [[ $data->{program}->{title}, $lang ]]; } 
     610    else { 
     611        $show->{desc} = [[ $data->{synopsis}, $lang ]]; } 
    626612 
    627613    if ($data->{classification}) 
    628614    { 
    629    $show->{rating} = [[ uc $data->{classification}, 'ABA', undef]]; 
     615        $show->{rating} = [[ uc $data->{classification}, 'ABA', undef]]; 
    630616    } 
    631617 
     
    634620        $show->{'previously-shown'} = { }; 
    635621    } 
     622 
    636623    if ($data->{premiere}) 
    637624    { 
     
    644631    } 
    645632 
    646     if (is_true($data->{mainCast})) 
    647     { 
    648    $show->{'credits'}{'actor'} = [ split(/, ?/, strip_whitespace($data->{mainCast})) ]; 
     633    if ($data->{mainCast}) 
     634    { 
     635        $show->{'credits'}{'actor'} = [ split(/, ?/, strip_whitespace($data->{mainCast})) ]; 
    649636    } 
    650637 
     
    659646    } 
    660647 
    661 #    if (is_true($data->{realtime})) 
    662 #    { 
    663 $type{live} = 1; 
    664 #    } 
    665  
    666     if (is_true($data->{closedCaptions}) or is_true($data->{subtitles})) 
     648    if ($data->{live}) 
     649    { 
     650        $type{live} = 1; 
     651    } 
     652 
     653    if ($data->{closedCaptions} || $data->{subtitles}) 
    667654    { 
    668655        $show->{'subtitles'} = [ { 'type' => 'teletext' } ]; 
    669656    } 
    670657 
    671 #    $show->{language} = [ $data->{meta}->{info}->{language} || 'en' ]; 
    672  
    673     if ($data->{country}) 
    674     { 
    675    $show->{country} = [[ $data->{country}, 'en' ]]; 
     658    if ($data->{program}->{country}) 
     659    { 
     660        $show->{'country'} = [[ $data->{program}->{country}, 'en' ]]; 
     661    } 
     662 
     663    if ($data->{program}->{yearReleased}) 
     664    { 
     665        $show->{'date'} =  $data->{program}->{yearReleased}; 
     666    } 
     667 
     668    if ($data->{duration}) 
     669    { 
     670        $show->{'length'} = ($data->{duration} *60); 
     671        my $s = $show->{'start'}; 
     672        my $txt_date = (substr $s, 0, 4) . "-" . (substr $s, 4, 2) . "-" . (substr $s, 6, 2) . "-" . (substr $s, 8, 2) . ":" . (substr $s, 10, 2) . ":" . (substr $s, 12, 2); 
     673        $show->{'stop'} = ParseDateString("epoch " . (UnixDate($txt_date,'%s') + ($data->{duration} * 60))); 
     674        $show->{'stop'} =~ tr/://d; 
     675    } 
     676    elsif ($data->{realtimeDurationSeconds}) 
     677    { 
     678        $show->{length} = $data->{realtimeDurationSeconds}; 
     679        my $s = $show->{'start'}; 
     680        my $txt_date = (substr $s, 0, 4) . "-" . (substr $s, 4, 2) . "-" . (substr $s, 6, 2) . "-" . (substr $s, 8, 2) . ":" . (substr $s, 10, 2) . ":" . (substr $s, 12, 2); 
     681        $show->{'stop'} = ParseDateString("epoch " . (UnixDate($txt_date,'%s') + $data->{realtimeDurationSeconds})); 
     682        $show->{'stop'} =~ tr/://d; 
    676683    } 
    677684 
    678685    $show->{'video'} = \%video if (%video); 
    679686 
     687    $type{'movie'} = 1 if ($data->{movie} && !$data->{series}); 
     688    $type{'series'} = 1 if (!$data->{movie} && $data->{series}); 
     689 
    680690    $show->{'category'} = [ &Shepherd::Common::generate_category($show->{'title'}[0][0], undef, %type) ]; 
    681691 
    682692#    print Dumper($show) if ($debug); 
     693 
    683694    return $show; 
    684695} 
     
    881892} 
    882893 
     894sub convert_date 
     895{ 
     896    my $str = shift; 
     897 
     898    my $ret = ParseDate($str); 
     899    $ret =~ tr/://d; 
     900 
     901    return $ret; 
     902} 
     903 
    883904sub expand_date 
    884905{ 
  • trunk/status

    r1530 r1531  
    88grabber         yahoo7widget        2.44 
    99grabber         sbsweb              5.04 
    10 grabber         rex                 10.1.0a 
     10grabber         rex                 10.3.2 
    1111grabber         acctv_website       0.09 
    1212grabber         zaxmltv             0.03 
Note: See TracChangeset for help on using the changeset viewer.