summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Travelynx/Command/database.pm12
-rw-r--r--lib/Travelynx/Command/work.pm50
-rw-r--r--lib/Travelynx/Controller/Account.pm11
-rwxr-xr-xlib/Travelynx/Controller/Traveling.pm14
-rw-r--r--lib/Travelynx/Helper/HAFAS.pm10
-rw-r--r--lib/Travelynx/Model/InTransit.pm2
-rw-r--r--public/service-worker.js24
-rw-r--r--public/static/css/material-icons.css8
-rw-r--r--public/static/manifest.json12
l---------public/static/v82 (renamed from public/static/v80)0
-rw-r--r--templates/bad_gateway.html.ep7
-rw-r--r--templates/gateway_timeout.html.ep7
-rw-r--r--templates/layouts/default.html.ep2
-rw-r--r--templates/select_backend.html.ep18
-rw-r--r--templates/traewelling.html.ep12
15 files changed, 125 insertions, 64 deletions
diff --git a/lib/Travelynx/Command/database.pm b/lib/Travelynx/Command/database.pm
index a7d13a8..6ba80a3 100644
--- a/lib/Travelynx/Command/database.pm
+++ b/lib/Travelynx/Command/database.pm
@@ -2689,6 +2689,18 @@ qq{select distinct checkout_station_id from in_transit where backend_id = 0;}
}
);
},
+
+ # v58 -> v59
+ # DB HAFAS is dead. Default to DB IRIS for now.
+ sub {
+ my ($db) = @_;
+ $db->query(
+ qq{
+ alter table users alter column backend_id set default 0;
+ update schema_version set version = 59;
+ }
+ );
+ },
);
sub sync_stations {
diff --git a/lib/Travelynx/Command/work.pm b/lib/Travelynx/Command/work.pm
index 98f478a..5385e9b 100644
--- a/lib/Travelynx/Command/work.pm
+++ b/lib/Travelynx/Command/work.pm
@@ -6,6 +6,8 @@ package Travelynx::Command::work;
use Mojo::Base 'Mojolicious::Command';
use Mojo::Promise;
+use utf8;
+
use DateTime;
use JSON;
use List::Util;
@@ -83,22 +85,27 @@ sub run {
dep_eva => $dep,
arr_eva => $arr
);
- if ( $entry->{backend_id} <= 1
- and $journey->class <= 16
- and $found_dep->rt_dep->epoch > $now->epoch )
- {
- $self->app->add_wagonorder(
- uid => $uid,
- train_id => $journey->id,
- is_departure => 1,
- eva => $dep,
- datetime => $found_dep->sched_dep,
- train_type => $journey->type,
- train_no => $journey->number,
- );
- $self->app->add_stationinfo( $uid, 1,
- $journey->id, $found_dep->loc->eva );
- }
+ }
+ if (
+ $found_dep->sched_dep
+ and ( $entry->{backend_id} <= 1
+ or $entry->{backend_name} eq 'VRN'
+ or $entry->{backend_name} eq 'ÖBB' )
+ and $journey->class <= 16
+ and $found_dep->dep->epoch > $now->epoch
+ )
+ {
+ $self->app->add_wagonorder(
+ uid => $uid,
+ train_id => $journey->id,
+ is_departure => 1,
+ eva => $dep,
+ datetime => $found_dep->sched_dep,
+ train_type => $journey->type =~ s{ +$}{}r,
+ train_no => $journey->number,
+ );
+ $self->app->add_stationinfo( $uid, 1,
+ $journey->id, $found_dep->loc->eva );
}
if ( $found_arr and $found_arr->rt_arr ) {
@@ -109,10 +116,15 @@ sub run {
dep_eva => $dep,
arr_eva => $arr
);
- if ( $entry->{backend_id} <= 1
+ if (
+ (
+ $entry->{backend_id} <= 1
+ or $entry->{backend_name} eq 'VRN'
+ or $entry->{backend_name} eq 'ÖBB'
+ )
and $journey->class <= 16
- and $found_arr->rt_arr->epoch - $now->epoch
- < 600 )
+ and $found_arr->arr->epoch - $now->epoch < 600
+ )
{
$self->app->add_wagonorder(
uid => $uid,
diff --git a/lib/Travelynx/Controller/Account.pm b/lib/Travelynx/Controller/Account.pm
index faaad0a..8a21ffa 100644
--- a/lib/Travelynx/Controller/Account.pm
+++ b/lib/Travelynx/Controller/Account.pm
@@ -1070,7 +1070,16 @@ sub backend_form {
$backend->{homepage} = 'https://www.bahn.de';
}
elsif ( $backend->{hafas} ) {
- if ( my $s = $self->hafas->get_service( $backend->{name} ) ) {
+
+ # These backends lack a journey endpoint or are no longer
+ # operational and are thus useless for travelynx
+ if ( $backend->{name} eq 'Resrobot'
+ or $backend->{name} eq 'TPG'
+ or $backend->{name} eq 'DB' )
+ {
+ $type = undef;
+ }
+ elsif ( my $s = $self->hafas->get_service( $backend->{name} ) ) {
$type = 'HAFAS';
$backend->{longname} = $s->{name};
$backend->{homepage} = $s->{homepage};
diff --git a/lib/Travelynx/Controller/Traveling.pm b/lib/Travelynx/Controller/Traveling.pm
index f61d83d..a0ae43b 100755
--- a/lib/Travelynx/Controller/Traveling.pm
+++ b/lib/Travelynx/Controller/Traveling.pm
@@ -1131,18 +1131,22 @@ sub station {
}
)->wait;
}
- elsif ( $err =~ m{svcRes|connection close} ) {
+ elsif ( $err
+ =~ m{svcRes|connection close|Service Temporarily Unavailable} )
+ {
$self->render(
'bad_gateway',
- message => $err,
- status => 502
+ message => $err,
+ status => 502,
+ select_new_backend => 1,
);
}
elsif ( $err =~ m{timeout}i ) {
$self->render(
'gateway_timeout',
- message => $err,
- status => 504
+ message => $err,
+ status => 504,
+ select_new_backend => 1,
);
}
else {
diff --git a/lib/Travelynx/Helper/HAFAS.pm b/lib/Travelynx/Helper/HAFAS.pm
index a8ab395..207fadb 100644
--- a/lib/Travelynx/Helper/HAFAS.pm
+++ b/lib/Travelynx/Helper/HAFAS.pm
@@ -97,7 +97,7 @@ sub get_departures_p {
: DateTime->now( time_zone => 'Europe/Berlin' )
)->subtract( minutes => $opt{lookbehind} );
return Travel::Status::DE::HAFAS->new_p(
- service => $opt{service},
+ service => $opt{service} // 'VRN',
station => $opt{eva},
datetime => $when,
lookahead => $opt{lookahead} + $opt{lookbehind},
@@ -112,7 +112,7 @@ sub search_location_p {
my ( $self, %opt ) = @_;
return Travel::Status::DE::HAFAS->new_p(
- service => $opt{service},
+ service => $opt{service} // 'VRN',
locationSearch => $opt{query},
cache => $self->{realtime_cache},
promise => 'Mojo::Promise',
@@ -130,7 +130,7 @@ sub get_tripid_p {
$train_desc =~ s{^- }{};
Travel::Status::DE::HAFAS->new_p(
- service => $opt{service},
+ service => $opt{service} // 'VRN',
journeyMatch => $train_desc,
datetime => $train->start,
cache => $self->{realtime_cache},
@@ -182,7 +182,7 @@ sub get_journey_p {
my $now = DateTime->now( time_zone => 'Europe/Berlin' );
Travel::Status::DE::HAFAS->new_p(
- service => $opt{service},
+ service => $opt{service} // 'VRN',
journey => {
id => $opt{trip_id},
},
@@ -223,7 +223,7 @@ sub get_route_p {
my $now = DateTime->now( time_zone => 'Europe/Berlin' );
Travel::Status::DE::HAFAS->new_p(
- service => $opt{service},
+ service => $opt{service} // 'VRN',
journey => {
id => $opt{trip_id},
diff --git a/lib/Travelynx/Model/InTransit.pm b/lib/Travelynx/Model/InTransit.pm
index 62e60f1..43ecb90 100644
--- a/lib/Travelynx/Model/InTransit.pm
+++ b/lib/Travelynx/Model/InTransit.pm
@@ -30,7 +30,7 @@ my %visibility_atoi = (
sub _epoch {
my ($dt) = @_;
- return $dt ? $dt->epoch : 0;
+ return $dt ? $dt->epoch : undef;
}
sub epoch_to_dt {
diff --git a/public/service-worker.js b/public/service-worker.js
index e3f7d51..f432faa 100644
--- a/public/service-worker.js
+++ b/public/service-worker.js
@@ -1,18 +1,18 @@
-const CACHE_NAME = 'static-cache-v81';
+const CACHE_NAME = 'static-cache-v82';
const FILES_TO_CACHE = [
'/favicon.ico',
'/offline.html',
- '/static/v81/css/light.min.css',
- '/static/v81/css/dark.min.css',
- '/static/v81/css/material-icons.css',
- '/static/v81/fonts/MaterialIcons-Regular.woff2',
- '/static/v81/fonts/MaterialIcons-Regular.woff',
- '/static/v81/fonts/MaterialIcons-Regular.ttf',
- '/static/v81/js/jquery-3.4.1.min.js',
- '/static/v81/js/materialize.min.js',
- '/static/v81/js/travelynx-actions.min.js',
- '/static/v81/js/autocomplete.min.js',
- '/static/v81/js/geolocation.min.js',
+ '/static/v82/css/light.min.css',
+ '/static/v82/css/dark.min.css',
+ '/static/v82/css/material-icons.css',
+ '/static/v82/fonts/MaterialIcons-Regular.woff2',
+ '/static/v82/fonts/MaterialIcons-Regular.woff',
+ '/static/v82/fonts/MaterialIcons-Regular.ttf',
+ '/static/v82/js/jquery-3.4.1.min.js',
+ '/static/v82/js/materialize.min.js',
+ '/static/v82/js/travelynx-actions.min.js',
+ '/static/v82/js/autocomplete.min.js',
+ '/static/v82/js/geolocation.min.js',
];
self.addEventListener('install', (evt) => {
diff --git a/public/static/css/material-icons.css b/public/static/css/material-icons.css
index 8a3d6f2..422d81e 100644
--- a/public/static/css/material-icons.css
+++ b/public/static/css/material-icons.css
@@ -2,12 +2,12 @@
font-family: 'Material Icons';
font-style: normal;
font-weight: 400;
- src: url(/static/v81/fonts/MaterialIcons-Regular.eot); /* For IE6-8 */
+ src: url(/static/v82/fonts/MaterialIcons-Regular.eot); /* For IE6-8 */
src: local('Material Icons'),
local('MaterialIcons-Regular'),
- url(/static/v81/fonts/MaterialIcons-Regular.woff2) format('woff2'),
- url(/static/v81/fonts/MaterialIcons-Regular.woff) format('woff'),
- url(/static/v81/fonts/MaterialIcons-Regular.ttf) format('truetype');
+ url(/static/v82/fonts/MaterialIcons-Regular.woff2) format('woff2'),
+ url(/static/v82/fonts/MaterialIcons-Regular.woff) format('woff'),
+ url(/static/v82/fonts/MaterialIcons-Regular.ttf) format('truetype');
}
.material-icons {
diff --git a/public/static/manifest.json b/public/static/manifest.json
index 0079c6f..67f1dfc 100644
--- a/public/static/manifest.json
+++ b/public/static/manifest.json
@@ -3,27 +3,27 @@
"short_name": "Travelynx",
"scope": "/",
"icons": [{
- "src": "/static/v81/icons/icon-128x128.png",
+ "src": "/static/v82/icons/icon-128x128.png",
"sizes": "128x128",
"type": "image/png"
}, {
- "src": "/static/v81/icons/icon-144x144.png",
+ "src": "/static/v82/icons/icon-144x144.png",
"sizes": "144x144",
"type": "image/png"
}, {
- "src": "/static/v81/icons/icon-152x152.png",
+ "src": "/static/v82/icons/icon-152x152.png",
"sizes": "152x152",
"type": "image/png"
}, {
- "src": "/static/v81/icons/icon-192x192.png",
+ "src": "/static/v82/icons/icon-192x192.png",
"sizes": "192x192",
"type": "image/png"
}, {
- "src": "/static/v81/icons/icon-256x256.png",
+ "src": "/static/v82/icons/icon-256x256.png",
"sizes": "256x256",
"type": "image/png"
}, {
- "src": "/static/v81/icons/icon-512x512.png",
+ "src": "/static/v82/icons/icon-512x512.png",
"sizes": "512x512",
"type": "image/png"
}],
diff --git a/public/static/v80 b/public/static/v82
index 945c9b4..945c9b4 120000
--- a/public/static/v80
+++ b/public/static/v82
diff --git a/templates/bad_gateway.html.ep b/templates/bad_gateway.html.ep
index ca69188..07bf29e 100644
--- a/templates/bad_gateway.html.ep
+++ b/templates/bad_gateway.html.ep
@@ -6,7 +6,12 @@
<p>
Das von travelynx genutzte Backend hat einen Fehler zurückgegeben.
travelynx hat keine Möglichkeiten, diese Situation zu beheben.
- Versuche es in ein paar Sekunden bis Minuten noch einmal.
+ % if (stash('select_new_backend')) {
+ Versuche es in ein paar Sekunden bis Minuten noch einmal oder <a href="/account/select_backend">wähle ein anderes Backend</a>.
+ % }
+ % else {
+ Versuche es in ein paar Sekunden bis Minuten noch einmal.
+ % }
</p>
</div>
</div>
diff --git a/templates/gateway_timeout.html.ep b/templates/gateway_timeout.html.ep
index 86e844d..9cf8690 100644
--- a/templates/gateway_timeout.html.ep
+++ b/templates/gateway_timeout.html.ep
@@ -6,7 +6,12 @@
<p>
Das von travelynx genutzte Backend hat nicht rechtzeitig reagiert.
travelynx hat keine Möglichkeiten, diese Situation zu beheben.
- Vrsuche es in ein paar Sekunden bis Minuten noch einmal.
+ % if (stash('select_new_backend')) {
+ Versuche es in ein paar Sekunden bis Minuten noch einmal oder <a href="/account/select_backend">wähle ein anderes Backend</a>.
+ % }
+ % else {
+ Versuche es in ein paar Sekunden bis Minuten noch einmal.
+ % }
</p>
</div>
</div>
diff --git a/templates/layouts/default.html.ep b/templates/layouts/default.html.ep
index fc31f49..e74a731 100644
--- a/templates/layouts/default.html.ep
+++ b/templates/layouts/default.html.ep
@@ -13,7 +13,7 @@
% while (my ($key, $value) = each %{stash('opengraph') // {}}) {
<meta property="og:<%= $key %>" content="<%= $value %>">
% }
- % my $av = 'v81'; # asset version
+ % my $av = 'v82'; # asset version
<link rel="icon" type="image/png" href="/static/<%= $av %>/icons/icon-16x16.png" sizes="16x16">
<link rel="icon" type="image/png" href="/static/<%= $av %>/icons/icon-32x32.png" sizes="32x32">
<link rel="icon" type="image/png" href="/static/<%= $av %>/icons/icon-96x96.png" sizes="96x96">
diff --git a/templates/select_backend.html.ep b/templates/select_backend.html.ep
index db1674e..8af157d 100644
--- a/templates/select_backend.html.ep
+++ b/templates/select_backend.html.ep
@@ -3,6 +3,7 @@
<h2>Backend auswählen</h2>
<p style="text-align: justify;">
Das ausgewählte Backend bestimmt die Datenquelle für Fahrten in travelynx.
+ <a href="#help">Hilfe bei der Auswahl</a>.
</p>
</div>
</div>
@@ -31,18 +32,23 @@
%= end
<div class="row">
<div class="col s12">
- <h2>Details</h2>
+ <h2 id="help">Hilfe</h2>
<p>
- <strong>Deutsche Bahn</strong> ist eine gute Wahl für Nah-, Regional- und Fernverkehr in Deutschland und (teilweise) Nachbarländern.
- Hier stehen zumeist brauchbare Echtzeitdaten zur Verfügung; bei Zügen sind zusätzlich Kartendaten vorhanden.
+ Leider gibt es seit der Abschaltung des DB HAFAS am 8. Januar 2025 derzeit kein Backend, welches allgemein für Nah- und Fernverkehr in Deutschland nutzbar ist.
+ Der <strong>VRN</strong> kommt voraussichtlich am ehesten an Qualität und Umfang der im DB HAFAS verfügbaren Daten heran.
+ Im Übrigen muss je nach Verkehrsmittel, Region und Wünschen an die verfügbaren Daten hier ein geeignetes Backend ausgewählt werden.
+ Abhilfe ist in Arbeit.
</p>
<p>
- <strong>Deutsche Bahn (IRIS-TTS)</strong> unterstützt ausschließlich Schienenverkehr; im Gegensatz zum HAFAS sind hier detaillierte Verspätungsgründe verfügbar.
+ <strong>VRN</strong> ist eine gute Wahl für Nah-, Regional- und Fernverkehr in Deutschland. Hier gibt es meist Echtzeitdaten, allgemeine Meldungen, Wagenreihungen und Kartendaten.
+ <strong>Deutsche Bahn</strong> (IRIS-TTS) liefert Echtzeitdaten, Wagenreihungen und Verspätungsmeldungen für Regional- und Fernverkehr in Deutschland. In vielen Fällen sind auch allgemeine Meldungen und Kartendaten verfügbar.
+ <strong>ÖBB</strong> liefern Kartendaten und Wagenreihungen für Fernverkehr in Deutschland, jedoch keine Meldungen. Echtzeitdaten sind teilweise verfügbar.
</p>
<p>
- Die restlichen Backends können sich für Fahrten in den zugehörigen Verkehrsverbünden lohnen.
- Im Gegensatz zum Deutsche Bahn-HAFAS haben sie oft besser gepflegte Echtzeitdaten und liefern in vielen (aber nicht allen) Fällen auch Kartendaten für Nahverkehrsmittel wie Busse oder Stadtbahnen.
+ Die restlichen Backends lohnen sich für Fahrten in den zugehörigen Verkehrsverbünden bzw. Ländern.
+ Im Gegensatz zu IRIS-TTS liefern sie in vielen (aber nicht allen) Fällen auch Kartendaten für die dem Verbund zugehörigen Verkehrsmittel.
In Einzelfällen (z.B. BVG) sind sogar Auslastungsdaten eingepflegt.
+ Bei Fahrten außerhalb von Deutschland und der Schweiz ist <strong>ÖBB</strong> zumeist die beste Wahl.
</p>
</div>
</div>
diff --git a/templates/traewelling.html.ep b/templates/traewelling.html.ep
index 1e0d65d..ee8f023 100644
--- a/templates/traewelling.html.ep
+++ b/templates/traewelling.html.ep
@@ -43,9 +43,16 @@
<div class="row">
<div class="col s12">
- <div class="card purple">
+ <div class="card caution-color">
<div class="card-content white-text">
- <span class="card-title">Eingeschränkte Synchronisierung</span>
+ <span class="card-title">Derzeit keine Synchronisierung möglich</span>
+ <p>
+ Seit Abschaltung des DB HAFAS am 8. Januar 2024 ist leider keine Synchronisierung zwischen Träwelling und travelynx möglich.
+ Träwelling nutzt seitdem eine zu großen Teilen mit dem DB HAFAS kompatible bahn.de-API, während travelynx derzeit ersatzweise das VRN HAFAS nutzt.
+ Da die von diesen APIs genutzten Reise-IDs nicht miteinander kompatibel sind, können Checkins nicht synchronisiert werden.
+ Eine Einbindung der bahn.de-API in travelynx (und damit eine Wiederherstellung der Synchronisierungsmöglichkeiten) ist in Arbeit, kann jedoch durchaus noch einige Wochen bis Monate in Anspruch nehmen.
+ </p>
+ <!--
<p>
Träwelling und travelynx setzen unterschiedliche Schwerpunkte und haben unterschiedliche Features.
Kombiniert mit der Vielzahl an möglichen Randfällen heißt das, dass die Synchronisierung nicht immer funktioniert.
@@ -55,6 +62,7 @@
Bei hohen Verspätungen, Ausfällen und nachträglichen Checkin-Änderungen ist die Synchronisierung u.U. nicht möglich und muss von Hand vorgenommen werden.
travelynx-Hooks werden bei via Träwelling vorgenommenen Checkins nicht ausgelöst.
</p>
+ -->
</div>
<div class="card-action">
<a href="https://github.com/derf/travelynx/issues" class="waves-effect waves-light btn-flat white-text">