diff options
Diffstat (limited to 'lib/Travel/Status/DE/DeutscheBahn.pm')
-rw-r--r-- | lib/Travel/Status/DE/DeutscheBahn.pm | 170 |
1 files changed, 170 insertions, 0 deletions
diff --git a/lib/Travel/Status/DE/DeutscheBahn.pm b/lib/Travel/Status/DE/DeutscheBahn.pm new file mode 100644 index 0000000..499f540 --- /dev/null +++ b/lib/Travel/Status/DE/DeutscheBahn.pm @@ -0,0 +1,170 @@ +package Travel::Status::DE::DeutscheBahn; + +use strict; +use warnings; +use 5.010; + +use Carp qw(confess); +use LWP::UserAgent; +use POSIX qw(strftime); +use Travel::Status::DE::DeutscheBahn::Departure; +use XML::LibXML; + +our $VERSION = '0.0'; + +sub new { + my ( $obj, %conf ) = @_; + my $date = strftime( '%d.%m.%Y', localtime(time) ); + my $time = strftime( '%H:%M', localtime(time) ); + + my $ua = LWP::UserAgent->new(); + + if ( not $conf{station} ) { + confess('You need to specify a station'); + } + + my $ref = { + post => { + input => $conf{station}, + inputRef => q{#}, + date => $conf{date} || $date, + time => $conf{time} || $time, + productsFilter => '1111101000000000', + REQTrain_name => q{}, + maxJourneys => 20, + delayedJourney => undef, + start => 'Suchen', + boardType => 'Abfahrt', + ao => 'yes', + }, + }; + + $ref->{html} + = $ua->post( 'http://mobile.bahn.de/bin/mobil/bhftafel.exe/dn?rt=1', + $ref->{post} )->content(); + + $ref->{tree} = XML::LibXML->load_html( + string => $ref->{html}, + recover => 2, + suppress_errors => 1, + suppress_warnings => 1, + ); + + return bless( $ref, $obj ); +} + +sub departures { + my ($self) = @_; + + my $xp_element = XML::LibXML::XPathExpression->new( + '//table[@class="result stboard dep"]/tr'); + my $xp_time = XML::LibXML::XPathExpression->new('./td[@class="time"]'); + my $xp_train = XML::LibXML::XPathExpression->new('./td[@class="train"]'); + my $xp_route = XML::LibXML::XPathExpression->new('./td[@class="route"]'); + my $xp_dest = XML::LibXML::XPathExpression->new('./td[@class="route"]//a'); + my $xp_platform + = XML::LibXML::XPathExpression->new('./td[@class="platform"]'); + my $xp_info = XML::LibXML::XPathExpression->new('./td[@class="ris"]'); + + my $re_via = qr{ + ^ \s* (.+?) \s* \n + \d{1,2}:\d{1,2} + }mx; + + for my $tr ( @{ $self->{tree}->findnodes($xp_element) } ) { + + my ($n_time) = $tr->findnodes($xp_time); + my ( undef, $n_train ) = $tr->findnodes($xp_train); + my ($n_route) = $tr->findnodes($xp_route); + my ($n_dest) = $tr->findnodes($xp_dest); + my ($n_platform) = $tr->findnodes($xp_platform); + my ($n_info) = $tr->findnodes($xp_info); + my $first = 1; + + if ( not( $n_time and $n_dest ) ) { + next; + } + + my $time = $n_time->textContent(); + my $train = $n_train->textContent(); + my $route = $n_route->textContent(); + my $dest = $n_dest->textContent(); + my $platform = $n_platform->textContent(); + my $info = $n_info->textContent(); + my @via; + + for my $str ( $time, $train, $dest, $platform, $info ) { + $str =~ s/\n//mg; + $str =~ tr/ //s; + } + + $info =~ s/,Grund//; + + while ( $route =~ m{$re_via}g ) { + if ($first) { + $first = 0; + next; + } + my $stop = $1; + push( @via, $stop ); + } + + push( + @{ $self->{departures} }, + Travel::Status::DE::DeutscheBahn::Departure->new( + time => $time, + train => $train, + route_raw => $route, + route => \@via, + destination => $dest, + platform => $platform, + info => $info, + ) + ); + } + + return @{ $self->{departures} }; +} + +1; + +__END__ + +=head1 NAME + +Travel::Status::DE::DeutscheBahn - Interface to the DeutscheBahn online +departure monitor + +=head1 SYNOPSIS + +=head1 VERSION + +version 0.0 + +=head1 DESCRIPTION + +=head1 METHODS + +=over + +=back + +=head1 DIAGNOSTICS + +=head1 DEPENDENCIES + +=over + +=back + +=head1 BUGS AND LIMITATIONS + +=head1 SEE ALSO + +=head1 AUTHOR + +Copyright (C) 2011 by Daniel Friesel E<lt>derf@finalrewind.orgE<gt> + +=head1 LICENSE + +This module is licensed under the same terms as Perl itself. |