diff --git a/core/constants.py b/core/constants.py index 4463e90..7c38d93 100644 --- a/core/constants.py +++ b/core/constants.py @@ -182,16 +182,9 @@ CW_MODES = ["CW"] PHONE_MODES = [ "PHONE", "SSB", - "USB", - "LSB", "AM", "FM", - "DV", - "DMR", - "DSTAR", - "C4FM", - "FUSION", - "M17", + "DV" ] DATA_MODES = [ "DATA", @@ -209,14 +202,19 @@ DATA_MODES = [ ] ALL_MODES = CW_MODES + PHONE_MODES + DATA_MODES MODE_TYPES = ["CW", "PHONE", "DATA"] -SSB_SUB_MODES = ["USB", "LSB"] -DV_SUB_MODES = ["DMR", "DSTAR", "C4FM", "FUSION", "M17"] # Mode aliases. Sometimes we get spots with a mode described in a different way that is effectively the same as a mode # we already know, or we want to normalise things for consistency. The lookup table for this is here. Incoming spots # that match a key in this table will be converted to the corresponding value, so only the modes above will actually be # present in the spots. MODE_ALIASES = { + "USB": "SSB", + "LSB": "SSB", + "DMR": "DV", + "DSTAR": "DV", + "C4FM": "DV", + "FUSION": "DV", + "M17": "DV", "RTT": "RTTY", "BPSK": "PSK", "PSK31": "PSK", diff --git a/core/utils.py b/core/utils.py index 607d3c5..16542d6 100644 --- a/core/utils.py +++ b/core/utils.py @@ -70,7 +70,7 @@ def infer_mode_from_frequency(freq): mode = freq_to_band(khz)["mode"] # Some additional common digimode ranges in addition to what the 3rd-party freq_to_band function returns. # This is mostly here just because freq_to_band is very specific about things like FT8 frequencies, and e.g. - # a spot at 7074.5 kHz will be indicated as LSB, even though it's clearly in the FT8 range. Future updates + # a spot at 7074.5 kHz will be indicated as SSB, even though it's clearly in the FT8 range. Future updates # might include other common digimode centres of activity here, but this achieves the main goal of keeping # large numbers of clearly-FT* spots off the list of people filtering out digimodes. if ( diff --git a/providers/spot/sota.py b/providers/spot/sota.py index cbdb239..e21f8c8 100644 --- a/providers/spot/sota.py +++ b/providers/spot/sota.py @@ -4,7 +4,7 @@ from datetime import datetime import requests from requests.exceptions import ConnectionError, ConnectTimeout, ReadTimeout -from core.constants import DV_SUB_MODES, HTTP_HEADERS, SSB_SUB_MODES +from core.constants import HTTP_HEADERS from data.sig_ref import SIGRef from data.spot import Spot from providers.spot.http_spot_provider import HTTPSpotProvider @@ -98,12 +98,7 @@ class SOTA(HTTPSpotProvider): # https://github.com/ham2k/app-polo/blob/main/src/extensions/activities/sota/SOTAPostSelfSpot.js mode = spot.mode if mode and mode not in self.VALID_MODES: - if mode in SSB_SUB_MODES: - mode = "SSB" - elif mode in DV_SUB_MODES: - mode = "DV" - else: - mode = "Data" + mode = "Data" body = { "activatorCallsign": spot.dx_call, diff --git a/providers/spot/tiles.py b/providers/spot/tiles.py index b291314..54f0248 100644 --- a/providers/spot/tiles.py +++ b/providers/spot/tiles.py @@ -3,7 +3,7 @@ from datetime import datetime import requests -from core.constants import HTTP_HEADERS, SSB_SUB_MODES +from core.constants import HTTP_HEADERS from data.sig_ref import SIGRef from data.spot import Spot from providers.spot.http_spot_provider import HTTPSpotProvider @@ -92,9 +92,7 @@ class Tiles(HTTPSpotProvider): if spot.mode: mode = spot.mode if mode not in self.VALID_MODES: - if mode in SSB_SUB_MODES: - mode = "SSB" - elif mode == "OLIVIA": + if mode == "OLIVIA": mode = "Olivia" elif mode == "JS8": mode = "JS8Call" diff --git a/static/apidocs/openapi.yml b/static/apidocs/openapi.yml index f51fadf..856d0a5 100644 --- a/static/apidocs/openapi.yml +++ b/static/apidocs/openapi.yml @@ -15,6 +15,11 @@ info: ## Changelog + ### 2.1 + + * Added DTMBA, FEA and BIWOTA SIGs + * Removed the distinction between LSB & USB (both will now show as SSB) and between the various digital voice modes, which will now show as DV. + ### 2.0 * **Breaking change:** The "add spot" API has changed to enable future support for upstream submission to the spotting services associated with various SIGs. Instead of just posting the spot object itself as the JSON content of the POST, this has moved into a `spot` object within the structure. A new `handling` object alongside it contains the `submit_upstream`, `upstream_provider`, `upstream_credentials`, and `captcha_token` fields which control the server handling of the spot. @@ -854,6 +859,7 @@ components: - DME - FEA - DTMBA + - BIWOTA - Toilets example: POTA @@ -913,15 +919,9 @@ components: - CW - PHONE - SSB - - USB - - LSB - AM - FM - DV - - DMR - - DSTAR - - C4FM - - M17 - DATA - FT8 - FT4 @@ -2032,7 +2032,7 @@ components: description: An array of all the supported modes. items: type: string - example: "LSB" + example: "SSB" mode_types: type: array description: An array of all the supported mode types. diff --git a/static/js/spotsbandsandmap.js b/static/js/spotsbandsandmap.js index 968dc03..0079df2 100644 --- a/static/js/spotsbandsandmap.js +++ b/static/js/spotsbandsandmap.js @@ -64,7 +64,7 @@ function generateModesMultiToggleFilterCard(mode_options) { // Set the mode toggles that relate to Analog Voice. function setVoiceModeToggles() { - const modes = ["PHONE", "SSB", "LSB", "USB", "AM", "FM", "DV", "DMR", "DSTAR", "C4FM", "M17"]; + const modes = ["PHONE", "SSB", "AM", "FM", "DV"]; $(".filter-button-mode").each(function () { $(this).prop('checked', modes.includes($(this).val().replace("filter-button-mode-", ""))); }); diff --git a/templates/about.html b/templates/about.html index ab0132c..a387a36 100644 --- a/templates/about.html +++ b/templates/about.html @@ -103,10 +103,11 @@ Parks Award (KRMNPA), South Australia National Parks and Conservation Parks Award (SANPCPA), Wainwrights on the Air (WOTA), Beaches on the Air (BOTA), Lagos y Lagunas On the Air (LLOTA), Towers on the Air, Tiles on the Air, Worked All Britain (WAB), Worked All Ireland (WAI), el Diploma Municipios de España (DME), el Diploma - Faros de España (FEA), il Diploma Teatri Musei e Belle Arti (DTMBA) and Toilets on the Air.

-

As of the time of writing in June 2026, I think Spothole captures essentially all outdoor radio programmes - that have a defined reference list, and almost certainly those that have a spotting/alerting API. If you know of - one I've missed, please let me know!

+ Faros de España (FEA), il Diploma Teatri Musei e Belle Arti (DTMBA), British Inland Waterways on the Air + (BIWOTA) and Toilets on the Air.

+

As of the time of writing in August 2026, I think Spothole captures most outdoor radio programmes that have a + defined, downloadable reference list, and almost certainly those that have a spotting/alerting API. If you know + of one I've missed, please let me know!

Why can I filter spots by both SIG and Source? Isn't that basically the same thing?

Mostly, but not quite. While POTA spots generally come from the POTA source and so on, there are a few exceptions:

diff --git a/templates/add_spot.html b/templates/add_spot.html index 8035344..23c7786 100644 --- a/templates/add_spot.html +++ b/templates/add_spot.html @@ -76,7 +76,7 @@ - + diff --git a/templates/alerts.html b/templates/alerts.html index b74fa94..2abe6ba 100644 --- a/templates/alerts.html +++ b/templates/alerts.html @@ -84,7 +84,7 @@ - + diff --git a/templates/bands.html b/templates/bands.html index d5f969b..95ccada 100644 --- a/templates/bands.html +++ b/templates/bands.html @@ -76,8 +76,8 @@ - - + + diff --git a/templates/base.html b/templates/base.html index 2e1dbf1..d441dbd 100644 --- a/templates/base.html +++ b/templates/base.html @@ -1,6 +1,6 @@ {% extends "skeleton.html" %} {% block head_extra %} - + @@ -15,10 +15,10 @@ window.fetchEventSource = fetchEventSource; - - - - + + + + {% end %} {% block body %}
diff --git a/templates/conditions.html b/templates/conditions.html index f635d8f..3b6c1c6 100644 --- a/templates/conditions.html +++ b/templates/conditions.html @@ -284,7 +284,7 @@
- + diff --git a/templates/map.html b/templates/map.html index 9cc412b..96beb9e 100644 --- a/templates/map.html +++ b/templates/map.html @@ -113,8 +113,8 @@ const CARTODB_API_KEY = "{{ web_ui_options.get('cartodb_api_key', '') }}"; - - + + diff --git a/templates/spots.html b/templates/spots.html index e20131f..e9830fd 100644 --- a/templates/spots.html +++ b/templates/spots.html @@ -113,8 +113,8 @@ - - + + diff --git a/templates/status.html b/templates/status.html index c514117..2a183ba 100644 --- a/templates/status.html +++ b/templates/status.html @@ -86,7 +86,7 @@ - +