@@ -41,8 +41,8 @@ use tempfile::{Builder as TempFileBuilder, NamedTempFile, TempDir};
41
41
use tokio:: { fs:: File as TokioFile , io:: AsyncWriteExt } ;
42
42
43
43
use crate :: {
44
- attachment:: Thumbnail , client:: futures:: SendMediaUploadRequest , config :: RequestConfig , Client ,
45
- Error , Result , TransmissionProgress ,
44
+ attachment:: Thumbnail , client:: futures:: SendMediaUploadRequest , Client , Error , Result ,
45
+ TransmissionProgress ,
46
46
} ;
47
47
48
48
/// A conservative upload speed of 1Mbps
@@ -165,57 +165,40 @@ impl Media {
165
165
Self { client }
166
166
}
167
167
168
- /// Upload some media to the server.
169
- ///
170
- /// # Arguments
171
- ///
172
- /// * `content_type` - The type of the media, this will be used as the
173
- /// content-type header.
174
- ///
175
- /// * `data` - Vector of bytes to be uploaded to the server.
176
- ///
177
- /// * `request_config` - Optional request configuration for the HTTP client,
178
- /// overriding the default. If not provided, a reasonable timeout value is
179
- /// inferred.
168
+ /// Upload some media to the server using the provided
169
+ /// [`SendMediaUploadRequest`].
180
170
///
181
171
/// # Examples
182
172
///
183
173
/// ```no_run
184
174
/// # use std::fs;
185
- /// # use matrix_sdk::{Client, ruma::room_id};
175
+ /// # use matrix_sdk::{Client, ruma::room_id, SendMediaUploadRequest };
186
176
/// # use url::Url;
187
177
/// # use mime;
188
178
/// # async {
189
179
/// # let homeserver = Url::parse("http://localhost:8080")?;
190
180
/// # let mut client = Client::new(homeserver).await?;
191
181
/// let image = fs::read("/home/example/my-cat.jpg")?;
192
182
///
193
- /// let response = client
194
- /// .media()
195
- /// .upload(&mime::IMAGE_JPEG, image, Some("my-cat.jpg".to_string()), None)
196
- /// .await?;
183
+ /// let send_media_request = SendMediaUploadRequest::new(client.clone(), image)
184
+ /// .with_content_type(mime::IMAGE_JPEG.essence_str().to_string())
185
+ /// .with_filename(Some("my-cat.jpg"));
186
+ ///
187
+ /// let response = client.media().upload(send_media_request).await?;
197
188
///
198
189
/// println!("Cat URI: {}", response.content_uri);
199
190
/// # anyhow::Ok(()) };
200
191
/// ```
201
- pub fn upload (
192
+ pub async fn upload (
202
193
& self ,
203
- content_type : & Mime ,
204
- data : Vec < u8 > ,
205
- filename : Option < String > ,
206
- request_config : Option < RequestConfig > ,
207
- ) -> SendMediaUploadRequest {
208
- let request_config = request_config. unwrap_or_else ( || {
209
- self . client . request_config ( ) . timeout ( Self :: reasonable_upload_timeout ( & data) )
210
- } ) ;
211
-
212
- let request = assign ! ( media:: create_content:: v3:: Request :: new( data) , {
213
- filename,
214
- content_type: Some ( content_type. essence_str( ) . to_owned( ) ) ,
194
+ send_media_upload_request : SendMediaUploadRequest ,
195
+ ) -> Result < media:: create_content:: v3:: Response , Error > {
196
+ let request_config = send_media_upload_request. request_config . unwrap_or_else ( || {
197
+ self . client
198
+ . request_config ( )
199
+ . timeout ( Self :: reasonable_upload_timeout ( send_media_upload_request. data ( ) ) )
215
200
} ) ;
216
-
217
- let request = self . client . send ( request) . with_request_config ( request_config) ;
218
- SendMediaUploadRequest :: new ( request)
201
+ send_media_upload_request. with_request_config ( Some ( request_config) ) . await
219
202
}
220
203
221
204
/// Returns a reasonable upload timeout for an upload, based on the size of
@@ -732,11 +715,12 @@ impl Media {
732
715
let upload_thumbnail =
733
716
self . upload_thumbnail ( thumbnail, filename. clone ( ) , send_progress. clone ( ) ) ;
734
717
735
- let upload_attachment = async move {
736
- self . upload ( content_type, data, filename, None )
737
- . with_send_progress_observable ( send_progress)
738
- . await
739
- } ;
718
+ let send_media_request = SendMediaUploadRequest :: new ( self . client . clone ( ) , data)
719
+ . with_content_type ( content_type. essence_str ( ) . to_owned ( ) )
720
+ . with_filename ( filename)
721
+ . with_send_progress_observable ( send_progress) ;
722
+
723
+ let upload_attachment = async move { self . upload ( send_media_request) . await } ;
740
724
741
725
let ( thumbnail, response) = try_join ( upload_thumbnail, upload_attachment) . await ?;
742
726
@@ -758,10 +742,13 @@ impl Media {
758
742
let ( data, content_type, thumbnail_info) = thumbnail. into_parts ( ) ;
759
743
760
744
let filename = filename. map ( |name| format ! ( "thumbnail-{name}" ) ) ;
761
- let response = self
762
- . upload ( & content_type, data, filename, None )
763
- . with_send_progress_observable ( send_progress)
764
- . await ?;
745
+
746
+ let send_media_request = SendMediaUploadRequest :: new ( self . client . clone ( ) , data)
747
+ . with_content_type ( content_type. essence_str ( ) . to_owned ( ) )
748
+ . with_filename ( filename)
749
+ . with_send_progress_observable ( send_progress) ;
750
+
751
+ let response = self . upload ( send_media_request) . await ?;
765
752
let url = response. content_uri ;
766
753
767
754
Ok ( Some ( ( MediaSource :: Plain ( url) , thumbnail_info) ) )
0 commit comments