diff options
author | Daniel Friesel <derf@finalrewind.org> | 2022-10-29 13:04:01 +0200 |
---|---|---|
committer | Daniel Friesel <derf@finalrewind.org> | 2022-10-29 13:04:01 +0200 |
commit | daa8cc5a72bd10d732912595bf0ca2ad3bf167c4 (patch) | |
tree | 1455129763e0070dc77ec5880b1c32f64b7d2abe | |
parent | 3f4fc57ba097ce969031ab1a1398d4bb657ca056 (diff) |
use T-S-DE-HAFAS for train details
-rw-r--r-- | lib/DBInfoscreen/Controller/Stationboard.pm | 229 | ||||
-rw-r--r-- | lib/DBInfoscreen/Helper/HAFAS.pm | 129 | ||||
-rw-r--r-- | lib/DBInfoscreen/Helper/Marudor.pm | 2 | ||||
-rw-r--r-- | templates/_train_details.html.ep | 6 | ||||
-rw-r--r-- | templates/about.html.ep | 11 | ||||
-rw-r--r-- | templates/exception.html.ep | 5 |
6 files changed, 152 insertions, 230 deletions
diff --git a/lib/DBInfoscreen/Controller/Stationboard.pm b/lib/DBInfoscreen/Controller/Stationboard.pm index d0d4c13..de1f5e5 100644 --- a/lib/DBInfoscreen/Controller/Stationboard.pm +++ b/lib/DBInfoscreen/Controller/Stationboard.pm @@ -698,64 +698,62 @@ sub render_train { $self->hafas->get_route_timestamps_p( train => $result )->then( sub { - my ( $route_ts, $route_info, $trainsearch ) = @_; + my ( $route_ts, $journey ) = @_; - $departure->{trip_id} = $trainsearch->{trip_id}; + $departure->{trip_id} = $journey->id; # If a train number changes on the way, IRIS routes are incomplete, # whereas HAFAS data has all stops -> merge HAFAS stops into IRIS # stops. This is a rare case, one point where it can be observed is # the TGV service at Frankfurt/Karlsruhe/Mannheim. - if ( $route_info - and my @hafas_stations = @{ $route_info->{stations} // [] } ) - { - if ( my @iris_stations = @{ $departure->{route_pre_diff} } ) { - my @missing_pre; - for my $station (@hafas_stations) { - if ( - List::MoreUtils::any { $_->{name} eq $station } - @iris_stations - ) + my @hafas_stations = $journey->route; + if ( my @iris_stations = @{ $departure->{route_pre_diff} } ) { + my @missing_pre; + for my $station (@hafas_stations) { + if ( + List::MoreUtils::any { $_->{name} eq $station->{name} } + @iris_stations + ) + { + unshift( + @{ $departure->{route_pre_diff} }, + @missing_pre + ); + last; + } + push( + @missing_pre, { - unshift( - @{ $departure->{route_pre_diff} }, - @missing_pre - ); - last; + name => $station->{name}, + hafas => 1 } + ); + } + } + if ( my @iris_stations = @{ $departure->{route_post_diff} } ) { + my @missing_post; + for my $station ( reverse @hafas_stations ) { + if ( + List::MoreUtils::any { $_->{name} eq $station->{name} } + @iris_stations + ) + { push( - @missing_pre, - { - name => $station, - hafas => 1 - } + @{ $departure->{route_post_diff} }, + @missing_post ); + last; } - } - if ( my @iris_stations = @{ $departure->{route_post_diff} } ) { - my @missing_post; - for my $station ( reverse @hafas_stations ) { - if ( - List::MoreUtils::any { $_->{name} eq $station } - @iris_stations - ) + unshift( + @missing_post, { - push( - @{ $departure->{route_post_diff} }, - @missing_post - ); - last; + name => $station->{name}, + hafas => 1 } - unshift( - @missing_post, - { - name => $station, - hafas => 1 - } - ); - } + ); } } + if ($route_ts) { if ( $route_ts->{ $result->station }{rt_bogus} ) { @@ -770,53 +768,30 @@ sub render_train { { $elem->{$key} = $route_ts->{ $elem->{name} }{$key}; } - if ( $elem->{rt_bogus} ) { - $departure->{partially_missing_realtime} = 1; - } } } - if ( $route_info and @{ $route_info->{messages} // [] } ) { - my $him = $route_info->{messages}; - my @him_messages; - $departure->{messages}{him} = $him; - for my $message ( @{$him} ) { - if ( $message->{display} ) { - push( - @him_messages, - [ - $message->{header}, { text => $message->{lead} } - ] - ); - if ( $message->{lead} =~ m{zuginfo.nrw/?\?msg=(\d+)} ) { - push( - @{ $departure->{links} }, - [ - "Großstörung", - "https://zuginfo.nrw/?msg=$1" - ] - ); - } - } + + my @him_messages; + for my $message ( $journey->messages ) { + if ( not $message->code ) { + push( @him_messages, + [ $message->short // q{}, { text => $message->text } ] + ); } - for my $message ( @{ $departure->{moreinfo} // [] } ) { - my $m = $message->[1]; - @him_messages - = grep { $_->[0] !~ m{Information\. $m\.$} } - @him_messages; + } + for my $m (@him_messages) { + if ( $m->[0] =~ s{: Information.}{:} ) { + $m->[1]{icon} = 'info_outline'; } - for my $m (@him_messages) { - if ( $m->[0] =~ s{: Information.}{: } ) { - $m->[1]{icon} = 'info_outline'; - } - elsif ( $m->[0] =~ s{: (?:Großs|S)törung.}{: } ) { - $m->[1]{icon} = 'warning'; - } - elsif ( $m->[0] =~ s{: Bauarbeiten.}{: } ) { - $m->[1]{icon} = 'build'; - } + elsif ( $m->[0] =~ s{: Störung.}{: } ) { + $m->[1]{icon} = 'warning'; + } + elsif ( $m->[0] =~ s{: Bauarbeiten.}{: } ) { + $m->[1]{icon} = 'build'; } - unshift( @{ $departure->{moreinfo} }, @him_messages ); + $m->[0] =~ s{(?!<)->}{ → }; } + unshift( @{ $departure->{moreinfo} }, @him_messages ); } )->catch( sub { @@ -1029,73 +1004,58 @@ sub train_details { my $linetype = 'bahn'; $self->hafas->get_route_timestamps_p( - train_req => "${train_type} $train_no" )->then( + train_type => $train_type, + train_no => $train_no + )->then( sub { - my ( $route_ts, $route_info, $trainsearch ) = @_; + my ( $route_ts, $journey ) = @_; - $res->{trip_id} = $trainsearch->{trip_id}; + $res->{trip_id} = $journey->id; - if ( not defined $trainsearch->{trainClass} ) { + if ( not defined $journey->class ) { $linetype = 'ext'; } - elsif ( $trainsearch->{trainClass} <= 2 ) { + elsif ( $journey->class <= 2 ) { $linetype = 'fern'; } - elsif ( $trainsearch->{trainClass} <= 8 ) { + elsif ( $journey->class <= 8 ) { $linetype = 'bahn'; } - elsif ( $trainsearch->{trainClass} <= 16 ) { + elsif ( $journey->class <= 16 ) { $linetype = 'sbahn'; } - $res->{origin} = $route_info->{stations}[0]; - $res->{destination} = $route_info->{stations}[-1]; + $res->{origin} = $journey->route_start; + $res->{destination} = $journey->route_end; $res->{route_post_diff} - = [ map { { name => $_ } } @{ $route_info->{stations} } ]; - - if ($route_ts) { - for my $elem ( @{ $res->{route_post_diff} } ) { - for my $key ( keys %{ $route_ts->{ $elem->{name} } // {} } ) - { - $elem->{$key} = $route_ts->{ $elem->{name} }{$key}; - } + = [ map { { name => $_->{name} } } $journey->route ]; + for my $elem ( @{ $res->{route_post_diff} } ) { + for my $key ( keys %{ $route_ts->{ $elem->{name} } // {} } ) { + $elem->{$key} = $route_ts->{ $elem->{name} }{$key}; } } - if ( $route_info and @{ $route_info->{messages} // [] } ) { - my $him = $route_info->{messages}; - my @him_messages; - for my $message ( @{$him} ) { - if ( $message->{display} ) { - push( - @him_messages, - [ - $message->{header}, { text => $message->{lead} } - ] - ); - if ( $message->{lead} =~ m{zuginfo.nrw/?\?msg=(\d+)} ) { - push( - @{ $res->{links} }, - [ - "Großstörung", - "https://zuginfo.nrw/?msg=$1" - ] - ); - } - } + my @him_messages; + for my $message ( $journey->messages ) { + if ( not $message->code ) { + push( @him_messages, + [ $message->short // q{}, { text => $message->text } ] + ); } - for my $m (@him_messages) { - if ( $m->[0] =~ s{: Information.}{:} ) { - $m->[1]{icon} = 'info_outline'; - } - elsif ( $m->[0] =~ s{: Störung.}{: } ) { - $m->[1]{icon} = 'warning'; - } - elsif ( $m->[0] =~ s{: Bauarbeiten.}{: } ) { - $m->[1]{icon} = 'build'; - } + } + for my $m (@him_messages) { + if ( $m->[0] =~ s{: Information.}{:} ) { + $m->[1]{icon} = 'info_outline'; + } + elsif ( $m->[0] =~ s{: Störung.}{: } ) { + $m->[1]{icon} = 'warning'; + } + elsif ( $m->[0] =~ s{: Bauarbeiten.}{: } ) { + $m->[1]{icon} = 'build'; } + } + if (@him_messages) { $res->{moreinfo} = [@him_messages]; } @@ -1106,8 +1066,6 @@ sub train_details { icetype => $self->app->ice_type_map->{ $res->{train_no} }, details => {}, #$departure->{composition} // {}, dt_now => DateTime->now( time_zone => 'Europe/Berlin' ), - - #station_name => "FIXME",#$station_name, ); } )->catch( @@ -1116,7 +1074,8 @@ sub train_details { if ($e) { $self->render( 'exception', - exception => $e, + message => $e, + exception => undef, snapshot => {} ); } diff --git a/lib/DBInfoscreen/Helper/HAFAS.pm b/lib/DBInfoscreen/Helper/HAFAS.pm index a13fd4a..b02deea 100644 --- a/lib/DBInfoscreen/Helper/HAFAS.pm +++ b/lib/DBInfoscreen/Helper/HAFAS.pm @@ -326,111 +326,70 @@ sub get_route_timestamps_p { $opt{train_origin} = $opt{train}->origin; } else { + $opt{train_req} = $opt{train_type} . ' ' . $opt{train_no}; $opt{date_yy} = $now->strftime('%d.%m.%y'); $opt{date_yyyy} = $now->strftime('%d.%m.%Y'); } - my $base = 'https://reiseauskunft.bahn.de/bin/traininfo.exe/dn'; - my ( $trainsearch_result, $trainlink ); - $self->trainsearch_p(%opt)->then( sub { - ($trainsearch_result) = @_; - $trainlink = $trainsearch_result->{trainLink}; - return Mojo::Promise->all( - $self->get_json_p( - $self->{realtime_cache}, - "${base}/${trainlink}?rt=1&date=$opt{date_yy}&L=vs_json" - ), - $self->get_xml_p( - $self->{realtime_cache}, - "${base}/${trainlink}?rt=1&date=$opt{date_yy}&L=vs_java3" - ) + my ($trainsearch_result) = @_; + my $trip_id = $trainsearch_result->{trip_id}; + return Travel::Status::DE::HAFAS->new_p( + journey => { + id => $trip_id, + + # name => $opt{train_no}, + }, + cache => $self->{realtime_cache}, + promise => 'Mojo::Promise', + user_agent => $self->{user_agent}->request_timeout(10) ); } )->then( sub { - my ( $traininfo, $traindelay ) = @_; - $traininfo = $traininfo->[0]; - $traindelay = $traindelay->[0]; - if ( not $traininfo or $traininfo->{error} ) { - $promise->reject; - return; - } - $trainsearch_result->{trainClass} - = $traininfo->{suggestions}[0]{trainClass}; - my $ret = {}; - - my $strp = DateTime::Format::Strptime->new( - pattern => '%d.%m.%y %H:%M', - time_zone => 'Europe/Berlin', - ); + my ($hafas) = @_; + my $journey = $hafas->result; + my $ret = {}; my $station_is_past = 1; - - for - my $station ( @{ $traininfo->{suggestions}[0]{locations} // [] } ) - { - my $name = $station->{name}; - my $arr = $station->{arrDate} . ' ' . $station->{arrTime}; - my $dep = $station->{depDate} . ' ' . $station->{depTime}; + for my $stop ( $journey->route ) { + my $name = $stop->{name}; $ret->{$name} = { - sched_arr => scalar $strp->parse_datetime($arr), - sched_dep => scalar $strp->parse_datetime($dep), + sched_arr => $stop->{sched_arr}, + sched_dep => $stop->{sched_dep}, + rt_arr => $stop->{rt_arr}, + rt_dep => $stop->{rt_dep}, + arr_delay => $stop->{arr_delay}, + dep_delay => $stop->{dep_delay}, + isCancelled => ( + ( $stop->{arr_cancelled} or not $stop->{sched_arr} ) + and + ( $stop->{dep_cancelled} or not $stop->{sched_dep} ) + ), }; - if ( exists $traindelay->{station}{$name} ) { - my $delay = $traindelay->{station}{$name}; - if ( $ret->{$name}{sched_arr} - and $delay->{adelay} - and $delay->{adelay} =~ m{^\d+$} ) - { - $ret->{$name}{rt_arr} = $ret->{$name}{sched_arr} - ->clone->add( minutes => $delay->{adelay} ); - } - if ( $ret->{$name}{sched_dep} - and $delay->{ddelay} - and $delay->{ddelay} =~ m{^\d+$} ) - { - $ret->{$name}{rt_dep} = $ret->{$name}{sched_dep} - ->clone->add( minutes => $delay->{ddelay} ); - if ( - ( - defined $delay->{adelay} - and $delay->{adelay} eq q{} - ) - or ( defined $delay->{ddelay} - and $delay->{ddelay} eq q{} ) - ) - { - $ret->{$name}{rt_bogus} = 1; - } - if ( $delay->{ddelay} and $delay->{ddelay} eq 'cancel' ) - { - $ret->{$name}{isCancelled} = 1; - } - } - if ( - $station_is_past - and not $ret->{$name}{isCancelled} - and $now->epoch < ( - $ret->{$name}{rt_arr} // $ret->{$name}{rt_dep} - // $ret->{$name}{sched_arr} - // $ret->{$name}{sched_dep} // $now - )->epoch - ) - { - $station_is_past = 0; - } - $ret->{$name}{isPast} = $station_is_past; + if ( + $station_is_past + and not $ret->{$name}{isCancelled} + and $now->epoch < ( + $ret->{$name}{rt_arr} // $ret->{$name}{rt_dep} + // $ret->{$name}{sched_arr} + // $ret->{$name}{sched_dep} // $now + )->epoch + ) + { + $station_is_past = 0; } + $ret->{$name}{isPast} = $station_is_past; } - $promise->resolve( $ret, $traindelay // {}, $trainsearch_result ); + $promise->resolve( $ret, $journey ); return; } )->catch( sub { - $promise->reject; + my ($err) = @_; + $promise->reject($err); return; } )->wait; @@ -453,7 +412,7 @@ sub get_polyline_p { with_polyline => 1, cache => $self->{realtime_cache}, promise => 'Mojo::Promise', - user_agent => $self->{user_agent}->request_timeout(5) + user_agent => $self->{user_agent}->request_timeout(10) )->then( sub { my ($hafas) = @_; diff --git a/lib/DBInfoscreen/Helper/Marudor.pm b/lib/DBInfoscreen/Helper/Marudor.pm index 329c017..15955a3 100644 --- a/lib/DBInfoscreen/Helper/Marudor.pm +++ b/lib/DBInfoscreen/Helper/Marudor.pm @@ -9,7 +9,7 @@ use warnings; use 5.020; use DateTime; -use Encode qw(decode encode); +use Encode qw(decode encode); use Mojo::JSON qw(decode_json); use Mojo::Promise; use Mojo::Util qw(url_escape); diff --git a/templates/_train_details.html.ep b/templates/_train_details.html.ep index 5bd42c9..e5d5c72 100644 --- a/templates/_train_details.html.ep +++ b/templates/_train_details.html.ep @@ -165,7 +165,7 @@ <ul class="messages"> % for my $pair (@{$departure->{moreinfo}}) { <li> -% if ($pair->[0]->isa('DateTime')) { +% if (ref($pair->[0]) eq 'DateTime') { % if ($pair->[0]->day != $dt_now->day) { % $pair->[0]->set_locale('de_DE'); %= $pair->[0]->strftime('%a %H:%M') @@ -214,7 +214,7 @@ % else { generic-stop % } -% if ($stop->{rt_dep}) { +% if ($stop->{rt_dep} and $stop->{dep_delay}) { "><%= $stop->{sched_dep}->strftime('%H:%M') %> (heute <%= $stop->{rt_dep}->strftime('%H:%M') %>) <%= $stop->{name} %></a> % } % else { @@ -259,7 +259,7 @@ % else { generic-stop % } -% if ($stop->{rt_arr}) { +% if ($stop->{rt_arr} and $stop->{arr_delay}) { "><%= $stop->{sched_arr}->strftime('%H:%M') %> (heute <%= $stop->{rt_arr}->strftime('%H:%M') %>) <%= $stop->{name} %></a> % } % else { diff --git a/templates/about.html.ep b/templates/about.html.ep index 1c04456..ce375d5 100644 --- a/templates/about.html.ep +++ b/templates/about.html.ep @@ -25,17 +25,16 @@ zu:<br/> • Abfahrtstafel: DB IRIS via <a href="https://finalrewind.org/projects/Travel-Status-DE-IRIS/">Travel::Status::DE::IRIS</a> v<%= $Travel::Status::DE::IRIS::VERSION %><br/> - • Meldungen und Ankunft/Abfahrt an Unterwegshalten: DB HAFAS via <a href="https://git.finalrewind.org/db-fakedisplay/tree/lib/DBInfoscreen/Helper/HAFAS.pm">Helper/HAFAS.pm</a><br/> + • Zugdetails: <a href="https://finalrewind.org/projects/Travel-Status-DE-DeutscheBahn/">Travel::Status::DE::HAFAS</a> + % if ($Travel::Status::DE::HAFAS::VERSION) { + v<%= $Travel::Status::DE::HAFAS::VERSION %> + % } + <br/> • Wagenreihung: <a href="https://finalrewind.org/projects/Travel-Status-DE-DBWagenreihung/">Travel::Status::DE::DBWagenreihung</a> % if ($Travel::Status::DE::DBWagenreihung::VERSION) { v<%= $Travel::Status::DE::DBWagenreihung::VERSION %> % } <br/> - • Karte: <a href="https://finalrewind.org/projects/Travel-Status-DE-DeutscheBahn/">Travel::Status::DE::HAFAS</a> - % if ($Travel::Status::DE::HAFAS::VERSION) { - v<%= $Travel::Status::DE::HAFAS::VERSION %> - % } - <br/> • Zugauslastung Fernverkehr: DB HAFAS via <a href="https://docs.bahn.expert/">bahn.expert</a><br/> • Zugauslastung Regionalverkehr: VRR EFA via <a href="https://github.com/derf/eva-to-efa-gw">eva-to-efa-gw</a><br/> <br/> diff --git a/templates/exception.html.ep b/templates/exception.html.ep index 2f20bc6..65ec7ff 100644 --- a/templates/exception.html.ep +++ b/templates/exception.html.ep @@ -4,9 +4,14 @@ Beim Bearbeiten der Anfrage ist ein Fehler aufgetreten.<br/> <pre> ----------[Debug start]---------- +% if ($exception) { %= $exception->message Stash: %= dumper $snapshot +% } +% else { +%= stash('message') +% } ----------[Debug end]---------- </pre> </div> |