diff options
| author | Alexander Færøy | 2014-05-31 13:10:46 +0200 | 
|---|---|---|
| committer | Alexander Færøy | 2014-05-31 13:10:46 +0200 | 
| commit | 2d0759e6ca5767b48bcc85bf38c2c43d5f0b63b1 (patch) | |
| tree | 1c5e6d817c88e67b46e216a50e0aef5428bf63df /scripts/ontv.pl | |
| parent | 2d080422d79d1fd49d6c5528593ccaaff9bfc583 (diff) | |
| download | scripts.irssi.org-2d0759e6ca5767b48bcc85bf38c2c43d5f0b63b1.tar.bz2 | |
Import scripts from scripts.irssi.org
Diffstat (limited to 'scripts/ontv.pl')
| -rw-r--r-- | scripts/ontv.pl | 339 | 
1 files changed, 339 insertions, 0 deletions
| diff --git a/scripts/ontv.pl b/scripts/ontv.pl new file mode 100644 index 0000000..8dcdfb3 --- /dev/null +++ b/scripts/ontv.pl @@ -0,0 +1,339 @@ +# OnTV by Stefan'tommie' Tomanek + +use strict; +use vars qw($VERSION %IRSSI); +$VERSION = "20050226"; +%IRSSI = ( +    authors     => "Stefan 'tommie' Tomanek", +    contact     => "stefan\@pico.ruhr.de", +    name        => "OnTV", +    description => "turns irssi into a tv program guide", +    license     => "GPLv2", +    modules     => "Data::Dumper POSIX LWP::Simple HTML::Entities Text::Wrap", +    changed     => "$VERSION", +    commands	=> "ontv" +); + +use Irssi 20020324; +use Data::Dumper; +use POSIX; +use LWP::Simple; +use HTML::Entities; +use Text::Wrap; + +use vars qw($forked @comp); + +sub show_help() { +    my $help=$IRSSI{name}." ".$VERSION." +/ontv (current) +    List the current tv program +/ontv search <query> +    Query the program guide for a show +/ontv next +    Show what'S next on TV +/ontv tonight +    List tonight's program +/ontv watching <station> +    Display what's on <station> +"; +    my $text = ''; +    foreach (split(/\n/, $help)) { +        $_ =~ s/^\/(.*)$/%9\/$1%9/; +        $text .= $_."\n"; +    } +    print CLIENTCRAP &draw_box($IRSSI{name}." help", $text, "help", 1) ; +} + +sub draw_box ($$$$) { +    my ($title, $text, $footer, $colour) = @_; +    my $box = ''; +    $box .= '%R,--[%n%9%U'.$title.'%U%9%R]%n'."\n"; +    foreach (split(/\n/, $text)) { +        $box .= '%R|%n '.$_."\n"; +    } +    $box .= '%R`--<%n'.$footer.'%R>->%n'; +    $box =~ s/%.//g unless $colour; +    return $box; +} + +sub get_prog ($) { +    my ($what) = @_; +    my $url = 'http://www.tvmovie.de/tv-programm/jetzt.html?nocache=true'; +    $url = 'http://www.tvmovie.de/tv-programm/gleich.html?nocache=true' if ($what == 0); +    $url = 'http://www.tvmovie.de/tv-programm/2015.html' if ($what == 2); +    my $data = get($url); +    my $programs = []; +    my %program; +    foreach (split /\n/, $data) { +	#print $_; +	if (/class="linkgrau">(.*?)<\/a><\/font><\/td>/) { +	    $program{station} = $1; +	    decode_entities($program{station}); +	} +	#if (/<a href="http:\/\/www.tvmovie.de\/tv-programm\/sendung.html\?SendungID=(\d+)" class="linkblack"><b>(.*?)<\/b><\/a>/) { +	if (/<a href="http:\/\/www.tvmovie.de\/tv-programm\/sendung.html\?SendungID=(\d+)" class="linkblack"><b>(.*?)<\/b>/) { +	    $program{id} = $1; +	    $program{title} = $2; +	    decode_entities($program{title}); +	} +	if (/<FONT face="Verdana, Arial, Helvetica, sans-serif" size="1" color="#757575"><br>(.*?)<\/font><\/font><\/td>/) { +	    $program{comment} = decode_entities($1); +	} +	if (/color='#ee0000'>(.*?)<\/font><\/td>/) { +	    $program{type} = decode_entities($1); +	} +	if (/color="white"><b>([A-Z]{2})<\/b><\/font><\/td>/) { +	    $program{day} = $1; +	} +	if (/size="1">(\d{2}\.\d{2}) <\/font><\/td>/) { +	    $program{begin} = $1; +	    decode_entities($program{begin}); +	} +	if (/size="1">bis (\d{2}\.\d{2})<\/font><\/td>/) { +	    $program{end} = $1; +	    decode_entities($program{end}); +	    my %data = %program; +	    push @$programs, \%data; +	    %program = (); +	} +    } +    return $programs; +} + +sub search_prog ($) { +    my ($query) = @_; +    encode_entities($query); +    my $url = 'http://fernsehen.tvmovie.de/finder?finder=swsendung&tag=alle&sw_sendung='.$query; +    my $data = get($url); +    return( parse_search($data) ); +} + +sub parse_search ($) { +    my ($data) = @_; +    my $programs = []; +    my %program; +    foreach (split /\n/, $data) { +	if (/color="white"><b>([A-Z]{2})<\/b> <\/font><\/td>$/) { +	    $program{day} = $1; +	    decode_entities($program{day}); +	} +	if (/size="1">(\d{2}:\d{2})<\/font><\/td>$/) { +	    $program{begin} = $1; +	    decode_entities($program{begin}); +	} elsif (/class="linkgrau">(.*?)<\/a><\/font><\/td>$/) { +	    $program{station} = $1; +	    decode_entities($program{station}); +	} elsif (/<a href="http:\/\/www.tvmovie.de\/tv-programm\/sendung\.html\?SendungID=(\d+)" class="linkblack"><b>(.*?)<\/b><\/a><\/font>(?:<FONT face="Verdana, Arial, Helvetica, sans-serif" size="1" color="#757575"><br>(.*?)<\/font>)?/) { +	    $program{id} = $1; +	    $program{title} = $2; +	    $program{comment} = $3; +	    decode_entities($program{title}); +	    decode_entities($program{comment}); +	#} elsif (/{ \t]*<td valign="top" align="left">$/) { +	    my %data = %program; +	    push @$programs, \%data; +	} +    } +    return $programs; +} + +sub get_info ($) { +    my ($id) = @_; +    my $data = get('http://www.tvmovie.de/tv-programm/sendung.html?SendungID='.$id); +    my %info; +    foreach (split(/\n/, $data)) { +	#print; +	if (/size="3"><b>(.*?)<\/b><br><\/font>$/) { +	    $info{title} = decode_entities($1); +	} elsif (/color="#FFFFFF"><b> (\d+\.\d+\.\d+) \|/) { +	    $info{date} = decode_entities($1); +	} elsif (/size="1"><b>(.*?)<\/b><br><br><\/font>$/) { +	    $info{comment} = decode_entities($1); +	} elsif (/class="uppercase"><b>(.*?)<\/b> <\/font>/) { +	    $info{type} = decode_entities($1); +	} elsif (/<FONT face="Verdana, Arial, Helvetica, sans-serif" size="1">(.*?)<br><br><\/font>/) { +	    $info{desc} = decode_entities($1); +	} elsif (/\[Sender: (.*?)\] \[Beginn: (.*?)\] \[Dauer: (.*?) Min\.\] \[Ende: (.*?)\] \[SV: (.*?)\]/) { +	    $info{station} = decode_entities($1); +	    $info{begin} = decode_entities($2); +	    $info{end} = decode_entities($4); +	    $info{showview} = decode_entities($5); +	} +    } +    my $stat = $info{station}; +    $info{desc} =~ s/$stat$//; +    #$info{desc} =~ s/<br><br>$//; +    $info{desc} =~ s/<br>/\n/g; +    return \%info; +} + +sub bg_fetch ($$) { +    my ($op, $query) = @_; +    my ($rh, $wh);  +    pipe($rh, $wh);  +    if ($forked) { +        print CLIENTCRAP "%R>>%n Please wait until your earlier request has been finished."; +        return; +    } +    my $pid = fork(); +    $forked = 1; +    if ($pid > 0) { +	print CLIENTCRAP "%R>>%n Please wait..."; +	close $wh; +	Irssi::pidwait_add($pid); +	my $pipetag; +	my @args = ($rh, \$pipetag, $op, $query); +	$pipetag = Irssi::input_add(fileno($rh), INPUT_READ, \&pipe_input, \@args); +    } else { +	my $result = {}; +	my @program; +	my $stations = Irssi::settings_get_str('ontv_stations'); +	eval { +	    if ($op eq 'current') { +		@program = @{ get_prog(1) }; +		foreach (@program) { +		    push @{ $result->{program} }, $_ if ($_->{station} =~ /^($stations)$/); +		} +	    } elsif ($op eq 'next') { +		@program = @{ get_prog(0) }; +		foreach (@program) { +		    push @{ $result->{program} }, $_ if ($_->{station} =~ /^($stations)$/); +		} +	    } elsif ($op eq 'tonight') { +		@program = @{ get_prog(2) }; +		foreach (@program) { +                    push @{ $result->{program} }, $_ if ($_->{station} =~ /^($stations)$/); +                } +	    } elsif ($op eq 'search') { +		@program = @{ search_prog($query) }; +		foreach (@program) { +		    push @{ $result->{program} }, $_ if ($_->{station} =~ /^($stations)$/); +		} +	    } elsif ($op eq 'watching') { +		@program = @{ get_prog(1) }; +		foreach (@program) { +		    next unless ($_->{station} =~ /^($query)$/); +		    push @{ $result->{program} }, $_; +		    print $_->{id}; +		    $result->{info} = get_info($_->{id}); +		} +	    } elsif ($op eq 'info') { +		$result->{info} = get_info($query); +	    } +	    my $dumper = Data::Dumper->new([$result]); +	    $dumper->Purity(1)->Deepcopy(1)->Indent(0); +	    print($wh $dumper->Dump); +	}; +	close $wh; +	POSIX::_exit(1); +    } +} + +sub pipe_input ($) { +    my ($rh, $pipetag, $op, $args) = @{$_[0]}; +    $forked = 0; +    Irssi::input_remove($$pipetag); +    my $text; +    $text .= $_ foreach <$rh>; +    no strict 'vars'; +    my $incoming = eval("$text"); +    return unless ($incoming->{program} || $incoming->{info}); +    print_prog($incoming->{program}, 'current') if ($op eq 'current'); +    print_prog($incoming->{program}, 'next') if ($op eq 'next'); +    print_prog($incoming->{program}, 'tonight') if ($op eq 'tonight'); +    print_prog($incoming->{program}, 'query: "'.$args.'"') if ($op eq 'search'); +    print_prog($incoming->{program}, 'current: "'.$args.'"') if ($op eq 'watching'); +    print_info($incoming->{info}) if $incoming->{info}; +} + +sub print_info ($) { +    my ($info) = @_; +    my $text; +    $text .= '%9'.$info->{title}.'%9'."\n"; +    $text .= $info->{date}.': '.$info->{begin}."-".$info->{end}."\n"; +    $text .= 'Showview: '.$info->{showview}."\n\n"; +    $text .= $info->{comment}."\n\n"; +    $text .= $info->{desc}; +    my $col = int( Irssi::active_win()->{width}*(2/3) ); +    $Text::Wrap::columns = $col; +    my $article = wrap("", "", $text); +    print CLIENTCRAP &draw_box('OnTV', $article, $info->{title}, 1); +} + +sub print_prog ($$) { +    my ($program, $query) = @_; +    @comp = @$program; +    my $text; +    foreach (@$program) { +	$text .= "%9".$_->{station}."%9:"; +	$text .= " %U".$_->{title}."%U"; +	$text .= " [".$_->{type}."]"if $_->{type}; +	$text .= " (".$_->{id}.")\n"; +	$text .= " >".$_->{comment}."<\n" if $_->{comment}; +	$text .= "  time: "; +	$text .= $_->{day}.", "; +	$text .= $_->{begin}; +	$text .= "-".$_->{end} if $_->{end}; +	$text .= "\n"; +	#$text .= "\n"; +    } +    print CLIENTCRAP &draw_box('OnTV', $text, $query, 1); +} + +sub sig_complete_word ($$$$$) { +    my ($list, $window, $word, $linestart, $want_space) = @_; +    return unless $linestart =~ /^.ontv (info)/; +    foreach (@comp) { +        push @$list, $_->{id} if ($_->{id} =~ /^(\Q$word\E.*)?$/); +        push @$list, $_->{station} if ($_->{station} =~ /^(\Q$word\E.*)?$/); +        push @$list, $_->{title} if ($_->{title} =~ /^(\Q$word\E.*)?$/); +    } +    Irssi::signal_stop(); +} + + +sub cmd_ontv ($$$) { +    my ($args, $server, $witem) = @_; +    my @arg = split(/ /, $args); +    if (scalar(@arg) == 0 || $arg[0] eq 'current') { +	bg_fetch('current', ''); +    } elsif ($arg[0] eq 'next') { +	bg_fetch('next', ''); +    } elsif ($arg[0] eq 'tonight') { +	bg_fetch('tonight', ''); +    } elsif ($arg[0] eq 'search') { +	shift @arg; +	bg_fetch('search', join(' ', @arg)) +    } elsif ($arg[0] eq 'watching' && defined $arg[1]) { +	shift @arg; +	bg_fetch('watching', join(' ', @arg)); +    } elsif ($arg[0] eq 'info' && defined $arg[1]) { +	shift @arg; +	my $query = join(' ', @arg); +	unless ($query =~ /^\d+$/) { +	    foreach (@comp) { +		if ($_->{title} eq $query || $_->{station} eq $query) { +		    $query = $_->{id}; +		    last; +		} +	    } +	} +	bg_fetch('info', $query); +    } elsif ($arg[0] eq 'help') { +	show_help(); +    } +} + +Irssi::settings_add_str($IRSSI{name}, 'ontv_stations', '.*' ); + +Irssi::command_bind('ontv' => \&cmd_ontv); + +Irssi::signal_add_first('complete word', \&sig_complete_word); + +foreach my $cmd ('search', 'current', 'next', 'tonight', 'watching', 'help', 'info') { +    Irssi::command_bind('ontv '.$cmd => +         sub { cmd_ontv("$cmd ".$_[0], $_[1], $_[2]); } ); +} + + +print CLIENTCRAP '%B>>%n '.$IRSSI{name}.' '.$VERSION.' loaded: /ontv help for help'; | 
