From f565b4dbcd658ce68b1e798d6174a6ec9d64c318 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Thu, 30 May 2019 18:32:08 +0200 Subject: [PATCH] download dmr ids asynchronously --- owrx/meta.py | 40 ++++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/owrx/meta.py b/owrx/meta.py index bdb1eab..d448b55 100644 --- a/owrx/meta.py +++ b/owrx/meta.py @@ -3,36 +3,44 @@ from urllib import request import json from datetime import datetime, timedelta import logging +import threading logger = logging.getLogger(__name__) class DmrMetaEnricher(object): def __init__(self): self.cache = {} + self.threads = {} self.cacheTimeout = timedelta(seconds = 86400) def cacheEntryValid(self, id): if not id in self.cache: return False entry = self.cache[id] return entry["timestamp"] + self.cacheTimeout > datetime.now() + def downloadRadioIdData(self, id): + try: + logger.debug("requesting DMR metadata for id=%s", id) + res = request.urlopen("https://www.radioid.net/api/dmr/user/?id={0}".format(id), timeout=5).read() + data = json.loads(res.decode("utf-8")) + self.cache[id] = { + "timestamp": datetime.now(), + "data": data + } + except json.JSONDecodeError: + self.cache[id] = { + "timestamp": datetime.now(), + "data": None + } + del self.threads[id] def enrich(self, meta): if not PropertyManager.getSharedInstance()["digital_voice_dmr_id_lookup"]: return None if not "source" in meta: return None - source = meta["source"] - if not self.cacheEntryValid(source): - try: - logger.debug("requesting DMR metadata for id=%s", source) - res = request.urlopen("https://www.radioid.net/api/dmr/user/?id={0}".format(source), timeout=5).read() - data = json.loads(res.decode("utf-8")) - self.cache[source] = { - "timestamp": datetime.now(), - "data": data - } - except json.JSONDecodeError: - self.cache[source] = { - "timestamp": datetime.now(), - "data": None - } - data = self.cache[source]["data"] + id = meta["source"] + if not self.cacheEntryValid(id): + if not id in self.threads: + self.threads[id] = threading.Thread(target=self.downloadRadioIdData, args=[id]) + self.threads[id].start() + return None + data = self.cache[id]["data"] if "count" in data and data["count"] > 0 and "results" in data: return data["results"][0] return None