Skip to main content

nominal_api/conjure/clients/scout/video/
video_service.rs

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