summaryrefslogtreecommitdiff
path: root/lib/DBInfoscreen
diff options
context:
space:
mode:
Diffstat (limited to 'lib/DBInfoscreen')
-rw-r--r--lib/DBInfoscreen/Controller/Stationboard.pm4
-rw-r--r--lib/DBInfoscreen/Helper/Marudor.pm120
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;