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(
65 &self,
66 cid: i64,
67 platform: Option<&str>,
68 quality: Option<i32>,
69 qn: Option<i32>,
70 ) -> Result<BpiResponse<LiveStreamData>, BpiError> {
71 let mut query = vec![("cid", cid.to_string())];
72
73 if let Some(platform) = platform {
74 query.push(("platform", platform.to_string()));
75 }
76
77 if let Some(quality) = quality {
78 query.push(("quality", quality.to_string()));
79 }
80
81 if let Some(qn) = qn {
82 query.push(("qn", qn.to_string()));
83 }
84
85 self.get("https://api.live.bilibili.com/room/v1/Room/playUrl")
86 .query(&query)
87 .send_bpi("获取直播视频流")
88 .await
89 }
90}
91
92#[cfg(test)]
93mod tests {
94 use super::*;
95
96 #[tokio::test]
97 async fn test_get_live_stream() {
98 let bpi = BpiClient::new();
99 let resp = bpi
100 .live_stream(14073662, Some("web"), None, Some(10000))
101 .await
102 .unwrap();
103 tracing::info!("{:?}", resp);
104 }
105}