Loading bin/efa-m +15 −18 Original line number Diff line number Diff line Loading @@ -13,14 +13,15 @@ use Getopt::Long qw(:config no_ignore_case bundling); use List::Util qw(first max none); use Travel::Status::DE::EFA; my $efa_url = 'https://efa.vrr.de/vrr/XSLT_DM_REQUEST'; my $service = 'VRR'; my $efa_url; my $efa_encoding; my ( $date, $time, $input_type, $list_lines, $offset, $relative_times ); my ( $full_routes, $filter_via ); my ( $timeout, $developer_mode ); my ( @grep_lines, @grep_platforms, @grep_mots ); my ( %edata, @edata_pre ); my ( $list_services, $service, $discover_and_print, $discover ); my ( $list_services, $discover_and_print, $discover ); my $efa; @ARGV = map { decode( 'UTF-8', $_ ) } @ARGV; Loading Loading @@ -88,9 +89,11 @@ if ($filter_via) { $full_routes = 1; } if ($service) { my $service_ref = first { lc( $_->{shortname} ) eq lc($service) } Travel::Status::DE::EFA::get_efa_urls(); if ($efa_url) { $service = undef; } elsif ($service) { my $service_ref = Travel::Status::DE::EFA::get_service($service); if ( not $service_ref ) { printf STDERR ( "Error: Unknown service '%s'. See 'efa-m --list' for a " Loading @@ -99,16 +102,17 @@ if ($service) { ); exit 1; } $efa_url = $service_ref->{url}; $efa_encoding = $service_ref->{encoding}; $efa_url = undef; } sub new_efa_by_url { my ($url) = @_; sub new_efa { my ( $s, $u ) = @_; my $res = Travel::Status::DE::EFA->new( service => $s, efa_url => $u, date => $date, developer_mode => $developer_mode, efa_url => $url, efa_encoding => $efa_encoding, full_routes => $full_routes, place => $place, Loading Loading @@ -371,7 +375,7 @@ sub show_results { if ( $discover or $discover_and_print ) { for my $service_ref ( Travel::Status::DE::EFA::get_efa_urls() ) { $efa = new_efa_by_url( $service_ref->{url} ); $efa = new_efa( $service_ref->{shortname} ); if ( $efa and not $efa->errstr ) { if ($discover_and_print) { last; Loading @@ -388,7 +392,7 @@ if ( $discover or $discover_and_print ) { } } $efa = new_efa_by_url($efa_url); $efa = new_efa( $service, $efa_url ); if ( my $err = $efa->errstr ) { say STDERR "Request error: ${err}"; Loading Loading @@ -571,13 +575,6 @@ B<--list> option for a list of services. Show departures starting at I<time> instead of now. =item B<-u>, B<--efa-url> I<url> URL to the EFA entry point, defaults to L<http://efa.vrr.de/vrr/XSLT_DM_REQUEST>. Depending on your location, some I<url>s may contain more specific data than others. See Travel::Status::DE::EFA(3pm) and the B<--list> option for alternatives. =item B<--timeout> I<seconds> Set timeout for HTTP requests. Default: 10 seconds. Set to 0 or a negative Loading lib/Travel/Status/DE/EFA.pm +79 −83 Original line number Diff line number Diff line Loading @@ -16,6 +16,73 @@ use Travel::Status::DE::EFA::Stop; use LWP::UserAgent; use XML::LibXML; my %efa_instance = ( BSVG => { url => 'https://bsvg.efa.de/bsvagstd/XML_DM_REQUEST', name => 'Braunschweiger Verkehrs-GmbH', }, DING => { url => 'https://www.ding.eu/ding3/XSLT_DM_REQUEST', name => 'Donau-Iller Nahverkehrsverbund', }, KVV => { url => 'https://projekte.kvv-efa.de/sl3-alone/XSLT_DM_REQUEST', name => 'Karlsruher Verkehrsverbund', }, LinzAG => { url => 'https://www.linzag.at/static/XSLT_DM_REQUEST', name => 'Linz AG', encoding => 'iso-8859-15', }, MVV => { url => 'https://efa.mvv-muenchen.de/mobile/XSLT_DM_REQUEST', name => 'Münchner Verkehrs- und Tarifverbund', }, NVBW => { url => 'https://www.efa-bw.de/nvbw/XSLT_DM_REQUEST', name => 'Nahverkehrsgesellschaft Baden-Württemberg', }, VAG => { url => 'https://efa.vagfr.de/vagfr3/XSLT_DM_REQUEST', name => 'Freiburger Verkehrs AG', }, VGN => { url => 'https://efa.vgn.de/vgnExt_oeffi/XML_DM_REQUEST', name => 'Verkehrsverbund Grossraum Nuernberg', }, # HTTPS: certificate verification fails VMV => { url => 'http://efa.vmv-mbh.de/vmv/XML_DM_REQUEST', name => 'Verkehrsgesellschaft Mecklenburg-Vorpommern', }, VRN => { url => 'https://www.vrn.de/mngvrn//XML_DM_REQUEST', name => 'Verkehrsverbund Rhein-Neckar', }, VRR => { url => 'https://efa.vrr.de/vrr/XSLT_DM_REQUEST', name => 'Verkehrsverbund Rhein-Ruhr', }, VRR2 => { url => 'https://app.vrr.de/standard/XML_DM_REQUEST', name => 'Verkehrsverbund Rhein-Ruhr (alternative)', }, VRR3 => { url => 'https://efa.vrr.de/rbgstd3/XML_DM_REQUEST', name => 'Verkehrsverbund Rhein-Ruhr (alternative alternative)', }, VVO => { url => 'https://efa.vvo-online.de/VMSSL3/XSLT_DM_REQUEST', name => 'Verkehrsverbund Oberelbe', }, VVS => { url => 'https://www2.vvs.de/vvs/XSLT_DM_REQUEST', name => 'Verkehrsverbund Stuttgart', }, ); sub new_p { my ( $class, %opt ) = @_; my $promise = $opt{promise}->new; Loading Loading @@ -105,8 +172,12 @@ sub new { confess('type must be stop, stopID, address, or poi'); } if ( $opt{service} and exists $efa_instance{ $opt{service} } ) { $opt{efa_url} = $efa_instance{ $opt{service} }{url}; } if ( not $opt{efa_url} ) { confess('efa_url is mandatory'); confess('service or efa_url must be specified'); } ## no critic (RegularExpressions::ProhibitUnusedCapture) Loading Loading @@ -630,89 +701,14 @@ sub results { # static sub get_efa_urls { return map { { %{ $efa_instance{$_} }, shortname => $_ } } sort keys %efa_instance; } # sorted lexically by shortname return ( { url => 'https://bsvg.efa.de/bsvagstd/XML_DM_REQUEST', name => 'Braunschweiger Verkehrs-GmbH', shortname => 'BSVG', }, { url => 'https://www.ding.eu/ding3/XSLT_DM_REQUEST', name => 'Donau-Iller Nahverkehrsverbund', shortname => 'DING', }, { url => 'https://projekte.kvv-efa.de/sl3-alone/XSLT_DM_REQUEST', name => 'Karlsruher Verkehrsverbund', shortname => 'KVV', }, { url => 'https://www.linzag.at/static/XSLT_DM_REQUEST', name => 'Linz AG', shortname => 'LinzAG', encoding => 'iso-8859-15', }, { url => 'https://efa.mvv-muenchen.de/mobile/XSLT_DM_REQUEST', name => 'Münchner Verkehrs- und Tarifverbund', shortname => 'MVV', }, { url => 'https://www.efa-bw.de/nvbw/XSLT_DM_REQUEST', name => 'Nahverkehrsgesellschaft Baden-Württemberg', shortname => 'NVBW', }, { url => 'https://efa.vagfr.de/vagfr3/XSLT_DM_REQUEST', name => 'Freiburger Verkehrs AG', shortname => 'VAG', }, { url => 'https://efa.vgn.de/vgnExt_oeffi/XML_DM_REQUEST', name => 'Verkehrsverbund Grossraum Nuernberg', shortname => 'VGN', }, # HTTPS: certificate verification fails { url => 'http://efa.vmv-mbh.de/vmv/XML_DM_REQUEST', name => 'Verkehrsgesellschaft Mecklenburg-Vorpommern', shortname => 'VMV', }, { url => 'https://www.vrn.de/mngvrn//XML_DM_REQUEST', name => 'Verkehrsverbund Rhein-Neckar', shortname => 'VRN', }, { url => 'https://efa.vrr.de/vrr/XSLT_DM_REQUEST', name => 'Verkehrsverbund Rhein-Ruhr', shortname => 'VRR', }, { url => 'https://app.vrr.de/standard/XML_DM_REQUEST', name => 'Verkehrsverbund Rhein-Ruhr (alternative)', shortname => 'VRR2', }, { url => 'https://efa.vrr.de/rbgstd3/XML_DM_REQUEST', name => 'Verkehrsverbund Rhein-Ruhr (alternative alternative)', shortname => 'VRR3', }, { url => 'https://efa.vvo-online.de/VMSSL3/XSLT_DM_REQUEST', name => 'Verkehrsverbund Oberelbe', shortname => 'VVO', }, { url => 'https://www2.vvs.de/vvs/XSLT_DM_REQUEST', name => 'Verkehrsverbund Stuttgart', shortname => 'VVS', }, ); sub get_service { my ($service) = @_; return $efa_instance{$service}; } 1; Loading Loading
bin/efa-m +15 −18 Original line number Diff line number Diff line Loading @@ -13,14 +13,15 @@ use Getopt::Long qw(:config no_ignore_case bundling); use List::Util qw(first max none); use Travel::Status::DE::EFA; my $efa_url = 'https://efa.vrr.de/vrr/XSLT_DM_REQUEST'; my $service = 'VRR'; my $efa_url; my $efa_encoding; my ( $date, $time, $input_type, $list_lines, $offset, $relative_times ); my ( $full_routes, $filter_via ); my ( $timeout, $developer_mode ); my ( @grep_lines, @grep_platforms, @grep_mots ); my ( %edata, @edata_pre ); my ( $list_services, $service, $discover_and_print, $discover ); my ( $list_services, $discover_and_print, $discover ); my $efa; @ARGV = map { decode( 'UTF-8', $_ ) } @ARGV; Loading Loading @@ -88,9 +89,11 @@ if ($filter_via) { $full_routes = 1; } if ($service) { my $service_ref = first { lc( $_->{shortname} ) eq lc($service) } Travel::Status::DE::EFA::get_efa_urls(); if ($efa_url) { $service = undef; } elsif ($service) { my $service_ref = Travel::Status::DE::EFA::get_service($service); if ( not $service_ref ) { printf STDERR ( "Error: Unknown service '%s'. See 'efa-m --list' for a " Loading @@ -99,16 +102,17 @@ if ($service) { ); exit 1; } $efa_url = $service_ref->{url}; $efa_encoding = $service_ref->{encoding}; $efa_url = undef; } sub new_efa_by_url { my ($url) = @_; sub new_efa { my ( $s, $u ) = @_; my $res = Travel::Status::DE::EFA->new( service => $s, efa_url => $u, date => $date, developer_mode => $developer_mode, efa_url => $url, efa_encoding => $efa_encoding, full_routes => $full_routes, place => $place, Loading Loading @@ -371,7 +375,7 @@ sub show_results { if ( $discover or $discover_and_print ) { for my $service_ref ( Travel::Status::DE::EFA::get_efa_urls() ) { $efa = new_efa_by_url( $service_ref->{url} ); $efa = new_efa( $service_ref->{shortname} ); if ( $efa and not $efa->errstr ) { if ($discover_and_print) { last; Loading @@ -388,7 +392,7 @@ if ( $discover or $discover_and_print ) { } } $efa = new_efa_by_url($efa_url); $efa = new_efa( $service, $efa_url ); if ( my $err = $efa->errstr ) { say STDERR "Request error: ${err}"; Loading Loading @@ -571,13 +575,6 @@ B<--list> option for a list of services. Show departures starting at I<time> instead of now. =item B<-u>, B<--efa-url> I<url> URL to the EFA entry point, defaults to L<http://efa.vrr.de/vrr/XSLT_DM_REQUEST>. Depending on your location, some I<url>s may contain more specific data than others. See Travel::Status::DE::EFA(3pm) and the B<--list> option for alternatives. =item B<--timeout> I<seconds> Set timeout for HTTP requests. Default: 10 seconds. Set to 0 or a negative Loading
lib/Travel/Status/DE/EFA.pm +79 −83 Original line number Diff line number Diff line Loading @@ -16,6 +16,73 @@ use Travel::Status::DE::EFA::Stop; use LWP::UserAgent; use XML::LibXML; my %efa_instance = ( BSVG => { url => 'https://bsvg.efa.de/bsvagstd/XML_DM_REQUEST', name => 'Braunschweiger Verkehrs-GmbH', }, DING => { url => 'https://www.ding.eu/ding3/XSLT_DM_REQUEST', name => 'Donau-Iller Nahverkehrsverbund', }, KVV => { url => 'https://projekte.kvv-efa.de/sl3-alone/XSLT_DM_REQUEST', name => 'Karlsruher Verkehrsverbund', }, LinzAG => { url => 'https://www.linzag.at/static/XSLT_DM_REQUEST', name => 'Linz AG', encoding => 'iso-8859-15', }, MVV => { url => 'https://efa.mvv-muenchen.de/mobile/XSLT_DM_REQUEST', name => 'Münchner Verkehrs- und Tarifverbund', }, NVBW => { url => 'https://www.efa-bw.de/nvbw/XSLT_DM_REQUEST', name => 'Nahverkehrsgesellschaft Baden-Württemberg', }, VAG => { url => 'https://efa.vagfr.de/vagfr3/XSLT_DM_REQUEST', name => 'Freiburger Verkehrs AG', }, VGN => { url => 'https://efa.vgn.de/vgnExt_oeffi/XML_DM_REQUEST', name => 'Verkehrsverbund Grossraum Nuernberg', }, # HTTPS: certificate verification fails VMV => { url => 'http://efa.vmv-mbh.de/vmv/XML_DM_REQUEST', name => 'Verkehrsgesellschaft Mecklenburg-Vorpommern', }, VRN => { url => 'https://www.vrn.de/mngvrn//XML_DM_REQUEST', name => 'Verkehrsverbund Rhein-Neckar', }, VRR => { url => 'https://efa.vrr.de/vrr/XSLT_DM_REQUEST', name => 'Verkehrsverbund Rhein-Ruhr', }, VRR2 => { url => 'https://app.vrr.de/standard/XML_DM_REQUEST', name => 'Verkehrsverbund Rhein-Ruhr (alternative)', }, VRR3 => { url => 'https://efa.vrr.de/rbgstd3/XML_DM_REQUEST', name => 'Verkehrsverbund Rhein-Ruhr (alternative alternative)', }, VVO => { url => 'https://efa.vvo-online.de/VMSSL3/XSLT_DM_REQUEST', name => 'Verkehrsverbund Oberelbe', }, VVS => { url => 'https://www2.vvs.de/vvs/XSLT_DM_REQUEST', name => 'Verkehrsverbund Stuttgart', }, ); sub new_p { my ( $class, %opt ) = @_; my $promise = $opt{promise}->new; Loading Loading @@ -105,8 +172,12 @@ sub new { confess('type must be stop, stopID, address, or poi'); } if ( $opt{service} and exists $efa_instance{ $opt{service} } ) { $opt{efa_url} = $efa_instance{ $opt{service} }{url}; } if ( not $opt{efa_url} ) { confess('efa_url is mandatory'); confess('service or efa_url must be specified'); } ## no critic (RegularExpressions::ProhibitUnusedCapture) Loading Loading @@ -630,89 +701,14 @@ sub results { # static sub get_efa_urls { return map { { %{ $efa_instance{$_} }, shortname => $_ } } sort keys %efa_instance; } # sorted lexically by shortname return ( { url => 'https://bsvg.efa.de/bsvagstd/XML_DM_REQUEST', name => 'Braunschweiger Verkehrs-GmbH', shortname => 'BSVG', }, { url => 'https://www.ding.eu/ding3/XSLT_DM_REQUEST', name => 'Donau-Iller Nahverkehrsverbund', shortname => 'DING', }, { url => 'https://projekte.kvv-efa.de/sl3-alone/XSLT_DM_REQUEST', name => 'Karlsruher Verkehrsverbund', shortname => 'KVV', }, { url => 'https://www.linzag.at/static/XSLT_DM_REQUEST', name => 'Linz AG', shortname => 'LinzAG', encoding => 'iso-8859-15', }, { url => 'https://efa.mvv-muenchen.de/mobile/XSLT_DM_REQUEST', name => 'Münchner Verkehrs- und Tarifverbund', shortname => 'MVV', }, { url => 'https://www.efa-bw.de/nvbw/XSLT_DM_REQUEST', name => 'Nahverkehrsgesellschaft Baden-Württemberg', shortname => 'NVBW', }, { url => 'https://efa.vagfr.de/vagfr3/XSLT_DM_REQUEST', name => 'Freiburger Verkehrs AG', shortname => 'VAG', }, { url => 'https://efa.vgn.de/vgnExt_oeffi/XML_DM_REQUEST', name => 'Verkehrsverbund Grossraum Nuernberg', shortname => 'VGN', }, # HTTPS: certificate verification fails { url => 'http://efa.vmv-mbh.de/vmv/XML_DM_REQUEST', name => 'Verkehrsgesellschaft Mecklenburg-Vorpommern', shortname => 'VMV', }, { url => 'https://www.vrn.de/mngvrn//XML_DM_REQUEST', name => 'Verkehrsverbund Rhein-Neckar', shortname => 'VRN', }, { url => 'https://efa.vrr.de/vrr/XSLT_DM_REQUEST', name => 'Verkehrsverbund Rhein-Ruhr', shortname => 'VRR', }, { url => 'https://app.vrr.de/standard/XML_DM_REQUEST', name => 'Verkehrsverbund Rhein-Ruhr (alternative)', shortname => 'VRR2', }, { url => 'https://efa.vrr.de/rbgstd3/XML_DM_REQUEST', name => 'Verkehrsverbund Rhein-Ruhr (alternative alternative)', shortname => 'VRR3', }, { url => 'https://efa.vvo-online.de/VMSSL3/XSLT_DM_REQUEST', name => 'Verkehrsverbund Oberelbe', shortname => 'VVO', }, { url => 'https://www2.vvs.de/vvs/XSLT_DM_REQUEST', name => 'Verkehrsverbund Stuttgart', shortname => 'VVS', }, ); sub get_service { my ($service) = @_; return $efa_instance{$service}; } 1; Loading