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