Allow adding spots. Convert timestamps in the API to UNIX seconds. #2

This commit is contained in:
Ian Renton
2025-10-04 13:28:22 +01:00
parent 0419aab83f
commit 5f16abf709
16 changed files with 51 additions and 37 deletions

View File

@@ -48,7 +48,7 @@ class APRSIS(Provider):
latitude=data["latitude"] if "latitude" in data else None,
longitude=data["longitude"] if "longitude" in data else None,
icon="tower-cell",
time=datetime.now(pytz.UTC)) # APRS-IS spots are live so we can assume spot time is "now"
time=datetime.now(pytz.UTC).timestamp()) # APRS-IS spots are live so we can assume spot time is "now"
# Add to our list
self.submit(spot)

View File

@@ -70,7 +70,7 @@ class DXCluster(Provider):
freq=float(match.group(2)) * 1000,
comment=match.group(4).strip(),
icon="desktop",
time=spot_datetime)
time=spot_datetime.timestamp())
# Add to our list
self.submit(spot)

View File

@@ -36,7 +36,7 @@ class GMA(HTTPProvider):
sig_refs=[source_spot["REF"]],
sig_refs_names=[source_spot["NAME"]],
time=datetime.strptime(source_spot["DATE"] + source_spot["TIME"], "%Y%m%d%H%M").replace(
tzinfo=pytz.UTC),
tzinfo=pytz.UTC).timestamp(),
latitude=float(source_spot["LAT"]) if (source_spot["LAT"] != "") else None,
# Seen GMA spots with no lat/lon
longitude=float(source_spot["LON"]) if (source_spot["LON"] != "") else None)

View File

@@ -55,7 +55,7 @@ class HEMA(HTTPProvider):
sig_refs=[spot_items[3].upper()],
sig_refs_names=[spot_items[4]],
icon="mound",
time=datetime.strptime(spot_items[0], "%d/%m/%Y %H:%M").replace(tzinfo=pytz.UTC),
time=datetime.strptime(spot_items[0], "%d/%m/%Y %H:%M").replace(tzinfo=pytz.UTC).timestamp(),
latitude=float(spot_items[7]),
longitude=float(spot_items[8]))

View File

@@ -30,7 +30,7 @@ class ParksNPeaks(HTTPProvider):
sig=source_spot["actClass"],
sig_refs=[source_spot["actSiteID"]],
icon="question", # todo determine from actClass
time=datetime.strptime(source_spot["actTime"], "%Y-%m-%d %H:%M:%S").replace(tzinfo=pytz.UTC))
time=datetime.strptime(source_spot["actTime"], "%Y-%m-%d %H:%M:%S").replace(tzinfo=pytz.UTC).timestamp())
# If this is POTA, SOTA or WWFF data we already have it through other means, so ignore.
if spot.sig not in ["POTA", "SOTA", "WWFF"]:

View File

@@ -30,7 +30,7 @@ class POTA(HTTPProvider):
sig_refs=[source_spot["reference"]],
sig_refs_names=[source_spot["name"]],
icon="tree",
time=datetime.strptime(source_spot["spotTime"], "%Y-%m-%dT%H:%M:%S").replace(tzinfo=pytz.UTC),
time=datetime.strptime(source_spot["spotTime"], "%Y-%m-%dT%H:%M:%S").replace(tzinfo=pytz.UTC).timestamp(),
grid=source_spot["grid6"],
latitude=source_spot["latitude"],
longitude=source_spot["longitude"])

View File

@@ -35,12 +35,12 @@ class Provider:
# subclasses on receiving spots.
def submit_batch(self, spots):
for spot in spots:
if spot.time > self.last_spot_time:
if datetime.fromtimestamp(spot.time, pytz.UTC) > self.last_spot_time:
# Fill in any blanks
spot.infer_missing()
# Add to the list
self.spots.add(spot.guid, spot, expire=MAX_SPOT_AGE)
self.last_spot_time = max(map(lambda s: s.time, spots))
self.last_spot_time = datetime.fromtimestamp(max(map(lambda s: s.time, spots)), pytz.UTC)
# Submit a single spot retrieved from the provider. This will be added to the list regardless of its age. Spots
# passing the check will also have their infer_missing() method called to complete their data set. This is called by
@@ -50,7 +50,7 @@ class Provider:
spot.infer_missing()
# Add to the list
self.spots.add(spot.guid, spot, expire=MAX_SPOT_AGE)
self.last_spot_time = spot.time
self.last_spot_time = datetime.fromtimestamp(spot.time, pytz.UTC)
# Stop any threads and prepare for application shutdown
def stop(self):

View File

@@ -71,7 +71,7 @@ class RBN(Provider):
freq=float(match.group(2)) * 1000,
comment=match.group(4).strip(),
icon="tower-cell",
time=spot_datetime)
time=spot_datetime.timestamp())
# Add to our list
self.submit(spot)

View File

@@ -49,7 +49,7 @@ class SOTA(HTTPProvider):
sig_refs=[source_spot["summitCode"]],
sig_refs_names=[source_spot["summitName"]],
icon="mountain-sun",
time=datetime.fromisoformat(source_spot["timeStamp"]),
time=datetime.fromisoformat(source_spot["timeStamp"]).timestamp(),
activation_score=source_spot["points"])
# SOTA doesn't give summit lat/lon/grid in the main call, so we need another separate call for this

View File

@@ -33,7 +33,7 @@ class WWBOTA(HTTPProvider):
sig_refs=refs,
sig_refs_names=ref_names,
icon="radiation",
time=datetime.fromisoformat(source_spot["time"]),
time=datetime.fromisoformat(source_spot["time"]).timestamp(),
# WWBOTA spots can contain multiple references for bunkers being activated simultaneously. For
# now, we will just pick the first one to use as our grid, latitude and longitude.
grid=source_spot["references"][0]["locator"],

View File

@@ -30,7 +30,7 @@ class WWFF(HTTPProvider):
sig_refs=[source_spot["reference"]],
sig_refs_names=[source_spot["reference_name"]],
icon="seedling",
time=datetime.fromtimestamp(source_spot["spot_time"], tz=pytz.UTC),
time=datetime.fromtimestamp(source_spot["spot_time"], tz=pytz.UTC).timestamp(),
latitude=source_spot["latitude"],
longitude=source_spot["longitude"])