|
1 | 1 | import request from './request'; |
2 | 2 |
|
3 | 3 |
|
4 | | -const SEGMENT_LENGTH = 1000 * 60; |
5 | | - |
6 | 4 | export function getSegmentMetadata(start, end, dongleId) { |
7 | 5 | return request.get(`v1/devices/${dongleId}/segments`, { |
8 | 6 | from: start, |
@@ -51,126 +49,3 @@ export function listRoutes(dongleId, limit, createdAfter) { |
51 | 49 | } |
52 | 50 | return request.get(`v1/devices/${dongleId}/routes`, params); |
53 | 51 | } |
54 | | - |
55 | | -function parseSegmentMetadata(start, end, segments) { |
56 | | - const routeStartTimes = {}; |
57 | | - |
58 | | - return segments.map((s) => { |
59 | | - const segment = { |
60 | | - ...s, |
61 | | - duration: Math.round(s.end_time_utc_millis - s.start_time_utc_millis), |
62 | | - offset: Math.round(s.start_time_utc_millis) - start, |
63 | | - }; |
64 | | - |
65 | | - if (!routeStartTimes[s.canonical_route_name]) { |
66 | | - segment.segment = Number(s.canonical_name.split('--')[2]); |
67 | | - routeStartTimes[s.canonical_route_name] = segment.offset - (SEGMENT_LENGTH * segment.segment); |
68 | | - } |
69 | | - segment.routeOffset = routeStartTimes[s.canonical_route_name]; |
70 | | - |
71 | | - return segment; |
72 | | - }); |
73 | | -} |
74 | | - |
75 | | -// TODO: understand this and write tests |
76 | | -function segmentsFromMetadata(segmentsData) { |
77 | | - function finishSegment(segment) { |
78 | | - if (!segment.hasVideo) { |
79 | | - return; |
80 | | - } |
81 | | - |
82 | | - const { videoAvailableBetweenOffsets } = segment; |
83 | | - let lastVideoRange = videoAvailableBetweenOffsets[videoAvailableBetweenOffsets.length - 1]; |
84 | | - if (!lastVideoRange) { |
85 | | - lastVideoRange = [segment.offset, segment.offset + segment.duration]; |
86 | | - } |
87 | | - |
88 | | - // TODO: refactor |
89 | | - // eslint-disable-next-line no-param-reassign |
90 | | - segment.videoAvailableBetweenOffsets = [ |
91 | | - ...videoAvailableBetweenOffsets.slice(0, videoAvailableBetweenOffsets.length - 1), |
92 | | - [lastVideoRange[0], segment.offset + segment.duration], |
93 | | - ]; |
94 | | - } |
95 | | - |
96 | | - let segment = null; |
97 | | - let videoStartOffset = null; |
98 | | - const segments = []; |
99 | | - segmentsData.forEach((s) => { |
100 | | - if (!s.url) { |
101 | | - return; |
102 | | - } |
103 | | - if (!(s.proc_log === 40 || s.proc_qlog === 40)) { |
104 | | - return; |
105 | | - } |
106 | | - const segmentHasDriverCamera = (s.proc_dcamera >= 0); |
107 | | - const segmentHasDriverCameraStream = (s.proc_dcamera === 40); |
108 | | - const segmentHasVideo = (s.proc_camera === 40); |
109 | | - if (segmentHasVideo && videoStartOffset === null) { |
110 | | - videoStartOffset = s.offset; |
111 | | - } |
112 | | - |
113 | | - if (!segment || segment.route !== s.canonical_route_name) { |
114 | | - if (segment) { |
115 | | - finishSegment(segment); |
116 | | - } |
117 | | - let { url } = s; |
118 | | - const parts = url.split('/'); |
119 | | - |
120 | | - if (Number.isFinite(Number(parts.pop()))) { |
121 | | - // url has a number at the end |
122 | | - url = parts.join('/'); |
123 | | - } |
124 | | - segment = { |
125 | | - dongleId: s.dongle_id, |
126 | | - offset: s.offset - (s.segment * SEGMENT_LENGTH), |
127 | | - route: s.canonical_route_name, |
128 | | - startTime: s.start_time_utc_millis, |
129 | | - startCoord: [s.start_lng, s.start_lat], |
130 | | - duration: 0, |
131 | | - segments: 0, |
132 | | - url: url.replace('chffrprivate.blob.core.windows.net', 'chffrprivate.azureedge.net'), |
133 | | - events: [], |
134 | | - videoAvailableBetweenOffsets: [], |
135 | | - hasVideo: segmentHasVideo, |
136 | | - deviceType: s.devicetype, |
137 | | - hpgps: s.hpgps, |
138 | | - hasDriverCamera: segmentHasDriverCamera, |
139 | | - hasDriverCameraStream: segmentHasDriverCameraStream, |
140 | | - locStart: '', |
141 | | - locEnd: '', |
142 | | - distanceMiles: 0.0, |
143 | | - cameraStreamSegCount: 0, |
144 | | - driverCameraStreamSegCount: 0, |
145 | | - }; |
146 | | - segments.push(segment); |
147 | | - } |
148 | | - if (!segmentHasVideo && videoStartOffset !== null) { |
149 | | - segment.videoAvailableBetweenOffsets.push([videoStartOffset, s.offset]); |
150 | | - videoStartOffset = null; |
151 | | - } |
152 | | - segment.hasVideo = (segment.hasVideo || segmentHasVideo); |
153 | | - segment.hasDriverCamera = (segment.hasDriverCamera || segmentHasDriverCamera); |
154 | | - segment.hasDriverCameraStream = (segment.hasDriverCameraStream || segmentHasDriverCameraStream); |
155 | | - segment.hpgps = (segment.hpgps || s.hpgps); |
156 | | - segment.duration = (s.offset - segment.offset) + s.duration; |
157 | | - segment.segments = Math.max(segment.segments, Number(s.canonical_name.split('--').pop()) + 1); |
158 | | - segment.events = segment.events.concat(s.events); |
159 | | - segment.endCoord = [s.end_lng, s.end_lat]; |
160 | | - segment.distanceMiles += s.length; |
161 | | - segment.cameraStreamSegCount += Math.floor(segmentHasVideo); |
162 | | - segment.driverCameraStreamSegCount += Math.floor(segmentHasDriverCameraStream); |
163 | | - }); |
164 | | - |
165 | | - if (segment) { |
166 | | - finishSegment(segment); |
167 | | - } |
168 | | - |
169 | | - return segments; |
170 | | -} |
171 | | - |
172 | | -export async function fetchRoutes(dongleId, start, end) { |
173 | | - let segments = await getSegmentMetadata(start, end, dongleId); |
174 | | - segments = parseSegmentMetadata(start, end, segments); |
175 | | - return segmentsFromMetadata(segments).reverse(); |
176 | | -} |
0 commit comments