use crate::BilibiliRequest;
use crate::BpiResult;
use crate::creativecenter::CreativeCenterClient;
use serde::{Deserialize, Serialize};
use serde_json::json;
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct SeasonEdit {
pub id: u64, pub title: String, pub cover: String, #[serde(default)]
pub desc: Option<String>, #[serde(default)]
pub season_price: Option<u32>, #[serde(default, rename = "isEnd")]
pub is_end: Option<u32>, }
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct SeasonSectionEdit {
pub id: u64,
#[serde(rename = "type")]
pub type_field: u64,
#[serde(rename = "seasonId")]
pub season_id: u64,
pub title: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SectionSort {
pub id: u64, pub order: u32, }
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct EpisodeEdit {
pub id: u64,
pub title: String,
pub aid: u64,
pub cid: u64,
#[serde(rename = "seasonId")]
pub season_id: u64,
#[serde(rename = "sectionId")]
pub section_id: u64,
pub sorts: Vec<EpisodeSort>,
pub order: u64,
}
#[derive(Serialize)]
struct EpisodeEditPayload {
#[serde(flatten)]
section: EpisodeEdit,
sorts: Vec<EpisodeSort>,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct EpisodeSort {
pub id: u64,
pub sort: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SeasonSectionSort {
pub id: u64, pub sort: u32, }
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SectionAddEpisodesRequest {
#[serde(rename = "sectionId")]
pub section_id: u64,
pub episodes: Vec<Episode>,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Episode {
pub title: String,
pub aid: u64,
pub cid: u64,
pub charging_pay: i64,
pub member_first: i64,
pub limited_free: bool,
}
impl<'a> CreativeCenterClient<'a> {
pub async fn season_edit(
&self,
season: SeasonEdit,
sorts: Vec<SeasonSectionSort>,
) -> BpiResult<Option<serde_json::Value>> {
let csrf = self.client.csrf()?;
let payload = json!({
"season": season,
"sorts": sorts
});
self.client
.post("https://member.bilibili.com/x2/creative/web/season/edit")
.query(&[("csrf", csrf)])
.json(&payload)
.send_bpi_optional_payload("creativecenter.season.edit")
.await
}
pub async fn season_section_edit(
&self,
section: SeasonSectionEdit,
sorts: Vec<SectionSort>,
) -> BpiResult<Option<serde_json::Value>> {
let csrf = self.client.csrf()?;
let payload = json!({
"section": section,
"sorts": sorts
});
self.client
.post("https://member.bilibili.com/x2/creative/web/season/section/edit")
.query(&[("csrf", csrf)])
.json(&payload)
.send_bpi_optional_payload("creativecenter.season.section.edit")
.await
}
pub async fn season_section_episode_edit(
&self,
section: EpisodeEdit,
sorts: Vec<EpisodeSort>,
) -> BpiResult<Option<serde_json::Value>> {
let csrf = self.client.csrf()?;
let payload = EpisodeEditPayload { section, sorts };
self.client
.post("https://member.bilibili.com/x2/creative/web/season/section/episode/edit")
.query(&[("csrf", csrf)])
.json(&payload)
.send_bpi_optional_payload("creativecenter.season.section.episode.edit")
.await
}
pub async fn season_enable_section(
&self,
season_id: u64,
enable: bool,
) -> BpiResult<Option<serde_json::Value>> {
let csrf = self.client.csrf()?;
let params = vec![
("csrf", csrf),
("season_id", season_id.to_string()),
("no_section", (if enable { "0" } else { "1" }).to_string()),
];
self.client
.post("https://member.bilibili.com/x2/creative/web/season/section/switch")
.form(¶ms)
.send_bpi_optional_payload("creativecenter.season.section.switch")
.await
}
pub async fn season_section_add_episodes(
&self,
section_id: u64,
episodes: Vec<Episode>,
) -> BpiResult<Option<serde_json::Value>> {
let csrf = self.client.csrf()?;
let payload = SectionAddEpisodesRequest {
section_id,
episodes,
};
self.client
.post("https://member.bilibili.com/x2/creative/web/season/section/episodes/add")
.json(&payload)
.query(&[("csrf", csrf)])
.send_bpi_optional_payload("creativecenter.season.section.episodes.add")
.await
}
}
#[cfg(test)]
mod tests {}