From be785a453c1a064a8b04c8ccb87267beb8a46957 Mon Sep 17 00:00:00 2001 From: Logan Date: Sun, 12 Apr 2026 21:58:24 -0400 Subject: [PATCH] metadata fixes --- drb-edge-node/app/internal/call_recorder.py | 19 +++++++++++++++++-- .../app/internal/metadata_watcher.py | 6 +++++- drb-edge-node/app/main.py | 9 ++++++++- 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/drb-edge-node/app/internal/call_recorder.py b/drb-edge-node/app/internal/call_recorder.py index ee5ebe0..4d9bace 100644 --- a/drb-edge-node/app/internal/call_recorder.py +++ b/drb-edge-node/app/internal/call_recorder.py @@ -89,7 +89,14 @@ class CallRecorder: logger.warning("Recording file empty or missing — discarding.") return None - async def upload_recording(self, file_path: Path, call_id: str) -> Optional[str]: + async def upload_recording( + self, + file_path: Path, + call_id: str, + talkgroup_id: Optional[int] = None, + talkgroup_name: Optional[str] = None, + system_id: Optional[str] = None, + ) -> Optional[str]: if not settings.c2_url: logger.info("No C2_URL configured — skipping upload.") return None @@ -98,13 +105,21 @@ class CallRecorder: api_key = credentials.get_api_key() headers = {"Authorization": f"Bearer {api_key}"} if api_key else {} + form: dict = {"call_id": call_id, "node_id": settings.node_id} + if talkgroup_id is not None: + form["talkgroup_id"] = str(talkgroup_id) + if talkgroup_name: + form["talkgroup_name"] = talkgroup_name + if system_id: + form["system_id"] = system_id + try: async with httpx.AsyncClient(timeout=120) as client: with open(file_path, "rb") as f: r = await client.post( upload_url, files={"file": (file_path.name, f, "audio/mpeg")}, - data={"call_id": call_id, "node_id": settings.node_id}, + data=form, headers=headers, ) r.raise_for_status() diff --git a/drb-edge-node/app/internal/metadata_watcher.py b/drb-edge-node/app/internal/metadata_watcher.py index ef9f486..a44f75c 100644 --- a/drb-edge-node/app/internal/metadata_watcher.py +++ b/drb-edge-node/app/internal/metadata_watcher.py @@ -15,6 +15,7 @@ class MetadataWatcher: def __init__(self): self._running = False self._current_tgid: Optional[int] = None + self._current_tgid_name: Optional[str] = None self._hang_counter: int = 0 self._active_call_id: Optional[str] = None self._call_started_at: Optional[datetime] = None @@ -82,10 +83,11 @@ class MetadataWatcher: async def _start_call(self, tgid: int, meta: dict): self._active_call_id = str(uuid.uuid4()) self._call_started_at = datetime.now(timezone.utc) + self._current_tgid_name = meta.get("tag") or meta.get("tgid_tag") or "" payload = { "call_id": self._active_call_id, "tgid": tgid, - "tgid_name": meta.get("tag") or meta.get("tgid_tag") or "", + "tgid_name": self._current_tgid_name, "freq": meta.get("freq"), "srcaddr": meta.get("srcaddr"), "started_at": self._call_started_at.isoformat(), @@ -100,12 +102,14 @@ class MetadataWatcher: payload = { "call_id": self._active_call_id, "tgid": self._current_tgid, + "tgid_name": self._current_tgid_name or "", "started_at": self._call_started_at.isoformat() if self._call_started_at else None, "ended_at": datetime.now(timezone.utc).isoformat(), } logger.info(f"Call end: id={self._active_call_id}") self._active_call_id = None self._current_tgid = None + self._current_tgid_name = None self._hang_counter = 0 self._call_started_at = None if self.on_call_end: diff --git a/drb-edge-node/app/main.py b/drb-edge-node/app/main.py index af08d05..003f3ce 100644 --- a/drb-edge-node/app/main.py +++ b/drb-edge-node/app/main.py @@ -31,7 +31,14 @@ async def on_call_end(data: dict): radio_bot.stop_stream() file_path = await call_recorder.stop_recording() if file_path: - audio_url = await call_recorder.upload_recording(file_path, data["call_id"]) + node_cfg = load_node_config() + audio_url = await call_recorder.upload_recording( + file_path, + data["call_id"], + talkgroup_id=data.get("tgid"), + talkgroup_name=data.get("tgid_name"), + system_id=node_cfg.assigned_system_id, + ) if audio_url: data["audio_url"] = audio_url else: