1use crate::SdkResult;
3use crate::{error::CommonResponse, wechat::WxApiRequestBuilder};
4use serde::{Deserialize, Serialize};
5
6use super::material::Articles;
7#[derive(Serialize, Deserialize)]
8pub struct MediaId {
9 pub media_id: String,
10}
11
12#[derive(Serialize, Deserialize, Debug)]
13pub struct UploadResponse {
14 #[serde(rename = "type")]
15 pub type_: String,
16 pub media_id: String,
17 pub created_at: i32,
18}
19
20pub struct Part {
25 pub name: String,
26 pub filename: String,
27 pub content_type: String,
28 pub data: Vec<u8>,
29}
30
31#[derive(Serialize, Deserialize)]
32pub struct PicUrl {
33 pub url: String,
34}
35
36#[derive(Serialize, Deserialize, Debug)]
37pub struct MediaRes {
38 #[serde(rename = "type")]
39 pub type_: String,
40 #[serde(alias = "thumb_media_id")]
41 pub media_id: String,
42 pub created_at: i64,
43}
44pub struct MediaModule<'a, T: WxApiRequestBuilder>(pub(crate) &'a T);
46impl<'a, T: WxApiRequestBuilder> MediaModule<'a, T> {
47 pub async fn uploadvideo<S: AsRef<str>>(
49 &self,
50 media_id: S,
51 title: Option<String>,
52 description: Option<String>,
53 ) -> SdkResult<UploadResponse> {
54 let base_url = "https://api.weixin.qq.com/cgi-bin/media/uploadvideo";
55 let sdk = self.0;
56 let builder = sdk.wx_post(base_url).await?;
57 let res: CommonResponse<UploadResponse> = builder
58 .json(&serde_json::json!({
59 "media_id": media_id.as_ref().to_string(),
60 "title": title,
61 "description": description,
62 }))
63 .send()
64 .await?
65 .json()
66 .await?;
67
68 res.into()
69 }
70
71 pub async fn uploadimg(&self, form: Part) -> SdkResult<PicUrl> {
74 let base_url = "https://api.weixin.qq.com/cgi-bin/media/uploadimg";
75 let sdk = self.0;
76 let part = reqwest::multipart::Part::bytes(form.data)
77 .file_name(form.filename)
78 .mime_str(form.content_type.as_ref());
79
80 let form = reqwest::multipart::Form::new().part(form.name, part.unwrap());
81 let builder = sdk.wx_post(base_url).await?;
82 let res: CommonResponse<PicUrl> = builder.multipart(form).send().await?.json().await?;
83
84 res.into()
85 }
86
87 pub async fn upload(&self, media_type: &str, media: &[i8]) -> SdkResult<MediaRes> {
89 let base_url = "https://api.weixin.qq.com/cgi-bin/media/upload";
90 let sdk = self.0;
91 let builder = sdk.wx_post(base_url).await?;
92 let builder = builder.query(&[("type", media_type)]);
93 let res: CommonResponse<MediaRes> = builder.form(media).send().await?.json().await?;
94 res.into()
95 }
96
97 pub async fn get<S: AsRef<str>>(&self, media_id: S) -> SdkResult<reqwest::Response> {
100 let base_url = "https://api.weixin.qq.com/cgi-bin/media/get";
101 let sdk = self.0;
102 let builder = sdk.wx_get(base_url).await?;
103 let builder = builder.query(&[("media_id", media_id.as_ref())]);
104 Ok(builder.send().await?)
106 }
107
108 pub async fn uploadnews(&self, articles: &[Articles]) -> SdkResult<MediaRes> {
110 let base_url = "https://api.weixin.qq.com/cgi-bin/media/uploadnews";
111 let sdk = self.0;
112 let builder = sdk.wx_post(base_url).await?;
113 let res: CommonResponse<MediaRes> = builder
114 .json(&serde_json::json!({ "articles": articles }))
115 .send()
116 .await?
117 .json()
118 .await?;
119 res.into()
120 }
121}