use crate::prelude::errors::ClientErr;
use crate::prelude::HttpConnection;
use crate::graph::prelude::form_data::reqwest_form::resumable_form_data_reqwest;
use crate::prelude::utils::{ChunksUploadResponse, PostResponse, UploadingData};
use crate::prelude::file_analyze::FileResultServer;
use crate::prelude::video::{FinalResponeResumableUpload, UploadPhase, VideoParams};
use serde::{Deserialize, Serialize};
use std::fs::File;
use std::io::prelude::*;
#[derive(Deserialize)]
struct ResumableUploadFinal {
success: bool,
}
#[derive(Deserialize, Debug)]
struct InitializeUploadResponse {
pub video_id: String,
pub end_offset: String,
pub upload_session_id: String,
}
#[derive(Deserialize, Clone)]
pub struct VideoApi_reqwest {
base_url: String,
page_access_token: String,
}
impl VideoApi_reqwest {
pub fn new(base_url: String, page_access_token: String) -> VideoApi_reqwest {
VideoApi_reqwest {
base_url,
page_access_token,
}
}
pub async fn non_resumable_post(
&self,
video_params: VideoParams,
mut file: File,
thumb_file: Option<File>,
) -> Result<PostResponse, ClientErr> {
let mut buffer = vec![];
file.read_to_end(&mut buffer).unwrap();
let base_url = self.base_url.replace("EDGE", "videos");
let url = base_url + "?access_token=" + &self.page_access_token;
let resp = HttpConnection::request_by_bytes_and_params::<PostResponse>(
url,
(buffer, video_params.clone()),
)
.await?;
Ok(resp)
}
}
impl VideoApi_reqwest {
pub async fn resumable_post(
&self,
video_param: VideoParams,
file: File,
thumb_file: Option<File>,
) -> Result<FinalResponeResumableUpload, ClientErr> {
let mut start_offset = Some("0".to_string()); let mut end_offset = Some("0".to_string()); let video_params = video_param.clone();
let self_data = self.clone();
let base_url = self.base_url.replace("EDGE", "videos").clone();
let form_data = resumable_form_data_reqwest(
UploadPhase::start,
"".to_string(),
"0".to_string(),
video_param.clone(),
file.try_clone().unwrap(),
);
let uploadind_data = UploadingData::new(
"empty:".to_owned(),
0,
0,
"start".to_string(),
"".to_string(),
);
let url = base_url.clone() + "?access_token=" + &self.page_access_token;
let response =
HttpConnection::resumable_video_post::<InitializeUploadResponse>(url, uploadind_data)
.await?;
let start_phase_data = response;
end_offset = Some(start_phase_data.end_offset);
#[cfg(any(feature = "reqwest"))]
let chunked_file_data = FileResultServer::file_analyze("your file path".to_owned());
let final_response = FinalResponeResumableUpload::default().update_params(
start_phase_data.video_id.clone(),
start_phase_data.upload_session_id.clone(),
);
let chunk_size = chunked_file_data.file_size_byte_f64();
if !start_phase_data.upload_session_id.is_empty() {
let mut final_response_status = false;
let mut current_chunk_size = chunk_size;
let mut start_chunk = 0.0;
let upload_session_id = &start_phase_data.upload_session_id;
while let Some(end_offset_status) = end_offset.clone() {
#[cfg(any(feature = "seed_async"))]
if current_chunk_size > file.size() {
current_chunk_size = file.size()
};
if let Some(start_offset_status) = start_offset.clone() {
let self_data = self.clone();
if end_offset_status != start_offset_status {
let base_url = self.base_url.replace("EDGE", "videos");
let url =
base_url.clone() + "?access_token=" + &self.page_access_token.clone();
let form_data = resumable_form_data_reqwest(
UploadPhase::transfer,
upload_session_id.to_string(),
start_offset_status.clone(),
video_params.clone(),
file.try_clone().unwrap(),
);
let uploadind_data = UploadingData::new(
"your file path".to_owned(),
1048576,
0,
"transfer".to_string(),
upload_session_id.to_string(),
);
let response =
HttpConnection::resumable_video_post::<ChunksUploadResponse>(
url,
uploadind_data.clone(),
)
.await?;
let chunk_upload_response = response;
let result = ChunksUploadResponse::new(
chunk_upload_response.start_offset,
chunk_upload_response.end_offset,
)
.clone();
start_offset = Some(result.start_offset); end_offset = Some(result.end_offset);
start_chunk = current_chunk_size; current_chunk_size += chunk_size as f64;
} else {
let base_url = self.base_url.replace("EDGE", "videos");
let url = base_url.clone() + "?access_token=" + &self.page_access_token;
let uploadind_data = UploadingData::new(
"your file path".to_owned(),
0,
0,
"finish".to_string(),
upload_session_id.to_string(),
);
let form_data = resumable_form_data_reqwest(
UploadPhase::finish,
upload_session_id.to_string(),
"".to_string(),
video_params.clone(),
file.try_clone().unwrap(),
);
let uploadind_data = UploadingData::default();
let resp = HttpConnection::resumable_video_post::<ResumableUploadFinal>(
url,
uploadind_data,
)
.await?;
final_response_status = resp.success.clone();
end_offset = None }
}
}
Ok(final_response.update_success(final_response_status))
} else {
Err(ClientErr::FacebookError("The video upload initialization was not sucessfull, try upload again or try with another video ".to_string()))
}
}
}
#[derive(Deserialize, Debug, Default, Serialize)]
struct FeedPostSuccess {
id: String,
}