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