Skip to main content

nominal_api_conjure/conjure/endpoints/scout/video/
video_service.rs

1use conjure_http::endpoint;
2/// The video service manages videos and video metadata.
3#[conjure_http::conjure_endpoints(name = "VideoService", use_legacy_error_serialization)]
4pub trait VideoService<#[request_body] I, #[response_writer] O> {
5    ///The body type returned by the `get_playlist` method.
6    type GetPlaylistBody: conjure_http::server::WriteBody<O> + 'static;
7    ///The body type returned by the `get_playlist_in_bounds` method.
8    type GetPlaylistInBoundsBody: conjure_http::server::WriteBody<O> + 'static;
9    ///The body type returned by the `get_playlist_in_bounds_v2` method.
10    type GetPlaylistInBoundsV2Body: conjure_http::server::WriteBody<O> + 'static;
11    ///The body type returned by the `get_playlist_v2` method.
12    type GetPlaylistV2Body: conjure_http::server::WriteBody<O> + 'static;
13    /// Returns video metadata associated with a video rid.
14    #[endpoint(
15        method = GET,
16        path = "/video/v1/videos/{videoRid}",
17        name = "get",
18        produces = conjure_http::server::StdResponseSerializer
19    )]
20    fn get(
21        &self,
22        #[auth]
23        auth_: conjure_object::BearerToken,
24        #[path(
25            name = "videoRid",
26            decoder = conjure_http::server::conjure::FromPlainDecoder,
27            log_as = "videoRid"
28        )]
29        video_rid: conjure_object::ResourceIdentifier,
30    ) -> Result<
31        super::super::super::super::objects::scout::video::api::Video,
32        conjure_http::private::Error,
33    >;
34    /// Returns video metadata about each video given a set of video rids.
35    #[endpoint(
36        method = POST,
37        path = "/video/v1/videos/batchGet",
38        name = "batchGet",
39        produces = conjure_http::server::StdResponseSerializer
40    )]
41    fn batch_get(
42        &self,
43        #[auth]
44        auth_: conjure_object::BearerToken,
45        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
46        request: super::super::super::super::objects::scout::video::api::GetVideosRequest,
47    ) -> Result<
48        super::super::super::super::objects::scout::video::api::GetVideosResponse,
49        conjure_http::private::Error,
50    >;
51    /// Returns metadata about videos that match a given query.
52    #[endpoint(
53        method = POST,
54        path = "/video/v1/videos/search",
55        name = "search",
56        produces = conjure_http::server::StdResponseSerializer
57    )]
58    fn search(
59        &self,
60        #[auth]
61        auth_: conjure_object::BearerToken,
62        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
63        request: super::super::super::super::objects::scout::video::api::SearchVideosRequest,
64    ) -> Result<
65        super::super::super::super::objects::scout::video::api::SearchVideosResponse,
66        conjure_http::private::Error,
67    >;
68    /// Creates and persists a video entity with the given metadata.
69    #[endpoint(
70        method = POST,
71        path = "/video/v1/videos",
72        name = "create",
73        produces = conjure_http::server::StdResponseSerializer
74    )]
75    fn create(
76        &self,
77        #[auth]
78        auth_: conjure_object::BearerToken,
79        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
80        request: super::super::super::super::objects::scout::video::api::CreateVideoRequest,
81    ) -> Result<
82        super::super::super::super::objects::scout::video::api::Video,
83        conjure_http::private::Error,
84    >;
85    /// Updates the metadata for a video associated with the given video rid.
86    #[endpoint(
87        method = PUT,
88        path = "/video/v1/videos/{videoRid}",
89        name = "updateMetadata",
90        produces = conjure_http::server::StdResponseSerializer
91    )]
92    fn update_metadata(
93        &self,
94        #[auth]
95        auth_: conjure_object::BearerToken,
96        #[path(
97            name = "videoRid",
98            decoder = conjure_http::server::conjure::FromPlainDecoder,
99            log_as = "videoRid"
100        )]
101        video_rid: conjure_object::ResourceIdentifier,
102        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
103        request: super::super::super::super::objects::scout::video::api::UpdateVideoMetadataRequest,
104    ) -> Result<
105        super::super::super::super::objects::scout::video::api::Video,
106        conjure_http::private::Error,
107    >;
108    #[endpoint(
109        method = PUT,
110        path = "/video/v1/videos/{videoRid}/ingest-status",
111        name = "updateIngestStatus"
112    )]
113    fn update_ingest_status(
114        &self,
115        #[auth]
116        auth_: conjure_object::BearerToken,
117        #[path(
118            name = "videoRid",
119            decoder = conjure_http::server::conjure::FromPlainDecoder,
120            log_as = "videoRid"
121        )]
122        video_rid: conjure_object::ResourceIdentifier,
123        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
124        request: super::super::super::super::objects::scout::video::api::UpdateIngestStatus,
125    ) -> Result<(), conjure_http::private::Error>;
126    #[endpoint(
127        method = GET,
128        path = "/video/v1/videos/{videoRid}/ingest-status",
129        name = "getIngestStatus",
130        produces = conjure_http::server::StdResponseSerializer
131    )]
132    fn get_ingest_status(
133        &self,
134        #[auth]
135        auth_: conjure_object::BearerToken,
136        #[path(
137            name = "videoRid",
138            decoder = conjure_http::server::conjure::FromPlainDecoder,
139            log_as = "videoRid"
140        )]
141        video_rid: conjure_object::ResourceIdentifier,
142    ) -> Result<
143        super::super::super::super::objects::scout::video::api::DetailedIngestStatus,
144        conjure_http::private::Error,
145    >;
146    #[endpoint(
147        method = POST,
148        path = "/video/v1/videos/batch-get-ingest-status",
149        name = "batchGetIngestStatus",
150        produces = conjure_http::server::conjure::CollectionResponseSerializer
151    )]
152    fn batch_get_ingest_status(
153        &self,
154        #[auth]
155        auth_: conjure_object::BearerToken,
156        #[body(
157            deserializer = conjure_http::server::StdRequestDeserializer,
158            log_as = "videoRids"
159        )]
160        video_rids: std::collections::BTreeSet<conjure_object::ResourceIdentifier>,
161    ) -> Result<
162        std::collections::BTreeMap<
163            conjure_object::ResourceIdentifier,
164            super::super::super::super::objects::scout::video::api::DetailedIngestStatus,
165        >,
166        conjure_http::private::Error,
167    >;
168    #[endpoint(
169        method = POST,
170        path = "/video/v1/videos/enriched-ingest-status",
171        name = "getEnrichedIngestStatus",
172        produces = conjure_http::server::conjure::CollectionResponseSerializer
173    )]
174    fn get_enriched_ingest_status(
175        &self,
176        #[auth]
177        auth_: conjure_object::BearerToken,
178        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
179        request: super::super::super::super::objects::scout::video::api::GetEnrichedVideoIngestStatusRequest,
180    ) -> Result<
181        Option<
182            super::super::super::super::objects::scout::video::api::EnrichedVideoIngestStatus,
183        >,
184        conjure_http::private::Error,
185    >;
186    /// Archives a video, which excludes it from search and hides it from being publicly visible, but does not
187    /// permanently delete it. Archived videos can be unarchived.
188    #[endpoint(
189        method = PUT,
190        path = "/video/v1/videos/{videoRid}/archive",
191        name = "archive"
192    )]
193    fn archive(
194        &self,
195        #[auth]
196        auth_: conjure_object::BearerToken,
197        #[path(
198            name = "videoRid",
199            decoder = conjure_http::server::conjure::FromPlainDecoder,
200            log_as = "videoRid"
201        )]
202        video_rid: conjure_object::ResourceIdentifier,
203    ) -> Result<(), conjure_http::private::Error>;
204    /// Unarchives a previously archived video.
205    #[endpoint(
206        method = PUT,
207        path = "/video/v1/videos/{videoRid}/unarchive",
208        name = "unarchive"
209    )]
210    fn unarchive(
211        &self,
212        #[auth]
213        auth_: conjure_object::BearerToken,
214        #[path(
215            name = "videoRid",
216            decoder = conjure_http::server::conjure::FromPlainDecoder,
217            log_as = "videoRid"
218        )]
219        video_rid: conjure_object::ResourceIdentifier,
220    ) -> Result<(), conjure_http::private::Error>;
221    /// Generates an HLS playlist for a video within optional time bounds.
222    /// Uses GET with query parameters for HLS.js compatibility.
223    /// The HLS playlist will contain links to all of the segments in the video that overlap with the given bounds,
224    /// or all segments if no bounds are provided.
225    ///
226    /// Note: The start and end parameters must either both be provided or both be omitted.
227    /// Providing only one will result in a MissingTimestampBoundPair error.
228    #[endpoint(
229        method = GET,
230        path = "/video/v1/videos/{videoRid}/playlist",
231        name = "getPlaylist",
232        produces = conjure_http::server::conjure::BinaryResponseSerializer
233    )]
234    fn get_playlist(
235        &self,
236        #[auth]
237        auth_: conjure_object::BearerToken,
238        #[path(
239            name = "videoRid",
240            decoder = conjure_http::server::conjure::FromPlainDecoder,
241            log_as = "videoRid"
242        )]
243        video_rid: conjure_object::ResourceIdentifier,
244        #[query(
245            name = "start",
246            decoder = conjure_http::server::conjure::FromPlainOptionDecoder
247        )]
248        start: Option<String>,
249        #[query(
250            name = "end",
251            decoder = conjure_http::server::conjure::FromPlainOptionDecoder
252        )]
253        end: Option<String>,
254    ) -> Result<Self::GetPlaylistBody, conjure_http::private::Error>;
255    /// Returns the min and max absolute and media timestamps for each segment in a video. To be used during
256    /// frame-timestamp mapping.
257    #[endpoint(
258        method = GET,
259        path = "/video/v1/videos/{videoRid}/segment-summaries",
260        name = "getSegmentSummaries",
261        produces = conjure_http::server::conjure::CollectionResponseSerializer
262    )]
263    fn get_segment_summaries(
264        &self,
265        #[auth]
266        auth_: conjure_object::BearerToken,
267        #[path(
268            name = "videoRid",
269            decoder = conjure_http::server::conjure::FromPlainDecoder,
270            log_as = "videoRid"
271        )]
272        video_rid: conjure_object::ResourceIdentifier,
273    ) -> Result<
274        Vec<super::super::super::super::objects::scout::video::api::SegmentSummary>,
275        conjure_http::private::Error,
276    >;
277    /// Generates an HLS playlist for a video with the given video rid to enable playback within an optional set of
278    /// bounds. The HLS playlist will contain links to all of the segments in the video that overlap with the given
279    /// bounds.
280    /// playlist will be limited to the given bounds.
281    #[endpoint(
282        method = POST,
283        path = "/video/v1/videos/{videoRid}/playlist-in-bounds",
284        name = "getPlaylistInBounds",
285        produces = conjure_http::server::conjure::BinaryResponseSerializer
286    )]
287    fn get_playlist_in_bounds(
288        &self,
289        #[auth]
290        auth_: conjure_object::BearerToken,
291        #[path(
292            name = "videoRid",
293            decoder = conjure_http::server::conjure::FromPlainDecoder,
294            log_as = "videoRid"
295        )]
296        video_rid: conjure_object::ResourceIdentifier,
297        #[body(deserializer = conjure_http::server::StdRequestDeserializer, safe)]
298        request: super::super::super::super::objects::scout::video::api::GetPlaylistInBoundsRequest,
299    ) -> Result<Self::GetPlaylistInBoundsBody, conjure_http::private::Error>;
300    /// Generates an HLS playlist for a video series (identified by channel + tags) within bounds.
301    #[endpoint(
302        method = POST,
303        path = "/video/v2/videos/playlist-in-bounds",
304        name = "getPlaylistInBoundsV2",
305        produces = conjure_http::server::conjure::BinaryResponseSerializer
306    )]
307    fn get_playlist_in_bounds_v2(
308        &self,
309        #[auth]
310        auth_: conjure_object::BearerToken,
311        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
312        request: super::super::super::super::objects::scout::video::api::GetPlaylistInBoundsForChannelRequest,
313    ) -> Result<Self::GetPlaylistInBoundsV2Body, conjure_http::private::Error>;
314    /// Generates an HLS playlist for a video series within time bounds.
315    /// Specify either dataSourceRid OR (assetRid + dataScopeName) to identify the series source.
316    ///
317    /// Note: Both start and end parameters are required and must be provided together.
318    #[endpoint(
319        method = GET,
320        path = "/video/v2/videos/playlist",
321        name = "getPlaylistV2",
322        produces = conjure_http::server::conjure::BinaryResponseSerializer
323    )]
324    fn get_playlist_v2(
325        &self,
326        #[auth]
327        auth_: conjure_object::BearerToken,
328        #[query(
329            name = "dataSourceRid",
330            decoder = conjure_http::server::conjure::FromPlainOptionDecoder,
331            log_as = "dataSourceRid"
332        )]
333        data_source_rid: Option<conjure_object::ResourceIdentifier>,
334        #[query(
335            name = "assetRid",
336            decoder = conjure_http::server::conjure::FromPlainOptionDecoder,
337            log_as = "assetRid",
338            safe
339        )]
340        asset_rid: Option<
341            super::super::super::super::objects::scout::rids::api::AssetRid,
342        >,
343        #[query(
344            name = "dataScopeName",
345            decoder = conjure_http::server::conjure::FromPlainOptionDecoder,
346            log_as = "dataScopeName"
347        )]
348        data_scope_name: Option<String>,
349        #[query(
350            name = "channel",
351            decoder = conjure_http::server::conjure::FromPlainDecoder
352        )]
353        channel: String,
354        #[query(
355            name = "tags",
356            decoder = conjure_http::server::conjure::FromPlainOptionDecoder
357        )]
358        tags: Option<String>,
359        #[query(
360            name = "start",
361            decoder = conjure_http::server::conjure::FromPlainDecoder
362        )]
363        start: String,
364        #[query(name = "end", decoder = conjure_http::server::conjure::FromPlainDecoder)]
365        end: String,
366    ) -> Result<Self::GetPlaylistV2Body, conjure_http::private::Error>;
367    /// Returns the min and max absolute and media timestamps for each segment in a video that overlap with an
368    /// optional set of bounds.
369    #[endpoint(
370        method = POST,
371        path = "/video/v1/videos/{videoRid}/segment-summaries-in-bounds",
372        name = "getSegmentSummariesInBounds",
373        produces = conjure_http::server::conjure::CollectionResponseSerializer
374    )]
375    fn get_segment_summaries_in_bounds(
376        &self,
377        #[auth]
378        auth_: conjure_object::BearerToken,
379        #[path(
380            name = "videoRid",
381            decoder = conjure_http::server::conjure::FromPlainDecoder,
382            log_as = "videoRid"
383        )]
384        video_rid: conjure_object::ResourceIdentifier,
385        #[body(deserializer = conjure_http::server::StdRequestDeserializer, safe)]
386        request: super::super::super::super::objects::scout::video::api::GetSegmentSummariesInBoundsRequest,
387    ) -> Result<
388        Vec<super::super::super::super::objects::scout::video::api::SegmentSummary>,
389        conjure_http::private::Error,
390    >;
391    /// Returns the min and max absolute and media timestamps for each segment matching a video series
392    /// (identified by channel + tags) within the specified bounds.
393    #[endpoint(
394        method = POST,
395        path = "/video/v2/videos/segment-summaries-in-bounds",
396        name = "getSegmentSummariesInBoundsV2",
397        produces = conjure_http::server::conjure::CollectionResponseSerializer
398    )]
399    fn get_segment_summaries_in_bounds_v2(
400        &self,
401        #[auth]
402        auth_: conjure_object::BearerToken,
403        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
404        request: super::super::super::super::objects::scout::video::api::GetSegmentSummariesInBoundsForChannelRequest,
405    ) -> Result<
406        Vec<super::super::super::super::objects::scout::video::api::SegmentSummaryV2>,
407        conjure_http::private::Error,
408    >;
409    /// Returns aggregated segment metadata for a video channel series, including total frames,
410    /// segment count, min/max timestamps, and average frame rate. Optionally filter by time bounds.
411    #[endpoint(
412        method = POST,
413        path = "/video/v2/videos/segment-metadata",
414        name = "getSegmentMetadataV2",
415        produces = conjure_http::server::conjure::CollectionResponseSerializer
416    )]
417    fn get_segment_metadata_v2(
418        &self,
419        #[auth]
420        auth_: conjure_object::BearerToken,
421        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
422        request: super::super::super::super::objects::scout::video::api::GetSegmentMetadataForChannelRequest,
423    ) -> Result<
424        Option<
425            super::super::super::super::objects::scout::video::api::VideoChannelSegmentsMetadata,
426        >,
427        conjure_http::private::Error,
428    >;
429    /// Returns metadata for the segment within a video series containing the requested absolute timestamp.
430    #[endpoint(
431        method = POST,
432        path = "/video/v2/videos/get-segment-by-timestamp",
433        name = "getSegmentByTimestampV2",
434        produces = conjure_http::server::conjure::CollectionResponseSerializer
435    )]
436    fn get_segment_by_timestamp_v2(
437        &self,
438        #[auth]
439        auth_: conjure_object::BearerToken,
440        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
441        request: super::super::super::super::objects::scout::video::api::GetSegmentByTimestampV2Request,
442    ) -> Result<
443        Option<super::super::super::super::objects::scout::video::api::SegmentV2>,
444        conjure_http::private::Error,
445    >;
446    /// Returns metadata for the segment containing the requested absolute timestamp. If no segment contains
447    /// the timestamp, returns the closest segment starting after the timestamp. Returns empty if no segment
448    /// is found at or after the timestamp.
449    #[endpoint(
450        method = POST,
451        path = "/video/v1/videos/{videoRid}/get-segment-at-or-after-timestamp",
452        name = "getSegmentAtOrAfterTimestamp",
453        produces = conjure_http::server::conjure::CollectionResponseSerializer
454    )]
455    fn get_segment_at_or_after_timestamp(
456        &self,
457        #[auth]
458        auth_: conjure_object::BearerToken,
459        #[path(
460            name = "videoRid",
461            decoder = conjure_http::server::conjure::FromPlainDecoder,
462            log_as = "videoRid"
463        )]
464        video_rid: conjure_object::ResourceIdentifier,
465        #[body(deserializer = conjure_http::server::StdRequestDeserializer, safe)]
466        request: super::super::super::super::objects::scout::video::api::GetSegmentAtOrAfterTimestampRequest,
467    ) -> Result<
468        Option<super::super::super::super::objects::scout::video::api::Segment>,
469        conjure_http::private::Error,
470    >;
471    /// Returns metadata for the segment containing the requested absolute timestamp for a video series
472    /// (identified by channel + tags). If no segment contains the timestamp, returns the closest segment
473    /// starting after the timestamp. Returns empty if no segment is found at or after the timestamp.
474    #[endpoint(
475        method = POST,
476        path = "/video/v2/videos/get-segment-at-or-after-timestamp",
477        name = "getSegmentAtOrAfterTimestampV2",
478        produces = conjure_http::server::conjure::CollectionResponseSerializer
479    )]
480    fn get_segment_at_or_after_timestamp_v2(
481        &self,
482        #[auth]
483        auth_: conjure_object::BearerToken,
484        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
485        request: super::super::super::super::objects::scout::video::api::GetSegmentAtOrAfterTimestampV2Request,
486    ) -> Result<
487        Option<super::super::super::super::objects::scout::video::api::SegmentV2>,
488        conjure_http::private::Error,
489    >;
490    /// Returns the min and max absolute timestamps from non-archived video files associated with a given video that
491    /// overlap with an optional set of bounds. The files on the edges of the bounds will be truncated to segments
492    /// that are inside or overlap with the bounds.
493    #[endpoint(
494        method = POST,
495        path = "/video/v1/videos/{videoRid}/get-ranges-with-existing-segment-data",
496        name = "getFileSummaries",
497        produces = conjure_http::server::StdResponseSerializer
498    )]
499    fn get_file_summaries(
500        &self,
501        #[auth]
502        auth_: conjure_object::BearerToken,
503        #[path(
504            name = "videoRid",
505            decoder = conjure_http::server::conjure::FromPlainDecoder,
506            log_as = "videoRid"
507        )]
508        video_rid: conjure_object::ResourceIdentifier,
509        #[body(deserializer = conjure_http::server::StdRequestDeserializer, safe)]
510        request: super::super::super::super::objects::scout::video::api::GetFileSummariesRequest,
511    ) -> Result<
512        super::super::super::super::objects::scout::video::api::GetFileSummariesResponse,
513        conjure_http::private::Error,
514    >;
515    /// Generates a stream ID scoped to a video and returns a WHIP URL with a MediaMTX JWT and ICE servers.
516    /// Enforces write permission on the video.
517    #[endpoint(
518        method = POST,
519        path = "/video/v1/videos/{videoRid}/streaming/whip",
520        name = "generateWhipStream",
521        produces = conjure_http::server::StdResponseSerializer
522    )]
523    fn generate_whip_stream(
524        &self,
525        #[auth]
526        auth_: conjure_object::BearerToken,
527        #[path(
528            name = "videoRid",
529            decoder = conjure_http::server::conjure::FromPlainDecoder,
530            log_as = "videoRid"
531        )]
532        video_rid: conjure_object::ResourceIdentifier,
533    ) -> Result<
534        super::super::super::super::objects::scout::video::api::GenerateWhipStreamResponse,
535        conjure_http::private::Error,
536    >;
537    /// Generates a stream ID scoped to a channel-backed live video series and returns a WHIP URL with
538    /// a MediaMTX JWT and ICE servers.
539    /// Currently only datasource-backed dataset channels are supported.
540    #[endpoint(
541        method = POST,
542        path = "/video/v2/videos/streaming/whip",
543        name = "generateWhipStreamV2",
544        produces = conjure_http::server::StdResponseSerializer
545    )]
546    fn generate_whip_stream_v2(
547        &self,
548        #[auth]
549        auth_: conjure_object::BearerToken,
550        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
551        request: super::super::super::super::objects::scout::video::api::GenerateWhipStreamV2Request,
552    ) -> Result<
553        super::super::super::super::objects::scout::video::api::GenerateWhipStreamResponse,
554        conjure_http::private::Error,
555    >;
556    /// Returns WHEP URL, ICE servers, and token for playing back the active stream.
557    /// Returns empty if there is no active stream.
558    /// Enforces read permission on the video.
559    #[endpoint(
560        method = POST,
561        path = "/video/v1/videos/{videoRid}/streaming/whep",
562        name = "generateWhepStream",
563        produces = conjure_http::server::conjure::CollectionResponseSerializer
564    )]
565    fn generate_whep_stream(
566        &self,
567        #[auth]
568        auth_: conjure_object::BearerToken,
569        #[path(
570            name = "videoRid",
571            decoder = conjure_http::server::conjure::FromPlainDecoder,
572            log_as = "videoRid"
573        )]
574        video_rid: conjure_object::ResourceIdentifier,
575    ) -> Result<
576        Option<
577            super::super::super::super::objects::scout::video::api::GenerateWhepStreamResponse,
578        >,
579        conjure_http::private::Error,
580    >;
581    /// Returns WHEP URL, ICE servers, and token for playing back the active channel-backed live video stream.
582    /// Returns empty if there is no active stream.
583    /// Currently only datasource-backed dataset channels are supported.
584    #[endpoint(
585        method = POST,
586        path = "/video/v2/videos/streaming/whep",
587        name = "generateWhepStreamV2",
588        produces = conjure_http::server::conjure::CollectionResponseSerializer
589    )]
590    fn generate_whep_stream_v2(
591        &self,
592        #[auth]
593        auth_: conjure_object::BearerToken,
594        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
595        request: super::super::super::super::objects::scout::video::api::GenerateWhepStreamV2Request,
596    ) -> Result<
597        Option<
598            super::super::super::super::objects::scout::video::api::GenerateWhepStreamResponse,
599        >,
600        conjure_http::private::Error,
601    >;
602    /// Returns stream session metadata for a given stream ID scoped to the video.
603    /// Enforces read permission on the video.
604    #[endpoint(
605        method = GET,
606        path = "/video/v1/videos/{videoRid}/streaming/streams/{streamId}",
607        name = "getStream",
608        produces = conjure_http::server::conjure::CollectionResponseSerializer
609    )]
610    fn get_stream(
611        &self,
612        #[auth]
613        auth_: conjure_object::BearerToken,
614        #[path(
615            name = "videoRid",
616            decoder = conjure_http::server::conjure::FromPlainDecoder,
617            log_as = "videoRid"
618        )]
619        video_rid: conjure_object::ResourceIdentifier,
620        #[path(
621            name = "streamId",
622            decoder = conjure_http::server::conjure::FromPlainDecoder,
623            log_as = "streamId"
624        )]
625        stream_id: String,
626    ) -> Result<
627        Option<super::super::super::super::objects::scout::video::api::VideoStream>,
628        conjure_http::private::Error,
629    >;
630    /// Returns all stream sessions for a video that overlap with the specified time bounds.
631    /// A stream overlaps if there is any intersection between its [start, end] interval and the provided bounds.
632    /// Enforces read permission on the video.
633    #[endpoint(
634        method = POST,
635        path = "/video/v1/videos/{videoRid}/streaming/streams-in-bounds",
636        name = "getStreamsInBounds",
637        produces = conjure_http::server::StdResponseSerializer
638    )]
639    fn get_streams_in_bounds(
640        &self,
641        #[auth]
642        auth_: conjure_object::BearerToken,
643        #[path(
644            name = "videoRid",
645            decoder = conjure_http::server::conjure::FromPlainDecoder,
646            log_as = "videoRid"
647        )]
648        video_rid: conjure_object::ResourceIdentifier,
649        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
650        request: super::super::super::super::objects::scout::video::api::GetStreamsInBoundsRequest,
651    ) -> Result<
652        super::super::super::super::objects::scout::video::api::GetStreamsInBoundsResponse,
653        conjure_http::private::Error,
654    >;
655    /// Returns all channel-backed stream sessions for a dataset/channel that overlap with the specified time bounds.
656    /// A stream overlaps if there is any intersection between its [start, end] interval and the provided bounds.
657    /// Enforces read metadata permission on the dataset.
658    #[endpoint(
659        method = POST,
660        path = "/video/v2/videos/streaming/streams-in-bounds",
661        name = "getStreamsInBoundsV2",
662        produces = conjure_http::server::StdResponseSerializer
663    )]
664    fn get_streams_in_bounds_v2(
665        &self,
666        #[auth]
667        auth_: conjure_object::BearerToken,
668        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
669        request: super::super::super::super::objects::scout::video::api::GetStreamsInBoundsForChannelRequest,
670    ) -> Result<
671        super::super::super::super::objects::scout::video::api::GetStreamsInBoundsV2Response,
672        conjure_http::private::Error,
673    >;
674    /// Returns the dataset files backing a video channel (identified by channel + tags), ordered by
675    /// start timestamp ascending and paginated. Each entry carries the min/max absolute timestamps the
676    /// file contributes to the channel. Optionally filtered by time bounds. Streamed sessions are not
677    /// included; use getStreamsInBoundsV2 for those.
678    /// Enforces read metadata permission on the datasource.
679    #[endpoint(
680        method = POST,
681        path = "/video/v2/videos/channel-dataset-files",
682        name = "listVideoChannelDatasetFiles",
683        produces = conjure_http::server::StdResponseSerializer
684    )]
685    fn list_video_channel_dataset_files(
686        &self,
687        #[auth]
688        auth_: conjure_object::BearerToken,
689        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
690        request: super::super::super::super::objects::scout::video::api::ListVideoChannelDatasetFilesRequest,
691    ) -> Result<
692        super::super::super::super::objects::scout::video::api::ListVideoChannelDatasetFilesResponse,
693        conjure_http::private::Error,
694    >;
695    /// Updates one or more video dataset files in a channel in a single transaction. Each update may set a new
696    /// absolute start timestamp (segments shifted so the earliest starts at the given timestamp), a scale
697    /// parameter (frame timestamps rescaled around the file's start), and/or a new title (file name). If a
698    /// resulting layout would overlap segments of another file in the channel, no files are updated and
699    /// VIDEO_SEGMENT_CONFLICT is thrown (all-or-nothing). Returns the updated files with their new bounds.
700    /// Currently only datasource-backed dataset channels are supported.
701    /// Enforces write data permission on the datasource.
702    #[endpoint(
703        method = POST,
704        path = "/video/v2/videos/channel-dataset-files/batch-update",
705        name = "batchUpdateVideoChannelDatasetFiles",
706        produces = conjure_http::server::StdResponseSerializer
707    )]
708    fn batch_update_video_channel_dataset_files(
709        &self,
710        #[auth]
711        auth_: conjure_object::BearerToken,
712        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
713        request: super::super::super::super::objects::scout::video::api::BatchUpdateVideoChannelDatasetFilesRequest,
714    ) -> Result<
715        super::super::super::super::objects::scout::video::api::BatchUpdateVideoChannelDatasetFilesResponse,
716        conjure_http::private::Error,
717    >;
718    /// Marks the active stream session as ended for the video.
719    /// Throws VIDEO_NOT_FOUND if no active stream exists.
720    /// Enforces write permission on the video.
721    #[endpoint(
722        method = POST,
723        path = "/video/v1/videos/{videoRid}/streaming/end",
724        name = "endStream",
725        produces = conjure_http::server::StdResponseSerializer
726    )]
727    fn end_stream(
728        &self,
729        #[auth]
730        auth_: conjure_object::BearerToken,
731        #[path(
732            name = "videoRid",
733            decoder = conjure_http::server::conjure::FromPlainDecoder,
734            log_as = "videoRid"
735        )]
736        video_rid: conjure_object::ResourceIdentifier,
737    ) -> Result<
738        super::super::super::super::objects::scout::video::api::EndStreamResponse,
739        conjure_http::private::Error,
740    >;
741    /// MediaMTX segment upload endpoint. Receives video segments from MediaMTX hooks.
742    /// Validates JWT and logs session. Future: create video segments from uploaded files.
743    #[endpoint(
744        method = POST,
745        path = "/video/v1/segment/upload",
746        name = "uploadSegmentFromMediaMtx"
747    )]
748    fn upload_segment_from_media_mtx(
749        &self,
750        #[auth]
751        auth_: conjure_object::BearerToken,
752        #[query(
753            name = "streamPath",
754            decoder = conjure_http::server::conjure::FromPlainDecoder,
755            log_as = "streamPath"
756        )]
757        stream_path: String,
758        #[query(
759            name = "filePath",
760            decoder = conjure_http::server::conjure::FromPlainDecoder,
761            log_as = "filePath"
762        )]
763        file_path: String,
764        #[query(
765            name = "duration",
766            decoder = conjure_http::server::conjure::FromPlainDecoder
767        )]
768        duration: String,
769        #[query(
770            name = "minTimestampSeconds",
771            decoder = conjure_http::server::conjure::FromPlainDecoder,
772            log_as = "minTimestampSeconds"
773        )]
774        min_timestamp_seconds: conjure_object::SafeLong,
775        #[query(
776            name = "minTimestampNanos",
777            decoder = conjure_http::server::conjure::FromPlainDecoder,
778            log_as = "minTimestampNanos"
779        )]
780        min_timestamp_nanos: conjure_object::SafeLong,
781        #[header(
782            name = "Content-Length",
783            decoder = conjure_http::server::conjure::FromPlainDecoder,
784            log_as = "contentLength"
785        )]
786        content_length: conjure_object::SafeLong,
787        #[body(deserializer = conjure_http::server::conjure::BinaryRequestDeserializer)]
788        body: I,
789    ) -> Result<(), conjure_http::private::Error>;
790}
791/// The video service manages videos and video metadata.
792#[conjure_http::conjure_endpoints(name = "VideoService", use_legacy_error_serialization)]
793pub trait AsyncVideoService<#[request_body] I, #[response_writer] O> {
794    ///The body type returned by the `get_playlist` method.
795    type GetPlaylistBody: conjure_http::server::AsyncWriteBody<O> + 'static + Send;
796    ///The body type returned by the `get_playlist_in_bounds` method.
797    type GetPlaylistInBoundsBody: conjure_http::server::AsyncWriteBody<O>
798        + 'static
799        + Send;
800    ///The body type returned by the `get_playlist_in_bounds_v2` method.
801    type GetPlaylistInBoundsV2Body: conjure_http::server::AsyncWriteBody<O>
802        + 'static
803        + Send;
804    ///The body type returned by the `get_playlist_v2` method.
805    type GetPlaylistV2Body: conjure_http::server::AsyncWriteBody<O> + 'static + Send;
806    /// Returns video metadata associated with a video rid.
807    #[endpoint(
808        method = GET,
809        path = "/video/v1/videos/{videoRid}",
810        name = "get",
811        produces = conjure_http::server::StdResponseSerializer
812    )]
813    async fn get(
814        &self,
815        #[auth]
816        auth_: conjure_object::BearerToken,
817        #[path(
818            name = "videoRid",
819            decoder = conjure_http::server::conjure::FromPlainDecoder,
820            log_as = "videoRid"
821        )]
822        video_rid: conjure_object::ResourceIdentifier,
823    ) -> Result<
824        super::super::super::super::objects::scout::video::api::Video,
825        conjure_http::private::Error,
826    >;
827    /// Returns video metadata about each video given a set of video rids.
828    #[endpoint(
829        method = POST,
830        path = "/video/v1/videos/batchGet",
831        name = "batchGet",
832        produces = conjure_http::server::StdResponseSerializer
833    )]
834    async fn batch_get(
835        &self,
836        #[auth]
837        auth_: conjure_object::BearerToken,
838        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
839        request: super::super::super::super::objects::scout::video::api::GetVideosRequest,
840    ) -> Result<
841        super::super::super::super::objects::scout::video::api::GetVideosResponse,
842        conjure_http::private::Error,
843    >;
844    /// Returns metadata about videos that match a given query.
845    #[endpoint(
846        method = POST,
847        path = "/video/v1/videos/search",
848        name = "search",
849        produces = conjure_http::server::StdResponseSerializer
850    )]
851    async fn search(
852        &self,
853        #[auth]
854        auth_: conjure_object::BearerToken,
855        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
856        request: super::super::super::super::objects::scout::video::api::SearchVideosRequest,
857    ) -> Result<
858        super::super::super::super::objects::scout::video::api::SearchVideosResponse,
859        conjure_http::private::Error,
860    >;
861    /// Creates and persists a video entity with the given metadata.
862    #[endpoint(
863        method = POST,
864        path = "/video/v1/videos",
865        name = "create",
866        produces = conjure_http::server::StdResponseSerializer
867    )]
868    async fn create(
869        &self,
870        #[auth]
871        auth_: conjure_object::BearerToken,
872        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
873        request: super::super::super::super::objects::scout::video::api::CreateVideoRequest,
874    ) -> Result<
875        super::super::super::super::objects::scout::video::api::Video,
876        conjure_http::private::Error,
877    >;
878    /// Updates the metadata for a video associated with the given video rid.
879    #[endpoint(
880        method = PUT,
881        path = "/video/v1/videos/{videoRid}",
882        name = "updateMetadata",
883        produces = conjure_http::server::StdResponseSerializer
884    )]
885    async fn update_metadata(
886        &self,
887        #[auth]
888        auth_: conjure_object::BearerToken,
889        #[path(
890            name = "videoRid",
891            decoder = conjure_http::server::conjure::FromPlainDecoder,
892            log_as = "videoRid"
893        )]
894        video_rid: conjure_object::ResourceIdentifier,
895        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
896        request: super::super::super::super::objects::scout::video::api::UpdateVideoMetadataRequest,
897    ) -> Result<
898        super::super::super::super::objects::scout::video::api::Video,
899        conjure_http::private::Error,
900    >;
901    #[endpoint(
902        method = PUT,
903        path = "/video/v1/videos/{videoRid}/ingest-status",
904        name = "updateIngestStatus"
905    )]
906    async fn update_ingest_status(
907        &self,
908        #[auth]
909        auth_: conjure_object::BearerToken,
910        #[path(
911            name = "videoRid",
912            decoder = conjure_http::server::conjure::FromPlainDecoder,
913            log_as = "videoRid"
914        )]
915        video_rid: conjure_object::ResourceIdentifier,
916        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
917        request: super::super::super::super::objects::scout::video::api::UpdateIngestStatus,
918    ) -> Result<(), conjure_http::private::Error>;
919    #[endpoint(
920        method = GET,
921        path = "/video/v1/videos/{videoRid}/ingest-status",
922        name = "getIngestStatus",
923        produces = conjure_http::server::StdResponseSerializer
924    )]
925    async fn get_ingest_status(
926        &self,
927        #[auth]
928        auth_: conjure_object::BearerToken,
929        #[path(
930            name = "videoRid",
931            decoder = conjure_http::server::conjure::FromPlainDecoder,
932            log_as = "videoRid"
933        )]
934        video_rid: conjure_object::ResourceIdentifier,
935    ) -> Result<
936        super::super::super::super::objects::scout::video::api::DetailedIngestStatus,
937        conjure_http::private::Error,
938    >;
939    #[endpoint(
940        method = POST,
941        path = "/video/v1/videos/batch-get-ingest-status",
942        name = "batchGetIngestStatus",
943        produces = conjure_http::server::conjure::CollectionResponseSerializer
944    )]
945    async fn batch_get_ingest_status(
946        &self,
947        #[auth]
948        auth_: conjure_object::BearerToken,
949        #[body(
950            deserializer = conjure_http::server::StdRequestDeserializer,
951            log_as = "videoRids"
952        )]
953        video_rids: std::collections::BTreeSet<conjure_object::ResourceIdentifier>,
954    ) -> Result<
955        std::collections::BTreeMap<
956            conjure_object::ResourceIdentifier,
957            super::super::super::super::objects::scout::video::api::DetailedIngestStatus,
958        >,
959        conjure_http::private::Error,
960    >;
961    #[endpoint(
962        method = POST,
963        path = "/video/v1/videos/enriched-ingest-status",
964        name = "getEnrichedIngestStatus",
965        produces = conjure_http::server::conjure::CollectionResponseSerializer
966    )]
967    async fn get_enriched_ingest_status(
968        &self,
969        #[auth]
970        auth_: conjure_object::BearerToken,
971        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
972        request: super::super::super::super::objects::scout::video::api::GetEnrichedVideoIngestStatusRequest,
973    ) -> Result<
974        Option<
975            super::super::super::super::objects::scout::video::api::EnrichedVideoIngestStatus,
976        >,
977        conjure_http::private::Error,
978    >;
979    /// Archives a video, which excludes it from search and hides it from being publicly visible, but does not
980    /// permanently delete it. Archived videos can be unarchived.
981    #[endpoint(
982        method = PUT,
983        path = "/video/v1/videos/{videoRid}/archive",
984        name = "archive"
985    )]
986    async fn archive(
987        &self,
988        #[auth]
989        auth_: conjure_object::BearerToken,
990        #[path(
991            name = "videoRid",
992            decoder = conjure_http::server::conjure::FromPlainDecoder,
993            log_as = "videoRid"
994        )]
995        video_rid: conjure_object::ResourceIdentifier,
996    ) -> Result<(), conjure_http::private::Error>;
997    /// Unarchives a previously archived video.
998    #[endpoint(
999        method = PUT,
1000        path = "/video/v1/videos/{videoRid}/unarchive",
1001        name = "unarchive"
1002    )]
1003    async fn unarchive(
1004        &self,
1005        #[auth]
1006        auth_: conjure_object::BearerToken,
1007        #[path(
1008            name = "videoRid",
1009            decoder = conjure_http::server::conjure::FromPlainDecoder,
1010            log_as = "videoRid"
1011        )]
1012        video_rid: conjure_object::ResourceIdentifier,
1013    ) -> Result<(), conjure_http::private::Error>;
1014    /// Generates an HLS playlist for a video within optional time bounds.
1015    /// Uses GET with query parameters for HLS.js compatibility.
1016    /// The HLS playlist will contain links to all of the segments in the video that overlap with the given bounds,
1017    /// or all segments if no bounds are provided.
1018    ///
1019    /// Note: The start and end parameters must either both be provided or both be omitted.
1020    /// Providing only one will result in a MissingTimestampBoundPair error.
1021    #[endpoint(
1022        method = GET,
1023        path = "/video/v1/videos/{videoRid}/playlist",
1024        name = "getPlaylist",
1025        produces = conjure_http::server::conjure::BinaryResponseSerializer
1026    )]
1027    async fn get_playlist(
1028        &self,
1029        #[auth]
1030        auth_: conjure_object::BearerToken,
1031        #[path(
1032            name = "videoRid",
1033            decoder = conjure_http::server::conjure::FromPlainDecoder,
1034            log_as = "videoRid"
1035        )]
1036        video_rid: conjure_object::ResourceIdentifier,
1037        #[query(
1038            name = "start",
1039            decoder = conjure_http::server::conjure::FromPlainOptionDecoder
1040        )]
1041        start: Option<String>,
1042        #[query(
1043            name = "end",
1044            decoder = conjure_http::server::conjure::FromPlainOptionDecoder
1045        )]
1046        end: Option<String>,
1047    ) -> Result<Self::GetPlaylistBody, conjure_http::private::Error>;
1048    /// Returns the min and max absolute and media timestamps for each segment in a video. To be used during
1049    /// frame-timestamp mapping.
1050    #[endpoint(
1051        method = GET,
1052        path = "/video/v1/videos/{videoRid}/segment-summaries",
1053        name = "getSegmentSummaries",
1054        produces = conjure_http::server::conjure::CollectionResponseSerializer
1055    )]
1056    async fn get_segment_summaries(
1057        &self,
1058        #[auth]
1059        auth_: conjure_object::BearerToken,
1060        #[path(
1061            name = "videoRid",
1062            decoder = conjure_http::server::conjure::FromPlainDecoder,
1063            log_as = "videoRid"
1064        )]
1065        video_rid: conjure_object::ResourceIdentifier,
1066    ) -> Result<
1067        Vec<super::super::super::super::objects::scout::video::api::SegmentSummary>,
1068        conjure_http::private::Error,
1069    >;
1070    /// Generates an HLS playlist for a video with the given video rid to enable playback within an optional set of
1071    /// bounds. The HLS playlist will contain links to all of the segments in the video that overlap with the given
1072    /// bounds.
1073    /// playlist will be limited to the given bounds.
1074    #[endpoint(
1075        method = POST,
1076        path = "/video/v1/videos/{videoRid}/playlist-in-bounds",
1077        name = "getPlaylistInBounds",
1078        produces = conjure_http::server::conjure::BinaryResponseSerializer
1079    )]
1080    async fn get_playlist_in_bounds(
1081        &self,
1082        #[auth]
1083        auth_: conjure_object::BearerToken,
1084        #[path(
1085            name = "videoRid",
1086            decoder = conjure_http::server::conjure::FromPlainDecoder,
1087            log_as = "videoRid"
1088        )]
1089        video_rid: conjure_object::ResourceIdentifier,
1090        #[body(deserializer = conjure_http::server::StdRequestDeserializer, safe)]
1091        request: super::super::super::super::objects::scout::video::api::GetPlaylistInBoundsRequest,
1092    ) -> Result<Self::GetPlaylistInBoundsBody, conjure_http::private::Error>;
1093    /// Generates an HLS playlist for a video series (identified by channel + tags) within bounds.
1094    #[endpoint(
1095        method = POST,
1096        path = "/video/v2/videos/playlist-in-bounds",
1097        name = "getPlaylistInBoundsV2",
1098        produces = conjure_http::server::conjure::BinaryResponseSerializer
1099    )]
1100    async fn get_playlist_in_bounds_v2(
1101        &self,
1102        #[auth]
1103        auth_: conjure_object::BearerToken,
1104        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
1105        request: super::super::super::super::objects::scout::video::api::GetPlaylistInBoundsForChannelRequest,
1106    ) -> Result<Self::GetPlaylistInBoundsV2Body, conjure_http::private::Error>;
1107    /// Generates an HLS playlist for a video series within time bounds.
1108    /// Specify either dataSourceRid OR (assetRid + dataScopeName) to identify the series source.
1109    ///
1110    /// Note: Both start and end parameters are required and must be provided together.
1111    #[endpoint(
1112        method = GET,
1113        path = "/video/v2/videos/playlist",
1114        name = "getPlaylistV2",
1115        produces = conjure_http::server::conjure::BinaryResponseSerializer
1116    )]
1117    async fn get_playlist_v2(
1118        &self,
1119        #[auth]
1120        auth_: conjure_object::BearerToken,
1121        #[query(
1122            name = "dataSourceRid",
1123            decoder = conjure_http::server::conjure::FromPlainOptionDecoder,
1124            log_as = "dataSourceRid"
1125        )]
1126        data_source_rid: Option<conjure_object::ResourceIdentifier>,
1127        #[query(
1128            name = "assetRid",
1129            decoder = conjure_http::server::conjure::FromPlainOptionDecoder,
1130            log_as = "assetRid",
1131            safe
1132        )]
1133        asset_rid: Option<
1134            super::super::super::super::objects::scout::rids::api::AssetRid,
1135        >,
1136        #[query(
1137            name = "dataScopeName",
1138            decoder = conjure_http::server::conjure::FromPlainOptionDecoder,
1139            log_as = "dataScopeName"
1140        )]
1141        data_scope_name: Option<String>,
1142        #[query(
1143            name = "channel",
1144            decoder = conjure_http::server::conjure::FromPlainDecoder
1145        )]
1146        channel: String,
1147        #[query(
1148            name = "tags",
1149            decoder = conjure_http::server::conjure::FromPlainOptionDecoder
1150        )]
1151        tags: Option<String>,
1152        #[query(
1153            name = "start",
1154            decoder = conjure_http::server::conjure::FromPlainDecoder
1155        )]
1156        start: String,
1157        #[query(name = "end", decoder = conjure_http::server::conjure::FromPlainDecoder)]
1158        end: String,
1159    ) -> Result<Self::GetPlaylistV2Body, conjure_http::private::Error>;
1160    /// Returns the min and max absolute and media timestamps for each segment in a video that overlap with an
1161    /// optional set of bounds.
1162    #[endpoint(
1163        method = POST,
1164        path = "/video/v1/videos/{videoRid}/segment-summaries-in-bounds",
1165        name = "getSegmentSummariesInBounds",
1166        produces = conjure_http::server::conjure::CollectionResponseSerializer
1167    )]
1168    async fn get_segment_summaries_in_bounds(
1169        &self,
1170        #[auth]
1171        auth_: conjure_object::BearerToken,
1172        #[path(
1173            name = "videoRid",
1174            decoder = conjure_http::server::conjure::FromPlainDecoder,
1175            log_as = "videoRid"
1176        )]
1177        video_rid: conjure_object::ResourceIdentifier,
1178        #[body(deserializer = conjure_http::server::StdRequestDeserializer, safe)]
1179        request: super::super::super::super::objects::scout::video::api::GetSegmentSummariesInBoundsRequest,
1180    ) -> Result<
1181        Vec<super::super::super::super::objects::scout::video::api::SegmentSummary>,
1182        conjure_http::private::Error,
1183    >;
1184    /// Returns the min and max absolute and media timestamps for each segment matching a video series
1185    /// (identified by channel + tags) within the specified bounds.
1186    #[endpoint(
1187        method = POST,
1188        path = "/video/v2/videos/segment-summaries-in-bounds",
1189        name = "getSegmentSummariesInBoundsV2",
1190        produces = conjure_http::server::conjure::CollectionResponseSerializer
1191    )]
1192    async fn get_segment_summaries_in_bounds_v2(
1193        &self,
1194        #[auth]
1195        auth_: conjure_object::BearerToken,
1196        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
1197        request: super::super::super::super::objects::scout::video::api::GetSegmentSummariesInBoundsForChannelRequest,
1198    ) -> Result<
1199        Vec<super::super::super::super::objects::scout::video::api::SegmentSummaryV2>,
1200        conjure_http::private::Error,
1201    >;
1202    /// Returns aggregated segment metadata for a video channel series, including total frames,
1203    /// segment count, min/max timestamps, and average frame rate. Optionally filter by time bounds.
1204    #[endpoint(
1205        method = POST,
1206        path = "/video/v2/videos/segment-metadata",
1207        name = "getSegmentMetadataV2",
1208        produces = conjure_http::server::conjure::CollectionResponseSerializer
1209    )]
1210    async fn get_segment_metadata_v2(
1211        &self,
1212        #[auth]
1213        auth_: conjure_object::BearerToken,
1214        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
1215        request: super::super::super::super::objects::scout::video::api::GetSegmentMetadataForChannelRequest,
1216    ) -> Result<
1217        Option<
1218            super::super::super::super::objects::scout::video::api::VideoChannelSegmentsMetadata,
1219        >,
1220        conjure_http::private::Error,
1221    >;
1222    /// Returns metadata for the segment within a video series containing the requested absolute timestamp.
1223    #[endpoint(
1224        method = POST,
1225        path = "/video/v2/videos/get-segment-by-timestamp",
1226        name = "getSegmentByTimestampV2",
1227        produces = conjure_http::server::conjure::CollectionResponseSerializer
1228    )]
1229    async fn get_segment_by_timestamp_v2(
1230        &self,
1231        #[auth]
1232        auth_: conjure_object::BearerToken,
1233        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
1234        request: super::super::super::super::objects::scout::video::api::GetSegmentByTimestampV2Request,
1235    ) -> Result<
1236        Option<super::super::super::super::objects::scout::video::api::SegmentV2>,
1237        conjure_http::private::Error,
1238    >;
1239    /// Returns metadata for the segment containing the requested absolute timestamp. If no segment contains
1240    /// the timestamp, returns the closest segment starting after the timestamp. Returns empty if no segment
1241    /// is found at or after the timestamp.
1242    #[endpoint(
1243        method = POST,
1244        path = "/video/v1/videos/{videoRid}/get-segment-at-or-after-timestamp",
1245        name = "getSegmentAtOrAfterTimestamp",
1246        produces = conjure_http::server::conjure::CollectionResponseSerializer
1247    )]
1248    async fn get_segment_at_or_after_timestamp(
1249        &self,
1250        #[auth]
1251        auth_: conjure_object::BearerToken,
1252        #[path(
1253            name = "videoRid",
1254            decoder = conjure_http::server::conjure::FromPlainDecoder,
1255            log_as = "videoRid"
1256        )]
1257        video_rid: conjure_object::ResourceIdentifier,
1258        #[body(deserializer = conjure_http::server::StdRequestDeserializer, safe)]
1259        request: super::super::super::super::objects::scout::video::api::GetSegmentAtOrAfterTimestampRequest,
1260    ) -> Result<
1261        Option<super::super::super::super::objects::scout::video::api::Segment>,
1262        conjure_http::private::Error,
1263    >;
1264    /// Returns metadata for the segment containing the requested absolute timestamp for a video series
1265    /// (identified by channel + tags). If no segment contains the timestamp, returns the closest segment
1266    /// starting after the timestamp. Returns empty if no segment is found at or after the timestamp.
1267    #[endpoint(
1268        method = POST,
1269        path = "/video/v2/videos/get-segment-at-or-after-timestamp",
1270        name = "getSegmentAtOrAfterTimestampV2",
1271        produces = conjure_http::server::conjure::CollectionResponseSerializer
1272    )]
1273    async fn get_segment_at_or_after_timestamp_v2(
1274        &self,
1275        #[auth]
1276        auth_: conjure_object::BearerToken,
1277        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
1278        request: super::super::super::super::objects::scout::video::api::GetSegmentAtOrAfterTimestampV2Request,
1279    ) -> Result<
1280        Option<super::super::super::super::objects::scout::video::api::SegmentV2>,
1281        conjure_http::private::Error,
1282    >;
1283    /// Returns the min and max absolute timestamps from non-archived video files associated with a given video that
1284    /// overlap with an optional set of bounds. The files on the edges of the bounds will be truncated to segments
1285    /// that are inside or overlap with the bounds.
1286    #[endpoint(
1287        method = POST,
1288        path = "/video/v1/videos/{videoRid}/get-ranges-with-existing-segment-data",
1289        name = "getFileSummaries",
1290        produces = conjure_http::server::StdResponseSerializer
1291    )]
1292    async fn get_file_summaries(
1293        &self,
1294        #[auth]
1295        auth_: conjure_object::BearerToken,
1296        #[path(
1297            name = "videoRid",
1298            decoder = conjure_http::server::conjure::FromPlainDecoder,
1299            log_as = "videoRid"
1300        )]
1301        video_rid: conjure_object::ResourceIdentifier,
1302        #[body(deserializer = conjure_http::server::StdRequestDeserializer, safe)]
1303        request: super::super::super::super::objects::scout::video::api::GetFileSummariesRequest,
1304    ) -> Result<
1305        super::super::super::super::objects::scout::video::api::GetFileSummariesResponse,
1306        conjure_http::private::Error,
1307    >;
1308    /// Generates a stream ID scoped to a video and returns a WHIP URL with a MediaMTX JWT and ICE servers.
1309    /// Enforces write permission on the video.
1310    #[endpoint(
1311        method = POST,
1312        path = "/video/v1/videos/{videoRid}/streaming/whip",
1313        name = "generateWhipStream",
1314        produces = conjure_http::server::StdResponseSerializer
1315    )]
1316    async fn generate_whip_stream(
1317        &self,
1318        #[auth]
1319        auth_: conjure_object::BearerToken,
1320        #[path(
1321            name = "videoRid",
1322            decoder = conjure_http::server::conjure::FromPlainDecoder,
1323            log_as = "videoRid"
1324        )]
1325        video_rid: conjure_object::ResourceIdentifier,
1326    ) -> Result<
1327        super::super::super::super::objects::scout::video::api::GenerateWhipStreamResponse,
1328        conjure_http::private::Error,
1329    >;
1330    /// Generates a stream ID scoped to a channel-backed live video series and returns a WHIP URL with
1331    /// a MediaMTX JWT and ICE servers.
1332    /// Currently only datasource-backed dataset channels are supported.
1333    #[endpoint(
1334        method = POST,
1335        path = "/video/v2/videos/streaming/whip",
1336        name = "generateWhipStreamV2",
1337        produces = conjure_http::server::StdResponseSerializer
1338    )]
1339    async fn generate_whip_stream_v2(
1340        &self,
1341        #[auth]
1342        auth_: conjure_object::BearerToken,
1343        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
1344        request: super::super::super::super::objects::scout::video::api::GenerateWhipStreamV2Request,
1345    ) -> Result<
1346        super::super::super::super::objects::scout::video::api::GenerateWhipStreamResponse,
1347        conjure_http::private::Error,
1348    >;
1349    /// Returns WHEP URL, ICE servers, and token for playing back the active stream.
1350    /// Returns empty if there is no active stream.
1351    /// Enforces read permission on the video.
1352    #[endpoint(
1353        method = POST,
1354        path = "/video/v1/videos/{videoRid}/streaming/whep",
1355        name = "generateWhepStream",
1356        produces = conjure_http::server::conjure::CollectionResponseSerializer
1357    )]
1358    async fn generate_whep_stream(
1359        &self,
1360        #[auth]
1361        auth_: conjure_object::BearerToken,
1362        #[path(
1363            name = "videoRid",
1364            decoder = conjure_http::server::conjure::FromPlainDecoder,
1365            log_as = "videoRid"
1366        )]
1367        video_rid: conjure_object::ResourceIdentifier,
1368    ) -> Result<
1369        Option<
1370            super::super::super::super::objects::scout::video::api::GenerateWhepStreamResponse,
1371        >,
1372        conjure_http::private::Error,
1373    >;
1374    /// Returns WHEP URL, ICE servers, and token for playing back the active channel-backed live video stream.
1375    /// Returns empty if there is no active stream.
1376    /// Currently only datasource-backed dataset channels are supported.
1377    #[endpoint(
1378        method = POST,
1379        path = "/video/v2/videos/streaming/whep",
1380        name = "generateWhepStreamV2",
1381        produces = conjure_http::server::conjure::CollectionResponseSerializer
1382    )]
1383    async fn generate_whep_stream_v2(
1384        &self,
1385        #[auth]
1386        auth_: conjure_object::BearerToken,
1387        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
1388        request: super::super::super::super::objects::scout::video::api::GenerateWhepStreamV2Request,
1389    ) -> Result<
1390        Option<
1391            super::super::super::super::objects::scout::video::api::GenerateWhepStreamResponse,
1392        >,
1393        conjure_http::private::Error,
1394    >;
1395    /// Returns stream session metadata for a given stream ID scoped to the video.
1396    /// Enforces read permission on the video.
1397    #[endpoint(
1398        method = GET,
1399        path = "/video/v1/videos/{videoRid}/streaming/streams/{streamId}",
1400        name = "getStream",
1401        produces = conjure_http::server::conjure::CollectionResponseSerializer
1402    )]
1403    async fn get_stream(
1404        &self,
1405        #[auth]
1406        auth_: conjure_object::BearerToken,
1407        #[path(
1408            name = "videoRid",
1409            decoder = conjure_http::server::conjure::FromPlainDecoder,
1410            log_as = "videoRid"
1411        )]
1412        video_rid: conjure_object::ResourceIdentifier,
1413        #[path(
1414            name = "streamId",
1415            decoder = conjure_http::server::conjure::FromPlainDecoder,
1416            log_as = "streamId"
1417        )]
1418        stream_id: String,
1419    ) -> Result<
1420        Option<super::super::super::super::objects::scout::video::api::VideoStream>,
1421        conjure_http::private::Error,
1422    >;
1423    /// Returns all stream sessions for a video that overlap with the specified time bounds.
1424    /// A stream overlaps if there is any intersection between its [start, end] interval and the provided bounds.
1425    /// Enforces read permission on the video.
1426    #[endpoint(
1427        method = POST,
1428        path = "/video/v1/videos/{videoRid}/streaming/streams-in-bounds",
1429        name = "getStreamsInBounds",
1430        produces = conjure_http::server::StdResponseSerializer
1431    )]
1432    async fn get_streams_in_bounds(
1433        &self,
1434        #[auth]
1435        auth_: conjure_object::BearerToken,
1436        #[path(
1437            name = "videoRid",
1438            decoder = conjure_http::server::conjure::FromPlainDecoder,
1439            log_as = "videoRid"
1440        )]
1441        video_rid: conjure_object::ResourceIdentifier,
1442        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
1443        request: super::super::super::super::objects::scout::video::api::GetStreamsInBoundsRequest,
1444    ) -> Result<
1445        super::super::super::super::objects::scout::video::api::GetStreamsInBoundsResponse,
1446        conjure_http::private::Error,
1447    >;
1448    /// Returns all channel-backed stream sessions for a dataset/channel that overlap with the specified time bounds.
1449    /// A stream overlaps if there is any intersection between its [start, end] interval and the provided bounds.
1450    /// Enforces read metadata permission on the dataset.
1451    #[endpoint(
1452        method = POST,
1453        path = "/video/v2/videos/streaming/streams-in-bounds",
1454        name = "getStreamsInBoundsV2",
1455        produces = conjure_http::server::StdResponseSerializer
1456    )]
1457    async fn get_streams_in_bounds_v2(
1458        &self,
1459        #[auth]
1460        auth_: conjure_object::BearerToken,
1461        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
1462        request: super::super::super::super::objects::scout::video::api::GetStreamsInBoundsForChannelRequest,
1463    ) -> Result<
1464        super::super::super::super::objects::scout::video::api::GetStreamsInBoundsV2Response,
1465        conjure_http::private::Error,
1466    >;
1467    /// Returns the dataset files backing a video channel (identified by channel + tags), ordered by
1468    /// start timestamp ascending and paginated. Each entry carries the min/max absolute timestamps the
1469    /// file contributes to the channel. Optionally filtered by time bounds. Streamed sessions are not
1470    /// included; use getStreamsInBoundsV2 for those.
1471    /// Enforces read metadata permission on the datasource.
1472    #[endpoint(
1473        method = POST,
1474        path = "/video/v2/videos/channel-dataset-files",
1475        name = "listVideoChannelDatasetFiles",
1476        produces = conjure_http::server::StdResponseSerializer
1477    )]
1478    async fn list_video_channel_dataset_files(
1479        &self,
1480        #[auth]
1481        auth_: conjure_object::BearerToken,
1482        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
1483        request: super::super::super::super::objects::scout::video::api::ListVideoChannelDatasetFilesRequest,
1484    ) -> Result<
1485        super::super::super::super::objects::scout::video::api::ListVideoChannelDatasetFilesResponse,
1486        conjure_http::private::Error,
1487    >;
1488    /// Updates one or more video dataset files in a channel in a single transaction. Each update may set a new
1489    /// absolute start timestamp (segments shifted so the earliest starts at the given timestamp), a scale
1490    /// parameter (frame timestamps rescaled around the file's start), and/or a new title (file name). If a
1491    /// resulting layout would overlap segments of another file in the channel, no files are updated and
1492    /// VIDEO_SEGMENT_CONFLICT is thrown (all-or-nothing). Returns the updated files with their new bounds.
1493    /// Currently only datasource-backed dataset channels are supported.
1494    /// Enforces write data permission on the datasource.
1495    #[endpoint(
1496        method = POST,
1497        path = "/video/v2/videos/channel-dataset-files/batch-update",
1498        name = "batchUpdateVideoChannelDatasetFiles",
1499        produces = conjure_http::server::StdResponseSerializer
1500    )]
1501    async fn batch_update_video_channel_dataset_files(
1502        &self,
1503        #[auth]
1504        auth_: conjure_object::BearerToken,
1505        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
1506        request: super::super::super::super::objects::scout::video::api::BatchUpdateVideoChannelDatasetFilesRequest,
1507    ) -> Result<
1508        super::super::super::super::objects::scout::video::api::BatchUpdateVideoChannelDatasetFilesResponse,
1509        conjure_http::private::Error,
1510    >;
1511    /// Marks the active stream session as ended for the video.
1512    /// Throws VIDEO_NOT_FOUND if no active stream exists.
1513    /// Enforces write permission on the video.
1514    #[endpoint(
1515        method = POST,
1516        path = "/video/v1/videos/{videoRid}/streaming/end",
1517        name = "endStream",
1518        produces = conjure_http::server::StdResponseSerializer
1519    )]
1520    async fn end_stream(
1521        &self,
1522        #[auth]
1523        auth_: conjure_object::BearerToken,
1524        #[path(
1525            name = "videoRid",
1526            decoder = conjure_http::server::conjure::FromPlainDecoder,
1527            log_as = "videoRid"
1528        )]
1529        video_rid: conjure_object::ResourceIdentifier,
1530    ) -> Result<
1531        super::super::super::super::objects::scout::video::api::EndStreamResponse,
1532        conjure_http::private::Error,
1533    >;
1534    /// MediaMTX segment upload endpoint. Receives video segments from MediaMTX hooks.
1535    /// Validates JWT and logs session. Future: create video segments from uploaded files.
1536    #[endpoint(
1537        method = POST,
1538        path = "/video/v1/segment/upload",
1539        name = "uploadSegmentFromMediaMtx"
1540    )]
1541    async fn upload_segment_from_media_mtx(
1542        &self,
1543        #[auth]
1544        auth_: conjure_object::BearerToken,
1545        #[query(
1546            name = "streamPath",
1547            decoder = conjure_http::server::conjure::FromPlainDecoder,
1548            log_as = "streamPath"
1549        )]
1550        stream_path: String,
1551        #[query(
1552            name = "filePath",
1553            decoder = conjure_http::server::conjure::FromPlainDecoder,
1554            log_as = "filePath"
1555        )]
1556        file_path: String,
1557        #[query(
1558            name = "duration",
1559            decoder = conjure_http::server::conjure::FromPlainDecoder
1560        )]
1561        duration: String,
1562        #[query(
1563            name = "minTimestampSeconds",
1564            decoder = conjure_http::server::conjure::FromPlainDecoder,
1565            log_as = "minTimestampSeconds"
1566        )]
1567        min_timestamp_seconds: conjure_object::SafeLong,
1568        #[query(
1569            name = "minTimestampNanos",
1570            decoder = conjure_http::server::conjure::FromPlainDecoder,
1571            log_as = "minTimestampNanos"
1572        )]
1573        min_timestamp_nanos: conjure_object::SafeLong,
1574        #[header(
1575            name = "Content-Length",
1576            decoder = conjure_http::server::conjure::FromPlainDecoder,
1577            log_as = "contentLength"
1578        )]
1579        content_length: conjure_object::SafeLong,
1580        #[body(deserializer = conjure_http::server::conjure::BinaryRequestDeserializer)]
1581        body: I,
1582    ) -> Result<(), conjure_http::private::Error>;
1583}
1584/// The video service manages videos and video metadata.
1585#[conjure_http::conjure_endpoints(
1586    name = "VideoService",
1587    use_legacy_error_serialization,
1588    local
1589)]
1590pub trait LocalAsyncVideoService<#[request_body] I, #[response_writer] O> {
1591    ///The body type returned by the `get_playlist` method.
1592    type GetPlaylistBody: conjure_http::server::LocalAsyncWriteBody<O> + 'static;
1593    ///The body type returned by the `get_playlist_in_bounds` method.
1594    type GetPlaylistInBoundsBody: conjure_http::server::LocalAsyncWriteBody<O> + 'static;
1595    ///The body type returned by the `get_playlist_in_bounds_v2` method.
1596    type GetPlaylistInBoundsV2Body: conjure_http::server::LocalAsyncWriteBody<O>
1597        + 'static;
1598    ///The body type returned by the `get_playlist_v2` method.
1599    type GetPlaylistV2Body: conjure_http::server::LocalAsyncWriteBody<O> + 'static;
1600    /// Returns video metadata associated with a video rid.
1601    #[endpoint(
1602        method = GET,
1603        path = "/video/v1/videos/{videoRid}",
1604        name = "get",
1605        produces = conjure_http::server::StdResponseSerializer
1606    )]
1607    async fn get(
1608        &self,
1609        #[auth]
1610        auth_: conjure_object::BearerToken,
1611        #[path(
1612            name = "videoRid",
1613            decoder = conjure_http::server::conjure::FromPlainDecoder,
1614            log_as = "videoRid"
1615        )]
1616        video_rid: conjure_object::ResourceIdentifier,
1617    ) -> Result<
1618        super::super::super::super::objects::scout::video::api::Video,
1619        conjure_http::private::Error,
1620    >;
1621    /// Returns video metadata about each video given a set of video rids.
1622    #[endpoint(
1623        method = POST,
1624        path = "/video/v1/videos/batchGet",
1625        name = "batchGet",
1626        produces = conjure_http::server::StdResponseSerializer
1627    )]
1628    async fn batch_get(
1629        &self,
1630        #[auth]
1631        auth_: conjure_object::BearerToken,
1632        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
1633        request: super::super::super::super::objects::scout::video::api::GetVideosRequest,
1634    ) -> Result<
1635        super::super::super::super::objects::scout::video::api::GetVideosResponse,
1636        conjure_http::private::Error,
1637    >;
1638    /// Returns metadata about videos that match a given query.
1639    #[endpoint(
1640        method = POST,
1641        path = "/video/v1/videos/search",
1642        name = "search",
1643        produces = conjure_http::server::StdResponseSerializer
1644    )]
1645    async fn search(
1646        &self,
1647        #[auth]
1648        auth_: conjure_object::BearerToken,
1649        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
1650        request: super::super::super::super::objects::scout::video::api::SearchVideosRequest,
1651    ) -> Result<
1652        super::super::super::super::objects::scout::video::api::SearchVideosResponse,
1653        conjure_http::private::Error,
1654    >;
1655    /// Creates and persists a video entity with the given metadata.
1656    #[endpoint(
1657        method = POST,
1658        path = "/video/v1/videos",
1659        name = "create",
1660        produces = conjure_http::server::StdResponseSerializer
1661    )]
1662    async fn create(
1663        &self,
1664        #[auth]
1665        auth_: conjure_object::BearerToken,
1666        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
1667        request: super::super::super::super::objects::scout::video::api::CreateVideoRequest,
1668    ) -> Result<
1669        super::super::super::super::objects::scout::video::api::Video,
1670        conjure_http::private::Error,
1671    >;
1672    /// Updates the metadata for a video associated with the given video rid.
1673    #[endpoint(
1674        method = PUT,
1675        path = "/video/v1/videos/{videoRid}",
1676        name = "updateMetadata",
1677        produces = conjure_http::server::StdResponseSerializer
1678    )]
1679    async fn update_metadata(
1680        &self,
1681        #[auth]
1682        auth_: conjure_object::BearerToken,
1683        #[path(
1684            name = "videoRid",
1685            decoder = conjure_http::server::conjure::FromPlainDecoder,
1686            log_as = "videoRid"
1687        )]
1688        video_rid: conjure_object::ResourceIdentifier,
1689        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
1690        request: super::super::super::super::objects::scout::video::api::UpdateVideoMetadataRequest,
1691    ) -> Result<
1692        super::super::super::super::objects::scout::video::api::Video,
1693        conjure_http::private::Error,
1694    >;
1695    #[endpoint(
1696        method = PUT,
1697        path = "/video/v1/videos/{videoRid}/ingest-status",
1698        name = "updateIngestStatus"
1699    )]
1700    async fn update_ingest_status(
1701        &self,
1702        #[auth]
1703        auth_: conjure_object::BearerToken,
1704        #[path(
1705            name = "videoRid",
1706            decoder = conjure_http::server::conjure::FromPlainDecoder,
1707            log_as = "videoRid"
1708        )]
1709        video_rid: conjure_object::ResourceIdentifier,
1710        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
1711        request: super::super::super::super::objects::scout::video::api::UpdateIngestStatus,
1712    ) -> Result<(), conjure_http::private::Error>;
1713    #[endpoint(
1714        method = GET,
1715        path = "/video/v1/videos/{videoRid}/ingest-status",
1716        name = "getIngestStatus",
1717        produces = conjure_http::server::StdResponseSerializer
1718    )]
1719    async fn get_ingest_status(
1720        &self,
1721        #[auth]
1722        auth_: conjure_object::BearerToken,
1723        #[path(
1724            name = "videoRid",
1725            decoder = conjure_http::server::conjure::FromPlainDecoder,
1726            log_as = "videoRid"
1727        )]
1728        video_rid: conjure_object::ResourceIdentifier,
1729    ) -> Result<
1730        super::super::super::super::objects::scout::video::api::DetailedIngestStatus,
1731        conjure_http::private::Error,
1732    >;
1733    #[endpoint(
1734        method = POST,
1735        path = "/video/v1/videos/batch-get-ingest-status",
1736        name = "batchGetIngestStatus",
1737        produces = conjure_http::server::conjure::CollectionResponseSerializer
1738    )]
1739    async fn batch_get_ingest_status(
1740        &self,
1741        #[auth]
1742        auth_: conjure_object::BearerToken,
1743        #[body(
1744            deserializer = conjure_http::server::StdRequestDeserializer,
1745            log_as = "videoRids"
1746        )]
1747        video_rids: std::collections::BTreeSet<conjure_object::ResourceIdentifier>,
1748    ) -> Result<
1749        std::collections::BTreeMap<
1750            conjure_object::ResourceIdentifier,
1751            super::super::super::super::objects::scout::video::api::DetailedIngestStatus,
1752        >,
1753        conjure_http::private::Error,
1754    >;
1755    #[endpoint(
1756        method = POST,
1757        path = "/video/v1/videos/enriched-ingest-status",
1758        name = "getEnrichedIngestStatus",
1759        produces = conjure_http::server::conjure::CollectionResponseSerializer
1760    )]
1761    async fn get_enriched_ingest_status(
1762        &self,
1763        #[auth]
1764        auth_: conjure_object::BearerToken,
1765        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
1766        request: super::super::super::super::objects::scout::video::api::GetEnrichedVideoIngestStatusRequest,
1767    ) -> Result<
1768        Option<
1769            super::super::super::super::objects::scout::video::api::EnrichedVideoIngestStatus,
1770        >,
1771        conjure_http::private::Error,
1772    >;
1773    /// Archives a video, which excludes it from search and hides it from being publicly visible, but does not
1774    /// permanently delete it. Archived videos can be unarchived.
1775    #[endpoint(
1776        method = PUT,
1777        path = "/video/v1/videos/{videoRid}/archive",
1778        name = "archive"
1779    )]
1780    async fn archive(
1781        &self,
1782        #[auth]
1783        auth_: conjure_object::BearerToken,
1784        #[path(
1785            name = "videoRid",
1786            decoder = conjure_http::server::conjure::FromPlainDecoder,
1787            log_as = "videoRid"
1788        )]
1789        video_rid: conjure_object::ResourceIdentifier,
1790    ) -> Result<(), conjure_http::private::Error>;
1791    /// Unarchives a previously archived video.
1792    #[endpoint(
1793        method = PUT,
1794        path = "/video/v1/videos/{videoRid}/unarchive",
1795        name = "unarchive"
1796    )]
1797    async fn unarchive(
1798        &self,
1799        #[auth]
1800        auth_: conjure_object::BearerToken,
1801        #[path(
1802            name = "videoRid",
1803            decoder = conjure_http::server::conjure::FromPlainDecoder,
1804            log_as = "videoRid"
1805        )]
1806        video_rid: conjure_object::ResourceIdentifier,
1807    ) -> Result<(), conjure_http::private::Error>;
1808    /// Generates an HLS playlist for a video within optional time bounds.
1809    /// Uses GET with query parameters for HLS.js compatibility.
1810    /// The HLS playlist will contain links to all of the segments in the video that overlap with the given bounds,
1811    /// or all segments if no bounds are provided.
1812    ///
1813    /// Note: The start and end parameters must either both be provided or both be omitted.
1814    /// Providing only one will result in a MissingTimestampBoundPair error.
1815    #[endpoint(
1816        method = GET,
1817        path = "/video/v1/videos/{videoRid}/playlist",
1818        name = "getPlaylist",
1819        produces = conjure_http::server::conjure::BinaryResponseSerializer
1820    )]
1821    async fn get_playlist(
1822        &self,
1823        #[auth]
1824        auth_: conjure_object::BearerToken,
1825        #[path(
1826            name = "videoRid",
1827            decoder = conjure_http::server::conjure::FromPlainDecoder,
1828            log_as = "videoRid"
1829        )]
1830        video_rid: conjure_object::ResourceIdentifier,
1831        #[query(
1832            name = "start",
1833            decoder = conjure_http::server::conjure::FromPlainOptionDecoder
1834        )]
1835        start: Option<String>,
1836        #[query(
1837            name = "end",
1838            decoder = conjure_http::server::conjure::FromPlainOptionDecoder
1839        )]
1840        end: Option<String>,
1841    ) -> Result<Self::GetPlaylistBody, conjure_http::private::Error>;
1842    /// Returns the min and max absolute and media timestamps for each segment in a video. To be used during
1843    /// frame-timestamp mapping.
1844    #[endpoint(
1845        method = GET,
1846        path = "/video/v1/videos/{videoRid}/segment-summaries",
1847        name = "getSegmentSummaries",
1848        produces = conjure_http::server::conjure::CollectionResponseSerializer
1849    )]
1850    async fn get_segment_summaries(
1851        &self,
1852        #[auth]
1853        auth_: conjure_object::BearerToken,
1854        #[path(
1855            name = "videoRid",
1856            decoder = conjure_http::server::conjure::FromPlainDecoder,
1857            log_as = "videoRid"
1858        )]
1859        video_rid: conjure_object::ResourceIdentifier,
1860    ) -> Result<
1861        Vec<super::super::super::super::objects::scout::video::api::SegmentSummary>,
1862        conjure_http::private::Error,
1863    >;
1864    /// Generates an HLS playlist for a video with the given video rid to enable playback within an optional set of
1865    /// bounds. The HLS playlist will contain links to all of the segments in the video that overlap with the given
1866    /// bounds.
1867    /// playlist will be limited to the given bounds.
1868    #[endpoint(
1869        method = POST,
1870        path = "/video/v1/videos/{videoRid}/playlist-in-bounds",
1871        name = "getPlaylistInBounds",
1872        produces = conjure_http::server::conjure::BinaryResponseSerializer
1873    )]
1874    async fn get_playlist_in_bounds(
1875        &self,
1876        #[auth]
1877        auth_: conjure_object::BearerToken,
1878        #[path(
1879            name = "videoRid",
1880            decoder = conjure_http::server::conjure::FromPlainDecoder,
1881            log_as = "videoRid"
1882        )]
1883        video_rid: conjure_object::ResourceIdentifier,
1884        #[body(deserializer = conjure_http::server::StdRequestDeserializer, safe)]
1885        request: super::super::super::super::objects::scout::video::api::GetPlaylistInBoundsRequest,
1886    ) -> Result<Self::GetPlaylistInBoundsBody, conjure_http::private::Error>;
1887    /// Generates an HLS playlist for a video series (identified by channel + tags) within bounds.
1888    #[endpoint(
1889        method = POST,
1890        path = "/video/v2/videos/playlist-in-bounds",
1891        name = "getPlaylistInBoundsV2",
1892        produces = conjure_http::server::conjure::BinaryResponseSerializer
1893    )]
1894    async fn get_playlist_in_bounds_v2(
1895        &self,
1896        #[auth]
1897        auth_: conjure_object::BearerToken,
1898        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
1899        request: super::super::super::super::objects::scout::video::api::GetPlaylistInBoundsForChannelRequest,
1900    ) -> Result<Self::GetPlaylistInBoundsV2Body, conjure_http::private::Error>;
1901    /// Generates an HLS playlist for a video series within time bounds.
1902    /// Specify either dataSourceRid OR (assetRid + dataScopeName) to identify the series source.
1903    ///
1904    /// Note: Both start and end parameters are required and must be provided together.
1905    #[endpoint(
1906        method = GET,
1907        path = "/video/v2/videos/playlist",
1908        name = "getPlaylistV2",
1909        produces = conjure_http::server::conjure::BinaryResponseSerializer
1910    )]
1911    async fn get_playlist_v2(
1912        &self,
1913        #[auth]
1914        auth_: conjure_object::BearerToken,
1915        #[query(
1916            name = "dataSourceRid",
1917            decoder = conjure_http::server::conjure::FromPlainOptionDecoder,
1918            log_as = "dataSourceRid"
1919        )]
1920        data_source_rid: Option<conjure_object::ResourceIdentifier>,
1921        #[query(
1922            name = "assetRid",
1923            decoder = conjure_http::server::conjure::FromPlainOptionDecoder,
1924            log_as = "assetRid",
1925            safe
1926        )]
1927        asset_rid: Option<
1928            super::super::super::super::objects::scout::rids::api::AssetRid,
1929        >,
1930        #[query(
1931            name = "dataScopeName",
1932            decoder = conjure_http::server::conjure::FromPlainOptionDecoder,
1933            log_as = "dataScopeName"
1934        )]
1935        data_scope_name: Option<String>,
1936        #[query(
1937            name = "channel",
1938            decoder = conjure_http::server::conjure::FromPlainDecoder
1939        )]
1940        channel: String,
1941        #[query(
1942            name = "tags",
1943            decoder = conjure_http::server::conjure::FromPlainOptionDecoder
1944        )]
1945        tags: Option<String>,
1946        #[query(
1947            name = "start",
1948            decoder = conjure_http::server::conjure::FromPlainDecoder
1949        )]
1950        start: String,
1951        #[query(name = "end", decoder = conjure_http::server::conjure::FromPlainDecoder)]
1952        end: String,
1953    ) -> Result<Self::GetPlaylistV2Body, conjure_http::private::Error>;
1954    /// Returns the min and max absolute and media timestamps for each segment in a video that overlap with an
1955    /// optional set of bounds.
1956    #[endpoint(
1957        method = POST,
1958        path = "/video/v1/videos/{videoRid}/segment-summaries-in-bounds",
1959        name = "getSegmentSummariesInBounds",
1960        produces = conjure_http::server::conjure::CollectionResponseSerializer
1961    )]
1962    async fn get_segment_summaries_in_bounds(
1963        &self,
1964        #[auth]
1965        auth_: conjure_object::BearerToken,
1966        #[path(
1967            name = "videoRid",
1968            decoder = conjure_http::server::conjure::FromPlainDecoder,
1969            log_as = "videoRid"
1970        )]
1971        video_rid: conjure_object::ResourceIdentifier,
1972        #[body(deserializer = conjure_http::server::StdRequestDeserializer, safe)]
1973        request: super::super::super::super::objects::scout::video::api::GetSegmentSummariesInBoundsRequest,
1974    ) -> Result<
1975        Vec<super::super::super::super::objects::scout::video::api::SegmentSummary>,
1976        conjure_http::private::Error,
1977    >;
1978    /// Returns the min and max absolute and media timestamps for each segment matching a video series
1979    /// (identified by channel + tags) within the specified bounds.
1980    #[endpoint(
1981        method = POST,
1982        path = "/video/v2/videos/segment-summaries-in-bounds",
1983        name = "getSegmentSummariesInBoundsV2",
1984        produces = conjure_http::server::conjure::CollectionResponseSerializer
1985    )]
1986    async fn get_segment_summaries_in_bounds_v2(
1987        &self,
1988        #[auth]
1989        auth_: conjure_object::BearerToken,
1990        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
1991        request: super::super::super::super::objects::scout::video::api::GetSegmentSummariesInBoundsForChannelRequest,
1992    ) -> Result<
1993        Vec<super::super::super::super::objects::scout::video::api::SegmentSummaryV2>,
1994        conjure_http::private::Error,
1995    >;
1996    /// Returns aggregated segment metadata for a video channel series, including total frames,
1997    /// segment count, min/max timestamps, and average frame rate. Optionally filter by time bounds.
1998    #[endpoint(
1999        method = POST,
2000        path = "/video/v2/videos/segment-metadata",
2001        name = "getSegmentMetadataV2",
2002        produces = conjure_http::server::conjure::CollectionResponseSerializer
2003    )]
2004    async fn get_segment_metadata_v2(
2005        &self,
2006        #[auth]
2007        auth_: conjure_object::BearerToken,
2008        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
2009        request: super::super::super::super::objects::scout::video::api::GetSegmentMetadataForChannelRequest,
2010    ) -> Result<
2011        Option<
2012            super::super::super::super::objects::scout::video::api::VideoChannelSegmentsMetadata,
2013        >,
2014        conjure_http::private::Error,
2015    >;
2016    /// Returns metadata for the segment within a video series containing the requested absolute timestamp.
2017    #[endpoint(
2018        method = POST,
2019        path = "/video/v2/videos/get-segment-by-timestamp",
2020        name = "getSegmentByTimestampV2",
2021        produces = conjure_http::server::conjure::CollectionResponseSerializer
2022    )]
2023    async fn get_segment_by_timestamp_v2(
2024        &self,
2025        #[auth]
2026        auth_: conjure_object::BearerToken,
2027        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
2028        request: super::super::super::super::objects::scout::video::api::GetSegmentByTimestampV2Request,
2029    ) -> Result<
2030        Option<super::super::super::super::objects::scout::video::api::SegmentV2>,
2031        conjure_http::private::Error,
2032    >;
2033    /// Returns metadata for the segment containing the requested absolute timestamp. If no segment contains
2034    /// the timestamp, returns the closest segment starting after the timestamp. Returns empty if no segment
2035    /// is found at or after the timestamp.
2036    #[endpoint(
2037        method = POST,
2038        path = "/video/v1/videos/{videoRid}/get-segment-at-or-after-timestamp",
2039        name = "getSegmentAtOrAfterTimestamp",
2040        produces = conjure_http::server::conjure::CollectionResponseSerializer
2041    )]
2042    async fn get_segment_at_or_after_timestamp(
2043        &self,
2044        #[auth]
2045        auth_: conjure_object::BearerToken,
2046        #[path(
2047            name = "videoRid",
2048            decoder = conjure_http::server::conjure::FromPlainDecoder,
2049            log_as = "videoRid"
2050        )]
2051        video_rid: conjure_object::ResourceIdentifier,
2052        #[body(deserializer = conjure_http::server::StdRequestDeserializer, safe)]
2053        request: super::super::super::super::objects::scout::video::api::GetSegmentAtOrAfterTimestampRequest,
2054    ) -> Result<
2055        Option<super::super::super::super::objects::scout::video::api::Segment>,
2056        conjure_http::private::Error,
2057    >;
2058    /// Returns metadata for the segment containing the requested absolute timestamp for a video series
2059    /// (identified by channel + tags). If no segment contains the timestamp, returns the closest segment
2060    /// starting after the timestamp. Returns empty if no segment is found at or after the timestamp.
2061    #[endpoint(
2062        method = POST,
2063        path = "/video/v2/videos/get-segment-at-or-after-timestamp",
2064        name = "getSegmentAtOrAfterTimestampV2",
2065        produces = conjure_http::server::conjure::CollectionResponseSerializer
2066    )]
2067    async fn get_segment_at_or_after_timestamp_v2(
2068        &self,
2069        #[auth]
2070        auth_: conjure_object::BearerToken,
2071        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
2072        request: super::super::super::super::objects::scout::video::api::GetSegmentAtOrAfterTimestampV2Request,
2073    ) -> Result<
2074        Option<super::super::super::super::objects::scout::video::api::SegmentV2>,
2075        conjure_http::private::Error,
2076    >;
2077    /// Returns the min and max absolute timestamps from non-archived video files associated with a given video that
2078    /// overlap with an optional set of bounds. The files on the edges of the bounds will be truncated to segments
2079    /// that are inside or overlap with the bounds.
2080    #[endpoint(
2081        method = POST,
2082        path = "/video/v1/videos/{videoRid}/get-ranges-with-existing-segment-data",
2083        name = "getFileSummaries",
2084        produces = conjure_http::server::StdResponseSerializer
2085    )]
2086    async fn get_file_summaries(
2087        &self,
2088        #[auth]
2089        auth_: conjure_object::BearerToken,
2090        #[path(
2091            name = "videoRid",
2092            decoder = conjure_http::server::conjure::FromPlainDecoder,
2093            log_as = "videoRid"
2094        )]
2095        video_rid: conjure_object::ResourceIdentifier,
2096        #[body(deserializer = conjure_http::server::StdRequestDeserializer, safe)]
2097        request: super::super::super::super::objects::scout::video::api::GetFileSummariesRequest,
2098    ) -> Result<
2099        super::super::super::super::objects::scout::video::api::GetFileSummariesResponse,
2100        conjure_http::private::Error,
2101    >;
2102    /// Generates a stream ID scoped to a video and returns a WHIP URL with a MediaMTX JWT and ICE servers.
2103    /// Enforces write permission on the video.
2104    #[endpoint(
2105        method = POST,
2106        path = "/video/v1/videos/{videoRid}/streaming/whip",
2107        name = "generateWhipStream",
2108        produces = conjure_http::server::StdResponseSerializer
2109    )]
2110    async fn generate_whip_stream(
2111        &self,
2112        #[auth]
2113        auth_: conjure_object::BearerToken,
2114        #[path(
2115            name = "videoRid",
2116            decoder = conjure_http::server::conjure::FromPlainDecoder,
2117            log_as = "videoRid"
2118        )]
2119        video_rid: conjure_object::ResourceIdentifier,
2120    ) -> Result<
2121        super::super::super::super::objects::scout::video::api::GenerateWhipStreamResponse,
2122        conjure_http::private::Error,
2123    >;
2124    /// Generates a stream ID scoped to a channel-backed live video series and returns a WHIP URL with
2125    /// a MediaMTX JWT and ICE servers.
2126    /// Currently only datasource-backed dataset channels are supported.
2127    #[endpoint(
2128        method = POST,
2129        path = "/video/v2/videos/streaming/whip",
2130        name = "generateWhipStreamV2",
2131        produces = conjure_http::server::StdResponseSerializer
2132    )]
2133    async fn generate_whip_stream_v2(
2134        &self,
2135        #[auth]
2136        auth_: conjure_object::BearerToken,
2137        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
2138        request: super::super::super::super::objects::scout::video::api::GenerateWhipStreamV2Request,
2139    ) -> Result<
2140        super::super::super::super::objects::scout::video::api::GenerateWhipStreamResponse,
2141        conjure_http::private::Error,
2142    >;
2143    /// Returns WHEP URL, ICE servers, and token for playing back the active stream.
2144    /// Returns empty if there is no active stream.
2145    /// Enforces read permission on the video.
2146    #[endpoint(
2147        method = POST,
2148        path = "/video/v1/videos/{videoRid}/streaming/whep",
2149        name = "generateWhepStream",
2150        produces = conjure_http::server::conjure::CollectionResponseSerializer
2151    )]
2152    async fn generate_whep_stream(
2153        &self,
2154        #[auth]
2155        auth_: conjure_object::BearerToken,
2156        #[path(
2157            name = "videoRid",
2158            decoder = conjure_http::server::conjure::FromPlainDecoder,
2159            log_as = "videoRid"
2160        )]
2161        video_rid: conjure_object::ResourceIdentifier,
2162    ) -> Result<
2163        Option<
2164            super::super::super::super::objects::scout::video::api::GenerateWhepStreamResponse,
2165        >,
2166        conjure_http::private::Error,
2167    >;
2168    /// Returns WHEP URL, ICE servers, and token for playing back the active channel-backed live video stream.
2169    /// Returns empty if there is no active stream.
2170    /// Currently only datasource-backed dataset channels are supported.
2171    #[endpoint(
2172        method = POST,
2173        path = "/video/v2/videos/streaming/whep",
2174        name = "generateWhepStreamV2",
2175        produces = conjure_http::server::conjure::CollectionResponseSerializer
2176    )]
2177    async fn generate_whep_stream_v2(
2178        &self,
2179        #[auth]
2180        auth_: conjure_object::BearerToken,
2181        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
2182        request: super::super::super::super::objects::scout::video::api::GenerateWhepStreamV2Request,
2183    ) -> Result<
2184        Option<
2185            super::super::super::super::objects::scout::video::api::GenerateWhepStreamResponse,
2186        >,
2187        conjure_http::private::Error,
2188    >;
2189    /// Returns stream session metadata for a given stream ID scoped to the video.
2190    /// Enforces read permission on the video.
2191    #[endpoint(
2192        method = GET,
2193        path = "/video/v1/videos/{videoRid}/streaming/streams/{streamId}",
2194        name = "getStream",
2195        produces = conjure_http::server::conjure::CollectionResponseSerializer
2196    )]
2197    async fn get_stream(
2198        &self,
2199        #[auth]
2200        auth_: conjure_object::BearerToken,
2201        #[path(
2202            name = "videoRid",
2203            decoder = conjure_http::server::conjure::FromPlainDecoder,
2204            log_as = "videoRid"
2205        )]
2206        video_rid: conjure_object::ResourceIdentifier,
2207        #[path(
2208            name = "streamId",
2209            decoder = conjure_http::server::conjure::FromPlainDecoder,
2210            log_as = "streamId"
2211        )]
2212        stream_id: String,
2213    ) -> Result<
2214        Option<super::super::super::super::objects::scout::video::api::VideoStream>,
2215        conjure_http::private::Error,
2216    >;
2217    /// Returns all stream sessions for a video that overlap with the specified time bounds.
2218    /// A stream overlaps if there is any intersection between its [start, end] interval and the provided bounds.
2219    /// Enforces read permission on the video.
2220    #[endpoint(
2221        method = POST,
2222        path = "/video/v1/videos/{videoRid}/streaming/streams-in-bounds",
2223        name = "getStreamsInBounds",
2224        produces = conjure_http::server::StdResponseSerializer
2225    )]
2226    async fn get_streams_in_bounds(
2227        &self,
2228        #[auth]
2229        auth_: conjure_object::BearerToken,
2230        #[path(
2231            name = "videoRid",
2232            decoder = conjure_http::server::conjure::FromPlainDecoder,
2233            log_as = "videoRid"
2234        )]
2235        video_rid: conjure_object::ResourceIdentifier,
2236        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
2237        request: super::super::super::super::objects::scout::video::api::GetStreamsInBoundsRequest,
2238    ) -> Result<
2239        super::super::super::super::objects::scout::video::api::GetStreamsInBoundsResponse,
2240        conjure_http::private::Error,
2241    >;
2242    /// Returns all channel-backed stream sessions for a dataset/channel that overlap with the specified time bounds.
2243    /// A stream overlaps if there is any intersection between its [start, end] interval and the provided bounds.
2244    /// Enforces read metadata permission on the dataset.
2245    #[endpoint(
2246        method = POST,
2247        path = "/video/v2/videos/streaming/streams-in-bounds",
2248        name = "getStreamsInBoundsV2",
2249        produces = conjure_http::server::StdResponseSerializer
2250    )]
2251    async fn get_streams_in_bounds_v2(
2252        &self,
2253        #[auth]
2254        auth_: conjure_object::BearerToken,
2255        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
2256        request: super::super::super::super::objects::scout::video::api::GetStreamsInBoundsForChannelRequest,
2257    ) -> Result<
2258        super::super::super::super::objects::scout::video::api::GetStreamsInBoundsV2Response,
2259        conjure_http::private::Error,
2260    >;
2261    /// Returns the dataset files backing a video channel (identified by channel + tags), ordered by
2262    /// start timestamp ascending and paginated. Each entry carries the min/max absolute timestamps the
2263    /// file contributes to the channel. Optionally filtered by time bounds. Streamed sessions are not
2264    /// included; use getStreamsInBoundsV2 for those.
2265    /// Enforces read metadata permission on the datasource.
2266    #[endpoint(
2267        method = POST,
2268        path = "/video/v2/videos/channel-dataset-files",
2269        name = "listVideoChannelDatasetFiles",
2270        produces = conjure_http::server::StdResponseSerializer
2271    )]
2272    async fn list_video_channel_dataset_files(
2273        &self,
2274        #[auth]
2275        auth_: conjure_object::BearerToken,
2276        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
2277        request: super::super::super::super::objects::scout::video::api::ListVideoChannelDatasetFilesRequest,
2278    ) -> Result<
2279        super::super::super::super::objects::scout::video::api::ListVideoChannelDatasetFilesResponse,
2280        conjure_http::private::Error,
2281    >;
2282    /// Updates one or more video dataset files in a channel in a single transaction. Each update may set a new
2283    /// absolute start timestamp (segments shifted so the earliest starts at the given timestamp), a scale
2284    /// parameter (frame timestamps rescaled around the file's start), and/or a new title (file name). If a
2285    /// resulting layout would overlap segments of another file in the channel, no files are updated and
2286    /// VIDEO_SEGMENT_CONFLICT is thrown (all-or-nothing). Returns the updated files with their new bounds.
2287    /// Currently only datasource-backed dataset channels are supported.
2288    /// Enforces write data permission on the datasource.
2289    #[endpoint(
2290        method = POST,
2291        path = "/video/v2/videos/channel-dataset-files/batch-update",
2292        name = "batchUpdateVideoChannelDatasetFiles",
2293        produces = conjure_http::server::StdResponseSerializer
2294    )]
2295    async fn batch_update_video_channel_dataset_files(
2296        &self,
2297        #[auth]
2298        auth_: conjure_object::BearerToken,
2299        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
2300        request: super::super::super::super::objects::scout::video::api::BatchUpdateVideoChannelDatasetFilesRequest,
2301    ) -> Result<
2302        super::super::super::super::objects::scout::video::api::BatchUpdateVideoChannelDatasetFilesResponse,
2303        conjure_http::private::Error,
2304    >;
2305    /// Marks the active stream session as ended for the video.
2306    /// Throws VIDEO_NOT_FOUND if no active stream exists.
2307    /// Enforces write permission on the video.
2308    #[endpoint(
2309        method = POST,
2310        path = "/video/v1/videos/{videoRid}/streaming/end",
2311        name = "endStream",
2312        produces = conjure_http::server::StdResponseSerializer
2313    )]
2314    async fn end_stream(
2315        &self,
2316        #[auth]
2317        auth_: conjure_object::BearerToken,
2318        #[path(
2319            name = "videoRid",
2320            decoder = conjure_http::server::conjure::FromPlainDecoder,
2321            log_as = "videoRid"
2322        )]
2323        video_rid: conjure_object::ResourceIdentifier,
2324    ) -> Result<
2325        super::super::super::super::objects::scout::video::api::EndStreamResponse,
2326        conjure_http::private::Error,
2327    >;
2328    /// MediaMTX segment upload endpoint. Receives video segments from MediaMTX hooks.
2329    /// Validates JWT and logs session. Future: create video segments from uploaded files.
2330    #[endpoint(
2331        method = POST,
2332        path = "/video/v1/segment/upload",
2333        name = "uploadSegmentFromMediaMtx"
2334    )]
2335    async fn upload_segment_from_media_mtx(
2336        &self,
2337        #[auth]
2338        auth_: conjure_object::BearerToken,
2339        #[query(
2340            name = "streamPath",
2341            decoder = conjure_http::server::conjure::FromPlainDecoder,
2342            log_as = "streamPath"
2343        )]
2344        stream_path: String,
2345        #[query(
2346            name = "filePath",
2347            decoder = conjure_http::server::conjure::FromPlainDecoder,
2348            log_as = "filePath"
2349        )]
2350        file_path: String,
2351        #[query(
2352            name = "duration",
2353            decoder = conjure_http::server::conjure::FromPlainDecoder
2354        )]
2355        duration: String,
2356        #[query(
2357            name = "minTimestampSeconds",
2358            decoder = conjure_http::server::conjure::FromPlainDecoder,
2359            log_as = "minTimestampSeconds"
2360        )]
2361        min_timestamp_seconds: conjure_object::SafeLong,
2362        #[query(
2363            name = "minTimestampNanos",
2364            decoder = conjure_http::server::conjure::FromPlainDecoder,
2365            log_as = "minTimestampNanos"
2366        )]
2367        min_timestamp_nanos: conjure_object::SafeLong,
2368        #[header(
2369            name = "Content-Length",
2370            decoder = conjure_http::server::conjure::FromPlainDecoder,
2371            log_as = "contentLength"
2372        )]
2373        content_length: conjure_object::SafeLong,
2374        #[body(deserializer = conjure_http::server::conjure::BinaryRequestDeserializer)]
2375        body: I,
2376    ) -> Result<(), conjure_http::private::Error>;
2377}