
    OJni                     ^    d dl Z d dlZd dlmZ ddlmZmZ ddlm	Z	 ddl
mZ  G d d	e      Zy)
    N)
itemgetter   )
StreamDatawrap_stream)	async_req   )BaseLiveStreamc            
            e Zd ZdZddedz  dedz  f fdZdefdZdefdZd	edefd
Z	dd	ededededz  fdZ
dd	ededefdZddedeez  dz  defdZ xZS )BilibiliLiveStreamzO
    A class for fetching and processing Bilibili live stream information.
    N
proxy_addrcookiesc                 z    t         |   ||       | j                         | _        | j	                         | _        y N)super__init___get_mobile_headersmobile_headers_get_pc_headers
pc_headers)selfr   r   	__class__s      Y/home/uftp/myenv/lib/python3.12/site-packages/streamget/platforms/bilibili/live_stream.pyr   zBilibiliLiveStream.__init__   s3    W-"668..0    returnc                 .    dd| j                   xs ddddS )NzMozilla/5.0 (Linux; Android 11; SAMSUNG SM-G973U) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/14.2 Chrome/87.0.4280.141 Mobile Safari/537.36;zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 https://live.bilibili.com"https://live.bilibili.com/26066074z
user-agentzaccept-languagecookieoriginrefererr   r   s    r   r   z&BilibiliLiveStream._get_mobile_headers   s'    Z\ll(b1;
 	
r   c                 .    dd| j                   xs ddddS )NzPMozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0r   z!__ac_nonce=064caded4009deafd8b89;r   r   r    r$   r%   s    r   r   z"BilibiliLiveStream._get_pc_headers   s%    l\llI&I1;
 	
r   urlc                 *  K   |j                  d      d   j                  dd      d   }d| }t        || j                  | j                         d {   }t        j                  |      }|j                  d      r|d   d	   d
   }|S d}|S 7 ;w)N?r   /   maxsplitzNhttps://api.live.bilibili.com/xlive/web-room/v1/index/getH5InfoByRoom?room_id=r   headersdata	room_infotitler   )splitrsplitr   r   r   jsonloadsget)r   r'   room_idapijson_strr1   r2   s          r   _get_bilibili_room_info_h5z-BilibiliLiveStream._get_bilibili_room_info_h5&   s     ))C.#**3*;A>^_f^gh"34??DL_L_``JJx(	;D==;P	&!+.w7 WY as   ABB<Bqnplatformc                   K   |j                  d      d   j                  dd      d   }|||d}dt        j                  j	                  |       }t        || j                  | j                         d {   }t        j                  |      }|r1|d	   dk(  r)|d
   d   D ]  }	d|	d   v s|	d   c S  |d
   d   d   d   S |ddd|dddddd
}t        j                  j	                  |      }
d|
 }t        || j                  | j                         d {   }t        j                  |      }|d
   d   dk(  rt        d       y |d
   d   }|d   d   d   d   }|d   d   }t        |t        d      d       }ddd!d"d#d$}t        |      }t        ||   |dz
        }||   }|d%   }|d&   d   d'   }|d&   d   d(   }||z   |z   }|S 7 X7 w))Nr)   r   r*   r+   r,   )cidr<   r=   z3https://api.live.bilibili.com/room/v1/Room/playUrl?r.   coder0   durlzd1--cn-gotchar'   z0,1z0,1,2web851)
r8   protocolformatcodecr<   r=   ptypedolbypanoramahdr_typezFhttps://api.live.bilibili.com/xlive/web-room/v2/index/getRoomPlayInfo?live_statusz&The anchor did not start broadcasting.playurl_infoplayurlstreamrH   rI   
current_qnT)keyreverser   r      )1000040025015080base_urlurl_infohostextra)r3   r4   urllibparse	urlencoder   r   r   r5   r6   printsortedr   lenmin)r   r'   r<   r=   r8   paramsplay_apir:   	json_dataiencode_paramsr9   rO   format_liststream_data_listsorted_stream_listvideo_quality_optionsqn_countselect_stream_indexstream_datar[   r]   r^   m3u8_urls                           r   get_bilibili_stream_dataz+BilibiliLiveStream.get_bilibili_stream_data.   sR    ))C.#**3*;A> 

 II_I_`fIgHhi"8QUQ`Q`aaJJx(	6*a/v&v. $"ah.U8O$ V$V,R077 #!! !!F #LL226:MZ[hZijC&stPTP_P_``H

8,I /14>?$V,^<L&y1(;A>xHK*1~g6!'(8j>V`d!e./!AUV$W!-.H"%&;B&?A"N 23F GK":.Hz*1-f5D
+A.w7Eh.HOU b0 as,   A6G8G95G/A,GGB5GGprocess_datac                 F  K   	 |j                  d      d   j                  dd      d   }t        d| | j                  | j                         d{   }t        j                  |      }|d	   d
   }|d	   d   dk(  rdnd}d| }t        || j                  | j                         d{   }	t        j                  |	      }
|
d	   d   d   }| j                  |       d{   }||||dS 7 7 F7 # t        $ r}t        |       dd|dcY d}~S d}~ww xY ww)a)  
        Fetches web stream data for a live room.

        Args:
            url (str): The room URL.
            process_data (bool): Whether to process the data. Defaults to True.

        Returns:
            dict: A dictionary containing anchor name, live status, room URL, and title.
        r)   r   r*   r+   r,   z8https://api.live.bilibili.com/room/v1/Room/room_init?id=r.   Nr0   uidrN   TFz;https://api.live.bilibili.com/live_user/v1/Master/info?uid=infouname)anchor_namerN   room_urlr2   r   )ry   rN   rz   )
r3   r4   r   r   r   r5   r6   r;   	Exceptionrb   )r   r'   rt   r8   r:   r1   rv   rN   r9   	json_str2anchor_infory   r2   es                 r   fetch_web_stream_dataz(BilibiliLiveStream.fetch_web_stream_datac   s9    	NiinQ'..sQ.?BG&)abiaj'k26//4??\ \H

8,IF#E*C"+F"3M"Ba"G$UKOPSuUC'QUQ`Q`aaI**Y/K%f-f5g>K99#>>E#.{X[fkll\ b ? 	N!H#%eMM	Nsl   D!AC: C4AC: /C608C: (C8)
C: 3D!4C: 6C: 8C: :	DDDD!DD!rh   video_qualityc                   K   d}|d   }|d   st        ||dd      S |d   }ddd	d
ddd}|sd}nOt        |      j                         r&t        |j	                               t        |         }n|j                         }|j                  |d      }| j                  ||d       d{   }||d   d|d   ||d}	t        |	      S 7 w)aW  
        Fetches the stream URL for a live room and wraps it into a StreamData object.

        This method takes the provided room data (including anchor name, live status, and room URL),
        fetches the stream URL based on the specified video quality, and returns a StreamData object
        containing all relevant information.
        u   哔哩哔哩ry   rN   F)r=   ry   is_liverz   rV   rW   rX   rY   rZ   )ODBDUHDHDSDLDr   rC   )r<   r=   NTr2   )r=   ry   r   r2   quality
record_url)	r   strisdigitlistkeysintupperr7   rs   )
r   rh   r   r=   ry   rz   rn   select_qualityplay_urlr0   s
             r   fetch_stream_urlz#BilibiliLiveStream.fetch_stream_url   s	     ".'H[]bcddZ( !
  M=!))+ $%:%?%?%A B3}CU V - 3 3 5.22='J66% 7 9 9 !$]3w'$"
 4  9s   B'C
)C*C
)NN)rV   rC   )Tr   )__name__
__module____qualname____doc__r   r   dictr   r   r;   rs   boolr   r   r   r   __classcell__)r   s   @r   r   r   
   s    13: 1sTz 1

T 

 
C C 3# 33 3TW 3dgjndn 3jNs N$ NRV N<+! +!S3YQUEU +!ak +!r   r   )r5   urllib.parser_   operatorr   r0   r   r   requests.async_httpr   baser	   r    r   r   <module>r      s%       + , !b! b!r   