
    OJni                     R    d dl Z d dl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   )
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ede	fd       Z
dd	ed
edefdZeddedeez  dz  defd       Z xZS )LookLiveStreamzK
    A class for fetching and processing Look live stream information.
    N
proxy_addrcookiesc                 P    t         |   ||       | j                         | _        y N)super__init___get_pc_headers
pc_headers)selfr   r   	__class__s      U/home/uftp/myenv/lib/python3.12/site-packages/streamget/platforms/look/live_stream.pyr   zLookLiveStream.__init__   s"    W-..0    returnc                 *    dd| j                   xs ddS )NzPMozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0z;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 )z
user-agentzaccept-languagecookie)r   )r   s    r   r   zLookLiveStream._get_pc_headers   s!     m\ll(b
 	
r   c                   
 d}d}d}ddl ddlddlddlm
 ddlm dt        d	t        ffd
}dt        t        z  dt        t        z  d	t        f
fd}dt        t        z  dt        dt        d	t        ffd} |d      } | |t        j                  |       |      |      } ||||      }	|j                         |	fS )ux   
        params: 由两次AES加密完成
        ncSecKey: 由一次自写的加密函数完成，值可固定
          00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7s   0CoJUm6Qyw8W8jud010001r   N)AES)padsizer   c                 p    ddj                  fdt        |       D              j                  d      S )NzX1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_+-=[]{}|;:,.<>?r   c              3   @   K   | ]  }j                          y wr   )choice).0_charsetsecretss     r   	<genexpr>zVLookLiveStream._get_looklive_secret_data.<locals>.create_secret_key.<locals>.<genexpr>/   s     Hq7>>'2Hs   utf-8)joinrangeencode)r    r&   r'   s    @r   create_secret_keyzCLookLiveStream._get_looklive_secret_data.<locals>.create_secret_key-   s-    pG77HE$KHHOOPWXXr   _text_sec_keyc                 R   t        | t              r| j                  d      } t        |t              r|j                  d      }|d d }t        dd      }j	                  |j
                  |      } 	| j                        }|j                  |      }j                  |      }|S )Nr)      0102030405060708)	
isinstancestrr,   bytesnewMODE_CBC
block_sizeencrypt	b64encode)
r.   r/   iv	encryptorpadded_text
ciphertextencoded_ciphertextr   base64r   s
          r   aes_encryptz=LookLiveStream._get_looklive_secret_data.<locals>.aes_encrypt1   s    %%W-(C(#??73}H)73B#,,;IeS^^4K"**;7J!'!1!1*!=%%r   pub_keymodc                    t        | t              r| j                  d      } | d d d   }t        j	                  |      d      }t        |t        |d      t        |d            }t        |d      j                  d      S )Nr)   r1   x   )r3   r4   r,   inthexlifypowformatzfill)r.   rB   rC   text_reversedtext_intencrypted_intbinasciis         r   rsa_encryptz=LookLiveStream._get_looklive_secret_data.<locals>.rsa_encrypt>   sr    %%W-!$B$KM8++M:B?H#gr*:CRLIM--33C88r   r1   )r@   rP   r'   Crypto.Cipherr   Crypto.Util.Paddingr   rH   r5   r4   jsondumpsdecode)textmodulusnonce
public_keyr-   rA   rQ   sec_keyenc_textenc_sec_keyr   r@   rP   r   r'   s             @@@@@r   _get_looklive_secret_dataz(LookLiveStream._get_looklive_secret_data   s    S $
%+	YC 	YE 	Y	&sU{ 	&cEk 	&e 	&	9sU{ 	9S 	9s 	9s 	9 $B'{4::d+;UCWM!':w? +--r   urlprocess_datac                   K   t        j                  d|      j                  d      }| j                  d|i      \  }}||d}d}t	        || j
                  | j                  |       d{   }t        j                  |      }	|s|	S |	d   d	   d
   }
|	d   d   }|
dd}|dk(  r<d|d<   |	d   d   d   dk7  r)|	d   d   d   }|	d   d   d   }|||d   |d   |d   dz  }|S 7 x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.
        zlive\?id=(.*?)&   
liveRoomNo)params	encSecKeyz5https://api.look.163.com/weapi/livestream/room/get/v3)r   headersdataNrg   anchornickName
liveStatusF)anchor_nameis_liveTrl   roomInfoliveTypeliveUrltitlehttpPullUrl
hlsPullUrl)rp   flv_urlm3u8_url
record_url)	researchgroupr^   r   r   r   rT   loads)r   r_   r`   room_idrd   	secretkeyrequest_dataapijson_str	json_datark   live_statusresultplay_url_list
live_titles                  r   fetch_web_stream_dataz$LookLiveStream.fetch_web_stream_dataK   s5     )).4::1= ::L';RS	"(yAE"34??DOObnooJJx(	'1*='5!,?! $F9 ,Z8A= )& 1* =i H&v.z:7C
',]; -l ;"/"=	  % ps   A)C&+C$,A9C&r   video_qualityc                 .   K   | ddiz  } t        |       S w)z_
        Fetches the stream URL for a live room and wraps it into a StreamData object.
        platformLook)r   )r   r   s     r   fetch_stream_urlzLookLiveStream.fetch_stream_urlo   s"     
 	j&))	9%%s   )NN)Tr   )__name__
__module____qualname____doc__r4   r   dictr   staticmethodtupler^   boolr   rH   r   r   __classcell__)r   s   @r   r
   r
   	   s    13: 1sTz 1
 
 /.5 /. /.b"s "$ "RV "H &$ &sSy4?O &[e & &r   r
   )
rT   rv   rg   r   r   requests.async_httpr   baser   r
    r   r   <module>r      s"     	 + , !l&^ l&r   