
    OJni"                     n    d dl Z d dlZd dlZddlmZmZ ddlmZm	Z	 ddl
mZ ddlmZmZ  G d	 d
e      Zy)    N   )
StreamDatawrap_stream)	async_reqget_response_status   )BaseLiveStream   )DouyinUtilsUnsupportedUrlErrorc                        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ded	ede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 )DouyinLiveStreamzM
    A class for fetching and processing Douyin 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      W/home/uftp/myenv/lib/python3.12/site-packages/streamget/platforms/douyin/live_stream.pyr   zDouyinLiveStream.__init__   s3    W-"668..0    returnc                 ,    dd| j                   xs d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.2z!__ac_nonce=064caded4009deafd8b89;https://live.douyin.com/)z
user-agentzaccept-languagecookiereferer)r   )r   s    r   r   z DouyinLiveStream._get_pc_headers   s"    l\llI&I1	
 	
r   urlprocess_datac                   K   |j                         }t               }	 |j                  || j                         d{   \  }}ddd||ddd}d	t        j
                  j                  |      z   }t        || j                  | j                  
       d{   }|st        j                  |      S t        j                  |      d   }	|	d   }
|
d   d   |
d<   |
d   d   d   d   }t        j                  |      d   d   d   }t        j                  |d         }|j                  d      xs d}d|d   dz   |z   i}d|d   dz   |z   i}|
d   d   }|
d   d   }i |||
d   d<   i |||
d   d<   |
S 7 :7 # t        $ rF |j                  || j                         d{  7  }| j                  d|z          d{  7  cY S w xY ww) a)  
        Fetches app 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   N4verify_lxj5zv70_7szNlAB7_pxNY_48Vh_ALKF_GA1Uf3yteoOY01z99.99.991128)verifyFptype_idlive_idroom_idsec_user_idversion_codeapp_idz4https://webcast.amemv.com/webcast/room/reflow/info/?r   headersdataroomownernicknameanchor_name
stream_urllive_core_sdk_data	pull_datastream_dataoriginmain
sdk_paramsVCodec ORIGINhls&codec=flvhls_pull_url_mapflv_pull_urlr   )stripr   get_sec_user_idr   urllibparse	urlencoder   r   jsonloadsgetr   get_unique_idfetch_web_stream_data)r   r"   r#   douyin_utilsr,   sec_uid
app_paramsapijson_str	json_data	room_datar:   origin_datar=   origin_hls_codecorigin_m3u8
origin_flvrD   rE   	unique_ids                       r   fetch_app_stream_dataz&DouyinLiveStream.fetch_app_stream_data   s%     iik"}!	\%1%A%A#RVRaRa%A%bbGWR"& * J I6<<KaKablKmmC&stPTPcPcddHzz(++ JJx08	%f-	+4W+=j+I	-('56JKKXYfg"jj5f=hGO!ZZL(AB
#->>(#;#Ar 'U);i)GJZ)Z[&E(:Y(FIY(YZ
#,\#:;M#N (6~F>a>aP`>a	,'(:;:XZ:X<:X	,'7  9  c e& # 	\*888YYYI334NQZ4Z[[[[	\sp   G E= E8AE= E;E= 2G3CE= 7G8E= ;E= =)G&F)'GGG	GGGc                   K   	 |j                         }d}t        || j                  | j                         d{   }t	        j
                  d|      }|st	        j
                  d|      }|j                  d      }|j                  dd      j                  dd	      }t	        j
                  d
|t        j                        j                  d      }t	        j
                  d|t        j                        j                  d      }	|j                  d      d   dz   }t	        j                  dd|      }|st        j                  |      S t        j                  |      d   d   }
|	|
d<   d|
v r
|
d   dk(  r|
S |
d   d   }t	        j                  d|      }|rw|dk(  r|d   n|d   }t        j                  |j                  dd      j                  dd      j                  dd      j                  dd	            }d|d   v r||d   d   d   }np|j                  dd      j                  dd	      }t	        j
                  d |t        j                        }|r't        j                  |j                  d      dz         }|rZ|d!   j                  d"      xs d}d#|d$   d%z   |z   i}d#|d&   d%z   |z   i}|
d   d'   }|
d   d(   }i |||
d   d'<   i |||
d   d(<   |
S 7 # t        $ r}t        d)| d*|       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.
        Nr0   z(\{\\"state\\":.*?)]\\n"]\)z0(\{\\"common\\":.*?)]\\n"]\)</script><div hiddenr
   \r?   u0026&z "roomStore":(.*?),"linkmicStore"z "nickname":"(.*?)","avatar_thumbz,"has_commerce_goods"r   z}}}z"title":""([^"]+)""z"title":"\1"roomInfor3   r6   status   r7   stream_orientationz0"(\{\\"common\\":.*?)"]\)</script><script nonce=z"{{z}"}r;   r2   r<   z"origin":\{"main":(.*?),"dash"r=   r>   r@   rA   rB   rC   rD   rE   zFetch failed: z, )rF   r   r   r   researchgroupreplaceDOTALLsplitsubrK   rL   findallrM   	Exception)r   r"   r#   origin_url_listhtml_strmatch_json_strrT   cleaned_string
room_storer6   rU   rd   match_json_str2
json_data2match_json_str3rX   rY   rZ   rD   rE   es                        r   rO   z&DouyinLiveStream.fetch_web_stream_dataL   s:    .	9))+C"O&stPTP_P_``HYY'ExPN!!#+^`h!i%++A.H%--dB7??$ON#E~WYW`W`agghijJ))$F
TVT]T]^ddefgK#))*AB1EMJ 6TJzz*-- JJz2:>vF	+6	-(y(Yx-@A-E$$%.|%<=Q%R""$**-`bj"k"5G15Lq1RabcRdH!% ((r2::4EMMdTWX``ahjmn"pJ:f#55*4V*<X*Fv*N  (//b9AA'3OH&(ii0QS[]_]f]f&gO&*.**_5J5J15MPS5S*T"'6|'D'H'H'R'XVX$#+_U-Ci-ORb-b"cK"*OE,BY,NQa,a!bJ'0'>?Q'R$#,\#:>#JLBe[BeTdBeIl+,>?>\>\|>\Il+N;Q aT  	9nSEA3788	9sR   L7K$ K!DK$ L-K$ ;L<E$K$  L!K$ $	L-K>>LLrU   video_qualityc                 x  K   |j                  d      }d|dd}|j                  dd      }|dk(  r|d   }|d	   }t        |j                               }|d
   }	t        |	j                               }
t        |      dk  r7|j	                  |d          |
j	                  |
d          t        |      dk  r7| j                  |      \  }}|
|   }||   }t        || j                  | j                         d{   }|s|dk  r|dz   n|dz
  }|
|   }||   }|d|d   ||||xs |dz  }t        |      S 7 =w)z_
        Fetches the stream URL for a live room and wraps it into a StreamData object.
        r6   u   抖音F)platformr6   is_liverb   rc   r   r7   rE   rD      )r"   r   r1   Nr
   Ttitle)r|   r   qualitym3u8_urlflv_url
record_url)
rM   listvalueslenappendget_quality_indexr   r   r   r   )r   rU   ry   r6   resultrb   r7   flv_url_dictflv_url_listm3u8_url_dictm3u8_url_listquality_indexr   r   okindexs                   r   fetch_stream_urlz!DouyinLiveStream.fetch_stream_url   st      mmM2&{uUx+Q;"<0J%n5L!%l&9&9&;!<L&'9:M"&}';';'=">Ml#a'##L$45$$]2%67 l#a' ,0+A+A-+P(M=$]3H"=1G*xDOO]a]l]lmmB+81+<a-RSBS(/&u-"7+($"&1' F 6"" ns   B4D:7AD::D8;>D:)NN)Tr   )__name__
__module____qualname____doc__strr   dictr   boolr\   rO   intr   r   __classcell__)r   s   @r   r   r      s    13: 1sTz 1

 
.\s .\$ .\RV .\`99s 99$ 99RV 99v!# !#S3YQUEU !#ak !#r   r   )rK   rg   urllib.parserH   r2   r   r   requests.async_httpr   r   baser	   utilsr   r   r    r   r   <module>r      s(     	  + A ! 3]#~ ]#r   