bpi_rs/live/
live_stream.rs1use serde::{ Deserialize, Serialize };
2
3use crate::{ BilibiliRequest, BpiClient, BpiError, BpiResponse };
4
5#[derive(Debug, Serialize, Clone, Deserialize)]
6pub struct QualityDescription {
7 pub qn: i32,
9 pub desc: String,
11}
12
13#[derive(Debug, Serialize, Clone, Deserialize)]
14pub struct LiveStreamUrl {
15 pub url: String,
17 pub order: i32,
19 pub stream_type: i32,
21 pub p2p_type: i32,
23}
24
25#[derive(Debug, Serialize, Clone, Deserialize)]
26pub struct LiveStreamData {
27 pub current_quality: i32,
29 pub accept_quality: Vec<String>,
31 pub current_qn: i32,
33 pub quality_description: Vec<QualityDescription>,
35 pub durl: Vec<LiveStreamUrl>,
37}
38
39impl BpiClient {
40 pub async fn live_stream(
66 &self,
67 cid: i64,
68 platform: Option<&str>,
69 quality: Option<i32>,
70 qn: Option<i32>
71 ) -> Result<BpiResponse<LiveStreamData>, BpiError> {
72 let mut query = vec![("cid", cid.to_string())];
73
74 if let Some(platform) = platform {
75 query.push(("platform", platform.to_string()));
76 }
77
78 if let Some(quality) = quality {
79 query.push(("quality", quality.to_string()));
80 }
81
82 if let Some(qn) = qn {
83 query.push(("qn", qn.to_string()));
84 }
85
86 self
87 .get("https://api.live.bilibili.com/room/v1/Room/playUrl")
88 .query(&query)
89 .send_bpi("获取直播视频流").await
90 }
91}
92
93#[cfg(test)]
94mod tests {
95 use super::*;
96
97 #[tokio::test]
98 async fn test_get_live_stream() {
99 let bpi = BpiClient::new();
100 let resp = bpi.live_stream(14073662, Some("web"), None, Some(10000)).await.unwrap();
101 tracing::info!("{:?}", resp);
102 }
103}