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