Telkku

Linkku 10.05.05 17:55

Paketin avulla voi helposti hakea telkku.comista haluamasi kanavan päivän tv-ohjelmat.

 Tekstiversio  Arvo: 2 (4 ääntä)  Äänestä: +  -
# Tiedosto: Telkku.pm
package Telkku;
use strict;
use warnings;
use IO::Socket;
use vars qw($VERSION);
use Safe;

$VERSION = 0.1;

our $host = 'telkku.com';
our $port = 80;
our $address = 'telkku.cgi?n=&sivu=0&sn=11&konro=';
our $channel;

sub new {
    my $self = {};
    bless $self, shift();
    return $self;
}

sub get {
    $channel = $_[1];
    return parseSource();
}

# parsitaan lähdekoodi
sub parseSource {
    my @result;
    #06:55 Ostoskanava</b></td></tr> <tr><td><blockquote><font class=a>Tuote-esittelyjä, tarjouksia.</blockquote></td></tr>
    my $find = qr((.+)</b></td></tr> <tr><td><blockquote><font class=a>(.+)</blockquote></td></tr>);

    my $src = getSource()
        or die("Can't get page source!");

    my @source = split( "<tr><td><font class=a><b>", $src );

    for(@source){
        # 06:55 Ostoskanava</b></td></tr>
        if(/(\d+:\d+)(.*)<\/b><\/td><\/tr>/) {
            s/\r|\n|\t|\r\n//g;
            s/<\/table>      <\/blockquote>.+//;
            m/$find/;
            # $1 = 06:55 Ostoskanava
            # $2 = Tuote-esittelyjä, tarjouksia.
            push @result, [$1, $2];
        }
    }
    return @result;
}

# palauttaa haetun sivun lähdekoodin
sub getSource {
    my $source = " ";

    my $socket = new IO::Socket::INET (
        Proto => 'tcp',
        PeerAddr => $host,
        PeerPort => $port
    );

    die "Could not connect to $host:$port" unless $socket;

    print $socket "GET /$address$channel\r\n";

    # luetaan socketti tyhjäksi
    $source .= "$_ " for <$socket>;

    return $source;
}

1;

__END__

=head1 NAME

Telkku - Hakee ja parsii TV-ohjelmat telkku.com:sta

=head1 SYNOPSIS

Käyttö:

    use Telkku;
    my $tv = new Telkku;

    # get:n parametrinä kanavan numero
    my @progs = $tv->get(2);

    # tulostetaan ohjelmat
    my @progs = $tv->get(($ARGV[0]?($ARGV[0]-1):3));
    print "@{$_}\n" for @progs;

=head1 DESCRIPTION

Paketin avulla voi helposti hakea telkku.comista
haluamasi kanavan päivän tv-ohjelmat.

Kanavien numerot:

    YLE1            0
    YLE2            1
    MTV3            2
    Nelonen         3
    Subtv           4
    CNBC            5
    CANAL+          6
    CANAL+ FILM1    7
    CANAL+ FILM2    8
    TV1000          9
    TV1000 Action   10
    Eurosport       11
    MTV Nordic      12
    TV1000 Nordic   13
    YLE24           14
    YLE Teema       15
    YLE FST         16
    TV Finland      18
    TV1000 Family   19
    TV1000 Classic  20
    BBC World       21
    Discovery Cha...22
    Animal Planet   23
    SVT 1           24
    SVT 2           25
    SVT24           26
    SVT Europa      27
    TV3             28
    MTVe            30
    TV4             31
    Kanal5          32
    ZTV             33
    MTV3+           34
    Nelonen Plus    35
    CANAL+ SPORT    36
    C MORE FILM     37
    The Voice       38

=head2 METHODS

=over 1

=item get( $channel_number )

Palauttaa taulukon, joka sisältää valitun kanavan ohjelmat
taulukossa, joka sisältää taulukon. Sen taulukon ensimmäinen
alkio sisältää ohjelman ja toinen mahdollisen kuvauksen.

=cut
 

editoitu: 16:32 11.5.05
Linkku 18:00 10.5.05 
Ja koska pitää olla myös käyttöesimerkki niin tässä se tulee:
#!/usr/bin/perl -w
use strict;
use Telkku;
use warnings;

my $tv = new Telkku;
my @progs = $tv->get(($ARGV[0]?($ARGV[0]-1):3));
print "@{$_}\n" for @progs;


Käyttö: ./telkku.pl 3, näyttää mtv3:n ohjelmat, joita voi kätevästi grepata: ./telkku.pl 3 | grep ^20, näyttää klo 20 alkavat ohjelmat.
[edit] korjattu esimerkki
editoitu: 19:56 10.5.05
Ztane 19:51 10.5.05 
hn, mikset vaan pushaa listaan [ $1, $2 ] ja esimin for-loopissa for (@progs) { my @info = @{$_} ...
Sitten, my $find = ... rivillä voit käyttää qr''-sulkuja (man perlop).

s/\r|\n|\t|\n\r// poistaa vain yhden tabin/newlinen/tms koska puuttuu g, ja helpompi kirjottaa tr/\r\n\t//d

$source .= "$_ " for <$socket>; => $source = join ' ', <$socket>;

Näin tuloksena idiomaattisempaa perliä.

Tietoa viittauksista ja datastruktuureista: man perlref, perlreftut, perldsc
editoitu: 16:26 11.5.05
Linkku 07:47 11.5.05 
Tosiaan, tuo g:hän oli se taikasana.
[edit] aijuu...
lapponia 23:31 13.1.07 
Onko tuo osoite vielä oikein:

telkku.cgi?n=&sivu=0&sn=11&konro=

Tulostaa tyhjän sivun.

Koska käytän windowsia, täytyi lisätä tämä rivi:
print "Content-Type:text/html\n\n";