diff --git a/htdocs/map.js b/htdocs/map.js
index d4f2acd3..7f9c2776 100644
--- a/htdocs/map.js
+++ b/htdocs/map.js
@@ -35,6 +35,7 @@ $(function(){
var strokeOpacity = 0.8;
var fillOpacity = 0.35;
var callsign_service;
+ var aircraft_tracking_service;
var colorKeys = {};
var colorScale = chroma.scale(['red', 'blue', 'green']).mode('hsl');
@@ -318,6 +319,9 @@ $(function(){
if ('callsign_service' in config) {
callsign_service = config['callsign_service'];
}
+ if ('aircraft_tracking_service' in config) {
+ aircraft_tracking_service = config['aircraft_tracking_service'];
+ }
break;
case "update":
processUpdates(json.value);
@@ -386,7 +390,7 @@ $(function(){
// we can reuse the same logic for displaying and indexing
var sourceToString = sourceToKey;
- var linkifySource = function(source) {
+ var linkifyCallsign = function(source) {
var callsignString = sourceToString(source);
switch (callsign_service) {
case "qrzcq":
@@ -401,6 +405,25 @@ $(function(){
}
};
+ var linkifyAircraft = function(source, identification) {
+ var aircraftString = identification || source.icao;
+ var link = false;
+ switch (aircraft_tracking_service) {
+ case 'flightaware':
+ link = 'https://flightaware.com/live/modes/' + source.icao;
+ if (identification) link += "/ident/" + identification
+ link += '/redirect';
+ break;
+ case 'planefinder':
+ if (identification) link = 'https://planefinder.net/flight/' + identification;
+ break;
+ }
+ if (link) {
+ return '' + aircraftString + '';
+ }
+ return aircraftString;
+ }
+
var distanceKm = function(p1, p2) {
// Earth radius in km
var R = 6371.0;
@@ -435,7 +458,7 @@ $(function(){
'
' +
inLocator.map(function(i){
var timestring = moment(i.lastseen).fromNow();
- var message = linkifySource(i.source) + ' (' + timestring + ' using ' + i.mode;
+ var message = linkifyCallsign(i.source) + ' (' + timestring + ' using ' + i.mode;
if (i.band) message += ' on ' + i.band;
message += ')';
return '- ' + message + '
'
@@ -461,7 +484,7 @@ $(function(){
}
var title;
if (marker.icao) {
- title = marker.identification || marker.icao;
+ title = linkifyAircraft(source, marker.identification);
if ('altitude' in marker) {
commentString += 'Altitude: ' + marker.altitude + ' ft
';
}
@@ -478,7 +501,7 @@ $(function(){
commentString += 'TAS: ' + marker.TAS + ' kt
/';
}
} else {
- linkifySource(source);
+ title = linkifyCallsign(source);
}
infowindow.setContent(
'' + title + distance + '
' +
diff --git a/owrx/connection.py b/owrx/connection.py
index 10cf795e..450f5a0a 100644
--- a/owrx/connection.py
+++ b/owrx/connection.py
@@ -459,6 +459,7 @@ class MapConnection(OpenWebRxClient):
"receiver_gps",
"map_position_retention_time",
"callsign_service",
+ "aircraft_tracking_service",
"receiver_name",
)
self.configSub = filtered_config.wire(self.write_config)
diff --git a/owrx/controllers/settings/general.py b/owrx/controllers/settings/general.py
index 8565375f..21ac8284 100644
--- a/owrx/controllers/settings/general.py
+++ b/owrx/controllers/settings/general.py
@@ -183,6 +183,17 @@ class GeneralSettingsController(SettingsFormController):
Option("aprsfi", "aprs.fi"),
],
),
+ DropdownInput(
+ "aircraft_tracking_service",
+ "Aircraft tracking service",
+ infotext="Allows users to navigate to an external flight tracking service by clicking on flight "
+ + "numbers",
+ options=[
+ Option(None, "disabled"),
+ Option("flightaware", "FlightAware"),
+ Option("planefinder", "planefinder"),
+ ]
+ )
),
]