Newer
Older
#!/usr/bin/env perl
use strict;
use warnings;
use 5.010;
use Getopt::Long;
Birte Kristina Friesel
committed
use List::Util qw(first max);
use Travel::Status::DE::DeutscheBahn;
my ( $date, $time );
my $types = q{};
my %train_type;
Birte Kristina Friesel
committed
my @output;
binmode( STDOUT, ':encoding(utf-8)' );
GetOptions(
'd|date=s' => \$date,
'm|mot=s' => \$types,
't|time=s' => \$time,
);
for my $type ( split( qr{,}, $types ) ) {
if ( substr( $type, 0, 1 ) eq q{!} ) {
$train_type{ substr( $type, 1 ) } = 0;
}
else {
$train_type{$type} = 1;
}
}
my $status = Travel::Status::DE::DeutscheBahn->new(
date => $date,
mot => \%train_type,
station => shift,
time => $time,
);
Birte Kristina Friesel
committed
sub display_result {
my (@lines) = @_;
my @line_length;
if ( not @lines ) {
die("Nothing to show\n");
}
for my $i ( 0 .. 5 ) {
$line_length[$i] = max map { length( $_->[$i] ) } @lines;
}
for my $line (@lines) {
printf( join( q{ }, ( map { "%-${_}s" } @line_length ) ) . "\n",
@{$line}, );
}
return;
}
for my $d ( $status->results() ) {
my ( @via, @via_main, @via_show );
@via = $d->route;
if ( $filter_via and not( first { $_ =~ m{$filter_via}io } @via ) ) {
next;
}
for my $stop (@via) {
if ( $stop =~ m{ ?Hbf} ) {
push( @via_main, $stop );
if ( @via_main and @via and $via[0] eq $via_main[0] ) {
@via_show = splice( @via, 0, ( @via_main > 2 ? 1 : 3 - @via_main ) );
while ( @via_show < 3 and @via_main ) {
if ( $stop ~~ \@via_show or $stop eq $d->destination ) {
for my $stop (@via_show) {
$stop =~ s{ ?Hbf}{};
}
Birte Kristina Friesel
committed
push(
@output,
[
$d->time, $d->train,
join( q{ }, @via_show ), $d->destination,
$d->platform, $d->info
]
Birte Kristina Friesel
committed
display_result(@output);
db-ris - Interface to the DeutscheBahn online departure monitor
B<db-ris> [B<-d> I<date>] [B<-m> I<motlist>] [B<-t> I<time>] [B<-v> I<via>]
I<station>
=head1 VERSION
version 0.0
db-ris is an interface to the DeutscheBahn departure monitor
available at L<http://reiseauskunft.bahn.de/bin/bhftafel.exe/dn>.
It requests all departures at I<station> (optionally filtered by date, time,
route and means of transport) and lists them on stdout, similar to the big
departure screens installed on most main stations.
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
=over
=item B<-d>, B<--date> I<dd>.I<mm>.I<yyyy>
Date to list departures for. Default: today
=item B<-m>, B<--mot> I<motlist>
Comma-separated list of modes of transport to show/hide. Accepts the following
argements:
ice InterCity Express trains
ic_ec InterCity / EuroCity trains
d InterRegio and similar
nv "Nahverkehr", RegionalExpress and such
s S-Bahn
bus
ferry
u U-Bahn
tram
You can prefix an argument with "!" to hide it. The default is C<<
ice,ic_ec,d,nv,s >>. Note that B<-m> does not replace the default, so if you
only want to see S-Bahn und U-Bahn departures, you'd have to use C<< -m
!ice,!ic_ec,!d,!nv,u >>.
=item B<-t>, B<--time> I<hh>:I<mm>
Time to list departures for. Default: now.
=item B<-v>, B<--via> I<regex>
Only display trains whose route (all stations between the current stop and the
destination) matches the perl regular expression I<regex>. The match is not
case-sensitive. Use '^regex$' to match a full string, but be aware that this
may not work as expected.
=back
=over
=item * Class::Accessor(3pm)
=item * LWP::UserAgent(3pm)
=item * XML::LibXML(3pm)
=back
There are a few character encoding problems (most notably, B<--via> does not
understand UTF-8 umlauts).
Copyright (C) 2011 by Daniel Friesel E<lt>derf@finalrewind.orgE<gt>
This program is licensed under the same terms as Perl itself.