diff options
| -rwxr-xr-x | bin/efa-m | 33 | ||||
| -rw-r--r-- | lib/Travel/Status/DE/EFA.pm | 162 | 
2 files changed, 94 insertions, 101 deletions
@@ -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; @@ -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 " @@ -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, @@ -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; @@ -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}"; @@ -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 diff --git a/lib/Travel/Status/DE/EFA.pm b/lib/Travel/Status/DE/EFA.pm index 64ba297..b61acbc 100644 --- a/lib/Travel/Status/DE/EFA.pm +++ b/lib/Travel/Status/DE/EFA.pm @@ -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; @@ -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) @@ -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;  | 
