Add QRZ lookup

This commit is contained in:
Ian Renton
2025-09-27 15:24:53 +01:00
parent 00c56a7c10
commit cf1798663d
4 changed files with 83 additions and 26 deletions

View File

@@ -3,12 +3,17 @@ from datetime import datetime
from pyhamtools import LookupLib, Callinfo
from core.config import config
from core.constants import BANDS, UNKNOWN_BAND, CW_MODES, PHONE_MODES, DATA_MODES, ALL_MODES
# Static lookup helpers from pyhamtools
# todo in future add QRZ as a second lookup option in case it provides more data?
lookuplib = LookupLib(lookuptype="countryfile")
callinfo = Callinfo(lookuplib)
# Lookup helpers from pyhamtools
LOOKUP_LIB_BASIC = LookupLib(lookuptype="countryfile")
CALL_INFO_BASIC = Callinfo(LOOKUP_LIB_BASIC)
QRZ_AVAILABLE = config["qrz-password"] != ""
if QRZ_AVAILABLE:
LOOKUP_LIB_QRZ = LookupLib(lookuptype="qrz", username=config["qrz-username"], pwd=config["qrz-password"])
# Cache of QRZ.com callsign lookups, so we don't repeatedly call the API for stuff we already know
QRZ_CALLSIGN_DATA_CACHE = {}
# Infer a mode from the comment
def infer_mode_from_comment(comment):
@@ -40,38 +45,82 @@ def infer_band_from_freq(freq):
# Infer a country name from a callsign
def infer_country_from_callsign(call):
try:
return callinfo.get_country_name(call)
return CALL_INFO_BASIC.get_country_name(call)
except KeyError as e:
return None
# Infer a DXCC ID from a callsign
def infer_dxcc_id_from_callsign(call):
try:
return callinfo.get_adif_id(call)
return CALL_INFO_BASIC.get_adif_id(call)
except KeyError as e:
return None
# Infer a continent shortcode from a callsign
def infer_continent_from_callsign(call):
try:
return callinfo.get_continent(call)
return CALL_INFO_BASIC.get_continent(call)
except KeyError as e:
return None
# Infer a CQ zone from a callsign
def infer_cq_zone_from_callsign(call):
try:
return callinfo.get_cqz(call)
return CALL_INFO_BASIC.get_cqz(call)
except KeyError as e:
return None
# Infer a ITU zone from a callsign
def infer_itu_zone_from_callsign(call):
try:
return callinfo.get_ituz(call)
return CALL_INFO_BASIC.get_ituz(call)
except KeyError as e:
return None
# Utility method to get QRZ.com data from cache if possible, if not get it from the API and cache it
def get_qrz_data_for_callsign(call):
# Fetch from cache if we can, otherwise fetch from the API and cache it
if call in QRZ_CALLSIGN_DATA_CACHE:
return QRZ_CALLSIGN_DATA_CACHE[call]
elif QRZ_AVAILABLE:
try:
data = LOOKUP_LIB_QRZ.lookup_callsign(callsign=call)
QRZ_CALLSIGN_DATA_CACHE[call] = data
return data
except KeyError:
# QRZ had no info for the call, that's OK
return None
else:
return None
# Infer an operator name from a callsign (requires QRZ.com)
def infer_name_from_callsign(call):
data = get_qrz_data_for_callsign(call)
if data and "fname" in data:
name = data["fname"]
if "name" in data:
name = name + " " + data["name"]
return name
else:
return None
# Infer a latitude and longitude from a callsign (requires QRZ.com)
def infer_latlon_from_callsign(call):
data = get_qrz_data_for_callsign(call)
if data and "latitude" in data and "longitude" in data:
return [data["longitude"], data["longitude"]]
else:
return None
# Infer a grid locator from a callsign (requires QRZ.com)
def infer_grid_from_callsign(call):
data = get_qrz_data_for_callsign(call)
if data and "locator" in data:
return data["locator"]
else:
return None
# Convert objects to serialisable things. Used by JSON serialiser as a default when it encounters unserializable things.
# Converts datetimes to ISO.
# Anything else it tries to convert to a dict.