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