use crate::prelude::errors::ClientErr;
use crate::prelude::utils::PostResponse;
use crate::prelude::HttpConnection;
#[cfg(any(feature = "reqwest"))]
use std::fs::File;
use serde::{Deserialize, Serialize};
#[cfg(any(feature = "web-sys"))]
use web_sys::{Blob, File, FormData};
#[cfg(any(feature = "reqwest"))]
use crate::prelude::media_upload::video_by_reqwest::VideoApi_reqwest;
#[cfg(any(feature = "web-sys"))]
use crate::prelude::media_upload::video_by_web_sys::VideoApi_seed;
#[derive(Clone)]
pub struct VideoParams {
pub description: String,
#[cfg(any(feature = "web-sys"))]
pub thumb: Option<File>,
pub content_category: ContentCategory,
pub title: String,
}
#[derive(Deserialize, Serialize, Copy, Clone)]
#[allow(warnings)]
pub enum ContentCategory {
EAUTY_FASHION,
BUSINESS,
CARS_TRUCKS,
COMEDY,
CUTE_ANIMALS,
ENTERTAINMENT,
FAMILY,
FOOD_HEALTH,
HOME,
LIFESTYLE,
MUSIC,
NEWS,
POLITICS,
SCIENCE,
SPORTS,
TECHNOLOGY,
VIDEO_GAMING,
OTHER,
}
#[derive(Deserialize, Debug, Clone)]
struct InitializeUploadResponse {
pub video_id: String,
pub end_offset: String,
pub upload_session_id: String,
}
#[derive(Deserialize, Default, Debug, Clone)]
pub struct FinalResponeResumableUpload {
success: bool,
upload_session_id: String, video_id: String,
}
impl FinalResponeResumableUpload {
pub fn update_params(
mut self,
video_id: String,
upload_session_id: String,
) -> FinalResponeResumableUpload {
self.upload_session_id = upload_session_id;
self.video_id = video_id;
self
}
pub fn new(
video_id: String,
upload_session_id: String,
success: bool,
) -> FinalResponeResumableUpload {
FinalResponeResumableUpload {
video_id,
upload_session_id,
success,
}
}
pub fn update_success(mut self, success: bool) -> FinalResponeResumableUpload {
self.success = success;
self
}
pub fn response(self) -> FinalResponeResumableUpload {
self
}
}
#[derive(Deserialize, Serialize)]
struct ResumableUploadFinal {
success: bool,
}
pub enum UploadPhase {
start,
transfer,
finish,
cancel,
}
impl Default for VideoParams {
fn default() -> Self {
Self {
description: "video feed".to_string(),
#[cfg(any(feature = "web-sys"))]
thumb: None,
content_category: ContentCategory::OTHER,
title: " ".to_string(),
}
}
}
impl VideoParams {
pub fn update_video_params(self, video_params: VideoParams) -> Self {
Self { ..video_params }
}
pub fn video_params(self) -> VideoParams {
self
}
pub fn new(
description: String,
#[cfg(any(feature = "web-sys"))] thumb: Option<File>,
content_category: ContentCategory,
title: String,
) -> Self {
VideoParams {
description,
#[cfg(any(feature = "web-sys"))]
thumb,
content_category,
title,
}
}
}
#[derive(Deserialize, Clone, Serialize)]
pub struct VideoApi {
base_url: String,
page_access_token: String,
}
impl VideoApi {
pub fn new(base_url: String, page_access_token: String) -> VideoApi {
VideoApi {
base_url,
page_access_token,
}
}
}
#[derive(Deserialize, Debug, Default, Serialize)]
struct FeedPostSuccess {
id: String,
}
#[cfg(any(feature = "web-sys"))]
impl VideoApi {
pub async fn resumable_post(
&self,
file: File,
video_param: VideoParams,
) -> Result<FinalResponeResumableUpload, ClientErr> {
let base_url = self.base_url.clone();
let page_token = self.page_access_token.clone();
VideoApi_seed::new(base_url, page_token)
.resumable_post(file, video_param)
.await
}
pub async fn non_resumable_post(
&self,
video_params: VideoParams,
file: File,
) -> Result<PostResponse, ClientErr> {
let base_url = self.base_url.clone();
let page_token = self.page_access_token.clone();
VideoApi_seed::new(base_url, page_token)
.non_resumable_post(video_params, file)
.await
}
}
#[cfg(any(feature = "reqwest"))]
impl VideoApi {
pub async fn resumable_post(
&self,
file: File,
video_param: VideoParams,
thumb_file: Option<File>,
) -> Result<FinalResponeResumableUpload, ClientErr> {
let base_url = self.base_url.clone();
let page_token = self.page_access_token.clone();
VideoApi_reqwest::new(base_url, page_token)
.resumable_post(video_param, file, thumb_file)
.await
}
pub async fn non_resumable_post(
&self,
video_params: VideoParams,
file: File,
thumb_file: Option<File>,
) -> Result<PostResponse, ClientErr> {
let base_url = self.base_url.clone();
let page_token = self.page_access_token.clone();
VideoApi_reqwest::new(base_url, page_token)
.non_resumable_post(video_params, file, thumb_file)
.await
}
}
impl VideoApi {
pub async fn post_by_link(
&self,
file_url: &str,
description: &str,
title: &str,
) -> Result<FinalResponeResumableUpload, ClientErr> {
let url = self.base_url.replace("EDGE", "videos")
+ "?file_url="
+ file_url
+ "&access_token="
+ &self.page_access_token
+ "&title="
+ title
+ &"description="
+ description;
let video_id = HttpConnection::post::<FeedPostSuccess, String>(url, "".to_string()).await?;
if video_id.id.is_empty() {
Err(ClientErr::FacebookError(
"The video posting by url was not suceessfull ".to_string(),
)) } else {
Ok(FinalResponeResumableUpload::default().update_params(video_id.id, "".to_string()))
}
}
}