Most providers don't need the ability to override names

This commit is contained in:
Ian Renton
2026-07-30 18:56:53 +01:00
parent fffd230633
commit 266468f938
46 changed files with 72 additions and 93 deletions
+1 -1
View File
@@ -14,7 +14,7 @@ class APRSIS(SpotProvider):
"""Spot provider for the APRS-IS."""
def __init__(self, provider_config):
super().__init__(provider_config)
super().__init__("APRS-IS", provider_config)
self._thread = Thread(target=self._connect)
self._thread.daemon = True
self._aprsis = None
+6 -1
View File
@@ -26,7 +26,8 @@ class DXCluster(SpotProvider):
def __init__(self, provider_config):
"""Constructor requires hostname and port"""
super().__init__(provider_config)
name = provider_config["name"] if "name" in provider_config else "Cluster"
super().__init__(name, provider_config)
self._hostname = provider_config["host"]
self._port = provider_config["port"]
self._login_prompt = provider_config["login_prompt"] if "login_prompt" in provider_config else "login:"
@@ -59,6 +60,10 @@ class DXCluster(SpotProvider):
self._telnet.write((self._login_callsign + "\n").encode("latin-1"))
connected = True
logging.info("DX Cluster " + self._hostname + " connected.")
except ConnectionRefusedError:
self.status = "Error"
logging.warning("Connection refused to DX cluster " + self._hostname)
sleep(300)
except Exception:
self.status = "Error"
logging.exception("Exception while connecting to DX Cluster Provider (" + self._hostname + ").")
+1 -1
View File
@@ -26,7 +26,7 @@ class GMA(HTTPSpotProvider):
provider_config["enabled"] = False
logging.warning("GMA spot provider configured but no api key was provided, this API will not be queried.")
super().__init__(provider_config, self.SPOTS_URL + "?key=" + self.api_key, self.POLL_INTERVAL_SEC)
super().__init__("GMA", provider_config, self.SPOTS_URL + "?key=" + self.api_key, self.POLL_INTERVAL_SEC)
def _http_response_to_spots(self, http_response):
new_spots = []
+1 -1
View File
@@ -25,7 +25,7 @@ class HEMA(HTTPSpotProvider):
SPOTTER_COMMENT_PATTERN = re.compile("^\\((.*)\\) (.*)$")
def __init__(self, provider_config):
super().__init__(provider_config, self.SPOT_SEED_URL, self.POLL_INTERVAL_SEC)
super().__init__("HEMA", provider_config, self.SPOT_SEED_URL, self.POLL_INTERVAL_SEC)
self._spot_seed = ""
def _http_response_to_spots(self, http_response):
+2 -2
View File
@@ -15,8 +15,8 @@ class HTTPSpotProvider(SpotProvider):
"""Generic spot provider class for providers that request data via HTTP(S). Just for convenience to avoid code
duplication. Subclasses of this query the individual APIs for data."""
def __init__(self, provider_config, url, poll_interval):
super().__init__(provider_config)
def __init__(self, name, provider_config, url, poll_interval):
super().__init__(name, provider_config)
self._url = url
self._poll_interval = poll_interval
self._thread = None
+1 -1
View File
@@ -12,7 +12,7 @@ class LLOTA(HTTPSpotProvider):
SPOTS_URL = "https://llota.app/api/public/spots"
def __init__(self, provider_config):
super().__init__(provider_config, self.SPOTS_URL, self.POLL_INTERVAL_SEC)
super().__init__("LLOTA", provider_config, self.SPOTS_URL, self.POLL_INTERVAL_SEC)
def _http_response_to_spots(self, http_response):
new_spots = []
+1 -1
View File
@@ -17,7 +17,7 @@ class ParksNPeaks(HTTPSpotProvider):
SIOTA_LIST_URL = "https://www.silosontheair.com/data/silos.csv"
def __init__(self, provider_config):
super().__init__(provider_config, self.SPOTS_URL, self.POLL_INTERVAL_SEC)
super().__init__("ParksNPeaks", provider_config, self.SPOTS_URL, self.POLL_INTERVAL_SEC)
def _http_response_to_spots(self, http_response):
new_spots = []
+1 -1
View File
@@ -14,7 +14,7 @@ class POTA(HTTPSpotProvider):
SPOTS_URL = "https://api.pota.app/spot/activator"
def __init__(self, provider_config):
super().__init__(provider_config, self.SPOTS_URL, self.POLL_INTERVAL_SEC)
super().__init__("POTA", provider_config, self.SPOTS_URL, self.POLL_INTERVAL_SEC)
def _http_response_to_spots(self, http_response):
new_spots = []
+2 -1
View File
@@ -23,7 +23,8 @@ class RBN(SpotProvider):
def __init__(self, provider_config):
"""Constructor requires port number."""
super().__init__(provider_config)
name = provider_config["name"] if "name" in provider_config else "RBN"
super().__init__(name, provider_config)
self._port = provider_config["port"]
self._telnet = None
self._thread = Thread(target=self._handle)
+1 -1
View File
@@ -23,7 +23,7 @@ class SOTA(HTTPSpotProvider):
SUMMIT_URL_ROOT = "https://api-db2.sota.org.uk/api/summits/"
def __init__(self, provider_config):
super().__init__(provider_config, self.EPOCH_URL, self.POLL_INTERVAL_SEC)
super().__init__("SOTA", provider_config, self.EPOCH_URL, self.POLL_INTERVAL_SEC)
self._api_epoch = ""
def _http_response_to_spots(self, http_response):
+2 -2
View File
@@ -8,10 +8,10 @@ from core.config import MAX_SPOT_AGE
class SpotProvider:
"""Generic spot provider class. Subclasses of this query the individual APIs for data."""
def __init__(self, provider_config):
def __init__(self, name, provider_config):
"""Constructor"""
self.name = provider_config["name"]
self.name = name
self.enabled = provider_config["enabled"]
self.last_update_time = datetime.min.replace(tzinfo=pytz.UTC)
self.last_spot_time = datetime.min.replace(tzinfo=pytz.UTC)
+2 -2
View File
@@ -13,8 +13,8 @@ from spotproviders.spot_provider import SpotProvider
class SSESpotProvider(SpotProvider):
"""Spot provider using Server-Sent Events."""
def __init__(self, provider_config, url):
super().__init__(provider_config)
def __init__(self, name, provider_config, url):
super().__init__(name, provider_config)
self._url = url
self._event_source = None
self._thread = None
+1 -1
View File
@@ -12,7 +12,7 @@ class Tiles(HTTPSpotProvider):
SPOTS_URL = "https://icneuzxitdqtofutxbla.supabase.co/functions/v1/spots?active_hours=24"
def __init__(self, provider_config):
super().__init__(provider_config, self.SPOTS_URL, self.POLL_INTERVAL_SEC)
super().__init__("Tiles", provider_config, self.SPOTS_URL, self.POLL_INTERVAL_SEC)
def _http_response_to_spots(self, http_response):
new_spots = []
+1 -1
View File
@@ -13,7 +13,7 @@ class Towers(HTTPSpotProvider):
SPOTS_URL = "https://wwtota.com/api/cluster_live.php"
def __init__(self, provider_config):
super().__init__(provider_config, self.SPOTS_URL, self.POLL_INTERVAL_SEC)
super().__init__("Towers", provider_config, self.SPOTS_URL, self.POLL_INTERVAL_SEC)
def _http_response_to_spots(self, http_response):
new_spots = []
+1 -1
View File
@@ -14,7 +14,7 @@ class UKPacketNet(HTTPSpotProvider):
SPOTS_URL = "https://nodes.ukpacketradio.network/api/nodedata"
def __init__(self, provider_config):
super().__init__(provider_config, self.SPOTS_URL, self.POLL_INTERVAL_SEC)
super().__init__("UK Packet Net", provider_config, self.SPOTS_URL, self.POLL_INTERVAL_SEC)
def _http_response_to_spots(self, http_response):
new_spots = []
+2 -2
View File
@@ -13,8 +13,8 @@ from spotproviders.spot_provider import SpotProvider
class WebsocketSpotProvider(SpotProvider):
"""Spot provider using websockets."""
def __init__(self, provider_config, url):
super().__init__(provider_config)
def __init__(self, name, provider_config, url):
super().__init__(name, provider_config)
self._url = url
self._ws = None
self._thread = None
+1 -1
View File
@@ -21,7 +21,7 @@ class WOTA(HTTPSpotProvider):
RSS_DATE_TIME_FORMAT = "%a, %d %b %Y %H:%M:%S %z"
def __init__(self, provider_config):
super().__init__(provider_config, self.SPOTS_URL, self.POLL_INTERVAL_SEC)
super().__init__("WOTA", provider_config, self.SPOTS_URL, self.POLL_INTERVAL_SEC)
def _http_response_to_spots(self, http_response):
new_spots = []
+1 -1
View File
@@ -12,7 +12,7 @@ class WWBOTA(SSESpotProvider):
SPOTS_URL = "https://api.wwbota.net/spots/"
def __init__(self, provider_config):
super().__init__(provider_config, self.SPOTS_URL)
super().__init__("WWBOTA", provider_config, self.SPOTS_URL)
def _sse_message_to_spot(self, message):
source_spot = json.loads(message)
+1 -1
View File
@@ -14,7 +14,7 @@ class WWFF(HTTPSpotProvider):
SPOTS_URL = "https://spots.wwff.co/static/spots.json"
def __init__(self, provider_config):
super().__init__(provider_config, self.SPOTS_URL, self.POLL_INTERVAL_SEC)
super().__init__("WWFF", provider_config, self.SPOTS_URL, self.POLL_INTERVAL_SEC)
def _http_response_to_spots(self, http_response):
new_spots = []
+2 -1
View File
@@ -21,7 +21,8 @@ class XOTA(WebsocketSpotProvider):
SIG = None
def __init__(self, provider_config):
super().__init__(provider_config, provider_config["url"])
name = provider_config["name"] if "name" in provider_config else "xOTA"
super().__init__(name, provider_config, provider_config["url"])
locations_csv = str(provider_config["locations-csv"]) if "locations-csv" in provider_config else None
self.SIG = str(provider_config["sig"]) if "sig" in provider_config else None
+1 -1
View File
@@ -15,7 +15,7 @@ class ZLOTA(HTTPSpotProvider):
LIST_URL = "https://ontheair.nz/assets/assets.json"
def __init__(self, provider_config):
super().__init__(provider_config, self.SPOTS_URL, self.POLL_INTERVAL_SEC)
super().__init__("ZLOTA", provider_config, self.SPOTS_URL, self.POLL_INTERVAL_SEC)
def _http_response_to_spots(self, http_response):
new_spots = []