stationboard: add HAFAS support
This commit is contained in:
parent
3acee2b285
commit
c3c7a0c78b
6 changed files with 153 additions and 66 deletions
|
@ -795,22 +795,56 @@ sub station {
|
||||||
my $train = $self->param('train');
|
my $train = $self->param('train');
|
||||||
|
|
||||||
$self->render_later;
|
$self->render_later;
|
||||||
$self->iris->get_departures_p(
|
|
||||||
station => $station,
|
my $use_hafas = $self->param('hafas');
|
||||||
lookbehind => 120,
|
my $promise;
|
||||||
lookahead => 30,
|
if ($use_hafas) {
|
||||||
with_related => 1
|
$promise = $self->hafas->get_departures_p(
|
||||||
)->then(
|
eva => $station,
|
||||||
|
lookbehind => 120,
|
||||||
|
lookahead => 30,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$promise = $self->iris->get_departures_p(
|
||||||
|
station => $station,
|
||||||
|
lookbehind => 120,
|
||||||
|
lookahead => 30,
|
||||||
|
with_related => 1,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
$promise->then(
|
||||||
sub {
|
sub {
|
||||||
my ($status) = @_;
|
my ($status) = @_;
|
||||||
|
|
||||||
# You can't check into a train which terminates here
|
my @results;
|
||||||
my @results = grep { $_->departure } @{ $status->{results} };
|
if ($use_hafas) {
|
||||||
|
my $now = $self->now->epoch;
|
||||||
|
@results = map { $_->[0] }
|
||||||
|
sort { $b->[1] <=> $a->[1] }
|
||||||
|
map { [ $_, $_->datetime->epoch ] }
|
||||||
|
grep {
|
||||||
|
( $_->datetime // $_->sched_datetime )->epoch
|
||||||
|
< $now + 30 * 60
|
||||||
|
} $status->results;
|
||||||
|
$status = {
|
||||||
|
station_eva => $status->station->{eva},
|
||||||
|
station_name =>
|
||||||
|
List::Util::reduce { length($a) < length($b) ? $a : $b }
|
||||||
|
@{ $status->station->{names} },
|
||||||
|
related_stations => [],
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
# You can't check into a train which terminates here
|
||||||
|
@results = grep { $_->departure } @{ $status->{results} };
|
||||||
|
|
||||||
@results = map { $_->[0] }
|
@results = map { $_->[0] }
|
||||||
sort { $b->[1] <=> $a->[1] }
|
sort { $b->[1] <=> $a->[1] }
|
||||||
map { [ $_, $_->departure->epoch // $_->sched_departure->epoch ] }
|
map {
|
||||||
@results;
|
[ $_, $_->departure->epoch // $_->sched_departure->epoch ]
|
||||||
|
} @results;
|
||||||
|
}
|
||||||
|
|
||||||
my $connections_p;
|
my $connections_p;
|
||||||
if ($train) {
|
if ($train) {
|
||||||
|
@ -842,6 +876,7 @@ sub station {
|
||||||
'departures',
|
'departures',
|
||||||
eva => $status->{station_eva},
|
eva => $status->{station_eva},
|
||||||
results => \@results,
|
results => \@results,
|
||||||
|
hafas => $use_hafas,
|
||||||
station => $status->{station_name},
|
station => $status->{station_name},
|
||||||
related_stations => $status->{related_stations},
|
related_stations => $status->{related_stations},
|
||||||
connections => $connecting_trains,
|
connections => $connecting_trains,
|
||||||
|
@ -856,6 +891,7 @@ sub station {
|
||||||
'departures',
|
'departures',
|
||||||
eva => $status->{station_eva},
|
eva => $status->{station_eva},
|
||||||
results => \@results,
|
results => \@results,
|
||||||
|
hafas => $use_hafas,
|
||||||
station => $status->{station_name},
|
station => $status->{station_name},
|
||||||
related_stations => $status->{related_stations},
|
related_stations => $status->{related_stations},
|
||||||
title => "travelynx: $status->{station_name}",
|
title => "travelynx: $status->{station_name}",
|
||||||
|
@ -870,6 +906,7 @@ sub station {
|
||||||
'departures',
|
'departures',
|
||||||
eva => $status->{station_eva},
|
eva => $status->{station_eva},
|
||||||
results => \@results,
|
results => \@results,
|
||||||
|
hafas => $use_hafas,
|
||||||
station => $status->{station_name},
|
station => $status->{station_name},
|
||||||
related_stations => $status->{related_stations},
|
related_stations => $status->{related_stations},
|
||||||
title => "travelynx: $status->{station_name}",
|
title => "travelynx: $status->{station_name}",
|
||||||
|
|
|
@ -91,7 +91,7 @@ sub get_departures_p {
|
||||||
station => $opt{eva},
|
station => $opt{eva},
|
||||||
datetime => $when,
|
datetime => $when,
|
||||||
duration => $opt{lookahead},
|
duration => $opt{lookahead},
|
||||||
results => 120,
|
results => 300,
|
||||||
cache => $self->{realtime_cache},
|
cache => $self->{realtime_cache},
|
||||||
promise => 'Mojo::Promise',
|
promise => 'Mojo::Promise',
|
||||||
user_agent => $self->{user_agent}->request_timeout(5),
|
user_agent => $self->{user_agent}->request_timeout(5),
|
||||||
|
|
44
templates/_departures_hafas.html.ep
Normal file
44
templates/_departures_hafas.html.ep
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
<table class="striped">
|
||||||
|
<tbody>
|
||||||
|
% my $orientation_bar_shown = param('train');
|
||||||
|
% my $now_epoch = now()->epoch;
|
||||||
|
% for my $result (@{$results}) {
|
||||||
|
% my $td_class = '';
|
||||||
|
% my $link_class = 'action-checkin';
|
||||||
|
% if ($result->is_cancelled) {
|
||||||
|
% $td_class = "cancelled";
|
||||||
|
% $link_class = 'action-cancelled-from';
|
||||||
|
% }
|
||||||
|
% if (not $orientation_bar_shown and $result->datetime->epoch < $now_epoch) {
|
||||||
|
% $orientation_bar_shown = 1;
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
— Anfragezeitpunkt —
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
% }
|
||||||
|
<tr class="<%= $link_class %>" data-station="<%= $result->station_eva %>" data-train="<%= $result->id %>" data-tr="3">
|
||||||
|
<td>
|
||||||
|
<a>
|
||||||
|
<%= $result->line %>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
<td class="<%= $td_class %>">
|
||||||
|
<a>
|
||||||
|
<%= $result->destination %>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
<td class="<%= $td_class %>">
|
||||||
|
%= $result->datetime->strftime('%H:%M')
|
||||||
|
% if ($result->delay) {
|
||||||
|
(<%= sprintf('%+d', $result->delay) %>)
|
||||||
|
% }
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
% }
|
||||||
|
</tbody>
|
||||||
|
</table>
|
52
templates/_departures_iris.html.ep
Normal file
52
templates/_departures_iris.html.ep
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
<table class="striped">
|
||||||
|
<tbody>
|
||||||
|
% my $orientation_bar_shown = param('train');
|
||||||
|
% my $now_epoch = now()->epoch;
|
||||||
|
% for my $result (@{$results}) {
|
||||||
|
% my $td_class = '';
|
||||||
|
% my $link_class = 'action-checkin';
|
||||||
|
% if ($result->departure_is_cancelled) {
|
||||||
|
% $td_class = "cancelled";
|
||||||
|
% $link_class = 'action-cancelled-from';
|
||||||
|
% }
|
||||||
|
% if (not $orientation_bar_shown and $result->departure->epoch < $now_epoch) {
|
||||||
|
% $orientation_bar_shown = 1;
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
— Anfragezeitpunkt —
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
% }
|
||||||
|
<tr class="<%= $link_class %>" data-station="<%= $result->station_uic %>" data-train="<%= $result->train_id %>" data-tr="3">
|
||||||
|
<td>
|
||||||
|
<a>
|
||||||
|
<%= $result->line %>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
<td class="<%= $td_class %>">
|
||||||
|
<a>
|
||||||
|
<%= $result->destination %>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
<td class="<%= $td_class %>">
|
||||||
|
% if ($result->departure_hidden) {
|
||||||
|
(<%= $result->departure->strftime('%H:%M') %>)
|
||||||
|
% }
|
||||||
|
% else {
|
||||||
|
%= $result->departure->strftime('%H:%M')
|
||||||
|
% }
|
||||||
|
% if ($result->departure_delay) {
|
||||||
|
(<%= sprintf('%+d', $result->departure_delay) %>)
|
||||||
|
% }
|
||||||
|
% elsif (not $result->has_realtime and $result->start->epoch < $now_epoch) {
|
||||||
|
<i class="material-icons" aria-label="Keine Echtzeitdaten vorhanden" style="font-size: 16px;">gps_off</i>
|
||||||
|
% }
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
% }
|
||||||
|
</tbody>
|
||||||
|
</table>
|
|
@ -63,58 +63,12 @@
|
||||||
und maximal 120 Minuten nach Abfahrt möglich.
|
und maximal 120 Minuten nach Abfahrt möglich.
|
||||||
% }
|
% }
|
||||||
</p>
|
</p>
|
||||||
<table class="striped">
|
% if ($hafas) {
|
||||||
<tbody>
|
%= include '_departures_hafas', results => $results;
|
||||||
% my $orientation_bar_shown = param('train');
|
% }
|
||||||
% my $now_epoch = now()->epoch;
|
% else {
|
||||||
% for my $result (@{$results}) {
|
%= include '_departures_iris', results => $results;
|
||||||
% my $td_class = '';
|
% }
|
||||||
% my $link_class = 'action-checkin';
|
|
||||||
% if ($result->departure_is_cancelled) {
|
|
||||||
% $td_class = "cancelled";
|
|
||||||
% $link_class = 'action-cancelled-from';
|
|
||||||
% }
|
|
||||||
% if (not $orientation_bar_shown and $result->departure->epoch < $now_epoch) {
|
|
||||||
% $orientation_bar_shown = 1;
|
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
— Anfragezeitpunkt —
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
% }
|
|
||||||
<tr class="<%= $link_class %>" data-station="<%= $result->station_uic %>" data-train="<%= $result->train_id %>" data-tr="3">
|
|
||||||
<td>
|
|
||||||
<a>
|
|
||||||
<%= $result->line %>
|
|
||||||
</a>
|
|
||||||
</td>
|
|
||||||
<td class="<%= $td_class %>">
|
|
||||||
<a>
|
|
||||||
<%= $result->destination %>
|
|
||||||
</a>
|
|
||||||
</td>
|
|
||||||
<td class="<%= $td_class %>">
|
|
||||||
% if ($result->departure_hidden) {
|
|
||||||
(<%= $result->departure->strftime('%H:%M') %>)
|
|
||||||
% }
|
|
||||||
% else {
|
|
||||||
%= $result->departure->strftime('%H:%M')
|
|
||||||
% }
|
|
||||||
% if ($result->departure_delay) {
|
|
||||||
(<%= sprintf('%+d', $result->departure_delay) %>)
|
|
||||||
% }
|
|
||||||
% elsif (not $result->has_realtime and $result->start->epoch < $now_epoch) {
|
|
||||||
<i class="material-icons" aria-label="Keine Echtzeitdaten vorhanden" style="font-size: 16px;">gps_off</i>
|
|
||||||
% }
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
% }
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
%= DateTime->now(time_zone => 'Europe/Berlin')->strftime("%d/%b/%Y:%H:%M:%S %z")
|
%= DateTime->now(time_zone => 'Europe/Berlin')->strftime("%d/%b/%Y:%H:%M:%S %z")
|
||||||
<br/><br/>
|
<br/><br/>
|
||||||
Message:
|
Message:
|
||||||
%= (split(qr{\n}, $exception->message))[0]
|
%= ref($exception) ? (split(qr{\n}, $exception->message))[0] : $exception
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
Loading…
Reference in a new issue