8000 feat(route.py): add metadata, events retrieval by greatgitsby · Pull Request #35261 · commaai/openpilot · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

feat(route.py): add metadata, events retrieval #35261

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
May 21, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 27 additions & 3 deletions tools/lib/route.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import os
import re
import requests
from functools import cache
from urllib.parse import urlparse
from collections import defaultdict
from itertools import chain

from openpilot.tools.lib.auth_config import get_token
from openpilot.tools.lib.api import CommaApi
from openpilot.tools.lib.api import APIError, CommaApi
from openpilot.tools.lib.helpers import RE

QLOG_FILENAMES = ['qlog', 'qlog.bz2', 'qlog.zst']
Expand All @@ -19,6 +20,7 @@

class Route:
def __init__(self, name, data_dir=None):
self._metadata = None
self._name = RouteName(name)
self.files = None
if data_dir is not None:
Expand All @@ -27,6 +29,13 @@ def __init__(self, name, data_dir=None):
self._segments = self._get_segments_remote()
self.max_seg_number = self._segments[-1].name.segment_num

@property
def metadata(self):
if not self._metadata:
api = CommaApi(get_token())
self._metadata = api.get('v1/route/' + self.name.canonical_name)
return self._metadata

@property
def name(self):
return self._name
Expand Down Expand Up @@ -78,6 +87,7 @@ def _get_segments_remote(self):
url if fn in DCAMERA_FILENAMES else segments[segment_name].dcamera_path,
url if fn in ECAMERA_FILENAMES else segments[segment_name].ecamera_path,
url if fn in QCAMERA_FILENAMES else segments[segment_name].qcamera_path,
self.metadata['url'],
)
else:
segments[segment_name] = Segment(
Expand All @@ -88,6 +98,7 @@ def _get_segments_remote(self):
url if fn in DCAMERA_FILENAMES else None,
url if fn in ECAMERA_FILENAMES else None,
url if fn in QCAMERA_FILENAMES else None,
self.metadata['url'],
)

return sorted(segments.values(), key=lambda seg: seg.name.segment_num)
Expand Down Expand Up @@ -153,16 +164,18 @@ def _get_segments_local(self, data_dir):
except StopIteration:
qcamera_path = None

segments.append(Segment(segment, log_path, qlog_path, camera_path, dcamera_path, ecamera_path, qcamera_path))
segments.append(Segment(segment, log_path, qlog_path, camera_path, dcamera_path, ecamera_path, qcamera_path, self.metadata['url']))

if len(segments) == 0:
raise ValueError(f'Could not find segments for route {self.name.canonical_name} in data directory {data_dir}')
return sorted(segments, key=lambda seg: seg.name.segment_num)


class Segment:
def __init__(self, name, log_path, qlog_path, camera_path, dcamera_path, ecamera_path, qcamera_path):
def __init__(self, name, log_path, qlog_path, camera_path, dcamera_path, ecamera_path, qcamera_path, url):
self._events = None
self._name = SegmentName(name)
self.url = f'{url}/{self._name.segment_num}'
self.log_path = log_path
self.qlog_path = qlog_path
self.camera_path = camera_path
Expand All @@ -174,6 +187,17 @@ def __init__(self, name, log_path, qlog_path, camera_path, dcamera_path, ecamera
def name(self):
return self._name

@property
def events(self):
if not self._events:
try:
resp = requests.get(f'{self.url}/events.json')
resp.raise_for_status()
self._events = resp.json()
except Exception as e:
raise APIError(f'error getting events for segment {self._name}') from e
return self._events


class RouteName:
def __init__(self, name_str: str):
Expand Down
Loading
0