Unverified Commit dfa79f53 authored by Birte Kristina Friesel's avatar Birte Kristina Friesel
Browse files

EFA: Add static get_service function

parent 1320ea39
Loading
Loading
Loading
Loading
+15 −18
Original line number Diff line number Diff line
@@ -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
+79 −83
Original line number Diff line number Diff line
@@ -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;