Loading lib/DBInfoscreen.pm +3 −2 Original line number Diff line number Diff line Loading @@ -142,8 +142,9 @@ sub startup { $self->helper( 'handle_no_results_json' => sub { my ( $self, $backend, $station, $errstr, $api_version, $callback ) = @_; my ( $self, $backend, $station, $errstr, $api_version ) = @_; my $callback = $self->param('callback'); $self->res->headers->access_control_allow_origin(q{*}); my $json; Loading lib/DBInfoscreen/Controller/Stationboard.pm +160 −139 Original line number Diff line number Diff line Loading @@ -11,6 +11,7 @@ use File::Slurp qw(read_file write_file); use List::Util qw(max); use List::MoreUtils qw(); use Mojo::JSON qw(decode_json); use Mojo::Promise; use Travel::Status::DE::HAFAS; use Travel::Status::DE::IRIS; use Travel::Status::DE::IRIS::Stations; Loading Loading @@ -506,22 +507,10 @@ sub get_results_for { sub handle_request { my ($self) = @_; my $station = $self->stash('station'); my $via = $self->param('via'); my @platforms = split( /,/, $self->param('platforms') // q{} ); my @lines = split( /,/, $self->param('lines') // q{} ); my $template = $self->param('mode') // 'app'; my $hide_low_delay = $self->param('hidelowdelay') // 0; my $hide_opts = $self->param('hide_opts') // 0; my $show_realtime = $self->param('show_realtime') // 0; my $show_details = $self->param('detailed') // 0; my $backend = $self->param('backend') // 'iris'; my $admode = $self->param('admode') // 'deparr'; my $apiver = $self->param('version') // 0; my $callback = $self->param('callback'); my $with_related = !$self->param('no_related'); my $limit = $self->param('limit') // 0; my @train_types = split( /,/, $self->param('train_types') // q{} ); my %opt = ( cache_hafas => $self->app->cache_hafas, cache_iris_main => $self->app->cache_iris_main, Loading Loading @@ -568,6 +557,8 @@ sub handle_request { $template = 'app'; } $self->param( mode => $template ); if ( not $station ) { $self->render( 'landingpage', show_intro => 1 ); return; Loading @@ -582,113 +573,60 @@ sub handle_request { $opt{with_related} = 1; } my @departures; my $data = get_results_for( $backend, $station, %opt ); my $results_ref = $data->{results}; my $errstr = $data->{errstr}; my @results = @{$results_ref}; if ( not @results and $template eq 'json' ) { if ( not @{ $data->{results} } and $template eq 'json' ) { $self->handle_no_results_json( $backend, $station, $errstr, $api_version, $callback ); $api_version ); return; } # foo/bar used to mean "departures for foo via bar". This is now # deprecated, but most of these cases are handled here. if ( not @results and $station =~ m{/} ) { ( $station, $via ) = split( qr{/}, $station ); $self->param( station => $station ); $self->param( via => $via ); $data = get_results_for( $backend, $station, %opt ); $results_ref = $data->{results}; $errstr = $data->{errstr}; @results = @{$results_ref}; } if ( not @results ) { if ( not @{ $data->{results} } ) { $self->handle_no_results( $backend, $station, $errstr ); return; } if ( $template eq 'single' ) { if ( not @platforms ) { for my $result (@results) { if ( not( $self->numeric_platform_part( $result->platform ) ~~ \@platforms ) ) { push( @platforms, $self->numeric_platform_part( $result->platform ) ); } } @platforms = sort { $a <=> $b } @platforms; } my %pcnt; @results = grep { $pcnt{ $self->numeric_platform_part( $_->platform ) }++ < 1 } @results; @results = map { $_->[1] } sort { $a->[0] <=> $b->[0] } map { [ $self->numeric_platform_part( $_->platform ), $_ ] } @results; $self->handle_result($data); } if ( $backend eq 'iris' and $show_realtime ) { if ( $admode eq 'arr' ) { @results = sort { ( $a->arrival // $a->departure ) <=> ( $b->arrival // $b->departure ) } @results; } else { @results = sort { ( $a->departure // $a->arrival ) <=> ( $b->departure // $b->arrival ) } @results; } } sub filter_results { my ( $self, @results ) = @_; if ( my $train = $self->param('train') ) { @results = grep { result_is_train( $_, $train ) } @results; } if (@lines) { if ( my @lines = split( /,/, $self->param('lines') // q{} ) ) { @results = grep { result_has_line( $_, @lines ) } @results; } if (@platforms) { if ( my @platforms = split( /,/, $self->param('platforms') // q{} ) ) { @results = grep { result_has_platform( $_, @platforms ) } @results; } if ($via) { if ( my $via = $self->param('via') ) { $via =~ s{ , \s* }{|}gx; @results = grep { result_has_via( $_, $via ) } @results; } if (@train_types) { if ( my @train_types = split( /,/, $self->param('train_types') // q{} ) ) { @results = grep { result_has_train_type( $_, @train_types ) } @results; } if ( $limit and $limit =~ m{ ^ \d+ $ }x ) { if ( my $limit = $self->param('limit') ) { if ( $limit =~ m{ ^ \d+ $ }x ) { splice( @results, $limit ); } for my $result (@results) { my $platform = ( split( qr{ }, $result->platform // '' ) )[0]; my $delay = $result->delay; if ( $backend eq 'iris' and $admode eq 'arr' and not $result->arrival ) { next; } if ( $backend eq 'iris' and $admode eq 'dep' and not $result->departure ) { next; return @results; } sub format_iris_result_info { my ( $self, $template, $result ) = @_; my ( $info, $moreinfo ); if ( $backend eq 'iris' ) { my $delaymsg = join( ', ', map { $_->[1] } $result->delay_messages ); my $qosmsg = join( ' +++ ', map { $_->[1] } $result->qos_messages ); Loading Loading @@ -732,28 +670,28 @@ sub handle_request { . ( $info ? ' +++ ' : q{} ) . $info; if ( $template ne 'json' ) { push( @{$moreinfo}, [ 'Zusätzliche Halte', $additional_line ] ); push( @{$moreinfo}, [ 'Zusätzliche Halte', $additional_line ] ); } } if ( $result->canceled_stops and not $result->is_cancelled ) { my $cancel_line = join( q{, }, $result->canceled_stops ); $info = 'Ohne Halt in: ' . $cancel_line . ( $info ? ' +++ ' : q{} ) . $info; = 'Ohne Halt in: ' . $cancel_line . ( $info ? ' +++ ' : q{} ) . $info; if ( $template ne 'json' ) { push( @{$moreinfo}, [ 'Ohne Halt in', $cancel_line ] ); } } push( @{$moreinfo}, $result->messages ); return ( $info, $moreinfo ); } else { sub format_hafas_result_info { my ( $self, $result ) = @_; my ( $info, $moreinfo ); $info = $result->info; if ($info) { $moreinfo = [ [ 'HAFAS', $info ] ]; Loading @@ -767,6 +705,88 @@ sub handle_request { } } push( @{$moreinfo}, map { [ 'HAFAS', $_ ] } $result->messages ); return ( $info, $moreinfo ); } sub handle_result { my ( $self, $data ) = @_; my @results = @{ $data->{results} }; my @departures; my @platforms = split( /,/, $self->param('platforms') // q{} ); my $template = $self->param('mode') // 'app'; my $hide_low_delay = $self->param('hidelowdelay') // 0; my $hide_opts = $self->param('hide_opts') // 0; my $show_realtime = $self->param('show_realtime') // 0; my $show_details = $self->param('detailed') // 0; my $backend = $self->param('backend') // 'iris'; my $admode = $self->param('admode') // 'deparr'; my $apiver = $self->param('version') // 0; my $callback = $self->param('callback'); my $via = $self->param('via'); if ( $template eq 'single' ) { if ( not @platforms ) { for my $result (@results) { if ( not( $self->numeric_platform_part( $result->platform ) ~~ \@platforms ) ) { push( @platforms, $self->numeric_platform_part( $result->platform ) ); } } @platforms = sort { $a <=> $b } @platforms; } my %pcnt; @results = grep { $pcnt{ $self->numeric_platform_part( $_->platform ) }++ < 1 } @results; @results = map { $_->[1] } sort { $a->[0] <=> $b->[0] } map { [ $self->numeric_platform_part( $_->platform ), $_ ] } @results; } if ( $backend eq 'iris' and $show_realtime ) { if ( $admode eq 'arr' ) { @results = sort { ( $a->arrival // $a->departure ) <=> ( $b->arrival // $b->departure ) } @results; } else { @results = sort { ( $a->departure // $a->arrival ) <=> ( $b->departure // $b->arrival ) } @results; } } @results = $self->filter_results(@results); for my $result (@results) { my $platform = ( split( qr{ }, $result->platform // '' ) )[0]; my $delay = $result->delay; if ( $backend eq 'iris' and $admode eq 'arr' and not $result->arrival ) { next; } if ( $backend eq 'iris' and $admode eq 'dep' and not $result->departure ) { next; } my ( $info, $moreinfo ); if ( $backend eq 'iris' ) { ( $info, $moreinfo ) = $self->format_iris_result_info( $template, $result ); } else { ( $info, $moreinfo ) = $self->format_hafas_result_info($result); } my $time = $result->time; Loading Loading @@ -1260,7 +1280,8 @@ sub handle_request { linetype => $linetype, icetype => $self->app->ice_type_map->{ $departure->{train_no} }, dt_now => DateTime->now( time_zone => 'Europe/Berlin' ), station_name => $data->{station_name} // $station, station_name => $data->{station_name} // $self->stash('station'), ); } else { Loading @@ -1268,7 +1289,7 @@ sub handle_request { } } else { my $station_name = $data->{station_name} // $station; my $station_name = $data->{station_name} // $self->stash('station'); $self->render( $template, departures => \@departures, Loading Loading
lib/DBInfoscreen.pm +3 −2 Original line number Diff line number Diff line Loading @@ -142,8 +142,9 @@ sub startup { $self->helper( 'handle_no_results_json' => sub { my ( $self, $backend, $station, $errstr, $api_version, $callback ) = @_; my ( $self, $backend, $station, $errstr, $api_version ) = @_; my $callback = $self->param('callback'); $self->res->headers->access_control_allow_origin(q{*}); my $json; Loading
lib/DBInfoscreen/Controller/Stationboard.pm +160 −139 Original line number Diff line number Diff line Loading @@ -11,6 +11,7 @@ use File::Slurp qw(read_file write_file); use List::Util qw(max); use List::MoreUtils qw(); use Mojo::JSON qw(decode_json); use Mojo::Promise; use Travel::Status::DE::HAFAS; use Travel::Status::DE::IRIS; use Travel::Status::DE::IRIS::Stations; Loading Loading @@ -506,22 +507,10 @@ sub get_results_for { sub handle_request { my ($self) = @_; my $station = $self->stash('station'); my $via = $self->param('via'); my @platforms = split( /,/, $self->param('platforms') // q{} ); my @lines = split( /,/, $self->param('lines') // q{} ); my $template = $self->param('mode') // 'app'; my $hide_low_delay = $self->param('hidelowdelay') // 0; my $hide_opts = $self->param('hide_opts') // 0; my $show_realtime = $self->param('show_realtime') // 0; my $show_details = $self->param('detailed') // 0; my $backend = $self->param('backend') // 'iris'; my $admode = $self->param('admode') // 'deparr'; my $apiver = $self->param('version') // 0; my $callback = $self->param('callback'); my $with_related = !$self->param('no_related'); my $limit = $self->param('limit') // 0; my @train_types = split( /,/, $self->param('train_types') // q{} ); my %opt = ( cache_hafas => $self->app->cache_hafas, cache_iris_main => $self->app->cache_iris_main, Loading Loading @@ -568,6 +557,8 @@ sub handle_request { $template = 'app'; } $self->param( mode => $template ); if ( not $station ) { $self->render( 'landingpage', show_intro => 1 ); return; Loading @@ -582,113 +573,60 @@ sub handle_request { $opt{with_related} = 1; } my @departures; my $data = get_results_for( $backend, $station, %opt ); my $results_ref = $data->{results}; my $errstr = $data->{errstr}; my @results = @{$results_ref}; if ( not @results and $template eq 'json' ) { if ( not @{ $data->{results} } and $template eq 'json' ) { $self->handle_no_results_json( $backend, $station, $errstr, $api_version, $callback ); $api_version ); return; } # foo/bar used to mean "departures for foo via bar". This is now # deprecated, but most of these cases are handled here. if ( not @results and $station =~ m{/} ) { ( $station, $via ) = split( qr{/}, $station ); $self->param( station => $station ); $self->param( via => $via ); $data = get_results_for( $backend, $station, %opt ); $results_ref = $data->{results}; $errstr = $data->{errstr}; @results = @{$results_ref}; } if ( not @results ) { if ( not @{ $data->{results} } ) { $self->handle_no_results( $backend, $station, $errstr ); return; } if ( $template eq 'single' ) { if ( not @platforms ) { for my $result (@results) { if ( not( $self->numeric_platform_part( $result->platform ) ~~ \@platforms ) ) { push( @platforms, $self->numeric_platform_part( $result->platform ) ); } } @platforms = sort { $a <=> $b } @platforms; } my %pcnt; @results = grep { $pcnt{ $self->numeric_platform_part( $_->platform ) }++ < 1 } @results; @results = map { $_->[1] } sort { $a->[0] <=> $b->[0] } map { [ $self->numeric_platform_part( $_->platform ), $_ ] } @results; $self->handle_result($data); } if ( $backend eq 'iris' and $show_realtime ) { if ( $admode eq 'arr' ) { @results = sort { ( $a->arrival // $a->departure ) <=> ( $b->arrival // $b->departure ) } @results; } else { @results = sort { ( $a->departure // $a->arrival ) <=> ( $b->departure // $b->arrival ) } @results; } } sub filter_results { my ( $self, @results ) = @_; if ( my $train = $self->param('train') ) { @results = grep { result_is_train( $_, $train ) } @results; } if (@lines) { if ( my @lines = split( /,/, $self->param('lines') // q{} ) ) { @results = grep { result_has_line( $_, @lines ) } @results; } if (@platforms) { if ( my @platforms = split( /,/, $self->param('platforms') // q{} ) ) { @results = grep { result_has_platform( $_, @platforms ) } @results; } if ($via) { if ( my $via = $self->param('via') ) { $via =~ s{ , \s* }{|}gx; @results = grep { result_has_via( $_, $via ) } @results; } if (@train_types) { if ( my @train_types = split( /,/, $self->param('train_types') // q{} ) ) { @results = grep { result_has_train_type( $_, @train_types ) } @results; } if ( $limit and $limit =~ m{ ^ \d+ $ }x ) { if ( my $limit = $self->param('limit') ) { if ( $limit =~ m{ ^ \d+ $ }x ) { splice( @results, $limit ); } for my $result (@results) { my $platform = ( split( qr{ }, $result->platform // '' ) )[0]; my $delay = $result->delay; if ( $backend eq 'iris' and $admode eq 'arr' and not $result->arrival ) { next; } if ( $backend eq 'iris' and $admode eq 'dep' and not $result->departure ) { next; return @results; } sub format_iris_result_info { my ( $self, $template, $result ) = @_; my ( $info, $moreinfo ); if ( $backend eq 'iris' ) { my $delaymsg = join( ', ', map { $_->[1] } $result->delay_messages ); my $qosmsg = join( ' +++ ', map { $_->[1] } $result->qos_messages ); Loading Loading @@ -732,28 +670,28 @@ sub handle_request { . ( $info ? ' +++ ' : q{} ) . $info; if ( $template ne 'json' ) { push( @{$moreinfo}, [ 'Zusätzliche Halte', $additional_line ] ); push( @{$moreinfo}, [ 'Zusätzliche Halte', $additional_line ] ); } } if ( $result->canceled_stops and not $result->is_cancelled ) { my $cancel_line = join( q{, }, $result->canceled_stops ); $info = 'Ohne Halt in: ' . $cancel_line . ( $info ? ' +++ ' : q{} ) . $info; = 'Ohne Halt in: ' . $cancel_line . ( $info ? ' +++ ' : q{} ) . $info; if ( $template ne 'json' ) { push( @{$moreinfo}, [ 'Ohne Halt in', $cancel_line ] ); } } push( @{$moreinfo}, $result->messages ); return ( $info, $moreinfo ); } else { sub format_hafas_result_info { my ( $self, $result ) = @_; my ( $info, $moreinfo ); $info = $result->info; if ($info) { $moreinfo = [ [ 'HAFAS', $info ] ]; Loading @@ -767,6 +705,88 @@ sub handle_request { } } push( @{$moreinfo}, map { [ 'HAFAS', $_ ] } $result->messages ); return ( $info, $moreinfo ); } sub handle_result { my ( $self, $data ) = @_; my @results = @{ $data->{results} }; my @departures; my @platforms = split( /,/, $self->param('platforms') // q{} ); my $template = $self->param('mode') // 'app'; my $hide_low_delay = $self->param('hidelowdelay') // 0; my $hide_opts = $self->param('hide_opts') // 0; my $show_realtime = $self->param('show_realtime') // 0; my $show_details = $self->param('detailed') // 0; my $backend = $self->param('backend') // 'iris'; my $admode = $self->param('admode') // 'deparr'; my $apiver = $self->param('version') // 0; my $callback = $self->param('callback'); my $via = $self->param('via'); if ( $template eq 'single' ) { if ( not @platforms ) { for my $result (@results) { if ( not( $self->numeric_platform_part( $result->platform ) ~~ \@platforms ) ) { push( @platforms, $self->numeric_platform_part( $result->platform ) ); } } @platforms = sort { $a <=> $b } @platforms; } my %pcnt; @results = grep { $pcnt{ $self->numeric_platform_part( $_->platform ) }++ < 1 } @results; @results = map { $_->[1] } sort { $a->[0] <=> $b->[0] } map { [ $self->numeric_platform_part( $_->platform ), $_ ] } @results; } if ( $backend eq 'iris' and $show_realtime ) { if ( $admode eq 'arr' ) { @results = sort { ( $a->arrival // $a->departure ) <=> ( $b->arrival // $b->departure ) } @results; } else { @results = sort { ( $a->departure // $a->arrival ) <=> ( $b->departure // $b->arrival ) } @results; } } @results = $self->filter_results(@results); for my $result (@results) { my $platform = ( split( qr{ }, $result->platform // '' ) )[0]; my $delay = $result->delay; if ( $backend eq 'iris' and $admode eq 'arr' and not $result->arrival ) { next; } if ( $backend eq 'iris' and $admode eq 'dep' and not $result->departure ) { next; } my ( $info, $moreinfo ); if ( $backend eq 'iris' ) { ( $info, $moreinfo ) = $self->format_iris_result_info( $template, $result ); } else { ( $info, $moreinfo ) = $self->format_hafas_result_info($result); } my $time = $result->time; Loading Loading @@ -1260,7 +1280,8 @@ sub handle_request { linetype => $linetype, icetype => $self->app->ice_type_map->{ $departure->{train_no} }, dt_now => DateTime->now( time_zone => 'Europe/Berlin' ), station_name => $data->{station_name} // $station, station_name => $data->{station_name} // $self->stash('station'), ); } else { Loading @@ -1268,7 +1289,7 @@ sub handle_request { } } else { my $station_name = $data->{station_name} // $station; my $station_name = $data->{station_name} // $self->stash('station'); $self->render( $template, departures => \@departures, Loading