diff options
-rw-r--r-- | lib/Travelynx/Command/database.pm | 12 | ||||
-rw-r--r-- | lib/Travelynx/Command/work.pm | 50 | ||||
-rw-r--r-- | lib/Travelynx/Controller/Account.pm | 11 | ||||
-rwxr-xr-x | lib/Travelynx/Controller/Traveling.pm | 14 | ||||
-rw-r--r-- | lib/Travelynx/Helper/HAFAS.pm | 10 | ||||
-rw-r--r-- | lib/Travelynx/Model/InTransit.pm | 2 | ||||
-rw-r--r-- | public/service-worker.js | 24 | ||||
-rw-r--r-- | public/static/css/material-icons.css | 8 | ||||
-rw-r--r-- | public/static/manifest.json | 12 | ||||
l--------- | public/static/v82 (renamed from public/static/v80) | 0 | ||||
-rw-r--r-- | templates/bad_gateway.html.ep | 7 | ||||
-rw-r--r-- | templates/gateway_timeout.html.ep | 7 | ||||
-rw-r--r-- | templates/layouts/default.html.ep | 2 | ||||
-rw-r--r-- | templates/select_backend.html.ep | 18 | ||||
-rw-r--r-- | templates/traewelling.html.ep | 12 |
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"> |