
    OJni)                     z    d dl Z d dlZd dlZd dlZd dlZ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dded	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 )HuyaLiveStreamzM
      A class for fetching and processing Huya live stream information.
    N
proxy_addrcookiesc                 z    t         |   ||       | j                         | _        | j	                         | _        y N)super__init___get_pc_headers
pc_headers_get_mobile_headersmobile_headers)selfr   r   	__class__s      U/home/uftp/myenv/lib/python3.12/site-packages/streamget/platforms/huya/live_stream.pyr   zHuyaLiveStream.__init__   s3    W-..0"668    returnc                 .    dddd| j                   xs ddS )Nz;ios/7.830 (ios 17.0; ; iPhone 15 (A2846/A3089/A3090/A3092))1z@https://servicewechat.com/wx74767bf0b684f7d3/301/page-frame.htmlzzh-CN,zh;q=0.9 )z
user-agentxweb_xhrrefererzaccept-languagecookie)r   )r   s    r   r   z"HuyaLiveStream._get_mobile_headers   s$    WY/ll(b
 	
r   urlprocess_datac                    K   t        || j                  | j                         d{   }t        j                  d|      d   }t        j                  |dz         }|S 7 7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   headersNz*stream: (\{"data".*?),"iWebDefaultBitRate"r   })r   r   r   refindalljsonloads)r   r    r!   html_strjson_str	json_datas         r   fetch_web_stream_dataz$HuyaLiveStream.fetch_web_stream_data    sY      #stPTP_P_``::KXVWXYJJx#~.	 as   &A"A 8A"c                   K   |j                  d      d   j                  dd      d   }t        d |D              r_t        || j                  | j
                         d	{   }t        j                  d
|      }|r|j                  d      }nt        d      dd|dd}dt        j                  j                  |       }t        || j                  | j                         d	{   }t        j                  |      }|s|S |d   d   d   }	|d   d   }
|
dk7  r|	ddS |d   d   d   }|d   d   d   }|dv r| j!                  |       d	{   S |d   d   d   }g }|D ]I  }|d   }|d    }|d!   }|d"   }|d#   }|d$   }| d| d%| }| d| d&| }|j#                  |||d'       K d	}|D ]  }|d(   d)k(  s|} |xs |d   }|j%                  d*      }|j%                  d+      }|d(   d,v rD|j'                  d-d.      j'                  d/d0      }|j'                  d-d.      j'                  d/d0      }|	d1|||xs ||d2S 7 7 c7 w)3a)  
        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   /   )maxsplitc              3   <   K   | ]  }|j                           y wr   )isalpha).0chars     r   	<genexpr>z7HuyaLiveStream.fetch_app_stream_data.<locals>.<genexpr>=   s     2$t||~2s   )r   r$   Nz ProfileRoom":(.*?),"sPrivateHostz<Please use "https://www.huya.com/+room_number" for recordingLiveprofileRoomr   )mdoroomid
showSecretzhttps://mp.huya.com/cache.php?r#   dataprofileInfonickrealLiveStatusONF)anchor_nameis_liveliveDataintroductiongameHostName)lolstreambaseSteamInfoListsCdnTypesStreamNamesFlvUrlsFlvAntiCodesHlsUrlsHlsAntiCodez.m3u8?z.flv?)cdn_typem3u8_urlflv_urlrR   TXrS   rT   )rU   HWz&ctype=tars_mpz&ctype=huya_webh5z&fs=bhctz&fs=bgctT)rD   rE   rS   rT   
record_urltitle)splitrsplitanyr   r   r   r&   searchgroup	Exceptionurllibparse	urlencoder   r(   r)   r-   appendgetreplace)r   r    r!   room_idr*   params
wx_app_apir+   r,   rD   live_status
live_title	live_typebase_steam_info_listplay_url_listirR   stream_name	s_flv_urlflv_anti_code	s_hls_urlhls_anti_coderS   rT   select_itemitems                             r   fetch_app_stream_dataz$HuyaLiveStream.fetch_app_stream_data0   s     ))C.#**3*;B?2'22&stPTPcPcddHii BHMG!--* ^__ 	
 6fll6L6LV6T5UV
"zdooW[WfWfggJJx(	'6v>'(89$#.5AA"6*:6~FJ!&)*5nEIG#!77<<<#,V#4X#>?R#S M) Z=.iL	 !. 1iL	 !. 1'[+f]OL&KqU=/J$$$,$,#*( K% '
#t+"&K' &9q)9K"z2H!ooi0G:&,6!//*:<OPXXYceop#++,<>QRZZ[egqr  +$"%1#  e h =s@   A I"I
#BI*I+A(IIA.IBIIIr,   video_qualityc                 f  K   d}d| v r| d|iz  } t        |       S | d   d   d   }|d   }| d   d   d   }|j                  d	d
      }||dd}|r|d   }|j                  d      }	|j                  d      |j                  d      }
|j                  d      }|j                  d      }|j                  d      }dt        dt        ffd} ||      }|	 d d|
 d| d}	| d d| d| d}|j                  d      }|sd}n<t        |      j	                         rg d}|t        |         }n|j                         }t        |      dkD  r|dvrd}t        t        j                  ||d               d d d!   }t        |      d"k  r#|j                  |d!          t        |      d"k  r#|d   |d   |d#   |d$   d%}||vr+t        d&d'j                  |j                                      |	t        ||         z   }	|t        ||         z   }|d(||||	|	xs |d)z  }t        |      S w)*za
         Fetches the stream URL for a live room and wraps it into a StreamData object.
         u   虎牙直播rE   platformr?   r   gameLiveInforG   gameStreamInfoListrA   r   F)rx   rD   rE   rN   rM   sFlvUrlSuffixrP   sHlsUrlSuffixrO   old_anti_coder   c                    d}d}t        t        j                               dz  }|}t        |dz  dz        t        dt        j                         z        z   dz  }t        j                  dd      }||z   }|dz   dz  }|d	j	                         }	t
        j                  j                  |       }
t        j                  t
        j                  j                  |
d
   d         j                               j                         j                  d      d   }t        j                  | d|
d   d    d| j                               j!                         }| d| d d| d|	 	}t        j                  |j                               j!                         }d| d|	 d| d|
d   d    d|
d   d    d| d| d| d| d| d}|S )Nd   l   \(w i  l    d(	 l    l    0ml   F2ni  xfmr   _|ctypez	wsSecret=z&wsTime=z&seqid=z&ctype=z
&ver=1&fs=fsz&uuid=z&u=z&t=z&sv=z	&sdk_sid=z
&codec=264)inttimerandomrandintlowerr_   r`   parse_qsbase64	b64decodeunquoteencodedecoderY   hashlibmd5	hexdigest)r}   params_tsdk_versiont13sdk_sid	init_uuiduidseq_idtarget_unix_timews_time	url_queryws_secret_pfws_secret_hash	ws_secretws_secret_md5	anti_codern   s                   r   get_anti_codez6HuyaLiveStream.fetch_stream_url.<locals>.get_anti_code   s    ( $))+&- !x$!67#dV]]_>T:UUYcc	nn]MBw %(&LT#9 -a0779 #LL11-@	%//0D0DYt_UVEW0X0_0_0abiikqqruv !(xq79KA9N8OqQYPZ-[-b-b-d!e!o!o!q+nAcU!K=.AQQRSZR[\	 'I,<,<,> ? I I K  hwiwvhgV_`gVhijVkUl m$T?1-.fYKs3%s8*TXYdXey
4 
 ! r   r0   .r/   z&ratio=z&exsphd=OD)r   BDUHDHDSDLDr1   )r   r   z(?<=264_)\d+Nr3      r   r   )r   r   r   r   z.Invalid video quality. Available options are: z, T)rE   rX   qualityrS   rT   rW   )r   rc   strrY   isdigitr   upperlenlistr&   r'   rb   
ValueErrorjoinkeys)r,   rv   rx   game_live_infori   stream_info_listrD   result
select_cdnrT   flv_url_suffixhls_urlhls_url_suffixrp   r   new_anti_coderS   quality_listvideo_quality_keyspatternvideo_quality_optionsrn   s                        @r   fetch_stream_urlzHuyaLiveStream.fetch_stream_url   s    
 "	!*h//Iy))"6*1-n=#N3
$V,Q/0DE$((4 !&
 )!,J nnY/G$..7K'^^O<N nnY/G'^^O<N&NN>:M#!S #!S #!J *-8M 	;-q0@-PWXG!!K=.1A=/QXYH(..z:L  $}%--/)N&$6s=7I$JM$1$7$7$9M< 1$l)J)#BJJwQ$HI$B$O,'!+ ''R(89 ,'!+ (?&q/&q/&q/	)% !(==$HShSmSmSoIpHqrt t "C(=m(L$MM#c*?*N&OO#($"%1 F 6""s   F.H12A?H1)NN)Tr   )__name__
__module____qualname____doc__r   r   dictr   boolr-   ru   staticmethodr   r   r   __classcell__)r   s   @r   r
   r
      s    93: 9sTz 9

T 
s $ RV  Ts T$ TRV Tl l#$ l#sSy4?O l#[e l# l#r   r
   )r   r   r(   r   r&   r   urllib.parser_   r?   r   r   requests.async_httpr   baser   r
    r   r   <module>r      s1        	   + , !e#^ e#r   