download dmr ids asynchronously
This commit is contained in:
		
							
								
								
									
										40
									
								
								owrx/meta.py
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								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 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Jakob Ketterl
					Jakob Ketterl