Newer
Older
#!/usr/bin/env perl
use Mojolicious::Lite;
use Travel::Status::DE::DeutscheBahn;
no if $] >= 5.018, warnings => "experimental::smartmatch";
our $VERSION = qx{git describe --dirty} || '0.04';
my $refresh_interval = 180;
sub get_results_for {
my ($station) = @_;
my $cache = Cache::File->new(
default_expires => $refresh_interval . ' sec',
);
my $results = $cache->thaw($station);
if ( not $results ) {
my $status
= Travel::Status::DE::DeutscheBahn->new( station => $station );
$results = [ $status->results ];
$cache->freeze( $station, $results );
my $station = $self->stash('station');
my @platforms = split( /,/, $self->param('platforms') // q{} );
my $template = $self->param('mode') // 'multi';
my $hide_low_delay = $self->param('hidelowdelay') // 0;
my $hide_opts = $self->param('hide_opts') // 0;
$self->stash( departures => [] );
$self->stash( title => 'db-fakedisplay' );
$self->stash( version => $VERSION );
if ( not( $template ~~ [qw[clean multi single]] ) ) {
Birte Kristina Friesel
committed
$template = 'multi';
}
$self->render( $template, hide_opts => 0 );
Birte Kristina Friesel
committed
my @departures;
my @results = get_results_for($station);
if ( not @results ) {
$self->render(
'multi',
error => "Got no results for '$station'",
hide_opts => 0
);
if ( $template eq 'single' ) {
if ( not @platforms ) {
for my $result (@results) {
if ( not( $result->platform ~~ \@platforms ) ) {
push( @platforms, $result->platform );
}
}
@platforms = sort { $a <=> $b } @platforms;
}
my %pcnt;
@results = grep { $pcnt{ $_->platform }++ < 1 } @results;
@results = sort { $a->platform <=> $b->platform } @results;
}
my $platform = ( split( / /, $result->platform ) )[0];
my $delay = 0;
if ( not( any { $_ =~ m{$via}io } @route ) ) {
if ( @platforms and not( any { $_ eq $platform } @platforms ) ) {
if ( $info eq '+0' ) {
if ( $template eq 'clean'
and $info
and $info =~ s{ (?: ca \. \s* )? \+ (\d+) :? \s* }{}x )
{
$delay = $1;
}
if ( $hide_low_delay and $info ) {
Birte Kristina Friesel
committed
$info =~ s{ (?: ca\. \s* )? \+ [ 1 2 3 4 ] $ }{}x;
Birte Kristina Friesel
committed
$info =~ s{ (?: ca\. \s* )? \+ (\d+) }{Verspätung ca $1 Min.}x;
}
Birte Kristina Friesel
committed
@departures,
Birte Kristina Friesel
committed
time => $result->time,
train => $result->train,
via => [ $result->route_interesting(3) ],
destination => $result->destination,
delay => $delay,
Birte Kristina Friesel
committed
$self->render(
Birte Kristina Friesel
committed
$template,
departures => \@departures,
version => $VERSION,
title => "departures for ${station}",
refresh_interval => $refresh_interval + 3,
Birte Kristina Friesel
committed
);
get '/_redirect' => sub {
my $station = $self->param('station');
my $params = $self->req->params;
$params->remove('station');
$params->remove('via');
if ( $params->param('mode') and $params->param('mode') eq 'multi' ) {
$params->remove($param);
}
}
$params = $params->to_string;
$self->redirect_to("/${station}/${via}?${params}");
$self->redirect_to("/${station}?${params}");
app->defaults( layout => 'default' );
get '/' => \&handle_request;
get '/:station' => \&handle_request;
get '/multi/:station' => \&handle_request;
accepts => 10,
listen => ['http://*:8092'],
workers => $ENV{VRRFAKEDISPLAY_WORKERS} // 2,