Skip to main content

nominal_api_conjure/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    /// Returns the dataset files backing a video channel (identified by channel + tags), ordered by
590    /// start timestamp ascending and paginated. Each entry carries the min/max absolute timestamps the
591    /// file contributes to the channel. Optionally filtered by time bounds. Streamed sessions are not
592    /// included; use getStreamsInBoundsV2 for those.
593    /// Enforces read metadata permission on the datasource.
594    #[endpoint(
595        method = POST,
596        path = "/video/v2/videos/channel-dataset-files",
597        name = "listVideoChannelDatasetFiles",
598        accept = conjure_http::client::StdResponseDeserializer
599    )]
600    fn list_video_channel_dataset_files(
601        &self,
602        #[auth]
603        auth_: &conjure_object::BearerToken,
604        #[body(serializer = conjure_http::client::StdRequestSerializer)]
605        request: &super::super::super::super::objects::scout::video::api::ListVideoChannelDatasetFilesRequest,
606    ) -> Result<
607        super::super::super::super::objects::scout::video::api::ListVideoChannelDatasetFilesResponse,
608        conjure_http::private::Error,
609    >;
610    /// Updates one or more video dataset files in a channel in a single transaction. Each update may set a new
611    /// absolute start timestamp (segments shifted so the earliest starts at the given timestamp), a scale
612    /// parameter (frame timestamps rescaled around the file's start), and/or a new title (file name). If a
613    /// resulting layout would overlap segments of another file in the channel, no files are updated and
614    /// VIDEO_SEGMENT_CONFLICT is thrown (all-or-nothing). Returns the updated files with their new bounds.
615    /// Currently only datasource-backed dataset channels are supported.
616    /// Enforces write data permission on the datasource.
617    #[endpoint(
618        method = POST,
619        path = "/video/v2/videos/channel-dataset-files/batch-update",
620        name = "batchUpdateVideoChannelDatasetFiles",
621        accept = conjure_http::client::StdResponseDeserializer
622    )]
623    fn batch_update_video_channel_dataset_files(
624        &self,
625        #[auth]
626        auth_: &conjure_object::BearerToken,
627        #[body(serializer = conjure_http::client::StdRequestSerializer)]
628        request: &super::super::super::super::objects::scout::video::api::BatchUpdateVideoChannelDatasetFilesRequest,
629    ) -> Result<
630        super::super::super::super::objects::scout::video::api::BatchUpdateVideoChannelDatasetFilesResponse,
631        conjure_http::private::Error,
632    >;
633    /// Marks the active stream session as ended for the video.
634    /// Throws VIDEO_NOT_FOUND if no active stream exists.
635    /// Enforces write permission on the video.
636    #[endpoint(
637        method = POST,
638        path = "/video/v1/videos/{videoRid}/streaming/end",
639        name = "endStream",
640        accept = conjure_http::client::StdResponseDeserializer
641    )]
642    fn end_stream(
643        &self,
644        #[auth]
645        auth_: &conjure_object::BearerToken,
646        #[path(name = "videoRid", encoder = conjure_http::client::conjure::PlainEncoder)]
647        video_rid: &conjure_object::ResourceIdentifier,
648    ) -> Result<
649        super::super::super::super::objects::scout::video::api::EndStreamResponse,
650        conjure_http::private::Error,
651    >;
652    /// MediaMTX segment upload endpoint. Receives video segments from MediaMTX hooks.
653    /// Validates JWT and logs session. Future: create video segments from uploaded files.
654    #[endpoint(
655        method = POST,
656        path = "/video/v1/segment/upload",
657        name = "uploadSegmentFromMediaMtx",
658        accept = conjure_http::client::conjure::EmptyResponseDeserializer
659    )]
660    fn upload_segment_from_media_mtx(
661        &self,
662        #[auth]
663        auth_: &conjure_object::BearerToken,
664        #[query(
665            name = "streamPath",
666            encoder = conjure_http::client::conjure::PlainEncoder
667        )]
668        stream_path: &str,
669        #[query(
670            name = "filePath",
671            encoder = conjure_http::client::conjure::PlainEncoder
672        )]
673        file_path: &str,
674        #[query(
675            name = "duration",
676            encoder = conjure_http::client::conjure::PlainEncoder
677        )]
678        duration: &str,
679        #[query(
680            name = "minTimestampSeconds",
681            encoder = conjure_http::client::conjure::PlainEncoder
682        )]
683        min_timestamp_seconds: conjure_object::SafeLong,
684        #[query(
685            name = "minTimestampNanos",
686            encoder = conjure_http::client::conjure::PlainEncoder
687        )]
688        min_timestamp_nanos: conjure_object::SafeLong,
689        #[header(
690            name = "Content-Length",
691            encoder = conjure_http::client::conjure::PlainEncoder
692        )]
693        content_length: conjure_object::SafeLong,
694        #[body(serializer = conjure_http::client::conjure::BinaryRequestSerializer)]
695        body: impl conjure_http::client::WriteBody<O>,
696    ) -> Result<(), conjure_http::private::Error>;
697}
698/// The video service manages videos and video metadata.
699#[conjure_http::conjure_client(name = "VideoService")]
700pub trait AsyncVideoService<
701    #[request_writer]
702    O,
703    #[response_body]
704    I: conjure_http::private::Stream<
705            Item = Result<conjure_http::private::Bytes, conjure_http::private::Error>,
706        >,
707> {
708    /// Returns video metadata associated with a video rid.
709    #[endpoint(
710        method = GET,
711        path = "/video/v1/videos/{videoRid}",
712        name = "get",
713        accept = conjure_http::client::StdResponseDeserializer
714    )]
715    async fn get(
716        &self,
717        #[auth]
718        auth_: &conjure_object::BearerToken,
719        #[path(name = "videoRid", encoder = conjure_http::client::conjure::PlainEncoder)]
720        video_rid: &conjure_object::ResourceIdentifier,
721    ) -> Result<
722        super::super::super::super::objects::scout::video::api::Video,
723        conjure_http::private::Error,
724    >;
725    /// Returns video metadata about each video given a set of video rids.
726    #[endpoint(
727        method = POST,
728        path = "/video/v1/videos/batchGet",
729        name = "batchGet",
730        accept = conjure_http::client::StdResponseDeserializer
731    )]
732    async fn batch_get(
733        &self,
734        #[auth]
735        auth_: &conjure_object::BearerToken,
736        #[body(serializer = conjure_http::client::StdRequestSerializer)]
737        request: &super::super::super::super::objects::scout::video::api::GetVideosRequest,
738    ) -> Result<
739        super::super::super::super::objects::scout::video::api::GetVideosResponse,
740        conjure_http::private::Error,
741    >;
742    /// Returns metadata about videos that match a given query.
743    #[endpoint(
744        method = POST,
745        path = "/video/v1/videos/search",
746        name = "search",
747        accept = conjure_http::client::StdResponseDeserializer
748    )]
749    async fn search(
750        &self,
751        #[auth]
752        auth_: &conjure_object::BearerToken,
753        #[body(serializer = conjure_http::client::StdRequestSerializer)]
754        request: &super::super::super::super::objects::scout::video::api::SearchVideosRequest,
755    ) -> Result<
756        super::super::super::super::objects::scout::video::api::SearchVideosResponse,
757        conjure_http::private::Error,
758    >;
759    /// Creates and persists a video entity with the given metadata.
760    #[endpoint(
761        method = POST,
762        path = "/video/v1/videos",
763        name = "create",
764        accept = conjure_http::client::StdResponseDeserializer
765    )]
766    async fn create(
767        &self,
768        #[auth]
769        auth_: &conjure_object::BearerToken,
770        #[body(serializer = conjure_http::client::StdRequestSerializer)]
771        request: &super::super::super::super::objects::scout::video::api::CreateVideoRequest,
772    ) -> Result<
773        super::super::super::super::objects::scout::video::api::Video,
774        conjure_http::private::Error,
775    >;
776    /// Updates the metadata for a video associated with the given video rid.
777    #[endpoint(
778        method = PUT,
779        path = "/video/v1/videos/{videoRid}",
780        name = "updateMetadata",
781        accept = conjure_http::client::StdResponseDeserializer
782    )]
783    async fn update_metadata(
784        &self,
785        #[auth]
786        auth_: &conjure_object::BearerToken,
787        #[path(name = "videoRid", encoder = conjure_http::client::conjure::PlainEncoder)]
788        video_rid: &conjure_object::ResourceIdentifier,
789        #[body(serializer = conjure_http::client::StdRequestSerializer)]
790        request: &super::super::super::super::objects::scout::video::api::UpdateVideoMetadataRequest,
791    ) -> Result<
792        super::super::super::super::objects::scout::video::api::Video,
793        conjure_http::private::Error,
794    >;
795    #[endpoint(
796        method = PUT,
797        path = "/video/v1/videos/{videoRid}/ingest-status",
798        name = "updateIngestStatus",
799        accept = conjure_http::client::conjure::EmptyResponseDeserializer
800    )]
801    async fn update_ingest_status(
802        &self,
803        #[auth]
804        auth_: &conjure_object::BearerToken,
805        #[path(name = "videoRid", encoder = conjure_http::client::conjure::PlainEncoder)]
806        video_rid: &conjure_object::ResourceIdentifier,
807        #[body(serializer = conjure_http::client::StdRequestSerializer)]
808        request: &super::super::super::super::objects::scout::video::api::UpdateIngestStatus,
809    ) -> Result<(), conjure_http::private::Error>;
810    #[endpoint(
811        method = GET,
812        path = "/video/v1/videos/{videoRid}/ingest-status",
813        name = "getIngestStatus",
814        accept = conjure_http::client::StdResponseDeserializer
815    )]
816    async fn get_ingest_status(
817        &self,
818        #[auth]
819        auth_: &conjure_object::BearerToken,
820        #[path(name = "videoRid", encoder = conjure_http::client::conjure::PlainEncoder)]
821        video_rid: &conjure_object::ResourceIdentifier,
822    ) -> Result<
823        super::super::super::super::objects::scout::video::api::DetailedIngestStatus,
824        conjure_http::private::Error,
825    >;
826    #[endpoint(
827        method = POST,
828        path = "/video/v1/videos/batch-get-ingest-status",
829        name = "batchGetIngestStatus",
830        accept = conjure_http::client::conjure::CollectionResponseDeserializer
831    )]
832    async fn batch_get_ingest_status(
833        &self,
834        #[auth]
835        auth_: &conjure_object::BearerToken,
836        #[body(serializer = conjure_http::client::StdRequestSerializer)]
837        video_rids: &std::collections::BTreeSet<conjure_object::ResourceIdentifier>,
838    ) -> Result<
839        std::collections::BTreeMap<
840            conjure_object::ResourceIdentifier,
841            super::super::super::super::objects::scout::video::api::DetailedIngestStatus,
842        >,
843        conjure_http::private::Error,
844    >;
845    #[endpoint(
846        method = POST,
847        path = "/video/v1/videos/enriched-ingest-status",
848        name = "getEnrichedIngestStatus",
849        accept = conjure_http::client::conjure::CollectionResponseDeserializer
850    )]
851    async fn get_enriched_ingest_status(
852        &self,
853        #[auth]
854        auth_: &conjure_object::BearerToken,
855        #[body(serializer = conjure_http::client::StdRequestSerializer)]
856        request: &super::super::super::super::objects::scout::video::api::GetEnrichedVideoIngestStatusRequest,
857    ) -> Result<
858        Option<
859            super::super::super::super::objects::scout::video::api::EnrichedVideoIngestStatus,
860        >,
861        conjure_http::private::Error,
862    >;
863    /// Archives a video, which excludes it from search and hides it from being publicly visible, but does not
864    /// permanently delete it. Archived videos can be unarchived.
865    #[endpoint(
866        method = PUT,
867        path = "/video/v1/videos/{videoRid}/archive",
868        name = "archive",
869        accept = conjure_http::client::conjure::EmptyResponseDeserializer
870    )]
871    async fn archive(
872        &self,
873        #[auth]
874        auth_: &conjure_object::BearerToken,
875        #[path(name = "videoRid", encoder = conjure_http::client::conjure::PlainEncoder)]
876        video_rid: &conjure_object::ResourceIdentifier,
877    ) -> Result<(), conjure_http::private::Error>;
878    /// Unarchives a previously archived video.
879    #[endpoint(
880        method = PUT,
881        path = "/video/v1/videos/{videoRid}/unarchive",
882        name = "unarchive",
883        accept = conjure_http::client::conjure::EmptyResponseDeserializer
884    )]
885    async fn unarchive(
886        &self,
887        #[auth]
888        auth_: &conjure_object::BearerToken,
889        #[path(name = "videoRid", encoder = conjure_http::client::conjure::PlainEncoder)]
890        video_rid: &conjure_object::ResourceIdentifier,
891    ) -> Result<(), conjure_http::private::Error>;
892    /// Generates an HLS playlist for a video within optional time bounds.
893    /// Uses GET with query parameters for HLS.js compatibility.
894    /// The HLS playlist will contain links to all of the segments in the video that overlap with the given bounds,
895    /// or all segments if no bounds are provided.
896    ///
897    /// Note: The start and end parameters must either both be provided or both be omitted.
898    /// Providing only one will result in a MissingTimestampBoundPair error.
899    #[endpoint(
900        method = GET,
901        path = "/video/v1/videos/{videoRid}/playlist",
902        name = "getPlaylist",
903        accept = conjure_http::client::conjure::BinaryResponseDeserializer
904    )]
905    async fn get_playlist(
906        &self,
907        #[auth]
908        auth_: &conjure_object::BearerToken,
909        #[path(name = "videoRid", encoder = conjure_http::client::conjure::PlainEncoder)]
910        video_rid: &conjure_object::ResourceIdentifier,
911        #[query(
912            name = "start",
913            encoder = conjure_http::client::conjure::PlainSeqEncoder
914        )]
915        start: Option<&str>,
916        #[query(name = "end", encoder = conjure_http::client::conjure::PlainSeqEncoder)]
917        end: Option<&str>,
918    ) -> Result<I, conjure_http::private::Error>;
919    /// Returns the min and max absolute and media timestamps for each segment in a video. To be used during
920    /// frame-timestamp mapping.
921    #[endpoint(
922        method = GET,
923        path = "/video/v1/videos/{videoRid}/segment-summaries",
924        name = "getSegmentSummaries",
925        accept = conjure_http::client::conjure::CollectionResponseDeserializer
926    )]
927    async fn get_segment_summaries(
928        &self,
929        #[auth]
930        auth_: &conjure_object::BearerToken,
931        #[path(name = "videoRid", encoder = conjure_http::client::conjure::PlainEncoder)]
932        video_rid: &conjure_object::ResourceIdentifier,
933    ) -> Result<
934        Vec<super::super::super::super::objects::scout::video::api::SegmentSummary>,
935        conjure_http::private::Error,
936    >;
937    /// Generates an HLS playlist for a video with the given video rid to enable playback within an optional set of
938    /// bounds. The HLS playlist will contain links to all of the segments in the video that overlap with the given
939    /// bounds.
940    /// playlist will be limited to the given bounds.
941    #[endpoint(
942        method = POST,
943        path = "/video/v1/videos/{videoRid}/playlist-in-bounds",
944        name = "getPlaylistInBounds",
945        accept = conjure_http::client::conjure::BinaryResponseDeserializer
946    )]
947    async fn get_playlist_in_bounds(
948        &self,
949        #[auth]
950        auth_: &conjure_object::BearerToken,
951        #[path(name = "videoRid", encoder = conjure_http::client::conjure::PlainEncoder)]
952        video_rid: &conjure_object::ResourceIdentifier,
953        #[body(serializer = conjure_http::client::StdRequestSerializer)]
954        request: &super::super::super::super::objects::scout::video::api::GetPlaylistInBoundsRequest,
955    ) -> Result<I, conjure_http::private::Error>;
956    /// Generates an HLS playlist for a video series (identified by channel + tags) within bounds.
957    #[endpoint(
958        method = POST,
959        path = "/video/v2/videos/playlist-in-bounds",
960        name = "getPlaylistInBoundsV2",
961        accept = conjure_http::client::conjure::BinaryResponseDeserializer
962    )]
963    async fn get_playlist_in_bounds_v2(
964        &self,
965        #[auth]
966        auth_: &conjure_object::BearerToken,
967        #[body(serializer = conjure_http::client::StdRequestSerializer)]
968        request: &super::super::super::super::objects::scout::video::api::GetPlaylistInBoundsForChannelRequest,
969    ) -> Result<I, conjure_http::private::Error>;
970    /// Generates an HLS playlist for a video series within time bounds.
971    /// Specify either dataSourceRid OR (assetRid + dataScopeName) to identify the series source.
972    ///
973    /// Note: Both start and end parameters are required and must be provided together.
974    #[endpoint(
975        method = GET,
976        path = "/video/v2/videos/playlist",
977        name = "getPlaylistV2",
978        accept = conjure_http::client::conjure::BinaryResponseDeserializer
979    )]
980    async fn get_playlist_v2(
981        &self,
982        #[auth]
983        auth_: &conjure_object::BearerToken,
984        #[query(
985            name = "dataSourceRid",
986            encoder = conjure_http::client::conjure::PlainSeqEncoder
987        )]
988        data_source_rid: Option<&conjure_object::ResourceIdentifier>,
989        #[query(
990            name = "assetRid",
991            encoder = conjure_http::client::conjure::PlainSeqEncoder
992        )]
993        asset_rid: Option<
994            &super::super::super::super::objects::scout::rids::api::AssetRid,
995        >,
996        #[query(
997            name = "dataScopeName",
998            encoder = conjure_http::client::conjure::PlainSeqEncoder
999        )]
1000        data_scope_name: Option<&str>,
1001        #[query(name = "channel", encoder = conjure_http::client::conjure::PlainEncoder)]
1002        channel: &str,
1003        #[query(name = "tags", encoder = conjure_http::client::conjure::PlainSeqEncoder)]
1004        tags: Option<&str>,
1005        #[query(name = "start", encoder = conjure_http::client::conjure::PlainEncoder)]
1006        start: &str,
1007        #[query(name = "end", encoder = conjure_http::client::conjure::PlainEncoder)]
1008        end: &str,
1009    ) -> Result<I, conjure_http::private::Error>;
1010    /// Returns the min and max absolute and media timestamps for each segment in a video that overlap with an
1011    /// optional set of bounds.
1012    #[endpoint(
1013        method = POST,
1014        path = "/video/v1/videos/{videoRid}/segment-summaries-in-bounds",
1015        name = "getSegmentSummariesInBounds",
1016        accept = conjure_http::client::conjure::CollectionResponseDeserializer
1017    )]
1018    async fn get_segment_summaries_in_bounds(
1019        &self,
1020        #[auth]
1021        auth_: &conjure_object::BearerToken,
1022        #[path(name = "videoRid", encoder = conjure_http::client::conjure::PlainEncoder)]
1023        video_rid: &conjure_object::ResourceIdentifier,
1024        #[body(serializer = conjure_http::client::StdRequestSerializer)]
1025        request: &super::super::super::super::objects::scout::video::api::GetSegmentSummariesInBoundsRequest,
1026    ) -> Result<
1027        Vec<super::super::super::super::objects::scout::video::api::SegmentSummary>,
1028        conjure_http::private::Error,
1029    >;
1030    /// Returns the min and max absolute and media timestamps for each segment matching a video series
1031    /// (identified by channel + tags) within the specified bounds.
1032    #[endpoint(
1033        method = POST,
1034        path = "/video/v2/videos/segment-summaries-in-bounds",
1035        name = "getSegmentSummariesInBoundsV2",
1036        accept = conjure_http::client::conjure::CollectionResponseDeserializer
1037    )]
1038    async fn get_segment_summaries_in_bounds_v2(
1039        &self,
1040        #[auth]
1041        auth_: &conjure_object::BearerToken,
1042        #[body(serializer = conjure_http::client::StdRequestSerializer)]
1043        request: &super::super::super::super::objects::scout::video::api::GetSegmentSummariesInBoundsForChannelRequest,
1044    ) -> Result<
1045        Vec<super::super::super::super::objects::scout::video::api::SegmentSummaryV2>,
1046        conjure_http::private::Error,
1047    >;
1048    /// Returns aggregated segment metadata for a video channel series, including total frames,
1049    /// segment count, min/max timestamps, and average frame rate. Optionally filter by time bounds.
1050    #[endpoint(
1051        method = POST,
1052        path = "/video/v2/videos/segment-metadata",
1053        name = "getSegmentMetadataV2",
1054        accept = conjure_http::client::conjure::CollectionResponseDeserializer
1055    )]
1056    async fn get_segment_metadata_v2(
1057        &self,
1058        #[auth]
1059        auth_: &conjure_object::BearerToken,
1060        #[body(serializer = conjure_http::client::StdRequestSerializer)]
1061        request: &super::super::super::super::objects::scout::video::api::GetSegmentMetadataForChannelRequest,
1062    ) -> Result<
1063        Option<
1064            super::super::super::super::objects::scout::video::api::VideoChannelSegmentsMetadata,
1065        >,
1066        conjure_http::private::Error,
1067    >;
1068    /// Returns metadata for the segment within a video series containing the requested absolute timestamp.
1069    #[endpoint(
1070        method = POST,
1071        path = "/video/v2/videos/get-segment-by-timestamp",
1072        name = "getSegmentByTimestampV2",
1073        accept = conjure_http::client::conjure::CollectionResponseDeserializer
1074    )]
1075    async fn get_segment_by_timestamp_v2(
1076        &self,
1077        #[auth]
1078        auth_: &conjure_object::BearerToken,
1079        #[body(serializer = conjure_http::client::StdRequestSerializer)]
1080        request: &super::super::super::super::objects::scout::video::api::GetSegmentByTimestampV2Request,
1081    ) -> Result<
1082        Option<super::super::super::super::objects::scout::video::api::SegmentV2>,
1083        conjure_http::private::Error,
1084    >;
1085    /// Returns metadata for the segment containing the requested absolute timestamp. If no segment contains
1086    /// the timestamp, returns the closest segment starting after the timestamp. Returns empty if no segment
1087    /// is found at or after the timestamp.
1088    #[endpoint(
1089        method = POST,
1090        path = "/video/v1/videos/{videoRid}/get-segment-at-or-after-timestamp",
1091        name = "getSegmentAtOrAfterTimestamp",
1092        accept = conjure_http::client::conjure::CollectionResponseDeserializer
1093    )]
1094    async fn get_segment_at_or_after_timestamp(
1095        &self,
1096        #[auth]
1097        auth_: &conjure_object::BearerToken,
1098        #[path(name = "videoRid", encoder = conjure_http::client::conjure::PlainEncoder)]
1099        video_rid: &conjure_object::ResourceIdentifier,
1100        #[body(serializer = conjure_http::client::StdRequestSerializer)]
1101        request: &super::super::super::super::objects::scout::video::api::GetSegmentAtOrAfterTimestampRequest,
1102    ) -> Result<
1103        Option<super::super::super::super::objects::scout::video::api::Segment>,
1104        conjure_http::private::Error,
1105    >;
1106    /// Returns metadata for the segment containing the requested absolute timestamp for a video series
1107    /// (identified by channel + tags). If no segment contains the timestamp, returns the closest segment
1108    /// starting after the timestamp. Returns empty if no segment is found at or after the timestamp.
1109    #[endpoint(
1110        method = POST,
1111        path = "/video/v2/videos/get-segment-at-or-after-timestamp",
1112        name = "getSegmentAtOrAfterTimestampV2",
1113        accept = conjure_http::client::conjure::CollectionResponseDeserializer
1114    )]
1115    async fn get_segment_at_or_after_timestamp_v2(
1116        &self,
1117        #[auth]
1118        auth_: &conjure_object::BearerToken,
1119        #[body(serializer = conjure_http::client::StdRequestSerializer)]
1120        request: &super::super::super::super::objects::scout::video::api::GetSegmentAtOrAfterTimestampV2Request,
1121    ) -> Result<
1122        Option<super::super::super::super::objects::scout::video::api::SegmentV2>,
1123        conjure_http::private::Error,
1124    >;
1125    /// Returns the min and max absolute timestamps from non-archived video files associated with a given video that
1126    /// overlap with an optional set of bounds. The files on the edges of the bounds will be truncated to segments
1127    /// that are inside or overlap with the bounds.
1128    #[endpoint(
1129        method = POST,
1130        path = "/video/v1/videos/{videoRid}/get-ranges-with-existing-segment-data",
1131        name = "getFileSummaries",
1132        accept = conjure_http::client::StdResponseDeserializer
1133    )]
1134    async fn get_file_summaries(
1135        &self,
1136        #[auth]
1137        auth_: &conjure_object::BearerToken,
1138        #[path(name = "videoRid", encoder = conjure_http::client::conjure::PlainEncoder)]
1139        video_rid: &conjure_object::ResourceIdentifier,
1140        #[body(serializer = conjure_http::client::StdRequestSerializer)]
1141        request: &super::super::super::super::objects::scout::video::api::GetFileSummariesRequest,
1142    ) -> Result<
1143        super::super::super::super::objects::scout::video::api::GetFileSummariesResponse,
1144        conjure_http::private::Error,
1145    >;
1146    /// Generates a stream ID scoped to a video and returns a WHIP URL with a MediaMTX JWT and ICE servers.
1147    /// Enforces write permission on the video.
1148    #[endpoint(
1149        method = POST,
1150        path = "/video/v1/videos/{videoRid}/streaming/whip",
1151        name = "generateWhipStream",
1152        accept = conjure_http::client::StdResponseDeserializer
1153    )]
1154    async fn generate_whip_stream(
1155        &self,
1156        #[auth]
1157        auth_: &conjure_object::BearerToken,
1158        #[path(name = "videoRid", encoder = conjure_http::client::conjure::PlainEncoder)]
1159        video_rid: &conjure_object::ResourceIdentifier,
1160    ) -> Result<
1161        super::super::super::super::objects::scout::video::api::GenerateWhipStreamResponse,
1162        conjure_http::private::Error,
1163    >;
1164    /// Generates a stream ID scoped to a channel-backed live video series and returns a WHIP URL with
1165    /// a MediaMTX JWT and ICE servers.
1166    /// Currently only datasource-backed dataset channels are supported.
1167    #[endpoint(
1168        method = POST,
1169        path = "/video/v2/videos/streaming/whip",
1170        name = "generateWhipStreamV2",
1171        accept = conjure_http::client::StdResponseDeserializer
1172    )]
1173    async fn generate_whip_stream_v2(
1174        &self,
1175        #[auth]
1176        auth_: &conjure_object::BearerToken,
1177        #[body(serializer = conjure_http::client::StdRequestSerializer)]
1178        request: &super::super::super::super::objects::scout::video::api::GenerateWhipStreamV2Request,
1179    ) -> Result<
1180        super::super::super::super::objects::scout::video::api::GenerateWhipStreamResponse,
1181        conjure_http::private::Error,
1182    >;
1183    /// Returns WHEP URL, ICE servers, and token for playing back the active stream.
1184    /// Returns empty if there is no active stream.
1185    /// Enforces read permission on the video.
1186    #[endpoint(
1187        method = POST,
1188        path = "/video/v1/videos/{videoRid}/streaming/whep",
1189        name = "generateWhepStream",
1190        accept = conjure_http::client::conjure::CollectionResponseDeserializer
1191    )]
1192    async fn generate_whep_stream(
1193        &self,
1194        #[auth]
1195        auth_: &conjure_object::BearerToken,
1196        #[path(name = "videoRid", encoder = conjure_http::client::conjure::PlainEncoder)]
1197        video_rid: &conjure_object::ResourceIdentifier,
1198    ) -> Result<
1199        Option<
1200            super::super::super::super::objects::scout::video::api::GenerateWhepStreamResponse,
1201        >,
1202        conjure_http::private::Error,
1203    >;
1204    /// Returns WHEP URL, ICE servers, and token for playing back the active channel-backed live video stream.
1205    /// Returns empty if there is no active stream.
1206    /// Currently only datasource-backed dataset channels are supported.
1207    #[endpoint(
1208        method = POST,
1209        path = "/video/v2/videos/streaming/whep",
1210        name = "generateWhepStreamV2",
1211        accept = conjure_http::client::conjure::CollectionResponseDeserializer
1212    )]
1213    async fn generate_whep_stream_v2(
1214        &self,
1215        #[auth]
1216        auth_: &conjure_object::BearerToken,
1217        #[body(serializer = conjure_http::client::StdRequestSerializer)]
1218        request: &super::super::super::super::objects::scout::video::api::GenerateWhepStreamV2Request,
1219    ) -> Result<
1220        Option<
1221            super::super::super::super::objects::scout::video::api::GenerateWhepStreamResponse,
1222        >,
1223        conjure_http::private::Error,
1224    >;
1225    /// Returns stream session metadata for a given stream ID scoped to the video.
1226    /// Enforces read permission on the video.
1227    #[endpoint(
1228        method = GET,
1229        path = "/video/v1/videos/{videoRid}/streaming/streams/{streamId}",
1230        name = "getStream",
1231        accept = conjure_http::client::conjure::CollectionResponseDeserializer
1232    )]
1233    async fn get_stream(
1234        &self,
1235        #[auth]
1236        auth_: &conjure_object::BearerToken,
1237        #[path(name = "videoRid", encoder = conjure_http::client::conjure::PlainEncoder)]
1238        video_rid: &conjure_object::ResourceIdentifier,
1239        #[path(name = "streamId", encoder = conjure_http::client::conjure::PlainEncoder)]
1240        stream_id: &str,
1241    ) -> Result<
1242        Option<super::super::super::super::objects::scout::video::api::VideoStream>,
1243        conjure_http::private::Error,
1244    >;
1245    /// Returns all stream sessions for a video that overlap with the specified time bounds.
1246    /// A stream overlaps if there is any intersection between its [start, end] interval and the provided bounds.
1247    /// Enforces read permission on the video.
1248    #[endpoint(
1249        method = POST,
1250        path = "/video/v1/videos/{videoRid}/streaming/streams-in-bounds",
1251        name = "getStreamsInBounds",
1252        accept = conjure_http::client::StdResponseDeserializer
1253    )]
1254    async fn get_streams_in_bounds(
1255        &self,
1256        #[auth]
1257        auth_: &conjure_object::BearerToken,
1258        #[path(name = "videoRid", encoder = conjure_http::client::conjure::PlainEncoder)]
1259        video_rid: &conjure_object::ResourceIdentifier,
1260        #[body(serializer = conjure_http::client::StdRequestSerializer)]
1261        request: &super::super::super::super::objects::scout::video::api::GetStreamsInBoundsRequest,
1262    ) -> Result<
1263        super::super::super::super::objects::scout::video::api::GetStreamsInBoundsResponse,
1264        conjure_http::private::Error,
1265    >;
1266    /// Returns all channel-backed stream sessions for a dataset/channel that overlap with the specified time bounds.
1267    /// A stream overlaps if there is any intersection between its [start, end] interval and the provided bounds.
1268    /// Enforces read metadata permission on the dataset.
1269    #[endpoint(
1270        method = POST,
1271        path = "/video/v2/videos/streaming/streams-in-bounds",
1272        name = "getStreamsInBoundsV2",
1273        accept = conjure_http::client::StdResponseDeserializer
1274    )]
1275    async fn get_streams_in_bounds_v2(
1276        &self,
1277        #[auth]
1278        auth_: &conjure_object::BearerToken,
1279        #[body(serializer = conjure_http::client::StdRequestSerializer)]
1280        request: &super::super::super::super::objects::scout::video::api::GetStreamsInBoundsForChannelRequest,
1281    ) -> Result<
1282        super::super::super::super::objects::scout::video::api::GetStreamsInBoundsV2Response,
1283        conjure_http::private::Error,
1284    >;
1285    /// Returns the dataset files backing a video channel (identified by channel + tags), ordered by
1286    /// start timestamp ascending and paginated. Each entry carries the min/max absolute timestamps the
1287    /// file contributes to the channel. Optionally filtered by time bounds. Streamed sessions are not
1288    /// included; use getStreamsInBoundsV2 for those.
1289    /// Enforces read metadata permission on the datasource.
1290    #[endpoint(
1291        method = POST,
1292        path = "/video/v2/videos/channel-dataset-files",
1293        name = "listVideoChannelDatasetFiles",
1294        accept = conjure_http::client::StdResponseDeserializer
1295    )]
1296    async fn list_video_channel_dataset_files(
1297        &self,
1298        #[auth]
1299        auth_: &conjure_object::BearerToken,
1300        #[body(serializer = conjure_http::client::StdRequestSerializer)]
1301        request: &super::super::super::super::objects::scout::video::api::ListVideoChannelDatasetFilesRequest,
1302    ) -> Result<
1303        super::super::super::super::objects::scout::video::api::ListVideoChannelDatasetFilesResponse,
1304        conjure_http::private::Error,
1305    >;
1306    /// Updates one or more video dataset files in a channel in a single transaction. Each update may set a new
1307    /// absolute start timestamp (segments shifted so the earliest starts at the given timestamp), a scale
1308    /// parameter (frame timestamps rescaled around the file's start), and/or a new title (file name). If a
1309    /// resulting layout would overlap segments of another file in the channel, no files are updated and
1310    /// VIDEO_SEGMENT_CONFLICT is thrown (all-or-nothing). Returns the updated files with their new bounds.
1311    /// Currently only datasource-backed dataset channels are supported.
1312    /// Enforces write data permission on the datasource.
1313    #[endpoint(
1314        method = POST,
1315        path = "/video/v2/videos/channel-dataset-files/batch-update",
1316        name = "batchUpdateVideoChannelDatasetFiles",
1317        accept = conjure_http::client::StdResponseDeserializer
1318    )]
1319    async fn batch_update_video_channel_dataset_files(
1320        &self,
1321        #[auth]
1322        auth_: &conjure_object::BearerToken,
1323        #[body(serializer = conjure_http::client::StdRequestSerializer)]
1324        request: &super::super::super::super::objects::scout::video::api::BatchUpdateVideoChannelDatasetFilesRequest,
1325    ) -> Result<
1326        super::super::super::super::objects::scout::video::api::BatchUpdateVideoChannelDatasetFilesResponse,
1327        conjure_http::private::Error,
1328    >;
1329    /// Marks the active stream session as ended for the video.
1330    /// Throws VIDEO_NOT_FOUND if no active stream exists.
1331    /// Enforces write permission on the video.
1332    #[endpoint(
1333        method = POST,
1334        path = "/video/v1/videos/{videoRid}/streaming/end",
1335        name = "endStream",
1336        accept = conjure_http::client::StdResponseDeserializer
1337    )]
1338    async fn end_stream(
1339        &self,
1340        #[auth]
1341        auth_: &conjure_object::BearerToken,
1342        #[path(name = "videoRid", encoder = conjure_http::client::conjure::PlainEncoder)]
1343        video_rid: &conjure_object::ResourceIdentifier,
1344    ) -> Result<
1345        super::super::super::super::objects::scout::video::api::EndStreamResponse,
1346        conjure_http::private::Error,
1347    >;
1348    /// MediaMTX segment upload endpoint. Receives video segments from MediaMTX hooks.
1349    /// Validates JWT and logs session. Future: create video segments from uploaded files.
1350    #[endpoint(
1351        method = POST,
1352        path = "/video/v1/segment/upload",
1353        name = "uploadSegmentFromMediaMtx",
1354        accept = conjure_http::client::conjure::EmptyResponseDeserializer
1355    )]
1356    async fn upload_segment_from_media_mtx(
1357        &self,
1358        #[auth]
1359        auth_: &conjure_object::BearerToken,
1360        #[query(
1361            name = "streamPath",
1362            encoder = conjure_http::client::conjure::PlainEncoder
1363        )]
1364        stream_path: &str,
1365        #[query(
1366            name = "filePath",
1367            encoder = conjure_http::client::conjure::PlainEncoder
1368        )]
1369        file_path: &str,
1370        #[query(
1371            name = "duration",
1372            encoder = conjure_http::client::conjure::PlainEncoder
1373        )]
1374        duration: &str,
1375        #[query(
1376            name = "minTimestampSeconds",
1377            encoder = conjure_http::client::conjure::PlainEncoder
1378        )]
1379        min_timestamp_seconds: conjure_object::SafeLong,
1380        #[query(
1381            name = "minTimestampNanos",
1382            encoder = conjure_http::client::conjure::PlainEncoder
1383        )]
1384        min_timestamp_nanos: conjure_object::SafeLong,
1385        #[header(
1386            name = "Content-Length",
1387            encoder = conjure_http::client::conjure::PlainEncoder
1388        )]
1389        content_length: conjure_object::SafeLong,
1390        #[body(serializer = conjure_http::client::conjure::BinaryRequestSerializer)]
1391        body: impl conjure_http::client::AsyncWriteBody<O> + Sync + Send,
1392    ) -> Result<(), conjure_http::private::Error>;
1393}
1394/// The video service manages videos and video metadata.
1395#[conjure_http::conjure_client(name = "VideoService", local)]
1396pub trait LocalAsyncVideoService<
1397    #[request_writer]
1398    O,
1399    #[response_body]
1400    I: conjure_http::private::Stream<
1401            Item = Result<conjure_http::private::Bytes, conjure_http::private::Error>,
1402        >,
1403> {
1404    /// Returns video metadata associated with a video rid.
1405    #[endpoint(
1406        method = GET,
1407        path = "/video/v1/videos/{videoRid}",
1408        name = "get",
1409        accept = conjure_http::client::StdResponseDeserializer
1410    )]
1411    async fn get(
1412        &self,
1413        #[auth]
1414        auth_: &conjure_object::BearerToken,
1415        #[path(name = "videoRid", encoder = conjure_http::client::conjure::PlainEncoder)]
1416        video_rid: &conjure_object::ResourceIdentifier,
1417    ) -> Result<
1418        super::super::super::super::objects::scout::video::api::Video,
1419        conjure_http::private::Error,
1420    >;
1421    /// Returns video metadata about each video given a set of video rids.
1422    #[endpoint(
1423        method = POST,
1424        path = "/video/v1/videos/batchGet",
1425        name = "batchGet",
1426        accept = conjure_http::client::StdResponseDeserializer
1427    )]
1428    async fn batch_get(
1429        &self,
1430        #[auth]
1431        auth_: &conjure_object::BearerToken,
1432        #[body(serializer = conjure_http::client::StdRequestSerializer)]
1433        request: &super::super::super::super::objects::scout::video::api::GetVideosRequest,
1434    ) -> Result<
1435        super::super::super::super::objects::scout::video::api::GetVideosResponse,
1436        conjure_http::private::Error,
1437    >;
1438    /// Returns metadata about videos that match a given query.
1439    #[endpoint(
1440        method = POST,
1441        path = "/video/v1/videos/search",
1442        name = "search",
1443        accept = conjure_http::client::StdResponseDeserializer
1444    )]
1445    async fn search(
1446        &self,
1447        #[auth]
1448        auth_: &conjure_object::BearerToken,
1449        #[body(serializer = conjure_http::client::StdRequestSerializer)]
1450        request: &super::super::super::super::objects::scout::video::api::SearchVideosRequest,
1451    ) -> Result<
1452        super::super::super::super::objects::scout::video::api::SearchVideosResponse,
1453        conjure_http::private::Error,
1454    >;
1455    /// Creates and persists a video entity with the given metadata.
1456    #[endpoint(
1457        method = POST,
1458        path = "/video/v1/videos",
1459        name = "create",
1460        accept = conjure_http::client::StdResponseDeserializer
1461    )]
1462    async fn create(
1463        &self,
1464        #[auth]
1465        auth_: &conjure_object::BearerToken,
1466        #[body(serializer = conjure_http::client::StdRequestSerializer)]
1467        request: &super::super::super::super::objects::scout::video::api::CreateVideoRequest,
1468    ) -> Result<
1469        super::super::super::super::objects::scout::video::api::Video,
1470        conjure_http::private::Error,
1471    >;
1472    /// Updates the metadata for a video associated with the given video rid.
1473    #[endpoint(
1474        method = PUT,
1475        path = "/video/v1/videos/{videoRid}",
1476        name = "updateMetadata",
1477        accept = conjure_http::client::StdResponseDeserializer
1478    )]
1479    async fn update_metadata(
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        #[body(serializer = conjure_http::client::StdRequestSerializer)]
1486        request: &super::super::super::super::objects::scout::video::api::UpdateVideoMetadataRequest,
1487    ) -> Result<
1488        super::super::super::super::objects::scout::video::api::Video,
1489        conjure_http::private::Error,
1490    >;
1491    #[endpoint(
1492        method = PUT,
1493        path = "/video/v1/videos/{videoRid}/ingest-status",
1494        name = "updateIngestStatus",
1495        accept = conjure_http::client::conjure::EmptyResponseDeserializer
1496    )]
1497    async fn update_ingest_status(
1498        &self,
1499        #[auth]
1500        auth_: &conjure_object::BearerToken,
1501        #[path(name = "videoRid", encoder = conjure_http::client::conjure::PlainEncoder)]
1502        video_rid: &conjure_object::ResourceIdentifier,
1503        #[body(serializer = conjure_http::client::StdRequestSerializer)]
1504        request: &super::super::super::super::objects::scout::video::api::UpdateIngestStatus,
1505    ) -> Result<(), conjure_http::private::Error>;
1506    #[endpoint(
1507        method = GET,
1508        path = "/video/v1/videos/{videoRid}/ingest-status",
1509        name = "getIngestStatus",
1510        accept = conjure_http::client::StdResponseDeserializer
1511    )]
1512    async fn get_ingest_status(
1513        &self,
1514        #[auth]
1515        auth_: &conjure_object::BearerToken,
1516        #[path(name = "videoRid", encoder = conjure_http::client::conjure::PlainEncoder)]
1517        video_rid: &conjure_object::ResourceIdentifier,
1518    ) -> Result<
1519        super::super::super::super::objects::scout::video::api::DetailedIngestStatus,
1520        conjure_http::private::Error,
1521    >;
1522    #[endpoint(
1523        method = POST,
1524        path = "/video/v1/videos/batch-get-ingest-status",
1525        name = "batchGetIngestStatus",
1526        accept = conjure_http::client::conjure::CollectionResponseDeserializer
1527    )]
1528    async fn batch_get_ingest_status(
1529        &self,
1530        #[auth]
1531        auth_: &conjure_object::BearerToken,
1532        #[body(serializer = conjure_http::client::StdRequestSerializer)]
1533        video_rids: &std::collections::BTreeSet<conjure_object::ResourceIdentifier>,
1534    ) -> Result<
1535        std::collections::BTreeMap<
1536            conjure_object::ResourceIdentifier,
1537            super::super::super::super::objects::scout::video::api::DetailedIngestStatus,
1538        >,
1539        conjure_http::private::Error,
1540    >;
1541    #[endpoint(
1542        method = POST,
1543        path = "/video/v1/videos/enriched-ingest-status",
1544        name = "getEnrichedIngestStatus",
1545        accept = conjure_http::client::conjure::CollectionResponseDeserializer
1546    )]
1547    async fn get_enriched_ingest_status(
1548        &self,
1549        #[auth]
1550        auth_: &conjure_object::BearerToken,
1551        #[body(serializer = conjure_http::client::StdRequestSerializer)]
1552        request: &super::super::super::super::objects::scout::video::api::GetEnrichedVideoIngestStatusRequest,
1553    ) -> Result<
1554        Option<
1555            super::super::super::super::objects::scout::video::api::EnrichedVideoIngestStatus,
1556        >,
1557        conjure_http::private::Error,
1558    >;
1559    /// Archives a video, which excludes it from search and hides it from being publicly visible, but does not
1560    /// permanently delete it. Archived videos can be unarchived.
1561    #[endpoint(
1562        method = PUT,
1563        path = "/video/v1/videos/{videoRid}/archive",
1564        name = "archive",
1565        accept = conjure_http::client::conjure::EmptyResponseDeserializer
1566    )]
1567    async fn archive(
1568        &self,
1569        #[auth]
1570        auth_: &conjure_object::BearerToken,
1571        #[path(name = "videoRid", encoder = conjure_http::client::conjure::PlainEncoder)]
1572        video_rid: &conjure_object::ResourceIdentifier,
1573    ) -> Result<(), conjure_http::private::Error>;
1574    /// Unarchives a previously archived video.
1575    #[endpoint(
1576        method = PUT,
1577        path = "/video/v1/videos/{videoRid}/unarchive",
1578        name = "unarchive",
1579        accept = conjure_http::client::conjure::EmptyResponseDeserializer
1580    )]
1581    async fn unarchive(
1582        &self,
1583        #[auth]
1584        auth_: &conjure_object::BearerToken,
1585        #[path(name = "videoRid", encoder = conjure_http::client::conjure::PlainEncoder)]
1586        video_rid: &conjure_object::ResourceIdentifier,
1587    ) -> Result<(), conjure_http::private::Error>;
1588    /// Generates an HLS playlist for a video within optional time bounds.
1589    /// Uses GET with query parameters for HLS.js compatibility.
1590    /// The HLS playlist will contain links to all of the segments in the video that overlap with the given bounds,
1591    /// or all segments if no bounds are provided.
1592    ///
1593    /// Note: The start and end parameters must either both be provided or both be omitted.
1594    /// Providing only one will result in a MissingTimestampBoundPair error.
1595    #[endpoint(
1596        method = GET,
1597        path = "/video/v1/videos/{videoRid}/playlist",
1598        name = "getPlaylist",
1599        accept = conjure_http::client::conjure::BinaryResponseDeserializer
1600    )]
1601    async fn get_playlist(
1602        &self,
1603        #[auth]
1604        auth_: &conjure_object::BearerToken,
1605        #[path(name = "videoRid", encoder = conjure_http::client::conjure::PlainEncoder)]
1606        video_rid: &conjure_object::ResourceIdentifier,
1607        #[query(
1608            name = "start",
1609            encoder = conjure_http::client::conjure::PlainSeqEncoder
1610        )]
1611        start: Option<&str>,
1612        #[query(name = "end", encoder = conjure_http::client::conjure::PlainSeqEncoder)]
1613        end: Option<&str>,
1614    ) -> Result<I, conjure_http::private::Error>;
1615    /// Returns the min and max absolute and media timestamps for each segment in a video. To be used during
1616    /// frame-timestamp mapping.
1617    #[endpoint(
1618        method = GET,
1619        path = "/video/v1/videos/{videoRid}/segment-summaries",
1620        name = "getSegmentSummaries",
1621        accept = conjure_http::client::conjure::CollectionResponseDeserializer
1622    )]
1623    async fn get_segment_summaries(
1624        &self,
1625        #[auth]
1626        auth_: &conjure_object::BearerToken,
1627        #[path(name = "videoRid", encoder = conjure_http::client::conjure::PlainEncoder)]
1628        video_rid: &conjure_object::ResourceIdentifier,
1629    ) -> Result<
1630        Vec<super::super::super::super::objects::scout::video::api::SegmentSummary>,
1631        conjure_http::private::Error,
1632    >;
1633    /// Generates an HLS playlist for a video with the given video rid to enable playback within an optional set of
1634    /// bounds. The HLS playlist will contain links to all of the segments in the video that overlap with the given
1635    /// bounds.
1636    /// playlist will be limited to the given bounds.
1637    #[endpoint(
1638        method = POST,
1639        path = "/video/v1/videos/{videoRid}/playlist-in-bounds",
1640        name = "getPlaylistInBounds",
1641        accept = conjure_http::client::conjure::BinaryResponseDeserializer
1642    )]
1643    async fn get_playlist_in_bounds(
1644        &self,
1645        #[auth]
1646        auth_: &conjure_object::BearerToken,
1647        #[path(name = "videoRid", encoder = conjure_http::client::conjure::PlainEncoder)]
1648        video_rid: &conjure_object::ResourceIdentifier,
1649        #[body(serializer = conjure_http::client::StdRequestSerializer)]
1650        request: &super::super::super::super::objects::scout::video::api::GetPlaylistInBoundsRequest,
1651    ) -> Result<I, conjure_http::private::Error>;
1652    /// Generates an HLS playlist for a video series (identified by channel + tags) within bounds.
1653    #[endpoint(
1654        method = POST,
1655        path = "/video/v2/videos/playlist-in-bounds",
1656        name = "getPlaylistInBoundsV2",
1657        accept = conjure_http::client::conjure::BinaryResponseDeserializer
1658    )]
1659    async fn get_playlist_in_bounds_v2(
1660        &self,
1661        #[auth]
1662        auth_: &conjure_object::BearerToken,
1663        #[body(serializer = conjure_http::client::StdRequestSerializer)]
1664        request: &super::super::super::super::objects::scout::video::api::GetPlaylistInBoundsForChannelRequest,
1665    ) -> Result<I, conjure_http::private::Error>;
1666    /// Generates an HLS playlist for a video series within time bounds.
1667    /// Specify either dataSourceRid OR (assetRid + dataScopeName) to identify the series source.
1668    ///
1669    /// Note: Both start and end parameters are required and must be provided together.
1670    #[endpoint(
1671        method = GET,
1672        path = "/video/v2/videos/playlist",
1673        name = "getPlaylistV2",
1674        accept = conjure_http::client::conjure::BinaryResponseDeserializer
1675    )]
1676    async fn get_playlist_v2(
1677        &self,
1678        #[auth]
1679        auth_: &conjure_object::BearerToken,
1680        #[query(
1681            name = "dataSourceRid",
1682            encoder = conjure_http::client::conjure::PlainSeqEncoder
1683        )]
1684        data_source_rid: Option<&conjure_object::ResourceIdentifier>,
1685        #[query(
1686            name = "assetRid",
1687            encoder = conjure_http::client::conjure::PlainSeqEncoder
1688        )]
1689        asset_rid: Option<
1690            &super::super::super::super::objects::scout::rids::api::AssetRid,
1691        >,
1692        #[query(
1693            name = "dataScopeName",
1694            encoder = conjure_http::client::conjure::PlainSeqEncoder
1695        )]
1696        data_scope_name: Option<&str>,
1697        #[query(name = "channel", encoder = conjure_http::client::conjure::PlainEncoder)]
1698        channel: &str,
1699        #[query(name = "tags", encoder = conjure_http::client::conjure::PlainSeqEncoder)]
1700        tags: Option<&str>,
1701        #[query(name = "start", encoder = conjure_http::client::conjure::PlainEncoder)]
1702        start: &str,
1703        #[query(name = "end", encoder = conjure_http::client::conjure::PlainEncoder)]
1704        end: &str,
1705    ) -> Result<I, conjure_http::private::Error>;
1706    /// Returns the min and max absolute and media timestamps for each segment in a video that overlap with an
1707    /// optional set of bounds.
1708    #[endpoint(
1709        method = POST,
1710        path = "/video/v1/videos/{videoRid}/segment-summaries-in-bounds",
1711        name = "getSegmentSummariesInBounds",
1712        accept = conjure_http::client::conjure::CollectionResponseDeserializer
1713    )]
1714    async fn get_segment_summaries_in_bounds(
1715        &self,
1716        #[auth]
1717        auth_: &conjure_object::BearerToken,
1718        #[path(name = "videoRid", encoder = conjure_http::client::conjure::PlainEncoder)]
1719        video_rid: &conjure_object::ResourceIdentifier,
1720        #[body(serializer = conjure_http::client::StdRequestSerializer)]
1721        request: &super::super::super::super::objects::scout::video::api::GetSegmentSummariesInBoundsRequest,
1722    ) -> Result<
1723        Vec<super::super::super::super::objects::scout::video::api::SegmentSummary>,
1724        conjure_http::private::Error,
1725    >;
1726    /// Returns the min and max absolute and media timestamps for each segment matching a video series
1727    /// (identified by channel + tags) within the specified bounds.
1728    #[endpoint(
1729        method = POST,
1730        path = "/video/v2/videos/segment-summaries-in-bounds",
1731        name = "getSegmentSummariesInBoundsV2",
1732        accept = conjure_http::client::conjure::CollectionResponseDeserializer
1733    )]
1734    async fn get_segment_summaries_in_bounds_v2(
1735        &self,
1736        #[auth]
1737        auth_: &conjure_object::BearerToken,
1738        #[body(serializer = conjure_http::client::StdRequestSerializer)]
1739        request: &super::super::super::super::objects::scout::video::api::GetSegmentSummariesInBoundsForChannelRequest,
1740    ) -> Result<
1741        Vec<super::super::super::super::objects::scout::video::api::SegmentSummaryV2>,
1742        conjure_http::private::Error,
1743    >;
1744    /// Returns aggregated segment metadata for a video channel series, including total frames,
1745    /// segment count, min/max timestamps, and average frame rate. Optionally filter by time bounds.
1746    #[endpoint(
1747        method = POST,
1748        path = "/video/v2/videos/segment-metadata",
1749        name = "getSegmentMetadataV2",
1750        accept = conjure_http::client::conjure::CollectionResponseDeserializer
1751    )]
1752    async fn get_segment_metadata_v2(
1753        &self,
1754        #[auth]
1755        auth_: &conjure_object::BearerToken,
1756        #[body(serializer = conjure_http::client::StdRequestSerializer)]
1757        request: &super::super::super::super::objects::scout::video::api::GetSegmentMetadataForChannelRequest,
1758    ) -> Result<
1759        Option<
1760            super::super::super::super::objects::scout::video::api::VideoChannelSegmentsMetadata,
1761        >,
1762        conjure_http::private::Error,
1763    >;
1764    /// Returns metadata for the segment within a video series containing the requested absolute timestamp.
1765    #[endpoint(
1766        method = POST,
1767        path = "/video/v2/videos/get-segment-by-timestamp",
1768        name = "getSegmentByTimestampV2",
1769        accept = conjure_http::client::conjure::CollectionResponseDeserializer
1770    )]
1771    async fn get_segment_by_timestamp_v2(
1772        &self,
1773        #[auth]
1774        auth_: &conjure_object::BearerToken,
1775        #[body(serializer = conjure_http::client::StdRequestSerializer)]
1776        request: &super::super::super::super::objects::scout::video::api::GetSegmentByTimestampV2Request,
1777    ) -> Result<
1778        Option<super::super::super::super::objects::scout::video::api::SegmentV2>,
1779        conjure_http::private::Error,
1780    >;
1781    /// Returns metadata for the segment containing the requested absolute timestamp. If no segment contains
1782    /// the timestamp, returns the closest segment starting after the timestamp. Returns empty if no segment
1783    /// is found at or after the timestamp.
1784    #[endpoint(
1785        method = POST,
1786        path = "/video/v1/videos/{videoRid}/get-segment-at-or-after-timestamp",
1787        name = "getSegmentAtOrAfterTimestamp",
1788        accept = conjure_http::client::conjure::CollectionResponseDeserializer
1789    )]
1790    async fn get_segment_at_or_after_timestamp(
1791        &self,
1792        #[auth]
1793        auth_: &conjure_object::BearerToken,
1794        #[path(name = "videoRid", encoder = conjure_http::client::conjure::PlainEncoder)]
1795        video_rid: &conjure_object::ResourceIdentifier,
1796        #[body(serializer = conjure_http::client::StdRequestSerializer)]
1797        request: &super::super::super::super::objects::scout::video::api::GetSegmentAtOrAfterTimestampRequest,
1798    ) -> Result<
1799        Option<super::super::super::super::objects::scout::video::api::Segment>,
1800        conjure_http::private::Error,
1801    >;
1802    /// Returns metadata for the segment containing the requested absolute timestamp for a video series
1803    /// (identified by channel + tags). If no segment contains the timestamp, returns the closest segment
1804    /// starting after the timestamp. Returns empty if no segment is found at or after the timestamp.
1805    #[endpoint(
1806        method = POST,
1807        path = "/video/v2/videos/get-segment-at-or-after-timestamp",
1808        name = "getSegmentAtOrAfterTimestampV2",
1809        accept = conjure_http::client::conjure::CollectionResponseDeserializer
1810    )]
1811    async fn get_segment_at_or_after_timestamp_v2(
1812        &self,
1813        #[auth]
1814        auth_: &conjure_object::BearerToken,
1815        #[body(serializer = conjure_http::client::StdRequestSerializer)]
1816        request: &super::super::super::super::objects::scout::video::api::GetSegmentAtOrAfterTimestampV2Request,
1817    ) -> Result<
1818        Option<super::super::super::super::objects::scout::video::api::SegmentV2>,
1819        conjure_http::private::Error,
1820    >;
1821    /// Returns the min and max absolute timestamps from non-archived video files associated with a given video that
1822    /// overlap with an optional set of bounds. The files on the edges of the bounds will be truncated to segments
1823    /// that are inside or overlap with the bounds.
1824    #[endpoint(
1825        method = POST,
1826        path = "/video/v1/videos/{videoRid}/get-ranges-with-existing-segment-data",
1827        name = "getFileSummaries",
1828        accept = conjure_http::client::StdResponseDeserializer
1829    )]
1830    async fn get_file_summaries(
1831        &self,
1832        #[auth]
1833        auth_: &conjure_object::BearerToken,
1834        #[path(name = "videoRid", encoder = conjure_http::client::conjure::PlainEncoder)]
1835        video_rid: &conjure_object::ResourceIdentifier,
1836        #[body(serializer = conjure_http::client::StdRequestSerializer)]
1837        request: &super::super::super::super::objects::scout::video::api::GetFileSummariesRequest,
1838    ) -> Result<
1839        super::super::super::super::objects::scout::video::api::GetFileSummariesResponse,
1840        conjure_http::private::Error,
1841    >;
1842    /// Generates a stream ID scoped to a video and returns a WHIP URL with a MediaMTX JWT and ICE servers.
1843    /// Enforces write permission on the video.
1844    #[endpoint(
1845        method = POST,
1846        path = "/video/v1/videos/{videoRid}/streaming/whip",
1847        name = "generateWhipStream",
1848        accept = conjure_http::client::StdResponseDeserializer
1849    )]
1850    async fn generate_whip_stream(
1851        &self,
1852        #[auth]
1853        auth_: &conjure_object::BearerToken,
1854        #[path(name = "videoRid", encoder = conjure_http::client::conjure::PlainEncoder)]
1855        video_rid: &conjure_object::ResourceIdentifier,
1856    ) -> Result<
1857        super::super::super::super::objects::scout::video::api::GenerateWhipStreamResponse,
1858        conjure_http::private::Error,
1859    >;
1860    /// Generates a stream ID scoped to a channel-backed live video series and returns a WHIP URL with
1861    /// a MediaMTX JWT and ICE servers.
1862    /// Currently only datasource-backed dataset channels are supported.
1863    #[endpoint(
1864        method = POST,
1865        path = "/video/v2/videos/streaming/whip",
1866        name = "generateWhipStreamV2",
1867        accept = conjure_http::client::StdResponseDeserializer
1868    )]
1869    async fn generate_whip_stream_v2(
1870        &self,
1871        #[auth]
1872        auth_: &conjure_object::BearerToken,
1873        #[body(serializer = conjure_http::client::StdRequestSerializer)]
1874        request: &super::super::super::super::objects::scout::video::api::GenerateWhipStreamV2Request,
1875    ) -> Result<
1876        super::super::super::super::objects::scout::video::api::GenerateWhipStreamResponse,
1877        conjure_http::private::Error,
1878    >;
1879    /// Returns WHEP URL, ICE servers, and token for playing back the active stream.
1880    /// Returns empty if there is no active stream.
1881    /// Enforces read permission on the video.
1882    #[endpoint(
1883        method = POST,
1884        path = "/video/v1/videos/{videoRid}/streaming/whep",
1885        name = "generateWhepStream",
1886        accept = conjure_http::client::conjure::CollectionResponseDeserializer
1887    )]
1888    async fn generate_whep_stream(
1889        &self,
1890        #[auth]
1891        auth_: &conjure_object::BearerToken,
1892        #[path(name = "videoRid", encoder = conjure_http::client::conjure::PlainEncoder)]
1893        video_rid: &conjure_object::ResourceIdentifier,
1894    ) -> Result<
1895        Option<
1896            super::super::super::super::objects::scout::video::api::GenerateWhepStreamResponse,
1897        >,
1898        conjure_http::private::Error,
1899    >;
1900    /// Returns WHEP URL, ICE servers, and token for playing back the active channel-backed live video stream.
1901    /// Returns empty if there is no active stream.
1902    /// Currently only datasource-backed dataset channels are supported.
1903    #[endpoint(
1904        method = POST,
1905        path = "/video/v2/videos/streaming/whep",
1906        name = "generateWhepStreamV2",
1907        accept = conjure_http::client::conjure::CollectionResponseDeserializer
1908    )]
1909    async fn generate_whep_stream_v2(
1910        &self,
1911        #[auth]
1912        auth_: &conjure_object::BearerToken,
1913        #[body(serializer = conjure_http::client::StdRequestSerializer)]
1914        request: &super::super::super::super::objects::scout::video::api::GenerateWhepStreamV2Request,
1915    ) -> Result<
1916        Option<
1917            super::super::super::super::objects::scout::video::api::GenerateWhepStreamResponse,
1918        >,
1919        conjure_http::private::Error,
1920    >;
1921    /// Returns stream session metadata for a given stream ID scoped to the video.
1922    /// Enforces read permission on the video.
1923    #[endpoint(
1924        method = GET,
1925        path = "/video/v1/videos/{videoRid}/streaming/streams/{streamId}",
1926        name = "getStream",
1927        accept = conjure_http::client::conjure::CollectionResponseDeserializer
1928    )]
1929    async fn get_stream(
1930        &self,
1931        #[auth]
1932        auth_: &conjure_object::BearerToken,
1933        #[path(name = "videoRid", encoder = conjure_http::client::conjure::PlainEncoder)]
1934        video_rid: &conjure_object::ResourceIdentifier,
1935        #[path(name = "streamId", encoder = conjure_http::client::conjure::PlainEncoder)]
1936        stream_id: &str,
1937    ) -> Result<
1938        Option<super::super::super::super::objects::scout::video::api::VideoStream>,
1939        conjure_http::private::Error,
1940    >;
1941    /// Returns all stream sessions for a video that overlap with the specified time bounds.
1942    /// A stream overlaps if there is any intersection between its [start, end] interval and the provided bounds.
1943    /// Enforces read permission on the video.
1944    #[endpoint(
1945        method = POST,
1946        path = "/video/v1/videos/{videoRid}/streaming/streams-in-bounds",
1947        name = "getStreamsInBounds",
1948        accept = conjure_http::client::StdResponseDeserializer
1949    )]
1950    async fn get_streams_in_bounds(
1951        &self,
1952        #[auth]
1953        auth_: &conjure_object::BearerToken,
1954        #[path(name = "videoRid", encoder = conjure_http::client::conjure::PlainEncoder)]
1955        video_rid: &conjure_object::ResourceIdentifier,
1956        #[body(serializer = conjure_http::client::StdRequestSerializer)]
1957        request: &super::super::super::super::objects::scout::video::api::GetStreamsInBoundsRequest,
1958    ) -> Result<
1959        super::super::super::super::objects::scout::video::api::GetStreamsInBoundsResponse,
1960        conjure_http::private::Error,
1961    >;
1962    /// Returns all channel-backed stream sessions for a dataset/channel that overlap with the specified time bounds.
1963    /// A stream overlaps if there is any intersection between its [start, end] interval and the provided bounds.
1964    /// Enforces read metadata permission on the dataset.
1965    #[endpoint(
1966        method = POST,
1967        path = "/video/v2/videos/streaming/streams-in-bounds",
1968        name = "getStreamsInBoundsV2",
1969        accept = conjure_http::client::StdResponseDeserializer
1970    )]
1971    async fn get_streams_in_bounds_v2(
1972        &self,
1973        #[auth]
1974        auth_: &conjure_object::BearerToken,
1975        #[body(serializer = conjure_http::client::StdRequestSerializer)]
1976        request: &super::super::super::super::objects::scout::video::api::GetStreamsInBoundsForChannelRequest,
1977    ) -> Result<
1978        super::super::super::super::objects::scout::video::api::GetStreamsInBoundsV2Response,
1979        conjure_http::private::Error,
1980    >;
1981    /// Returns the dataset files backing a video channel (identified by channel + tags), ordered by
1982    /// start timestamp ascending and paginated. Each entry carries the min/max absolute timestamps the
1983    /// file contributes to the channel. Optionally filtered by time bounds. Streamed sessions are not
1984    /// included; use getStreamsInBoundsV2 for those.
1985    /// Enforces read metadata permission on the datasource.
1986    #[endpoint(
1987        method = POST,
1988        path = "/video/v2/videos/channel-dataset-files",
1989        name = "listVideoChannelDatasetFiles",
1990        accept = conjure_http::client::StdResponseDeserializer
1991    )]
1992    async fn list_video_channel_dataset_files(
1993        &self,
1994        #[auth]
1995        auth_: &conjure_object::BearerToken,
1996        #[body(serializer = conjure_http::client::StdRequestSerializer)]
1997        request: &super::super::super::super::objects::scout::video::api::ListVideoChannelDatasetFilesRequest,
1998    ) -> Result<
1999        super::super::super::super::objects::scout::video::api::ListVideoChannelDatasetFilesResponse,
2000        conjure_http::private::Error,
2001    >;
2002    /// Updates one or more video dataset files in a channel in a single transaction. Each update may set a new
2003    /// absolute start timestamp (segments shifted so the earliest starts at the given timestamp), a scale
2004    /// parameter (frame timestamps rescaled around the file's start), and/or a new title (file name). If a
2005    /// resulting layout would overlap segments of another file in the channel, no files are updated and
2006    /// VIDEO_SEGMENT_CONFLICT is thrown (all-or-nothing). Returns the updated files with their new bounds.
2007    /// Currently only datasource-backed dataset channels are supported.
2008    /// Enforces write data permission on the datasource.
2009    #[endpoint(
2010        method = POST,
2011        path = "/video/v2/videos/channel-dataset-files/batch-update",
2012        name = "batchUpdateVideoChannelDatasetFiles",
2013        accept = conjure_http::client::StdResponseDeserializer
2014    )]
2015    async fn batch_update_video_channel_dataset_files(
2016        &self,
2017        #[auth]
2018        auth_: &conjure_object::BearerToken,
2019        #[body(serializer = conjure_http::client::StdRequestSerializer)]
2020        request: &super::super::super::super::objects::scout::video::api::BatchUpdateVideoChannelDatasetFilesRequest,
2021    ) -> Result<
2022        super::super::super::super::objects::scout::video::api::BatchUpdateVideoChannelDatasetFilesResponse,
2023        conjure_http::private::Error,
2024    >;
2025    /// Marks the active stream session as ended for the video.
2026    /// Throws VIDEO_NOT_FOUND if no active stream exists.
2027    /// Enforces write permission on the video.
2028    #[endpoint(
2029        method = POST,
2030        path = "/video/v1/videos/{videoRid}/streaming/end",
2031        name = "endStream",
2032        accept = conjure_http::client::StdResponseDeserializer
2033    )]
2034    async fn end_stream(
2035        &self,
2036        #[auth]
2037        auth_: &conjure_object::BearerToken,
2038        #[path(name = "videoRid", encoder = conjure_http::client::conjure::PlainEncoder)]
2039        video_rid: &conjure_object::ResourceIdentifier,
2040    ) -> Result<
2041        super::super::super::super::objects::scout::video::api::EndStreamResponse,
2042        conjure_http::private::Error,
2043    >;
2044    /// MediaMTX segment upload endpoint. Receives video segments from MediaMTX hooks.
2045    /// Validates JWT and logs session. Future: create video segments from uploaded files.
2046    #[endpoint(
2047        method = POST,
2048        path = "/video/v1/segment/upload",
2049        name = "uploadSegmentFromMediaMtx",
2050        accept = conjure_http::client::conjure::EmptyResponseDeserializer
2051    )]
2052    async fn upload_segment_from_media_mtx(
2053        &self,
2054        #[auth]
2055        auth_: &conjure_object::BearerToken,
2056        #[query(
2057            name = "streamPath",
2058            encoder = conjure_http::client::conjure::PlainEncoder
2059        )]
2060        stream_path: &str,
2061        #[query(
2062            name = "filePath",
2063            encoder = conjure_http::client::conjure::PlainEncoder
2064        )]
2065        file_path: &str,
2066        #[query(
2067            name = "duration",
2068            encoder = conjure_http::client::conjure::PlainEncoder
2069        )]
2070        duration: &str,
2071        #[query(
2072            name = "minTimestampSeconds",
2073            encoder = conjure_http::client::conjure::PlainEncoder
2074        )]
2075        min_timestamp_seconds: conjure_object::SafeLong,
2076        #[query(
2077            name = "minTimestampNanos",
2078            encoder = conjure_http::client::conjure::PlainEncoder
2079        )]
2080        min_timestamp_nanos: conjure_object::SafeLong,
2081        #[header(
2082            name = "Content-Length",
2083            encoder = conjure_http::client::conjure::PlainEncoder
2084        )]
2085        content_length: conjure_object::SafeLong,
2086        #[body(serializer = conjure_http::client::conjure::BinaryRequestSerializer)]
2087        body: impl conjure_http::client::LocalAsyncWriteBody<O>,
2088    ) -> Result<(), conjure_http::private::Error>;
2089}