diff options
Diffstat (limited to 'lib/DBInfoscreen')
-rw-r--r-- | lib/DBInfoscreen/Controller/Stationboard.pm | 4 | ||||
-rw-r--r-- | lib/DBInfoscreen/Helper/Marudor.pm | 120 |
2 files changed, 124 insertions, 0 deletions
diff --git a/lib/DBInfoscreen/Controller/Stationboard.pm b/lib/DBInfoscreen/Controller/Stationboard.pm index a09a1df..90478a4 100644 --- a/lib/DBInfoscreen/Controller/Stationboard.pm +++ b/lib/DBInfoscreen/Controller/Stationboard.pm @@ -479,6 +479,10 @@ sub render_train { return; } )->wait; + + # Looks like utilization data is only available for long-distance trains + # – and the few regional trains which also have wagon order data (e.g. + # around Stuttgart). Funky. $self->marudor->get_train_utilization( train => $result )->then( sub { my ( $first, $second ) = @_; diff --git a/lib/DBInfoscreen/Helper/Marudor.pm b/lib/DBInfoscreen/Helper/Marudor.pm new file mode 100644 index 0000000..41ba81e --- /dev/null +++ b/lib/DBInfoscreen/Helper/Marudor.pm @@ -0,0 +1,120 @@ +package DBInfoscreen::Helper::Marudor; + +# Copyright (C) 2020 Daniel Friesel +# +# SPDX-License-Identifier: BSD-2-Clause + +use strict; +use warnings; +use 5.020; + +use DateTime; +use Encode qw(decode encode); +use Mojo::JSON qw(decode_json); +use Mojo::Promise; +use XML::LibXML; + +sub new { + my ( $class, %opt ) = @_; + + my $version = $opt{version}; + + $opt{header} + = { 'User-Agent' => +"dbf/${version} on $opt{root_url} +https://finalrewind.org/projects/db-fakedisplay" + }; + + return bless( \%opt, $class ); + +} + +sub get_json_p { + my ( $self, $cache, $url ) = @_; + + my $promise = Mojo::Promise->new; + + if ( my $content = $cache->thaw($url) ) { + return $promise->resolve($content); + } + + $self->{log}->debug("get_json_p($url)"); + + $self->{user_agent}->request_timeout(5)->get_p( $url => $self->{header} ) + ->then( + sub { + my ($tx) = @_; + + if ( my $err = $tx->error ) { + $self->{log}->debug( +"marudor->get_json_p($url): HTTP $err->{code} $err->{message}" + ); + $promise->reject( + "GET $url returned HTTP $err->{code} $err->{message}"); + return; + } + + my $res = $tx->res->json; + + $cache->freeze( $url, $res ); + + $promise->resolve($res); + + return; + } + )->catch( + sub { + my ($err) = @_; + $self->{log}->debug("marudor->get_json_p($url): $err"); + $promise->reject($err); + return; + } + )->wait; + + return $promise; +} + +sub get_train_utilization { + my ( $self, %opt ) = @_; + + my $promise = Mojo::Promise->new; + my $train = $opt{train}; + + if ( not $train->sched_departure ) { + $promise->reject("train has no departure"); + return $promise; + } + + my $train_no = $train->train_no; + my $this_station = $train->station; + my @route = $train->route_post; + my $next_station; + my $dep = $train->sched_departure->epoch . '000'; + + if ( @route > 1 ) { + $next_station = $route[1]; + } + else { + $next_station = $route[0]; + } + + $self->get_json_p( $self->{realtime_cache}, +"https://marudor.de/api/hafas/v1/auslastung/${this_station}/${next_station}/${train_no}/${dep}" + )->then( + sub { + my ($utilization_json) = @_; + + $promise->resolve( $utilization_json->{first}, + $utilization_json->{second} ); + return; + } + )->catch( + sub { + $promise->reject; + return; + } + )->wait; + + return $promise; +} + +1; |