biliapi/requests/
danmu_info.rs

1use super::prelude::*;
2
3/// 获取用于连接直播间的弹幕服务器
4///
5/// 从 /xlive/web-room/v1/index/getDanmuInfo 获取
6#[derive(Debug, Deserialize, Serialize, Clone)]
7pub struct DanmuInfo {
8    pub token: String,
9    #[serde(rename = "host_list")]
10    pub servers: Vec<DanmuServer>,
11}
12
13/// [`DanmuInfo`] 的子信息,连接直播间的弹幕服务器
14#[derive(Debug, Deserialize, Serialize, Clone)]
15pub struct DanmuServer {
16    pub host: String,
17    pub port: u16,
18    pub wss_port: u16,
19    pub ws_port: u16,
20}
21impl DanmuServer {
22    /// 获取对应的 url(wss 协议)
23    pub fn url(&self) -> String {
24        format!("wss://{}:{}/sub", self.host, self.wss_port)
25    }
26}
27
28impl Request for DanmuInfo {
29    type Args = u64;
30
31    fn request(client: &Client, args: Self::Args) -> RequestResponse<Self> {
32        const DANMU_INFO_URL: &str =
33            "https://api.live.bilibili.com/xlive/web-room/v1/index/getDanmuInfo";
34
35        let request = client.get(DANMU_INFO_URL).query(&[("id", args)]).send();
36        Box::pin(async move { request.await?.bili_data().await })
37    }
38}
39
40#[cfg(test)]
41mod tests {
42    use crate::Request;
43    use anyhow::*;
44    #[tokio::test]
45    async fn test_get_danmu_info() -> Result<()> {
46        let client = crate::connection::new_client()?;
47        let info = crate::requests::DanmuInfo::request(&client, 2).await?;
48        assert!(info.servers.len() > 0);
49        Ok(())
50    }
51}