use serde_json::{Map, Value};
use crate::{error::AppError, platforms::bilibili::fetcher::requests};
use super::types::BilibiliJsonPostRequest;
const BILIBILI_API_BASE_URL: &str = "https://api.bilibili.com";
const BILIBILI_VC_BASE_URL: &str = "https://api.vc.bilibili.com";
const BILIBILI_LIVE_BASE_URL: &str = "https://api.live.bilibili.com";
const BILIBILI_PASSPORT_BASE_URL: &str = "https://passport.bilibili.com";
#[derive(Debug, Clone, PartialEq, Eq)]
#[doc(alias = "bilibiliApiUrls")]
pub struct BilibiliApiUrls {
api_base_url: String,
vc_base_url: String,
live_base_url: String,
passport_base_url: String,
}
impl Default for BilibiliApiUrls {
fn default() -> Self {
Self::new()
}
}
impl BilibiliApiUrls {
pub fn new() -> Self {
Self::with_base_urls(
BILIBILI_API_BASE_URL,
BILIBILI_VC_BASE_URL,
BILIBILI_LIVE_BASE_URL,
BILIBILI_PASSPORT_BASE_URL,
)
}
pub fn with_base_urls(
api_base_url: impl Into<String>,
vc_base_url: impl Into<String>,
live_base_url: impl Into<String>,
passport_base_url: impl Into<String>,
) -> Self {
Self {
api_base_url: api_base_url.into(),
vc_base_url: vc_base_url.into(),
live_base_url: live_base_url.into(),
passport_base_url: passport_base_url.into(),
}
}
#[doc(alias = "getLoginStatus")]
pub fn login_status(&self) -> Result<String, AppError> {
requests::login_status(&self.api_base_url)
}
#[doc(alias = "getVideoInfo")]
pub fn video_info(&self, bvid: &str) -> Result<String, AppError> {
requests::video_info(&self.api_base_url, bvid)
}
#[doc(alias = "getVideoStream")]
pub fn video_stream(&self, aid: u64, cid: u64) -> Result<String, AppError> {
requests::video_stream(&self.api_base_url, aid, cid)
}
#[doc(alias = "getComments")]
pub fn comments(
&self,
oid: u64,
comment_type: u32,
mode: Option<u32>,
pagination_offset: Option<&str>,
) -> Result<String, AppError> {
requests::comments(
&self.api_base_url,
oid,
comment_type,
mode,
pagination_offset,
)
}
#[doc(alias = "getCommentStatus")]
pub fn comment_status(&self, oid: u64, comment_type: u32) -> Result<String, AppError> {
requests::comment_status(&self.api_base_url, oid, comment_type)
}
#[doc(alias = "getCommentReplies")]
pub fn comment_replies(
&self,
oid: u64,
comment_type: u32,
root: u64,
number: Option<u32>,
) -> Result<String, AppError> {
requests::comment_replies(&self.api_base_url, oid, comment_type, root, number)
}
#[doc(alias = "getEmojiList")]
pub fn emoji_list(&self) -> Result<String, AppError> {
requests::emoji_list(&self.api_base_url)
}
#[doc(alias = "getBangumiInfo")]
pub fn bangumi_info(&self, bangumi_id: &str) -> Result<String, AppError> {
requests::bangumi_info(&self.api_base_url, bangumi_id)
}
#[doc(alias = "getBangumiStream")]
pub fn bangumi_stream(&self, ep_id: &str, cid: u64) -> Result<String, AppError> {
requests::bangumi_stream(&self.api_base_url, cid, ep_id)
}
#[doc(alias = "getUserDynamicList")]
pub fn user_dynamic_list(&self, host_mid: u64) -> Result<String, AppError> {
requests::user_dynamic_list(&self.api_base_url, host_mid)
}
#[doc(alias = "getDynamicDetail")]
pub fn dynamic_detail(&self, dynamic_id: &str) -> Result<String, AppError> {
requests::dynamic_detail(&self.api_base_url, dynamic_id)
}
#[doc(alias = "getDynamicCard")]
pub fn dynamic_card(&self, dynamic_id: &str) -> Result<String, AppError> {
requests::dynamic_card(&self.vc_base_url, dynamic_id)
}
#[doc(alias = "getUserCard")]
pub fn user_card(&self, host_mid: u64) -> Result<String, AppError> {
requests::user_card(&self.api_base_url, host_mid)
}
#[doc(alias = "getLiveRoomInfo")]
pub fn live_room_info(&self, room_id: u64) -> Result<String, AppError> {
requests::live_room_info(&self.live_base_url, room_id)
}
#[doc(alias = "getLiveRoomInit")]
pub fn live_room_init(&self, room_id: u64) -> Result<String, AppError> {
requests::live_room_init(&self.live_base_url, room_id)
}
#[doc(alias = "getLoginQrcode")]
pub fn login_qrcode(&self) -> Result<String, AppError> {
requests::login_qrcode(&self.passport_base_url)
}
#[doc(alias = "getQrcodeStatus")]
pub fn qrcode_status(&self, qrcode_key: &str) -> Result<String, AppError> {
requests::qrcode_status(&self.passport_base_url, qrcode_key)
}
#[doc(alias = "getUploaderTotalViews")]
pub fn uploader_total_views(&self, host_mid: u64) -> Result<String, AppError> {
requests::uploader_total_views(&self.api_base_url, host_mid)
}
#[doc(alias = "getArticleContent")]
pub fn article_content(&self, article_id: &str) -> Result<String, AppError> {
requests::article_content(&self.api_base_url, article_id)
}
#[doc(alias = "getArticleCards")]
pub fn article_cards<I, S>(&self, ids: I) -> Result<String, AppError>
where
I: IntoIterator<Item = S>,
S: AsRef<str>,
{
let joined = ids
.into_iter()
.map(|value| value.as_ref().to_owned())
.filter(|value| !value.is_empty())
.collect::<Vec<_>>()
.join(",");
requests::article_cards(&self.api_base_url, &joined)
}
#[doc(alias = "getArticleInfo")]
pub fn article_info(&self, article_id: &str) -> Result<String, AppError> {
requests::article_info(&self.api_base_url, article_id)
}
#[doc(alias = "getArticleListInfo")]
pub fn article_list_info(&self, list_id: &str) -> Result<String, AppError> {
requests::article_list_info(&self.api_base_url, list_id)
}
#[doc(alias = "getUserSpaceInfo")]
pub fn user_space_info(&self, host_mid: u64) -> Result<String, AppError> {
requests::user_space_info(&self.api_base_url, host_mid)
}
#[doc(alias = "getCaptchaFromVoucher")]
pub fn captcha_from_voucher(
&self,
v_voucher: &str,
csrf: Option<&str>,
) -> Result<BilibiliJsonPostRequest, AppError> {
let url = requests::captcha_from_voucher(&self.api_base_url)?;
let mut body =
Map::from_iter([("v_voucher".to_owned(), Value::String(v_voucher.to_owned()))]);
if let Some(csrf) = csrf.filter(|value| !value.is_empty()) {
body.insert("csrf".to_owned(), Value::String(csrf.to_owned()));
}
Ok(BilibiliJsonPostRequest {
url,
body: Value::Object(body),
})
}
#[doc(alias = "validateCaptcha")]
pub fn validate_captcha(
&self,
challenge: &str,
token: &str,
validate: &str,
seccode: &str,
csrf: Option<&str>,
) -> Result<BilibiliJsonPostRequest, AppError> {
let url = requests::validate_captcha(&self.api_base_url)?;
let mut body = Map::from_iter([
("challenge".to_owned(), Value::String(challenge.to_owned())),
("token".to_owned(), Value::String(token.to_owned())),
("validate".to_owned(), Value::String(validate.to_owned())),
("seccode".to_owned(), Value::String(seccode.to_owned())),
]);
if let Some(csrf) = csrf.filter(|value| !value.is_empty()) {
body.insert("csrf".to_owned(), Value::String(csrf.to_owned()));
}
Ok(BilibiliJsonPostRequest {
url,
body: Value::Object(body),
})
}
#[doc(alias = "getVideoDanmaku")]
pub fn video_danmaku(&self, cid: u64, segment_index: Option<u32>) -> Result<String, AppError> {
requests::video_danmaku(&self.api_base_url, cid, segment_index)
}
}
#[doc(alias = "createBilibiliApiUrls")]
pub fn create_bilibili_api_urls() -> BilibiliApiUrls {
BilibiliApiUrls::new()
}