All pastes #790791 Raw Edit

mahou-v2 (u)

public text v1 · immutable
·published 2007-11-20 16:31 UTC
rendered paste body
use LWP::Simple;         # start! I wouldn't copy
use HTML::TreeBuilder;   # anything seen in here,
use HTML::Entities;      # it's for your own good
use DBI;
use DBD::SQLite;
use strict;

 ## Setup and global!
my (%setup);
setup();
core_parse();

 ## SQL Stuff!
sub sql_create {
  unlink q(mahou.db);
  my $dbh = DBI->connect (
    q(dbi:SQLite:dbname=mahou.db),undef,undef,
    { RaiseError => 1, AutoCommit => 0 }
  ) or die q(SC: error connecting);

  eval {
    foreach my $command (
        q[CREATE TABLE data ( name     TEXT PRIMARY KEY,
                              aid      INTEGER,
                              station  INTEGER,
                              airtime  TEXT,
                              eta      TEXT    )],
        q[CREATE TABLE meta ( hit      INTEGER
                              miss     INTEGER,
                              last     INTEGER )],
        q[CREATE TABLE conf ( timezone INTEGER,
                              debug    INTEGER,
                              local    INTEGER )],
    ) {
      $dbh->do($command);
    }
    $dbh->do(q[INSERT INTO conf values(16,1,1)]);
    $dbh->commit;
  };
  if ($@) {
    $dbh->disconnect;
    die q(SC: creation failure);
  }
  $dbh->disconnect;
}

 ## Parse related stuff.
sub table_header_has {
  my ($table, $str) = @_;
  return defined $table->look_down(
    q(_tag), q(th),
    sub { $_[0]->as_text() eq $str }
  );
} # by pc486

sub core_parse {
  my %showtime;
  note(q(core_parse: starting)) if $setup{q(debug)};
  my $html = get(q(http://localhost:8049/Showtime.htm))
    and note(q(core_parse: html secured)) if $setup{q(debug)};
  die q(CP: html) unless $html;
  $html = HTML::TreeBuilder->new_from_content($html);

  # first step: find time table
  note(q(core_parse: closing in on table)) if $setup{q(debug)};
  my $table = $html->look_down(
    q(_tag), q(table),
    q(bgcolor), q(#bfa89b),
    sub { table_header_has($_[0], q(ETA)) },
    sub { not table_header_has($_[0], q(Starting)) }
  ); # by pc486 & edit by dean

  # second step: find ACTUAL time table
  note(q(core_parse: parsing table)) if $setup{q(debug)};
  foreach my $anime ($table->look_down( q(_tag), q(tr),
                                        q(align), undef )) {

    # first get name, stay as hash, get link, move on
    my $name = $anime->look_down(q(_tag), q(a), q(name), qr/\d+/)->parent();
    my $link = $name->parent()->look_down(q(_tag), q(a), q(href), qr/anidb/);

    # populates the showtime hash
    my @info = $anime->look_down(q(_tag), q(td));
    %{$showtime{$name->as_text}} =
      map { $_->[0] => $info[$_->[1]]->as_text } ( [qw(station 3)],
                                                   [qw(airtime 5)],
                                                   [qw(eta 6)] );
    $showtime{$name->as_text}->{q(link)} = anidb_link($link->{q(href)} or undef);
  }

  $html->delete;
  note(q(core_parse: returning hash)) if $setup{q(debug)};
  return %showtime;
}

 ## Sets up the configuration.
sub setup {
  sql_create() unless -e q(mahou.db); # check db exists &&
  die q(SU: mahou.db unwritable) unless -w q(mahou.db); # is writable

  my $dbh = DBI->connect ( # open db
    q(dbi:SQLite:dbname=mahou.db),undef,undef,
    { RaiseError => 1, AutoCommit => 0 }
  ) or die q(SU: connect);

  my @setup = $dbh->selectrow_array(q(SELECT * from conf))
    or die q(SU: fetch); # grab array and move it to %setup
  %setup = map { $_ => shift(@setup) } qw(tmzn debug local);

  if ($setup{debug}) {
    note(q(setup: setup is complete));
    note(qq(  > $_:\t=> $setup{$_})) foreach keys %setup;
  }

  return 0;
}

 ## Useful little functions.
sub note {
  my $note = shift;
  print curti(), qq( - \u$note\n);
  return 1;
} # pretty debugging

sub anidb_link {
  my $url = shift;
  return q(-) unless $url;
  $url =~ s/http.+aid.(\d+)/$1/;
  return qq(http://anidb.net/a$url);
}

sub curti {
  my @time = @{[ gmtime ]}[2,1,0];
  $time[0] = ($time[0]+$setup{q(tmzn)}) % 24;
  return sprintf(q(%02d:%02d:%02d),@time);
} # grabs & adjusts the time from GMT