summaryrefslogtreecommitdiffstats
path: root/scripts/ontv.pl
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/ontv.pl')
-rw-r--r--scripts/ontv.pl339
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})&nbsp;<\/font><\/td>/) {
+ $program{begin} = $1;
+ decode_entities($program{begin});
+ }
+ if (/size="1">bis&nbsp;(\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>&nbsp;(\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:&nbsp;(.*?)\] \[Beginn:&nbsp;(.*?)\] \[Dauer:&nbsp;(.*?) Min\.\] \[Ende:&nbsp;(.*?)\] \[SV:&nbsp;(.*?)\]/) {
+ $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';