diff options
| -rw-r--r-- | index.pl | 61 | ||||
| -rw-r--r-- | t/22-json.t (renamed from t/22-marudor.t) | 4 | ||||
| -rw-r--r-- | templates/layouts/default.html.ep | 6 | 
3 files changed, 27 insertions, 44 deletions
| @@ -188,7 +188,7 @@ helper 'handle_no_results_json' => sub {  			}  		);  	} -	elsif ( $backend eq 'iris' ) { +	else {  		my @candidates = map { { code => $_->[0], name => $_->[1] } }  		  Travel::Status::DE::IRIS::Stations::get_station($station);  		if ( @candidates > 1 @@ -213,15 +213,6 @@ helper 'handle_no_results_json' => sub {  			);  		}  	} -	else { -		$json = $self->render_to_string( -			json => { -				api_version => $api_version, -				version     => $VERSION, -				error       => ( $errstr // 'unknown station code/name' ) -			} -		); -	}  	if ($callback) {  		$self->render(  			data   => "$callback($json);", @@ -358,8 +349,23 @@ sub handle_request {  		$self->stash( layout => 'text' );  	} +	# Historically, there were two JSON APIs: 'json' (undocumented, raw +	# passthrough of serialized Travel::Status::DE::IRIS::Result / +	# Travel::Status::DE::DE::HAFAS::Result objects) and 'marudor' +	# (documented, IRIS only, stable versioned API). The latter was initially +	# created for marudor.de, but quickly used by other clients as well. +	# +	# marudor.de switched to a nodejs IRIS parser in December 2018. As the +	# 'json' API was not used and the 'marudor' variant is no longer related to +	# (or used by) marudor.de, it was renamed to 'json'. Many clients won't +	# notice this for year to come, so we make sure mode=marudor still works as +	# intended. +	if ($template eq 'marudor') { +		$template = 'json'; +	} +  	if ( -		not( $template ~~ [qw[app infoscreen json marudor multi single text]] ) +		not( $template ~~ [qw[app infoscreen json multi single text]] )  	  )  	{  		$template = 'app'; @@ -382,7 +388,7 @@ sub handle_request {  		return;  	} -	if ( $template eq 'marudor' ) { +	if ( $template eq 'json' ) {  		$backend = 'iris';  		$opt{lookahead} = 120;  	} @@ -397,7 +403,7 @@ sub handle_request {  	my $errstr      = $data->{errstr};  	my @results     = @{$results_ref}; -	if ( not @results and $template ~~ [qw[json marudor]] ) { +	if ( not @results and $template eq 'json' ) {  		$self->handle_no_results_json( $backend, $station, $errstr,  			$api_version, $callback );  		return; @@ -530,7 +536,7 @@ sub handle_request {  				  . $additional_line  				  . ( $info ? ' +++ ' : q{} )  				  . $info; -				if ( $template ne 'marudor' ) { +				if ( $template ne 'json' ) {  					push(  						@{$moreinfo},  						[ 'Zusätzliche Halte', $additional_line ] @@ -545,7 +551,7 @@ sub handle_request {  				  . $cancel_line  				  . ( $info ? ' +++ ' : q{} )  				  . $info; -				if ( $template ne 'marudor' ) { +				if ( $template ne 'json' ) {  					push( @{$moreinfo}, [ 'Ohne Halt in', $cancel_line ] );  				}  			} @@ -602,7 +608,7 @@ sub handle_request {  			$info =~ s{ (?: ca [.] \s* )? [+] (\d+) }{Verspätung ca $1 Min.}x;  		} -		if ( $template eq 'marudor' ) { +		if ( $template eq 'json' ) {  			my @json_route = $self->json_route_diff( [ $result->route ],  				[ $result->sched_route ] ); @@ -864,29 +870,6 @@ sub handle_request {  		$self->res->headers->access_control_allow_origin(q{*});  		my $json = $self->render_to_string(  			json => { -				api_version  => $api_version, -				preformatted => \@departures, -				version      => $VERSION, -				raw          => \@results, -			} -		); -		if ($callback) { -			$self->render( -				data   => "$callback($json);", -				format => 'json' -			); -		} -		else { -			$self->render( -				data   => $json, -				format => 'json' -			); -		} -	} -	elsif ( $template eq 'marudor' ) { -		$self->res->headers->access_control_allow_origin(q{*}); -		my $json = $self->render_to_string( -			json => {  				departures => \@departures,  			}  		); diff --git a/t/22-marudor.t b/t/22-json.t index 7038ca6..9db67b8 100644 --- a/t/22-marudor.t +++ b/t/22-json.t @@ -14,7 +14,7 @@ my $t = Test::Mojo->new;  # be because of IRIS problems or unanticipated schedule changes.  # TODO: Support mock XML from hard disk. -$t->get_ok('/EDUV?mode=marudor&version=1') +$t->get_ok('/EDUV?mode=json&version=1')    ->status_is(200)    ->json_has('/departures', 'has departures')    ->json_has('/departures/0', 'has a departure') @@ -38,7 +38,7 @@ $t->get_ok('/EDUV?mode=marudor&version=1')                '.via[0]')    ; -$t->get_ok('/EDUV?mode=marudor&version=1&callback=my_callback') +$t->get_ok('/EDUV?mode=json&version=1&callback=my_callback')    ->status_is(200)    ->content_like(qr{ ^ my_callback \( }x, 'json callback works');  # ) <- just here to fix bracket grouping in vim diff --git a/templates/layouts/default.html.ep b/templates/layouts/default.html.ep index 3edb715..0d70092 100644 --- a/templates/layouts/default.html.ep +++ b/templates/layouts/default.html.ep @@ -214,10 +214,10 @@ nur Züge via Bochum oder Hamm)</li>  	"App"-Frontend verwenden (und vorerst den Parameter <span style="font-family: monospace;">force_mobile=1</span>  	hinzufügen, das ist bald aber nicht mehr nötig). Für eine große Ansicht  	(z.B. als alleinstehender Infoscreen) gibt es das "Infoscreen"-Frontend.</li> -<li>Die Parameter <span style="font-family: monospace;">mode=marudor&version=3</span> -	liefern ein JSON-Interface. Die route-Elemente können zusätzlich +<li>Die Parameter <span style="font-family: monospace;">mode=json&version=3</span> +	bieten ein JSON-Interface. Die route-Elemente können zusätzlich  	die Felder "isAdditional" oder "isCancelled" enthalten, der Rest sollte -	selbsterklärend sein.</li> +	selbsterklärend sein. Dieses Interface nutzt ausschließlich das IRIS-Backend.</li>  <li>Dieser Dienst ist Open Source-Software (Links siehe unten) und kann auch  	auf eigenen Servern installiert werden. Automatisierte Crawler, die mehrere  	Dutzend Stationen pro Minute abfragen, bitte nur auf eigenen Instanzen | 
