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.
722    /// Currently only datasource-backed dataset channels are supported.
723    /// Enforces write data permission on the datasource.
724    #[endpoint(
725        method = POST,
726        path = "/video/v2/videos/channel-dataset-files/batch-update",
727        name = "batchUpdateVideoChannelDatasetFiles",
728        produces = conjure_http::server::StdResponseSerializer
729    )]
730    fn batch_update_video_channel_dataset_files(
731        &self,
732        #[auth]
733        auth_: conjure_object::BearerToken,
734        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
735        request: super::super::super::super::objects::scout::video::api::BatchUpdateVideoChannelDatasetFilesRequest,
736    ) -> Result<
737        super::super::super::super::objects::scout::video::api::BatchUpdateVideoChannelDatasetFilesResponse,
738        conjure_http::private::Error,
739    >;
740    /// Marks the active stream session as ended for the video.
741    /// Throws VIDEO_NOT_FOUND if no active stream exists.
742    /// Enforces write permission on the video.
743    #[endpoint(
744        method = POST,
745        path = "/video/v1/videos/{videoRid}/streaming/end",
746        name = "endStream",
747        produces = conjure_http::server::StdResponseSerializer
748    )]
749    fn end_stream(
750        &self,
751        #[auth]
752        auth_: conjure_object::BearerToken,
753        #[path(
754            name = "videoRid",
755            decoder = conjure_http::server::conjure::FromPlainDecoder,
756            log_as = "videoRid",
757            safe
758        )]
759        video_rid: super::super::super::super::objects::api::rids::VideoRid,
760    ) -> Result<
761        super::super::super::super::objects::scout::video::api::EndStreamResponse,
762        conjure_http::private::Error,
763    >;
764    /// MediaMTX segment upload endpoint. Receives video segments from MediaMTX hooks.
765    /// Validates JWT and logs session. Future: create video segments from uploaded files.
766    #[endpoint(
767        method = POST,
768        path = "/video/v1/segment/upload",
769        name = "uploadSegmentFromMediaMtx"
770    )]
771    fn upload_segment_from_media_mtx(
772        &self,
773        #[auth]
774        auth_: conjure_object::BearerToken,
775        #[query(
776            name = "streamPath",
777            decoder = conjure_http::server::conjure::FromPlainDecoder,
778            log_as = "streamPath"
779        )]
780        stream_path: String,
781        #[query(
782            name = "filePath",
783            decoder = conjure_http::server::conjure::FromPlainDecoder,
784            log_as = "filePath"
785        )]
786        file_path: String,
787        #[query(
788            name = "duration",
789            decoder = conjure_http::server::conjure::FromPlainDecoder
790        )]
791        duration: String,
792        #[query(
793            name = "minTimestampSeconds",
794            decoder = conjure_http::server::conjure::FromPlainDecoder,
795            log_as = "minTimestampSeconds"
796        )]
797        min_timestamp_seconds: conjure_object::SafeLong,
798        #[query(
799            name = "minTimestampNanos",
800            decoder = conjure_http::server::conjure::FromPlainDecoder,
801            log_as = "minTimestampNanos"
802        )]
803        min_timestamp_nanos: conjure_object::SafeLong,
804        #[header(
805            name = "Content-Length",
806            decoder = conjure_http::server::conjure::FromPlainDecoder,
807            log_as = "contentLength"
808        )]
809        content_length: conjure_object::SafeLong,
810        #[body(deserializer = conjure_http::server::conjure::BinaryRequestDeserializer)]
811        body: I,
812    ) -> Result<(), conjure_http::private::Error>;
813}
814/// The video service manages videos and video metadata.
815#[conjure_http::conjure_endpoints(name = "VideoService", use_legacy_error_serialization)]
816pub trait AsyncVideoService<#[request_body] I, #[response_writer] O> {
817    ///The body type returned by the `get_playlist` method.
818    type GetPlaylistBody: conjure_http::server::AsyncWriteBody<O> + 'static + Send;
819    ///The body type returned by the `get_playlist_in_bounds` method.
820    type GetPlaylistInBoundsBody: conjure_http::server::AsyncWriteBody<O>
821        + 'static
822        + Send;
823    ///The body type returned by the `get_playlist_in_bounds_v2` method.
824    type GetPlaylistInBoundsV2Body: conjure_http::server::AsyncWriteBody<O>
825        + 'static
826        + Send;
827    ///The body type returned by the `get_playlist_v2` method.
828    type GetPlaylistV2Body: conjure_http::server::AsyncWriteBody<O> + 'static + Send;
829    /// Returns video metadata associated with a video rid.
830    #[endpoint(
831        method = GET,
832        path = "/video/v1/videos/{videoRid}",
833        name = "get",
834        produces = conjure_http::server::StdResponseSerializer
835    )]
836    async fn get(
837        &self,
838        #[auth]
839        auth_: conjure_object::BearerToken,
840        #[path(
841            name = "videoRid",
842            decoder = conjure_http::server::conjure::FromPlainDecoder,
843            log_as = "videoRid",
844            safe
845        )]
846        video_rid: super::super::super::super::objects::api::rids::VideoRid,
847    ) -> Result<
848        super::super::super::super::objects::scout::video::api::Video,
849        conjure_http::private::Error,
850    >;
851    /// Returns video metadata about each video given a set of video rids.
852    #[endpoint(
853        method = POST,
854        path = "/video/v1/videos/batchGet",
855        name = "batchGet",
856        produces = conjure_http::server::StdResponseSerializer
857    )]
858    async fn batch_get(
859        &self,
860        #[auth]
861        auth_: conjure_object::BearerToken,
862        #[body(deserializer = conjure_http::server::StdRequestDeserializer, safe)]
863        request: super::super::super::super::objects::scout::video::api::GetVideosRequest,
864    ) -> Result<
865        super::super::super::super::objects::scout::video::api::GetVideosResponse,
866        conjure_http::private::Error,
867    >;
868    /// Returns metadata about videos that match a given query.
869    #[endpoint(
870        method = POST,
871        path = "/video/v1/videos/search",
872        name = "search",
873        produces = conjure_http::server::StdResponseSerializer
874    )]
875    async fn search(
876        &self,
877        #[auth]
878        auth_: conjure_object::BearerToken,
879        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
880        request: super::super::super::super::objects::scout::video::api::SearchVideosRequest,
881    ) -> Result<
882        super::super::super::super::objects::scout::video::api::SearchVideosResponse,
883        conjure_http::private::Error,
884    >;
885    /// Creates and persists a video entity with the given metadata.
886    #[endpoint(
887        method = POST,
888        path = "/video/v1/videos",
889        name = "create",
890        produces = conjure_http::server::StdResponseSerializer
891    )]
892    async fn create(
893        &self,
894        #[auth]
895        auth_: conjure_object::BearerToken,
896        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
897        request: super::super::super::super::objects::scout::video::api::CreateVideoRequest,
898    ) -> Result<
899        super::super::super::super::objects::scout::video::api::Video,
900        conjure_http::private::Error,
901    >;
902    /// Updates the metadata for a video associated with the given video rid.
903    #[endpoint(
904        method = PUT,
905        path = "/video/v1/videos/{videoRid}",
906        name = "updateMetadata",
907        produces = conjure_http::server::StdResponseSerializer
908    )]
909    async fn update_metadata(
910        &self,
911        #[auth]
912        auth_: conjure_object::BearerToken,
913        #[path(
914            name = "videoRid",
915            decoder = conjure_http::server::conjure::FromPlainDecoder,
916            log_as = "videoRid",
917            safe
918        )]
919        video_rid: super::super::super::super::objects::api::rids::VideoRid,
920        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
921        request: super::super::super::super::objects::scout::video::api::UpdateVideoMetadataRequest,
922    ) -> Result<
923        super::super::super::super::objects::scout::video::api::Video,
924        conjure_http::private::Error,
925    >;
926    #[endpoint(
927        method = PUT,
928        path = "/video/v1/videos/{videoRid}/ingest-status",
929        name = "updateIngestStatus"
930    )]
931    async fn update_ingest_status(
932        &self,
933        #[auth]
934        auth_: conjure_object::BearerToken,
935        #[path(
936            name = "videoRid",
937            decoder = conjure_http::server::conjure::FromPlainDecoder,
938            log_as = "videoRid",
939            safe
940        )]
941        video_rid: super::super::super::super::objects::api::rids::VideoRid,
942        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
943        request: super::super::super::super::objects::scout::video::api::UpdateIngestStatus,
944    ) -> Result<(), conjure_http::private::Error>;
945    #[endpoint(
946        method = GET,
947        path = "/video/v1/videos/{videoRid}/ingest-status",
948        name = "getIngestStatus",
949        produces = conjure_http::server::StdResponseSerializer
950    )]
951    async fn get_ingest_status(
952        &self,
953        #[auth]
954        auth_: conjure_object::BearerToken,
955        #[path(
956            name = "videoRid",
957            decoder = conjure_http::server::conjure::FromPlainDecoder,
958            log_as = "videoRid",
959            safe
960        )]
961        video_rid: super::super::super::super::objects::api::rids::VideoRid,
962    ) -> Result<
963        super::super::super::super::objects::scout::video::api::DetailedIngestStatus,
964        conjure_http::private::Error,
965    >;
966    #[endpoint(
967        method = POST,
968        path = "/video/v1/videos/batch-get-ingest-status",
969        name = "batchGetIngestStatus",
970        produces = conjure_http::server::conjure::CollectionResponseSerializer
971    )]
972    async fn batch_get_ingest_status(
973        &self,
974        #[auth]
975        auth_: conjure_object::BearerToken,
976        #[body(
977            deserializer = conjure_http::server::StdRequestDeserializer,
978            log_as = "videoRids",
979            safe
980        )]
981        video_rids: std::collections::BTreeSet<
982            super::super::super::super::objects::api::rids::VideoRid,
983        >,
984    ) -> Result<
985        std::collections::BTreeMap<
986            super::super::super::super::objects::api::rids::VideoRid,
987            super::super::super::super::objects::scout::video::api::DetailedIngestStatus,
988        >,
989        conjure_http::private::Error,
990    >;
991    #[endpoint(
992        method = POST,
993        path = "/video/v1/videos/enriched-ingest-status",
994        name = "getEnrichedIngestStatus",
995        produces = conjure_http::server::conjure::CollectionResponseSerializer
996    )]
997    async fn get_enriched_ingest_status(
998        &self,
999        #[auth]
1000        auth_: conjure_object::BearerToken,
1001        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
1002        request: super::super::super::super::objects::scout::video::api::GetEnrichedVideoIngestStatusRequest,
1003    ) -> Result<
1004        Option<
1005            super::super::super::super::objects::scout::video::api::EnrichedVideoIngestStatus,
1006        >,
1007        conjure_http::private::Error,
1008    >;
1009    /// Archives a video, which excludes it from search and hides it from being publicly visible, but does not
1010    /// permanently delete it. Archived videos can be unarchived.
1011    #[endpoint(
1012        method = PUT,
1013        path = "/video/v1/videos/{videoRid}/archive",
1014        name = "archive"
1015    )]
1016    async fn archive(
1017        &self,
1018        #[auth]
1019        auth_: conjure_object::BearerToken,
1020        #[path(
1021            name = "videoRid",
1022            decoder = conjure_http::server::conjure::FromPlainDecoder,
1023            log_as = "videoRid",
1024            safe
1025        )]
1026        video_rid: super::super::super::super::objects::api::rids::VideoRid,
1027    ) -> Result<(), conjure_http::private::Error>;
1028    /// Unarchives a previously archived video.
1029    #[endpoint(
1030        method = PUT,
1031        path = "/video/v1/videos/{videoRid}/unarchive",
1032        name = "unarchive"
1033    )]
1034    async fn unarchive(
1035        &self,
1036        #[auth]
1037        auth_: conjure_object::BearerToken,
1038        #[path(
1039            name = "videoRid",
1040            decoder = conjure_http::server::conjure::FromPlainDecoder,
1041            log_as = "videoRid",
1042            safe
1043        )]
1044        video_rid: super::super::super::super::objects::api::rids::VideoRid,
1045    ) -> Result<(), conjure_http::private::Error>;
1046    /// Generates an HLS playlist for a video within optional time bounds.
1047    /// Uses GET with query parameters for HLS.js compatibility.
1048    /// The HLS playlist will contain links to all of the segments in the video that overlap with the given bounds,
1049    /// or all segments if no bounds are provided.
1050    ///
1051    /// Note: The start and end parameters must either both be provided or both be omitted.
1052    /// Providing only one will result in a MissingTimestampBoundPair error.
1053    #[endpoint(
1054        method = GET,
1055        path = "/video/v1/videos/{videoRid}/playlist",
1056        name = "getPlaylist",
1057        produces = conjure_http::server::conjure::BinaryResponseSerializer
1058    )]
1059    async fn get_playlist(
1060        &self,
1061        #[auth]
1062        auth_: conjure_object::BearerToken,
1063        #[path(
1064            name = "videoRid",
1065            decoder = conjure_http::server::conjure::FromPlainDecoder,
1066            log_as = "videoRid",
1067            safe
1068        )]
1069        video_rid: super::super::super::super::objects::api::rids::VideoRid,
1070        #[query(
1071            name = "start",
1072            decoder = conjure_http::server::conjure::FromPlainOptionDecoder
1073        )]
1074        start: Option<String>,
1075        #[query(
1076            name = "end",
1077            decoder = conjure_http::server::conjure::FromPlainOptionDecoder
1078        )]
1079        end: Option<String>,
1080    ) -> Result<Self::GetPlaylistBody, conjure_http::private::Error>;
1081    /// Returns the min and max absolute and media timestamps for each segment in a video. To be used during
1082    /// frame-timestamp mapping.
1083    #[endpoint(
1084        method = GET,
1085        path = "/video/v1/videos/{videoRid}/segment-summaries",
1086        name = "getSegmentSummaries",
1087        produces = conjure_http::server::conjure::CollectionResponseSerializer
1088    )]
1089    async fn get_segment_summaries(
1090        &self,
1091        #[auth]
1092        auth_: conjure_object::BearerToken,
1093        #[path(
1094            name = "videoRid",
1095            decoder = conjure_http::server::conjure::FromPlainDecoder,
1096            log_as = "videoRid",
1097            safe
1098        )]
1099        video_rid: super::super::super::super::objects::api::rids::VideoRid,
1100    ) -> Result<
1101        Vec<super::super::super::super::objects::scout::video::api::SegmentSummary>,
1102        conjure_http::private::Error,
1103    >;
1104    /// Generates an HLS playlist for a video with the given video rid to enable playback within an optional set of
1105    /// bounds. The HLS playlist will contain links to all of the segments in the video that overlap with the given
1106    /// bounds.
1107    /// playlist will be limited to the given bounds.
1108    #[endpoint(
1109        method = POST,
1110        path = "/video/v1/videos/{videoRid}/playlist-in-bounds",
1111        name = "getPlaylistInBounds",
1112        produces = conjure_http::server::conjure::BinaryResponseSerializer
1113    )]
1114    async fn get_playlist_in_bounds(
1115        &self,
1116        #[auth]
1117        auth_: conjure_object::BearerToken,
1118        #[path(
1119            name = "videoRid",
1120            decoder = conjure_http::server::conjure::FromPlainDecoder,
1121            log_as = "videoRid",
1122            safe
1123        )]
1124        video_rid: super::super::super::super::objects::api::rids::VideoRid,
1125        #[body(deserializer = conjure_http::server::StdRequestDeserializer, safe)]
1126        request: super::super::super::super::objects::scout::video::api::GetPlaylistInBoundsRequest,
1127    ) -> Result<Self::GetPlaylistInBoundsBody, conjure_http::private::Error>;
1128    /// Generates an HLS playlist for a video series (identified by channel + tags) within bounds.
1129    #[endpoint(
1130        method = POST,
1131        path = "/video/v2/videos/playlist-in-bounds",
1132        name = "getPlaylistInBoundsV2",
1133        produces = conjure_http::server::conjure::BinaryResponseSerializer
1134    )]
1135    async fn get_playlist_in_bounds_v2(
1136        &self,
1137        #[auth]
1138        auth_: conjure_object::BearerToken,
1139        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
1140        request: super::super::super::super::objects::scout::video::api::GetPlaylistInBoundsForChannelRequest,
1141    ) -> Result<Self::GetPlaylistInBoundsV2Body, conjure_http::private::Error>;
1142    /// Generates an HLS playlist for a video series within time bounds.
1143    /// Specify either dataSourceRid OR (assetRid + dataScopeName) to identify the series source.
1144    ///
1145    /// Note: Both start and end parameters are required and must be provided together.
1146    #[endpoint(
1147        method = GET,
1148        path = "/video/v2/videos/playlist",
1149        name = "getPlaylistV2",
1150        produces = conjure_http::server::conjure::BinaryResponseSerializer
1151    )]
1152    async fn get_playlist_v2(
1153        &self,
1154        #[auth]
1155        auth_: conjure_object::BearerToken,
1156        #[query(
1157            name = "dataSourceRid",
1158            decoder = conjure_http::server::conjure::FromPlainOptionDecoder,
1159            log_as = "dataSourceRid",
1160            safe
1161        )]
1162        data_source_rid: Option<
1163            super::super::super::super::objects::api::rids::DataSourceRid,
1164        >,
1165        #[query(
1166            name = "assetRid",
1167            decoder = conjure_http::server::conjure::FromPlainOptionDecoder,
1168            log_as = "assetRid",
1169            safe
1170        )]
1171        asset_rid: Option<
1172            super::super::super::super::objects::scout::rids::api::AssetRid,
1173        >,
1174        #[query(
1175            name = "dataScopeName",
1176            decoder = conjure_http::server::conjure::FromPlainOptionDecoder,
1177            log_as = "dataScopeName"
1178        )]
1179        data_scope_name: Option<String>,
1180        #[query(
1181            name = "channel",
1182            decoder = conjure_http::server::conjure::FromPlainDecoder
1183        )]
1184        channel: String,
1185        #[query(
1186            name = "tags",
1187            decoder = conjure_http::server::conjure::FromPlainOptionDecoder
1188        )]
1189        tags: Option<String>,
1190        #[query(
1191            name = "start",
1192            decoder = conjure_http::server::conjure::FromPlainDecoder
1193        )]
1194        start: String,
1195        #[query(name = "end", decoder = conjure_http::server::conjure::FromPlainDecoder)]
1196        end: String,
1197    ) -> Result<Self::GetPlaylistV2Body, conjure_http::private::Error>;
1198    /// Returns the min and max absolute and media timestamps for each segment in a video that overlap with an
1199    /// optional set of bounds.
1200    #[endpoint(
1201        method = POST,
1202        path = "/video/v1/videos/{videoRid}/segment-summaries-in-bounds",
1203        name = "getSegmentSummariesInBounds",
1204        produces = conjure_http::server::conjure::CollectionResponseSerializer
1205    )]
1206    async fn get_segment_summaries_in_bounds(
1207        &self,
1208        #[auth]
1209        auth_: conjure_object::BearerToken,
1210        #[path(
1211            name = "videoRid",
1212            decoder = conjure_http::server::conjure::FromPlainDecoder,
1213            log_as = "videoRid",
1214            safe
1215        )]
1216        video_rid: super::super::super::super::objects::api::rids::VideoRid,
1217        #[body(deserializer = conjure_http::server::StdRequestDeserializer, safe)]
1218        request: super::super::super::super::objects::scout::video::api::GetSegmentSummariesInBoundsRequest,
1219    ) -> Result<
1220        Vec<super::super::super::super::objects::scout::video::api::SegmentSummary>,
1221        conjure_http::private::Error,
1222    >;
1223    /// Returns the min and max absolute and media timestamps for each segment matching a video series
1224    /// (identified by channel + tags) within the specified bounds.
1225    #[endpoint(
1226        method = POST,
1227        path = "/video/v2/videos/segment-summaries-in-bounds",
1228        name = "getSegmentSummariesInBoundsV2",
1229        produces = conjure_http::server::conjure::CollectionResponseSerializer
1230    )]
1231    async fn get_segment_summaries_in_bounds_v2(
1232        &self,
1233        #[auth]
1234        auth_: conjure_object::BearerToken,
1235        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
1236        request: super::super::super::super::objects::scout::video::api::GetSegmentSummariesInBoundsForChannelRequest,
1237    ) -> Result<
1238        Vec<super::super::super::super::objects::scout::video::api::SegmentSummaryV2>,
1239        conjure_http::private::Error,
1240    >;
1241    /// Returns aggregated segment metadata for a video channel series, including total frames,
1242    /// segment count, min/max timestamps, and average frame rate. Optionally filter by time bounds.
1243    #[endpoint(
1244        method = POST,
1245        path = "/video/v2/videos/segment-metadata",
1246        name = "getSegmentMetadataV2",
1247        produces = conjure_http::server::conjure::CollectionResponseSerializer
1248    )]
1249    async fn get_segment_metadata_v2(
1250        &self,
1251        #[auth]
1252        auth_: conjure_object::BearerToken,
1253        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
1254        request: super::super::super::super::objects::scout::video::api::GetSegmentMetadataForChannelRequest,
1255    ) -> Result<
1256        Option<
1257            super::super::super::super::objects::scout::video::api::VideoChannelSegmentsMetadata,
1258        >,
1259        conjure_http::private::Error,
1260    >;
1261    /// Returns metadata for the segment within a video series containing the requested absolute timestamp.
1262    #[endpoint(
1263        method = POST,
1264        path = "/video/v2/videos/get-segment-by-timestamp",
1265        name = "getSegmentByTimestampV2",
1266        produces = conjure_http::server::conjure::CollectionResponseSerializer
1267    )]
1268    async fn get_segment_by_timestamp_v2(
1269        &self,
1270        #[auth]
1271        auth_: conjure_object::BearerToken,
1272        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
1273        request: super::super::super::super::objects::scout::video::api::GetSegmentByTimestampV2Request,
1274    ) -> Result<
1275        Option<super::super::super::super::objects::scout::video::api::SegmentV2>,
1276        conjure_http::private::Error,
1277    >;
1278    /// Returns metadata for the segment containing the requested absolute timestamp. If no segment contains
1279    /// the timestamp, returns the closest segment starting after the timestamp. Returns empty if no segment
1280    /// is found at or after the timestamp.
1281    #[endpoint(
1282        method = POST,
1283        path = "/video/v1/videos/{videoRid}/get-segment-at-or-after-timestamp",
1284        name = "getSegmentAtOrAfterTimestamp",
1285        produces = conjure_http::server::conjure::CollectionResponseSerializer
1286    )]
1287    async fn get_segment_at_or_after_timestamp(
1288        &self,
1289        #[auth]
1290        auth_: conjure_object::BearerToken,
1291        #[path(
1292            name = "videoRid",
1293            decoder = conjure_http::server::conjure::FromPlainDecoder,
1294            log_as = "videoRid",
1295            safe
1296        )]
1297        video_rid: super::super::super::super::objects::api::rids::VideoRid,
1298        #[body(deserializer = conjure_http::server::StdRequestDeserializer, safe)]
1299        request: super::super::super::super::objects::scout::video::api::GetSegmentAtOrAfterTimestampRequest,
1300    ) -> Result<
1301        Option<super::super::super::super::objects::scout::video::api::Segment>,
1302        conjure_http::private::Error,
1303    >;
1304    /// Returns metadata for the segment containing the requested absolute timestamp for a video series
1305    /// (identified by channel + tags). If no segment contains the timestamp, returns the closest segment
1306    /// starting after the timestamp. Returns empty if no segment is found at or after the timestamp.
1307    #[endpoint(
1308        method = POST,
1309        path = "/video/v2/videos/get-segment-at-or-after-timestamp",
1310        name = "getSegmentAtOrAfterTimestampV2",
1311        produces = conjure_http::server::conjure::CollectionResponseSerializer
1312    )]
1313    async fn get_segment_at_or_after_timestamp_v2(
1314        &self,
1315        #[auth]
1316        auth_: conjure_object::BearerToken,
1317        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
1318        request: super::super::super::super::objects::scout::video::api::GetSegmentAtOrAfterTimestampV2Request,
1319    ) -> Result<
1320        Option<super::super::super::super::objects::scout::video::api::SegmentV2>,
1321        conjure_http::private::Error,
1322    >;
1323    /// Returns the min and max absolute timestamps from non-archived video files associated with a given video that
1324    /// overlap with an optional set of bounds. The files on the edges of the bounds will be truncated to segments
1325    /// that are inside or overlap with the bounds.
1326    #[endpoint(
1327        method = POST,
1328        path = "/video/v1/videos/{videoRid}/get-ranges-with-existing-segment-data",
1329        name = "getFileSummaries",
1330        produces = conjure_http::server::StdResponseSerializer
1331    )]
1332    async fn get_file_summaries(
1333        &self,
1334        #[auth]
1335        auth_: conjure_object::BearerToken,
1336        #[path(
1337            name = "videoRid",
1338            decoder = conjure_http::server::conjure::FromPlainDecoder,
1339            log_as = "videoRid",
1340            safe
1341        )]
1342        video_rid: super::super::super::super::objects::api::rids::VideoRid,
1343        #[body(deserializer = conjure_http::server::StdRequestDeserializer, safe)]
1344        request: super::super::super::super::objects::scout::video::api::GetFileSummariesRequest,
1345    ) -> Result<
1346        super::super::super::super::objects::scout::video::api::GetFileSummariesResponse,
1347        conjure_http::private::Error,
1348    >;
1349    /// Generates a stream ID scoped to a video and returns a WHIP URL with a MediaMTX JWT and ICE servers.
1350    /// Enforces write permission on the video.
1351    #[endpoint(
1352        method = POST,
1353        path = "/video/v1/videos/{videoRid}/streaming/whip",
1354        name = "generateWhipStream",
1355        produces = conjure_http::server::StdResponseSerializer
1356    )]
1357    async fn generate_whip_stream(
1358        &self,
1359        #[auth]
1360        auth_: conjure_object::BearerToken,
1361        #[path(
1362            name = "videoRid",
1363            decoder = conjure_http::server::conjure::FromPlainDecoder,
1364            log_as = "videoRid",
1365            safe
1366        )]
1367        video_rid: super::super::super::super::objects::api::rids::VideoRid,
1368    ) -> Result<
1369        super::super::super::super::objects::scout::video::api::GenerateWhipStreamResponse,
1370        conjure_http::private::Error,
1371    >;
1372    /// Generates a stream ID scoped to a channel-backed live video series and returns a WHIP URL with
1373    /// a MediaMTX JWT and ICE servers.
1374    /// Currently only datasource-backed dataset channels are supported.
1375    #[endpoint(
1376        method = POST,
1377        path = "/video/v2/videos/streaming/whip",
1378        name = "generateWhipStreamV2",
1379        produces = conjure_http::server::StdResponseSerializer
1380    )]
1381    async fn generate_whip_stream_v2(
1382        &self,
1383        #[auth]
1384        auth_: conjure_object::BearerToken,
1385        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
1386        request: super::super::super::super::objects::scout::video::api::GenerateWhipStreamV2Request,
1387    ) -> Result<
1388        super::super::super::super::objects::scout::video::api::GenerateWhipStreamResponse,
1389        conjure_http::private::Error,
1390    >;
1391    /// Returns WHEP URL, ICE servers, and token for playing back the active stream.
1392    /// Returns empty if there is no active stream.
1393    /// Enforces read permission on the video.
1394    #[endpoint(
1395        method = POST,
1396        path = "/video/v1/videos/{videoRid}/streaming/whep",
1397        name = "generateWhepStream",
1398        produces = conjure_http::server::conjure::CollectionResponseSerializer
1399    )]
1400    async fn generate_whep_stream(
1401        &self,
1402        #[auth]
1403        auth_: conjure_object::BearerToken,
1404        #[path(
1405            name = "videoRid",
1406            decoder = conjure_http::server::conjure::FromPlainDecoder,
1407            log_as = "videoRid",
1408            safe
1409        )]
1410        video_rid: super::super::super::super::objects::api::rids::VideoRid,
1411    ) -> Result<
1412        Option<
1413            super::super::super::super::objects::scout::video::api::GenerateWhepStreamResponse,
1414        >,
1415        conjure_http::private::Error,
1416    >;
1417    /// Returns WHEP URL, ICE servers, and token for playing back the active channel-backed live video stream.
1418    /// Returns empty if there is no active stream.
1419    /// Currently only datasource-backed dataset channels are supported.
1420    #[endpoint(
1421        method = POST,
1422        path = "/video/v2/videos/streaming/whep",
1423        name = "generateWhepStreamV2",
1424        produces = conjure_http::server::conjure::CollectionResponseSerializer
1425    )]
1426    async fn generate_whep_stream_v2(
1427        &self,
1428        #[auth]
1429        auth_: conjure_object::BearerToken,
1430        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
1431        request: super::super::super::super::objects::scout::video::api::GenerateWhepStreamV2Request,
1432    ) -> Result<
1433        Option<
1434            super::super::super::super::objects::scout::video::api::GenerateWhepStreamResponse,
1435        >,
1436        conjure_http::private::Error,
1437    >;
1438    /// Returns stream session metadata for a given stream ID scoped to the video.
1439    /// Enforces read permission on the video.
1440    #[endpoint(
1441        method = GET,
1442        path = "/video/v1/videos/{videoRid}/streaming/streams/{streamId}",
1443        name = "getStream",
1444        produces = conjure_http::server::conjure::CollectionResponseSerializer
1445    )]
1446    async fn get_stream(
1447        &self,
1448        #[auth]
1449        auth_: conjure_object::BearerToken,
1450        #[path(
1451            name = "videoRid",
1452            decoder = conjure_http::server::conjure::FromPlainDecoder,
1453            log_as = "videoRid",
1454            safe
1455        )]
1456        video_rid: super::super::super::super::objects::api::rids::VideoRid,
1457        #[path(
1458            name = "streamId",
1459            decoder = conjure_http::server::conjure::FromPlainDecoder,
1460            log_as = "streamId"
1461        )]
1462        stream_id: String,
1463    ) -> Result<
1464        Option<super::super::super::super::objects::scout::video::api::VideoStream>,
1465        conjure_http::private::Error,
1466    >;
1467    /// Returns all stream sessions for a video that overlap with the specified time bounds.
1468    /// A stream overlaps if there is any intersection between its [start, end] interval and the provided bounds.
1469    /// Enforces read permission on the video.
1470    #[endpoint(
1471        method = POST,
1472        path = "/video/v1/videos/{videoRid}/streaming/streams-in-bounds",
1473        name = "getStreamsInBounds",
1474        produces = conjure_http::server::StdResponseSerializer
1475    )]
1476    async fn get_streams_in_bounds(
1477        &self,
1478        #[auth]
1479        auth_: conjure_object::BearerToken,
1480        #[path(
1481            name = "videoRid",
1482            decoder = conjure_http::server::conjure::FromPlainDecoder,
1483            log_as = "videoRid",
1484            safe
1485        )]
1486        video_rid: super::super::super::super::objects::api::rids::VideoRid,
1487        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
1488        request: super::super::super::super::objects::scout::video::api::GetStreamsInBoundsRequest,
1489    ) -> Result<
1490        super::super::super::super::objects::scout::video::api::GetStreamsInBoundsResponse,
1491        conjure_http::private::Error,
1492    >;
1493    /// Returns all channel-backed stream sessions for a dataset/channel that overlap with the specified time bounds.
1494    /// A stream overlaps if there is any intersection between its [start, end] interval and the provided bounds.
1495    /// Enforces read metadata permission on the dataset.
1496    #[endpoint(
1497        method = POST,
1498        path = "/video/v2/videos/streaming/streams-in-bounds",
1499        name = "getStreamsInBoundsV2",
1500        produces = conjure_http::server::StdResponseSerializer
1501    )]
1502    async fn get_streams_in_bounds_v2(
1503        &self,
1504        #[auth]
1505        auth_: conjure_object::BearerToken,
1506        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
1507        request: super::super::super::super::objects::scout::video::api::GetStreamsInBoundsForChannelRequest,
1508    ) -> Result<
1509        super::super::super::super::objects::scout::video::api::GetStreamsInBoundsV2Response,
1510        conjure_http::private::Error,
1511    >;
1512    /// Returns the dataset files backing a video channel (identified by channel + tags), ordered by
1513    /// start timestamp ascending and paginated. Each entry carries the min/max absolute timestamps the
1514    /// file contributes to the channel. Optionally filtered by time bounds. Streamed sessions are not
1515    /// included; use getStreamsInBoundsV2 for those.
1516    /// Enforces read metadata permission on the datasource.
1517    #[endpoint(
1518        method = POST,
1519        path = "/video/v2/videos/channel-dataset-files",
1520        name = "listVideoChannelDatasetFiles",
1521        produces = conjure_http::server::StdResponseSerializer
1522    )]
1523    async fn list_video_channel_dataset_files(
1524        &self,
1525        #[auth]
1526        auth_: conjure_object::BearerToken,
1527        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
1528        request: super::super::super::super::objects::scout::video::api::ListVideoChannelDatasetFilesRequest,
1529    ) -> Result<
1530        super::super::super::super::objects::scout::video::api::ListVideoChannelDatasetFilesResponse,
1531        conjure_http::private::Error,
1532    >;
1533    /// Updates one or more video dataset files in a channel in a single transaction. Each update may set a new
1534    /// absolute start timestamp (segments shifted so the earliest starts at the given timestamp), a scale
1535    /// parameter (frame timestamps rescaled around the file's start), and/or a new title (file name). If a
1536    /// resulting layout would overlap segments of another file in the channel, no files are updated and
1537    /// VIDEO_SEGMENT_CONFLICT is thrown (all-or-nothing). Returns the updated files with their new bounds.
1538    /// Currently only datasource-backed dataset channels are supported.
1539    /// Enforces write data permission on the datasource.
1540    #[endpoint(
1541        method = POST,
1542        path = "/video/v2/videos/channel-dataset-files/batch-update",
1543        name = "batchUpdateVideoChannelDatasetFiles",
1544        produces = conjure_http::server::StdResponseSerializer
1545    )]
1546    async fn batch_update_video_channel_dataset_files(
1547        &self,
1548        #[auth]
1549        auth_: conjure_object::BearerToken,
1550        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
1551        request: super::super::super::super::objects::scout::video::api::BatchUpdateVideoChannelDatasetFilesRequest,
1552    ) -> Result<
1553        super::super::super::super::objects::scout::video::api::BatchUpdateVideoChannelDatasetFilesResponse,
1554        conjure_http::private::Error,
1555    >;
1556    /// Marks the active stream session as ended for the video.
1557    /// Throws VIDEO_NOT_FOUND if no active stream exists.
1558    /// Enforces write permission on the video.
1559    #[endpoint(
1560        method = POST,
1561        path = "/video/v1/videos/{videoRid}/streaming/end",
1562        name = "endStream",
1563        produces = conjure_http::server::StdResponseSerializer
1564    )]
1565    async fn end_stream(
1566        &self,
1567        #[auth]
1568        auth_: conjure_object::BearerToken,
1569        #[path(
1570            name = "videoRid",
1571            decoder = conjure_http::server::conjure::FromPlainDecoder,
1572            log_as = "videoRid",
1573            safe
1574        )]
1575        video_rid: super::super::super::super::objects::api::rids::VideoRid,
1576    ) -> Result<
1577        super::super::super::super::objects::scout::video::api::EndStreamResponse,
1578        conjure_http::private::Error,
1579    >;
1580    /// MediaMTX segment upload endpoint. Receives video segments from MediaMTX hooks.
1581    /// Validates JWT and logs session. Future: create video segments from uploaded files.
1582    #[endpoint(
1583        method = POST,
1584        path = "/video/v1/segment/upload",
1585        name = "uploadSegmentFromMediaMtx"
1586    )]
1587    async fn upload_segment_from_media_mtx(
1588        &self,
1589        #[auth]
1590        auth_: conjure_object::BearerToken,
1591        #[query(
1592            name = "streamPath",
1593            decoder = conjure_http::server::conjure::FromPlainDecoder,
1594            log_as = "streamPath"
1595        )]
1596        stream_path: String,
1597        #[query(
1598            name = "filePath",
1599            decoder = conjure_http::server::conjure::FromPlainDecoder,
1600            log_as = "filePath"
1601        )]
1602        file_path: String,
1603        #[query(
1604            name = "duration",
1605            decoder = conjure_http::server::conjure::FromPlainDecoder
1606        )]
1607        duration: String,
1608        #[query(
1609            name = "minTimestampSeconds",
1610            decoder = conjure_http::server::conjure::FromPlainDecoder,
1611            log_as = "minTimestampSeconds"
1612        )]
1613        min_timestamp_seconds: conjure_object::SafeLong,
1614        #[query(
1615            name = "minTimestampNanos",
1616            decoder = conjure_http::server::conjure::FromPlainDecoder,
1617            log_as = "minTimestampNanos"
1618        )]
1619        min_timestamp_nanos: conjure_object::SafeLong,
1620        #[header(
1621            name = "Content-Length",
1622            decoder = conjure_http::server::conjure::FromPlainDecoder,
1623            log_as = "contentLength"
1624        )]
1625        content_length: conjure_object::SafeLong,
1626        #[body(deserializer = conjure_http::server::conjure::BinaryRequestDeserializer)]
1627        body: I,
1628    ) -> Result<(), conjure_http::private::Error>;
1629}
1630/// The video service manages videos and video metadata.
1631#[conjure_http::conjure_endpoints(
1632    name = "VideoService",
1633    use_legacy_error_serialization,
1634    local
1635)]
1636pub trait LocalAsyncVideoService<#[request_body] I, #[response_writer] O> {
1637    ///The body type returned by the `get_playlist` method.
1638    type GetPlaylistBody: conjure_http::server::LocalAsyncWriteBody<O> + 'static;
1639    ///The body type returned by the `get_playlist_in_bounds` method.
1640    type GetPlaylistInBoundsBody: conjure_http::server::LocalAsyncWriteBody<O> + 'static;
1641    ///The body type returned by the `get_playlist_in_bounds_v2` method.
1642    type GetPlaylistInBoundsV2Body: conjure_http::server::LocalAsyncWriteBody<O>
1643        + 'static;
1644    ///The body type returned by the `get_playlist_v2` method.
1645    type GetPlaylistV2Body: conjure_http::server::LocalAsyncWriteBody<O> + 'static;
1646    /// Returns video metadata associated with a video rid.
1647    #[endpoint(
1648        method = GET,
1649        path = "/video/v1/videos/{videoRid}",
1650        name = "get",
1651        produces = conjure_http::server::StdResponseSerializer
1652    )]
1653    async fn get(
1654        &self,
1655        #[auth]
1656        auth_: conjure_object::BearerToken,
1657        #[path(
1658            name = "videoRid",
1659            decoder = conjure_http::server::conjure::FromPlainDecoder,
1660            log_as = "videoRid",
1661            safe
1662        )]
1663        video_rid: super::super::super::super::objects::api::rids::VideoRid,
1664    ) -> Result<
1665        super::super::super::super::objects::scout::video::api::Video,
1666        conjure_http::private::Error,
1667    >;
1668    /// Returns video metadata about each video given a set of video rids.
1669    #[endpoint(
1670        method = POST,
1671        path = "/video/v1/videos/batchGet",
1672        name = "batchGet",
1673        produces = conjure_http::server::StdResponseSerializer
1674    )]
1675    async fn batch_get(
1676        &self,
1677        #[auth]
1678        auth_: conjure_object::BearerToken,
1679        #[body(deserializer = conjure_http::server::StdRequestDeserializer, safe)]
1680        request: super::super::super::super::objects::scout::video::api::GetVideosRequest,
1681    ) -> Result<
1682        super::super::super::super::objects::scout::video::api::GetVideosResponse,
1683        conjure_http::private::Error,
1684    >;
1685    /// Returns metadata about videos that match a given query.
1686    #[endpoint(
1687        method = POST,
1688        path = "/video/v1/videos/search",
1689        name = "search",
1690        produces = conjure_http::server::StdResponseSerializer
1691    )]
1692    async fn search(
1693        &self,
1694        #[auth]
1695        auth_: conjure_object::BearerToken,
1696        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
1697        request: super::super::super::super::objects::scout::video::api::SearchVideosRequest,
1698    ) -> Result<
1699        super::super::super::super::objects::scout::video::api::SearchVideosResponse,
1700        conjure_http::private::Error,
1701    >;
1702    /// Creates and persists a video entity with the given metadata.
1703    #[endpoint(
1704        method = POST,
1705        path = "/video/v1/videos",
1706        name = "create",
1707        produces = conjure_http::server::StdResponseSerializer
1708    )]
1709    async fn create(
1710        &self,
1711        #[auth]
1712        auth_: conjure_object::BearerToken,
1713        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
1714        request: super::super::super::super::objects::scout::video::api::CreateVideoRequest,
1715    ) -> Result<
1716        super::super::super::super::objects::scout::video::api::Video,
1717        conjure_http::private::Error,
1718    >;
1719    /// Updates the metadata for a video associated with the given video rid.
1720    #[endpoint(
1721        method = PUT,
1722        path = "/video/v1/videos/{videoRid}",
1723        name = "updateMetadata",
1724        produces = conjure_http::server::StdResponseSerializer
1725    )]
1726    async fn update_metadata(
1727        &self,
1728        #[auth]
1729        auth_: conjure_object::BearerToken,
1730        #[path(
1731            name = "videoRid",
1732            decoder = conjure_http::server::conjure::FromPlainDecoder,
1733            log_as = "videoRid",
1734            safe
1735        )]
1736        video_rid: super::super::super::super::objects::api::rids::VideoRid,
1737        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
1738        request: super::super::super::super::objects::scout::video::api::UpdateVideoMetadataRequest,
1739    ) -> Result<
1740        super::super::super::super::objects::scout::video::api::Video,
1741        conjure_http::private::Error,
1742    >;
1743    #[endpoint(
1744        method = PUT,
1745        path = "/video/v1/videos/{videoRid}/ingest-status",
1746        name = "updateIngestStatus"
1747    )]
1748    async fn update_ingest_status(
1749        &self,
1750        #[auth]
1751        auth_: conjure_object::BearerToken,
1752        #[path(
1753            name = "videoRid",
1754            decoder = conjure_http::server::conjure::FromPlainDecoder,
1755            log_as = "videoRid",
1756            safe
1757        )]
1758        video_rid: super::super::super::super::objects::api::rids::VideoRid,
1759        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
1760        request: super::super::super::super::objects::scout::video::api::UpdateIngestStatus,
1761    ) -> Result<(), conjure_http::private::Error>;
1762    #[endpoint(
1763        method = GET,
1764        path = "/video/v1/videos/{videoRid}/ingest-status",
1765        name = "getIngestStatus",
1766        produces = conjure_http::server::StdResponseSerializer
1767    )]
1768    async fn get_ingest_status(
1769        &self,
1770        #[auth]
1771        auth_: conjure_object::BearerToken,
1772        #[path(
1773            name = "videoRid",
1774            decoder = conjure_http::server::conjure::FromPlainDecoder,
1775            log_as = "videoRid",
1776            safe
1777        )]
1778        video_rid: super::super::super::super::objects::api::rids::VideoRid,
1779    ) -> Result<
1780        super::super::super::super::objects::scout::video::api::DetailedIngestStatus,
1781        conjure_http::private::Error,
1782    >;
1783    #[endpoint(
1784        method = POST,
1785        path = "/video/v1/videos/batch-get-ingest-status",
1786        name = "batchGetIngestStatus",
1787        produces = conjure_http::server::conjure::CollectionResponseSerializer
1788    )]
1789    async fn batch_get_ingest_status(
1790        &self,
1791        #[auth]
1792        auth_: conjure_object::BearerToken,
1793        #[body(
1794            deserializer = conjure_http::server::StdRequestDeserializer,
1795            log_as = "videoRids",
1796            safe
1797        )]
1798        video_rids: std::collections::BTreeSet<
1799            super::super::super::super::objects::api::rids::VideoRid,
1800        >,
1801    ) -> Result<
1802        std::collections::BTreeMap<
1803            super::super::super::super::objects::api::rids::VideoRid,
1804            super::super::super::super::objects::scout::video::api::DetailedIngestStatus,
1805        >,
1806        conjure_http::private::Error,
1807    >;
1808    #[endpoint(
1809        method = POST,
1810        path = "/video/v1/videos/enriched-ingest-status",
1811        name = "getEnrichedIngestStatus",
1812        produces = conjure_http::server::conjure::CollectionResponseSerializer
1813    )]
1814    async fn get_enriched_ingest_status(
1815        &self,
1816        #[auth]
1817        auth_: conjure_object::BearerToken,
1818        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
1819        request: super::super::super::super::objects::scout::video::api::GetEnrichedVideoIngestStatusRequest,
1820    ) -> Result<
1821        Option<
1822            super::super::super::super::objects::scout::video::api::EnrichedVideoIngestStatus,
1823        >,
1824        conjure_http::private::Error,
1825    >;
1826    /// Archives a video, which excludes it from search and hides it from being publicly visible, but does not
1827    /// permanently delete it. Archived videos can be unarchived.
1828    #[endpoint(
1829        method = PUT,
1830        path = "/video/v1/videos/{videoRid}/archive",
1831        name = "archive"
1832    )]
1833    async fn archive(
1834        &self,
1835        #[auth]
1836        auth_: conjure_object::BearerToken,
1837        #[path(
1838            name = "videoRid",
1839            decoder = conjure_http::server::conjure::FromPlainDecoder,
1840            log_as = "videoRid",
1841            safe
1842        )]
1843        video_rid: super::super::super::super::objects::api::rids::VideoRid,
1844    ) -> Result<(), conjure_http::private::Error>;
1845    /// Unarchives a previously archived video.
1846    #[endpoint(
1847        method = PUT,
1848        path = "/video/v1/videos/{videoRid}/unarchive",
1849        name = "unarchive"
1850    )]
1851    async fn unarchive(
1852        &self,
1853        #[auth]
1854        auth_: conjure_object::BearerToken,
1855        #[path(
1856            name = "videoRid",
1857            decoder = conjure_http::server::conjure::FromPlainDecoder,
1858            log_as = "videoRid",
1859            safe
1860        )]
1861        video_rid: super::super::super::super::objects::api::rids::VideoRid,
1862    ) -> Result<(), conjure_http::private::Error>;
1863    /// Generates an HLS playlist for a video within optional time bounds.
1864    /// Uses GET with query parameters for HLS.js compatibility.
1865    /// The HLS playlist will contain links to all of the segments in the video that overlap with the given bounds,
1866    /// or all segments if no bounds are provided.
1867    ///
1868    /// Note: The start and end parameters must either both be provided or both be omitted.
1869    /// Providing only one will result in a MissingTimestampBoundPair error.
1870    #[endpoint(
1871        method = GET,
1872        path = "/video/v1/videos/{videoRid}/playlist",
1873        name = "getPlaylist",
1874        produces = conjure_http::server::conjure::BinaryResponseSerializer
1875    )]
1876    async fn get_playlist(
1877        &self,
1878        #[auth]
1879        auth_: conjure_object::BearerToken,
1880        #[path(
1881            name = "videoRid",
1882            decoder = conjure_http::server::conjure::FromPlainDecoder,
1883            log_as = "videoRid",
1884            safe
1885        )]
1886        video_rid: super::super::super::super::objects::api::rids::VideoRid,
1887        #[query(
1888            name = "start",
1889            decoder = conjure_http::server::conjure::FromPlainOptionDecoder
1890        )]
1891        start: Option<String>,
1892        #[query(
1893            name = "end",
1894            decoder = conjure_http::server::conjure::FromPlainOptionDecoder
1895        )]
1896        end: Option<String>,
1897    ) -> Result<Self::GetPlaylistBody, conjure_http::private::Error>;
1898    /// Returns the min and max absolute and media timestamps for each segment in a video. To be used during
1899    /// frame-timestamp mapping.
1900    #[endpoint(
1901        method = GET,
1902        path = "/video/v1/videos/{videoRid}/segment-summaries",
1903        name = "getSegmentSummaries",
1904        produces = conjure_http::server::conjure::CollectionResponseSerializer
1905    )]
1906    async fn get_segment_summaries(
1907        &self,
1908        #[auth]
1909        auth_: conjure_object::BearerToken,
1910        #[path(
1911            name = "videoRid",
1912            decoder = conjure_http::server::conjure::FromPlainDecoder,
1913            log_as = "videoRid",
1914            safe
1915        )]
1916        video_rid: super::super::super::super::objects::api::rids::VideoRid,
1917    ) -> Result<
1918        Vec<super::super::super::super::objects::scout::video::api::SegmentSummary>,
1919        conjure_http::private::Error,
1920    >;
1921    /// Generates an HLS playlist for a video with the given video rid to enable playback within an optional set of
1922    /// bounds. The HLS playlist will contain links to all of the segments in the video that overlap with the given
1923    /// bounds.
1924    /// playlist will be limited to the given bounds.
1925    #[endpoint(
1926        method = POST,
1927        path = "/video/v1/videos/{videoRid}/playlist-in-bounds",
1928        name = "getPlaylistInBounds",
1929        produces = conjure_http::server::conjure::BinaryResponseSerializer
1930    )]
1931    async fn get_playlist_in_bounds(
1932        &self,
1933        #[auth]
1934        auth_: conjure_object::BearerToken,
1935        #[path(
1936            name = "videoRid",
1937            decoder = conjure_http::server::conjure::FromPlainDecoder,
1938            log_as = "videoRid",
1939            safe
1940        )]
1941        video_rid: super::super::super::super::objects::api::rids::VideoRid,
1942        #[body(deserializer = conjure_http::server::StdRequestDeserializer, safe)]
1943        request: super::super::super::super::objects::scout::video::api::GetPlaylistInBoundsRequest,
1944    ) -> Result<Self::GetPlaylistInBoundsBody, conjure_http::private::Error>;
1945    /// Generates an HLS playlist for a video series (identified by channel + tags) within bounds.
1946    #[endpoint(
1947        method = POST,
1948        path = "/video/v2/videos/playlist-in-bounds",
1949        name = "getPlaylistInBoundsV2",
1950        produces = conjure_http::server::conjure::BinaryResponseSerializer
1951    )]
1952    async fn get_playlist_in_bounds_v2(
1953        &self,
1954        #[auth]
1955        auth_: conjure_object::BearerToken,
1956        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
1957        request: super::super::super::super::objects::scout::video::api::GetPlaylistInBoundsForChannelRequest,
1958    ) -> Result<Self::GetPlaylistInBoundsV2Body, conjure_http::private::Error>;
1959    /// Generates an HLS playlist for a video series within time bounds.
1960    /// Specify either dataSourceRid OR (assetRid + dataScopeName) to identify the series source.
1961    ///
1962    /// Note: Both start and end parameters are required and must be provided together.
1963    #[endpoint(
1964        method = GET,
1965        path = "/video/v2/videos/playlist",
1966        name = "getPlaylistV2",
1967        produces = conjure_http::server::conjure::BinaryResponseSerializer
1968    )]
1969    async fn get_playlist_v2(
1970        &self,
1971        #[auth]
1972        auth_: conjure_object::BearerToken,
1973        #[query(
1974            name = "dataSourceRid",
1975            decoder = conjure_http::server::conjure::FromPlainOptionDecoder,
1976            log_as = "dataSourceRid",
1977            safe
1978        )]
1979        data_source_rid: Option<
1980            super::super::super::super::objects::api::rids::DataSourceRid,
1981        >,
1982        #[query(
1983            name = "assetRid",
1984            decoder = conjure_http::server::conjure::FromPlainOptionDecoder,
1985            log_as = "assetRid",
1986            safe
1987        )]
1988        asset_rid: Option<
1989            super::super::super::super::objects::scout::rids::api::AssetRid,
1990        >,
1991        #[query(
1992            name = "dataScopeName",
1993            decoder = conjure_http::server::conjure::FromPlainOptionDecoder,
1994            log_as = "dataScopeName"
1995        )]
1996        data_scope_name: Option<String>,
1997        #[query(
1998            name = "channel",
1999            decoder = conjure_http::server::conjure::FromPlainDecoder
2000        )]
2001        channel: String,
2002        #[query(
2003            name = "tags",
2004            decoder = conjure_http::server::conjure::FromPlainOptionDecoder
2005        )]
2006        tags: Option<String>,
2007        #[query(
2008            name = "start",
2009            decoder = conjure_http::server::conjure::FromPlainDecoder
2010        )]
2011        start: String,
2012        #[query(name = "end", decoder = conjure_http::server::conjure::FromPlainDecoder)]
2013        end: String,
2014    ) -> Result<Self::GetPlaylistV2Body, conjure_http::private::Error>;
2015    /// Returns the min and max absolute and media timestamps for each segment in a video that overlap with an
2016    /// optional set of bounds.
2017    #[endpoint(
2018        method = POST,
2019        path = "/video/v1/videos/{videoRid}/segment-summaries-in-bounds",
2020        name = "getSegmentSummariesInBounds",
2021        produces = conjure_http::server::conjure::CollectionResponseSerializer
2022    )]
2023    async fn get_segment_summaries_in_bounds(
2024        &self,
2025        #[auth]
2026        auth_: conjure_object::BearerToken,
2027        #[path(
2028            name = "videoRid",
2029            decoder = conjure_http::server::conjure::FromPlainDecoder,
2030            log_as = "videoRid",
2031            safe
2032        )]
2033        video_rid: super::super::super::super::objects::api::rids::VideoRid,
2034        #[body(deserializer = conjure_http::server::StdRequestDeserializer, safe)]
2035        request: super::super::super::super::objects::scout::video::api::GetSegmentSummariesInBoundsRequest,
2036    ) -> Result<
2037        Vec<super::super::super::super::objects::scout::video::api::SegmentSummary>,
2038        conjure_http::private::Error,
2039    >;
2040    /// Returns the min and max absolute and media timestamps for each segment matching a video series
2041    /// (identified by channel + tags) within the specified bounds.
2042    #[endpoint(
2043        method = POST,
2044        path = "/video/v2/videos/segment-summaries-in-bounds",
2045        name = "getSegmentSummariesInBoundsV2",
2046        produces = conjure_http::server::conjure::CollectionResponseSerializer
2047    )]
2048    async fn get_segment_summaries_in_bounds_v2(
2049        &self,
2050        #[auth]
2051        auth_: conjure_object::BearerToken,
2052        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
2053        request: super::super::super::super::objects::scout::video::api::GetSegmentSummariesInBoundsForChannelRequest,
2054    ) -> Result<
2055        Vec<super::super::super::super::objects::scout::video::api::SegmentSummaryV2>,
2056        conjure_http::private::Error,
2057    >;
2058    /// Returns aggregated segment metadata for a video channel series, including total frames,
2059    /// segment count, min/max timestamps, and average frame rate. Optionally filter by time bounds.
2060    #[endpoint(
2061        method = POST,
2062        path = "/video/v2/videos/segment-metadata",
2063        name = "getSegmentMetadataV2",
2064        produces = conjure_http::server::conjure::CollectionResponseSerializer
2065    )]
2066    async fn get_segment_metadata_v2(
2067        &self,
2068        #[auth]
2069        auth_: conjure_object::BearerToken,
2070        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
2071        request: super::super::super::super::objects::scout::video::api::GetSegmentMetadataForChannelRequest,
2072    ) -> Result<
2073        Option<
2074            super::super::super::super::objects::scout::video::api::VideoChannelSegmentsMetadata,
2075        >,
2076        conjure_http::private::Error,
2077    >;
2078    /// Returns metadata for the segment within a video series containing the requested absolute timestamp.
2079    #[endpoint(
2080        method = POST,
2081        path = "/video/v2/videos/get-segment-by-timestamp",
2082        name = "getSegmentByTimestampV2",
2083        produces = conjure_http::server::conjure::CollectionResponseSerializer
2084    )]
2085    async fn get_segment_by_timestamp_v2(
2086        &self,
2087        #[auth]
2088        auth_: conjure_object::BearerToken,
2089        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
2090        request: super::super::super::super::objects::scout::video::api::GetSegmentByTimestampV2Request,
2091    ) -> Result<
2092        Option<super::super::super::super::objects::scout::video::api::SegmentV2>,
2093        conjure_http::private::Error,
2094    >;
2095    /// Returns metadata for the segment containing the requested absolute timestamp. If no segment contains
2096    /// the timestamp, returns the closest segment starting after the timestamp. Returns empty if no segment
2097    /// is found at or after the timestamp.
2098    #[endpoint(
2099        method = POST,
2100        path = "/video/v1/videos/{videoRid}/get-segment-at-or-after-timestamp",
2101        name = "getSegmentAtOrAfterTimestamp",
2102        produces = conjure_http::server::conjure::CollectionResponseSerializer
2103    )]
2104    async fn get_segment_at_or_after_timestamp(
2105        &self,
2106        #[auth]
2107        auth_: conjure_object::BearerToken,
2108        #[path(
2109            name = "videoRid",
2110            decoder = conjure_http::server::conjure::FromPlainDecoder,
2111            log_as = "videoRid",
2112            safe
2113        )]
2114        video_rid: super::super::super::super::objects::api::rids::VideoRid,
2115        #[body(deserializer = conjure_http::server::StdRequestDeserializer, safe)]
2116        request: super::super::super::super::objects::scout::video::api::GetSegmentAtOrAfterTimestampRequest,
2117    ) -> Result<
2118        Option<super::super::super::super::objects::scout::video::api::Segment>,
2119        conjure_http::private::Error,
2120    >;
2121    /// Returns metadata for the segment containing the requested absolute timestamp for a video series
2122    /// (identified by channel + tags). If no segment contains the timestamp, returns the closest segment
2123    /// starting after the timestamp. Returns empty if no segment is found at or after the timestamp.
2124    #[endpoint(
2125        method = POST,
2126        path = "/video/v2/videos/get-segment-at-or-after-timestamp",
2127        name = "getSegmentAtOrAfterTimestampV2",
2128        produces = conjure_http::server::conjure::CollectionResponseSerializer
2129    )]
2130    async fn get_segment_at_or_after_timestamp_v2(
2131        &self,
2132        #[auth]
2133        auth_: conjure_object::BearerToken,
2134        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
2135        request: super::super::super::super::objects::scout::video::api::GetSegmentAtOrAfterTimestampV2Request,
2136    ) -> Result<
2137        Option<super::super::super::super::objects::scout::video::api::SegmentV2>,
2138        conjure_http::private::Error,
2139    >;
2140    /// Returns the min and max absolute timestamps from non-archived video files associated with a given video that
2141    /// overlap with an optional set of bounds. The files on the edges of the bounds will be truncated to segments
2142    /// that are inside or overlap with the bounds.
2143    #[endpoint(
2144        method = POST,
2145        path = "/video/v1/videos/{videoRid}/get-ranges-with-existing-segment-data",
2146        name = "getFileSummaries",
2147        produces = conjure_http::server::StdResponseSerializer
2148    )]
2149    async fn get_file_summaries(
2150        &self,
2151        #[auth]
2152        auth_: conjure_object::BearerToken,
2153        #[path(
2154            name = "videoRid",
2155            decoder = conjure_http::server::conjure::FromPlainDecoder,
2156            log_as = "videoRid",
2157            safe
2158        )]
2159        video_rid: super::super::super::super::objects::api::rids::VideoRid,
2160        #[body(deserializer = conjure_http::server::StdRequestDeserializer, safe)]
2161        request: super::super::super::super::objects::scout::video::api::GetFileSummariesRequest,
2162    ) -> Result<
2163        super::super::super::super::objects::scout::video::api::GetFileSummariesResponse,
2164        conjure_http::private::Error,
2165    >;
2166    /// Generates a stream ID scoped to a video and returns a WHIP URL with a MediaMTX JWT and ICE servers.
2167    /// Enforces write permission on the video.
2168    #[endpoint(
2169        method = POST,
2170        path = "/video/v1/videos/{videoRid}/streaming/whip",
2171        name = "generateWhipStream",
2172        produces = conjure_http::server::StdResponseSerializer
2173    )]
2174    async fn generate_whip_stream(
2175        &self,
2176        #[auth]
2177        auth_: conjure_object::BearerToken,
2178        #[path(
2179            name = "videoRid",
2180            decoder = conjure_http::server::conjure::FromPlainDecoder,
2181            log_as = "videoRid",
2182            safe
2183        )]
2184        video_rid: super::super::super::super::objects::api::rids::VideoRid,
2185    ) -> Result<
2186        super::super::super::super::objects::scout::video::api::GenerateWhipStreamResponse,
2187        conjure_http::private::Error,
2188    >;
2189    /// Generates a stream ID scoped to a channel-backed live video series and returns a WHIP URL with
2190    /// a MediaMTX JWT and ICE servers.
2191    /// Currently only datasource-backed dataset channels are supported.
2192    #[endpoint(
2193        method = POST,
2194        path = "/video/v2/videos/streaming/whip",
2195        name = "generateWhipStreamV2",
2196        produces = conjure_http::server::StdResponseSerializer
2197    )]
2198    async fn generate_whip_stream_v2(
2199        &self,
2200        #[auth]
2201        auth_: conjure_object::BearerToken,
2202        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
2203        request: super::super::super::super::objects::scout::video::api::GenerateWhipStreamV2Request,
2204    ) -> Result<
2205        super::super::super::super::objects::scout::video::api::GenerateWhipStreamResponse,
2206        conjure_http::private::Error,
2207    >;
2208    /// Returns WHEP URL, ICE servers, and token for playing back the active stream.
2209    /// Returns empty if there is no active stream.
2210    /// Enforces read permission on the video.
2211    #[endpoint(
2212        method = POST,
2213        path = "/video/v1/videos/{videoRid}/streaming/whep",
2214        name = "generateWhepStream",
2215        produces = conjure_http::server::conjure::CollectionResponseSerializer
2216    )]
2217    async fn generate_whep_stream(
2218        &self,
2219        #[auth]
2220        auth_: conjure_object::BearerToken,
2221        #[path(
2222            name = "videoRid",
2223            decoder = conjure_http::server::conjure::FromPlainDecoder,
2224            log_as = "videoRid",
2225            safe
2226        )]
2227        video_rid: super::super::super::super::objects::api::rids::VideoRid,
2228    ) -> Result<
2229        Option<
2230            super::super::super::super::objects::scout::video::api::GenerateWhepStreamResponse,
2231        >,
2232        conjure_http::private::Error,
2233    >;
2234    /// Returns WHEP URL, ICE servers, and token for playing back the active channel-backed live video stream.
2235    /// Returns empty if there is no active stream.
2236    /// Currently only datasource-backed dataset channels are supported.
2237    #[endpoint(
2238        method = POST,
2239        path = "/video/v2/videos/streaming/whep",
2240        name = "generateWhepStreamV2",
2241        produces = conjure_http::server::conjure::CollectionResponseSerializer
2242    )]
2243    async fn generate_whep_stream_v2(
2244        &self,
2245        #[auth]
2246        auth_: conjure_object::BearerToken,
2247        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
2248        request: super::super::super::super::objects::scout::video::api::GenerateWhepStreamV2Request,
2249    ) -> Result<
2250        Option<
2251            super::super::super::super::objects::scout::video::api::GenerateWhepStreamResponse,
2252        >,
2253        conjure_http::private::Error,
2254    >;
2255    /// Returns stream session metadata for a given stream ID scoped to the video.
2256    /// Enforces read permission on the video.
2257    #[endpoint(
2258        method = GET,
2259        path = "/video/v1/videos/{videoRid}/streaming/streams/{streamId}",
2260        name = "getStream",
2261        produces = conjure_http::server::conjure::CollectionResponseSerializer
2262    )]
2263    async fn get_stream(
2264        &self,
2265        #[auth]
2266        auth_: conjure_object::BearerToken,
2267        #[path(
2268            name = "videoRid",
2269            decoder = conjure_http::server::conjure::FromPlainDecoder,
2270            log_as = "videoRid",
2271            safe
2272        )]
2273        video_rid: super::super::super::super::objects::api::rids::VideoRid,
2274        #[path(
2275            name = "streamId",
2276            decoder = conjure_http::server::conjure::FromPlainDecoder,
2277            log_as = "streamId"
2278        )]
2279        stream_id: String,
2280    ) -> Result<
2281        Option<super::super::super::super::objects::scout::video::api::VideoStream>,
2282        conjure_http::private::Error,
2283    >;
2284    /// Returns all stream sessions for a video that overlap with the specified time bounds.
2285    /// A stream overlaps if there is any intersection between its [start, end] interval and the provided bounds.
2286    /// Enforces read permission on the video.
2287    #[endpoint(
2288        method = POST,
2289        path = "/video/v1/videos/{videoRid}/streaming/streams-in-bounds",
2290        name = "getStreamsInBounds",
2291        produces = conjure_http::server::StdResponseSerializer
2292    )]
2293    async fn get_streams_in_bounds(
2294        &self,
2295        #[auth]
2296        auth_: conjure_object::BearerToken,
2297        #[path(
2298            name = "videoRid",
2299            decoder = conjure_http::server::conjure::FromPlainDecoder,
2300            log_as = "videoRid",
2301            safe
2302        )]
2303        video_rid: super::super::super::super::objects::api::rids::VideoRid,
2304        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
2305        request: super::super::super::super::objects::scout::video::api::GetStreamsInBoundsRequest,
2306    ) -> Result<
2307        super::super::super::super::objects::scout::video::api::GetStreamsInBoundsResponse,
2308        conjure_http::private::Error,
2309    >;
2310    /// Returns all channel-backed stream sessions for a dataset/channel that overlap with the specified time bounds.
2311    /// A stream overlaps if there is any intersection between its [start, end] interval and the provided bounds.
2312    /// Enforces read metadata permission on the dataset.
2313    #[endpoint(
2314        method = POST,
2315        path = "/video/v2/videos/streaming/streams-in-bounds",
2316        name = "getStreamsInBoundsV2",
2317        produces = conjure_http::server::StdResponseSerializer
2318    )]
2319    async fn get_streams_in_bounds_v2(
2320        &self,
2321        #[auth]
2322        auth_: conjure_object::BearerToken,
2323        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
2324        request: super::super::super::super::objects::scout::video::api::GetStreamsInBoundsForChannelRequest,
2325    ) -> Result<
2326        super::super::super::super::objects::scout::video::api::GetStreamsInBoundsV2Response,
2327        conjure_http::private::Error,
2328    >;
2329    /// Returns the dataset files backing a video channel (identified by channel + tags), ordered by
2330    /// start timestamp ascending and paginated. Each entry carries the min/max absolute timestamps the
2331    /// file contributes to the channel. Optionally filtered by time bounds. Streamed sessions are not
2332    /// included; use getStreamsInBoundsV2 for those.
2333    /// Enforces read metadata permission on the datasource.
2334    #[endpoint(
2335        method = POST,
2336        path = "/video/v2/videos/channel-dataset-files",
2337        name = "listVideoChannelDatasetFiles",
2338        produces = conjure_http::server::StdResponseSerializer
2339    )]
2340    async fn list_video_channel_dataset_files(
2341        &self,
2342        #[auth]
2343        auth_: conjure_object::BearerToken,
2344        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
2345        request: super::super::super::super::objects::scout::video::api::ListVideoChannelDatasetFilesRequest,
2346    ) -> Result<
2347        super::super::super::super::objects::scout::video::api::ListVideoChannelDatasetFilesResponse,
2348        conjure_http::private::Error,
2349    >;
2350    /// Updates one or more video dataset files in a channel in a single transaction. Each update may set a new
2351    /// absolute start timestamp (segments shifted so the earliest starts at the given timestamp), a scale
2352    /// parameter (frame timestamps rescaled around the file's start), and/or a new title (file name). If a
2353    /// resulting layout would overlap segments of another file in the channel, no files are updated and
2354    /// VIDEO_SEGMENT_CONFLICT is thrown (all-or-nothing). Returns the updated files with their new bounds.
2355    /// Currently only datasource-backed dataset channels are supported.
2356    /// Enforces write data permission on the datasource.
2357    #[endpoint(
2358        method = POST,
2359        path = "/video/v2/videos/channel-dataset-files/batch-update",
2360        name = "batchUpdateVideoChannelDatasetFiles",
2361        produces = conjure_http::server::StdResponseSerializer
2362    )]
2363    async fn batch_update_video_channel_dataset_files(
2364        &self,
2365        #[auth]
2366        auth_: conjure_object::BearerToken,
2367        #[body(deserializer = conjure_http::server::StdRequestDeserializer)]
2368        request: super::super::super::super::objects::scout::video::api::BatchUpdateVideoChannelDatasetFilesRequest,
2369    ) -> Result<
2370        super::super::super::super::objects::scout::video::api::BatchUpdateVideoChannelDatasetFilesResponse,
2371        conjure_http::private::Error,
2372    >;
2373    /// Marks the active stream session as ended for the video.
2374    /// Throws VIDEO_NOT_FOUND if no active stream exists.
2375    /// Enforces write permission on the video.
2376    #[endpoint(
2377        method = POST,
2378        path = "/video/v1/videos/{videoRid}/streaming/end",
2379        name = "endStream",
2380        produces = conjure_http::server::StdResponseSerializer
2381    )]
2382    async fn end_stream(
2383        &self,
2384        #[auth]
2385        auth_: conjure_object::BearerToken,
2386        #[path(
2387            name = "videoRid",
2388            decoder = conjure_http::server::conjure::FromPlainDecoder,
2389            log_as = "videoRid",
2390            safe
2391        )]
2392        video_rid: super::super::super::super::objects::api::rids::VideoRid,
2393    ) -> Result<
2394        super::super::super::super::objects::scout::video::api::EndStreamResponse,
2395        conjure_http::private::Error,
2396    >;
2397    /// MediaMTX segment upload endpoint. Receives video segments from MediaMTX hooks.
2398    /// Validates JWT and logs session. Future: create video segments from uploaded files.
2399    #[endpoint(
2400        method = POST,
2401        path = "/video/v1/segment/upload",
2402        name = "uploadSegmentFromMediaMtx"
2403    )]
2404    async fn upload_segment_from_media_mtx(
2405        &self,
2406        #[auth]
2407        auth_: conjure_object::BearerToken,
2408        #[query(
2409            name = "streamPath",
2410            decoder = conjure_http::server::conjure::FromPlainDecoder,
2411            log_as = "streamPath"
2412        )]
2413        stream_path: String,
2414        #[query(
2415            name = "filePath",
2416            decoder = conjure_http::server::conjure::FromPlainDecoder,
2417            log_as = "filePath"
2418        )]
2419        file_path: String,
2420        #[query(
2421            name = "duration",
2422            decoder = conjure_http::server::conjure::FromPlainDecoder
2423        )]
2424        duration: String,
2425        #[query(
2426            name = "minTimestampSeconds",
2427            decoder = conjure_http::server::conjure::FromPlainDecoder,
2428            log_as = "minTimestampSeconds"
2429        )]
2430        min_timestamp_seconds: conjure_object::SafeLong,
2431        #[query(
2432            name = "minTimestampNanos",
2433            decoder = conjure_http::server::conjure::FromPlainDecoder,
2434            log_as = "minTimestampNanos"
2435        )]
2436        min_timestamp_nanos: conjure_object::SafeLong,
2437        #[header(
2438            name = "Content-Length",
2439            decoder = conjure_http::server::conjure::FromPlainDecoder,
2440            log_as = "contentLength"
2441        )]
2442        content_length: conjure_object::SafeLong,
2443        #[body(deserializer = conjure_http::server::conjure::BinaryRequestDeserializer)]
2444        body: I,
2445    ) -> Result<(), conjure_http::private::Error>;
2446}