Skip to main content

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

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