#!/usr/bin/env perl use Mojolicious::Lite; use Cache::File; use Travel::Status::DE::DeutscheBahn; our $VERSION = '0.01'; sub get_results_for { my ($station) = @_; my $cache = Cache::File->new( cache_root => '/tmp/db-fake', default_expires => '900 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 ); } return @{$results}; } sub handle_request { my $self = shift; my $station = $self->stash('station'); my $via = $self->stash('via'); $self->stash( departures => [] ); $self->stash( title => 'db-fakedisplay' ); $self->stash( version => $VERSION ); if ( not $station ) { $self->render('multi'); return; } my @departures; my @results = get_results_for($station); if ( not @results ) { $self->render( 'multi', error => "Got no results for '$station'" ); return; } for my $result (@results) { if ($via) { my @route = $result->route; if (not( grep { $_ =~ m{$via}io } @route )) { next; } } push( @departures, { time => $result->time, train => $result->train, via => [ $result->route_interesting(3) ], destination => $result->destination, platform => ( split( / /, $result->platform ) )[0], info => $result->info, } ); } $self->render( 'multi', departures => \@departures, version => $VERSION, title => "departures for ${station}" ); } get '/_redirect' => sub { my $self = shift; my $station = $self->param('station'); my $via = $self->param('via'); if ($via) { $self->redirect_to("/${station}/${via}"); } else { $self->redirect_to("/${station}"); } }; get '/' => \&handle_request; get '/:station' => \&handle_request; get '/:station/:via' => \&handle_request; get '/multi/:station' => \&handle_request; app->config( hypnotoad => { accepts => 10, listen => ['http://*:8092'], pid_file => '/tmp/db-fake.pid', }, ); app->start(); __DATA__ @@ multi.html.ep <%= $title %> % if (@{$departures}) {
% my $i = 0; % for my $departure (@{$departures}) { % $i++;
%= $departure->{platform}
%= $departure->{time}
%= $departure->{train}
% my $via_max = @{$departure->{via}}; % my $via_cur = 0; % for my $stop (@{$departure->{via}}) { % $via_cur++; <%= $stop %><% if ($via_cur < $via_max) { %> - <% } %> % }
%= $departure->{destination}
% if ($departure->{info}) {
%= $departure->{info}
% }
% }
% } % else {

DB-Fakedisplay displays the next departures at a DB station, just like the big LC display in the station itself.

% }
<% if (my $error = stash 'error') { %>

Error: <%= $error %>

<% } %> <%= form_for _redirect => begin %>

Station name <%= text_field 'station' %>
only display routes via <%= text_field 'via' %> (optional) <%= submit_button 'Display' %>

<% end %>
db-fakedisplay v<%= $version %>
@@ not_found.html.ep page not found
page not found