Commit 50ac58e8 authored by Birte Kristina Friesel's avatar Birte Kristina Friesel
Browse files

Travel::Status::DE::DeutscheBahn

parent 12b89190
Loading
Loading
Loading
Loading

.gitignore

0 → 100644
+9 −0
Original line number Diff line number Diff line
/_build
/Build
/blib
/cover_db
/MANIFEST
/MANIFEST.bak
/MANIFEST.SKIP
/MANIFEST.SKIP.bak
/MYMETA.yml

Build.PL

0 → 100755
+25 −0
Original line number Diff line number Diff line
#!/usr/bin/env perl

use strict;
use warnings;
use Module::Build;

Module::Build->new(

	build_requires => {
		'Test::More' => 0,
		'Test::Compile' => 0,
		'Test::Pod' => 0,
	},
	module_name => 'Travel::Status::DE::DeutscheBahn',
	license => 'perl',
	requires => {
		'perl' => '5.10.0',
		'Class::Accessor' => '0.16',
		'LWP::UserAgent' => 0,
		'XML::LibXML' => '1.70',
	},
	script_files => 'bin/',
	sign => 1,

)->create_build_script();
+28 −99
Original line number Diff line number Diff line
#!/usr/bin/env perl
## Copyright © 2010 by Daniel Friesel <derf@finalrewind.org>
## License: WTFPL <http://sam.zoy.org/wtfpl>
##   0. You just DO WHAT THE FUCK YOU WANT TO.
use strict;
use warnings;
use 5.010;

use LWP::UserAgent;
use XML::LibXML;

my @now = localtime(time());
my $date = sprintf("%d.%d.%d", $now[3], $now[4] + 1 , $now[5] + 1900);
my $time = sprintf("%d:%d", $now[2], $now[1]);

my $post = {
	input => $ARGV[0],
	inputRef => '#',
	date => $date,
	time => $time,
	productsFilter => '1111101000000000',
	REQTrain_name => q{},
	maxJourneys => 20,
	delayedJourney => undef,
	start => 'Suchen',
	boardType => 'Abfahrt',
	ao => 'yes',
};

my $ua = LWP::UserAgent->new();
my $reply = $ua->post('http://mobile.bahn.de/bin/mobil/bhftafel.exe/dn?rt=1', $post)->content();

my $tree = XML::LibXML->load_html(
	string => $reply,
	recover => 2,
	suppress_errors => 1,
	suppress_warnings => 1,
);
our $VERSION = '0.0';

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{
	^ (.+) \n
	\d{1,2}:\d{1,2}
}mx;

for my $tr (@{$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;
	}
use Travel::Status::DE::DeutscheBahn;

	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_str;
	my (@via, @via_main, @via_show);
my $status = Travel::Status::DE::DeutscheBahn->new( station => shift, );

	for my $str ($time, $train, $dest, $platform, $info) {
		$str =~ s/\n//mg;
		$str =~ tr/ //s;
	}
for my $d ( $status->departures() ) {

	$info =~ s/,Grund//;
	my ( @via, @via_main, @via_show );

	while ($route =~ m{$re_via}g) {
		if ($first) {
			$first = 0;
			next;
		}
		my $stop = $1;
		push(@via, $stop);
		if ($stop =~ /Hbf$/) {
	@via = $d->route;

	for my $stop (@via) {
		if ( $stop =~ m{ ?Hbf} ) {
			push( @via_main, $stop );
		}
	}
@@ -106,25 +34,22 @@ for my $tr (@{$tree->findnodes($xp_element)}) {

		while ( @via_show < 3 and @via_main ) {
			my $stop = shift(@via_main);
			if ($stop ~~ \@via_show) {
			if ( $stop ~~ \@via_show or $stop eq $d->destination ) {
				next;
			}
			push( @via_show, $stop );
		}
	}


	for my $stop (@via_show) {
		$stop =~ s{ ?Hbf}{};
	}

	printf(
		"%5s %-10s %-80s %-20s %-2d %s\n",
		$time,
		$train,
		join(' ', @via_show),
		$dest,
		$platform,
		$info,
		$d->time, $d->train, join( q{ }, @via_show ),
		$d->destination, $d->platform, $d->info
	);

}

__END__
@@ -133,6 +58,10 @@ __END__

=head1 SYNOPSIS

=head1 VERSION

version 0.0

=head1 DESCRIPTION

=head1 OPTIONS
@@ -151,4 +80,4 @@ Copyright (C) 2010 by Daniel Friesel E<lt>derf@finalrewind.orgE<gt>

=head1 LICENSE

  0. You just DO WHAT THE FUCK YOU WANT TO.
This program is licensed under the same terms as Perl itself.
+170 −0
Original line number Diff line number Diff line
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.
+69 −0
Original line number Diff line number Diff line
package Travel::Status::DE::DeutscheBahn::Departure;

use strict;
use warnings;
use 5.010;

use parent 'Class::Accessor';

our $VERSION = '0.0';

Travel::Status::DE::DeutscheBahn::Departure->mk_ro_accessors(
	qw(time train destination platform info));

sub new {
	my ( $obj, %conf ) = @_;

	my $ref = \%conf;

	return bless( $ref, $obj );
}

sub route {
	my ($self) = @_;

	return @{ $self->{route} };
}

1;

__END__

=head1 NAME

Travel::Status::DE::DeutscheBahn::Departure - Information about a single
departure received by Travel::Status::DE::DeutscheBahn

=head1 SYNOPSIS

=head1 VERSION

version

=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.
Loading