
    OJni%                     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  dedz  dedz  f fdZdefd	Zdedz  fd
ZdedefdZ	dededee
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 )SoopLiveStreamzK
    A class for fetching and processing SOOP live stream information.
    N
proxy_addrcookiesusernamepasswordc                 l    t         |   ||       || _        || _        | j	                         | _        y N)super__init__r   r   _get_pc_headers
pc_headers)selfr   r   r   r   	__class__s        U/home/uftp/myenv/lib/python3.12/site-packages/streamget/platforms/soop/live_stream.pyr   zSoopLiveStream.__init__   s0    W-  ..0    returnc                 .    dddd| j                   xs ddS )NzPMozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/20100101 Firefox/122.0z0application/x-www-form-urlencoded; charset=UTF-8zhttps://play.sooplive.co.krz1https://play.sooplive.co.kr/superbsw123/277837074 )z
user-agentzcontent-typeoriginreferercookie)r   )r   s    r   r   zSoopLiveStream._get_pc_headers   s$    lN3Jll(b
 	
r   c           	      4  K   t        | j                        dk  st        | j                        dk  rt        d      dd| j                  | j                  ddddd}d	}	 t	        || j
                  | j                  |d
d       d {   \  }}dj                  |j                         D cg c]  \  }}| d|  c}}      | _	        | j                  | j                  d<   | j                  S 7 hc c}}w # t        $ r}t        d|       d }~ww xY ww)N   
   zvsooplive login failed! Please enter the correct account and password for the sooplive platform in the config.ini file.loginjsontrueY)szWorkszTypeszUid
szPasswordisSaveIdisSavePw
isSaveJoinisLoginRetainz0https://login.sooplive.co.kr/app/LoginAction.phpT   )r   headersdatareturn_cookiestimeoutz; =r   zbsooplive login failed, please check if the account password in the configuration file is correct. )lenr   r   RuntimeErrorr   r   r   joinitemsr   	Exception)r   r0   url_cookie_dictkves           r   login_sooplivezSoopLiveStream.login_sooplive   s!    t}}!S%7"%<  B C C ]]--  	
 A		#,ST__VZVeVe/3DRT$V VNA{99[=N=N=P%QTQ1QCj%QRDL(,DOOH%<<	V%Q  	tuvtwx 	sN   AD (C9 C1	%C9 .C3
?1C9 0D1C9 3C9 9	DDDDbroad_noc                    K   ddd| ddd}dt         j                  j                  |      z   }t        || j                  | j
                         d {   }t        j                  |      }|S 7 w)	Ngcp_cdnfalsezplay.sooplive.co.krz-common-master-hlsz8361.086329376785)return_typeuse_corscors_origin_url	broad_keytimezBhttp://livestream-manager.sooplive.co.kr/broad_stream_assign.html?r9   r   r/   )urllibparse	urlencoder   r   r   r#   loads)r   r@   paramsurl2json_str	json_datas         r   _get_sooplive_cdn_urlz$SoopLiveStream._get_sooplive_cdn_url;   sz     $4$:%78'
 TV\VbVbVlVlmsVtt"tQUQ`Q`aaJJx(	 bs   AA3A1A3r9   rtypec                   K   |j                  d      }t        |      dk  r|d   n|d   }| j                  |d      }|sd}|d||ddd	d
ddd
}d| }t        || j                  | j
                  |       d {   }t        j                  |      }	|dk(  r
|	d   d   }
|
S |	d   d   }|	d   d   }| d| |	d   d   fS 7 Gw)N/r    r      pwdr   html5commonmasterlanding0rC   )
bidbnotyperW   player_typestream_typequalitymodefrom_api	is_revivez=https://live.sooplive.co.kr/afreeca/player_live_api.php?bjid=)r9   r   r/   r0   aidCHANNELAIDBJNICKBJID-BNO)splitr4   
get_paramsr   r   r   r#   rM   )r   r9   rS   	split_urlbj_idroom_passwordr0   rO   rP   rQ   tokenbj_names               r   get_sooplive_tkzSoopLiveStream.get_sooplive_tkJ   s    IIcN	 #I 2	!	!U3M "# 
 OugV"tQUQ`Q`gkllJJx(	E>i(/EL	*84Gi(0EYaw'9)=e)DDD ms   A8C:C;ACprocess_datac                 *   K   j                  d      }t        |      dk  r|d   n|d   }|ddddd	d
}d}t        | j                   j                  |       d{   }t        j                  |      }d|d   v r|d   d   }	d|d   v r|	 d|d   d    }	nd}	|	xs ddd}
dt        dt        t           f fd|	sdt        dz  f fd}dt        f fd}|d   d   dk(  rt        d      |d   d   dk(  r; |        d{   }|rt        |      dkD  r |||
       d{   S t        d      |d   d   dk(  rJ j                  r3t         j                        dkD  r | j                  |
       d{   S t        d      |d   d   d k(  rt        d!      |d"   d#k(  rO|	rM|d   d$   }|d   d%   } j                  |       d{   }|d&   }|d'z   |z   }|
d(| |       d{   d)z  }
d|
d*<   |
S 7 7 7 7 7 87 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.
        rU   r    r   rV   r   webr$   webmlive)rp   r@   agentconfirm_adultr`   rc   z)http://api.m.sooplive.co.kr/broad/a/watch)r   r/   r0   N	user_nickr0   rp   rk   F)anchor_nameis_livem3u8r   c                    	K   t        | 
j                  
j                         d {   }g }| j                  dd      d   dz   }|j	                  d      D ]6  }|j                  d      s|j                  ||j                         z          8 t        j                  d      }|j                  |      }t        ||      D ci c]  \  }}|t        |       c}}	t        |	fd	d
      }|S 7 c c}}w w)NrI   rU      )maxsplitr   
auth_playlistzBANDWIDTH=(\d+)c                     |    S r    )purlurl_to_bandwidths    r   <lambda>zLSoopLiveStream.fetch_web_stream_data.<locals>.get_url_list.<locals>.<lambda>   s    CSTXCY r   T)keyreverse)r   r   r   rsplitrm   
startswithappendstriprecompilefindallzipintsorted)r   respplay_url_list
url_prefixibandwidth_patternbandwidth_list	bandwidthr   r   r   s            @r   get_url_listz:SoopLiveStream.fetch_web_stream_data.<locals>.get_url_list   s     "tQUQ`Q`aaDMS15a83>JZZ% A<<0!((aggi)?@A !#

+= >.66t<NLOP^`mLnoDc)n 4o"=6YcghM   b  ps)   &C>C6AC>0AC>	C8C>8C>c                  N   K   j                          d {   } d| v r| S y 7 w)NzAuthTicket=)r?   )r   r   s    r   handle_loginz:SoopLiveStream.fetch_web_stream_data.<locals>.handle_login   s/     #2244 F*!M + 5s   %#%c                   K   	j                  
d       d {   }	j                  
d       d {   \  }}	j                  |       d {   }|d   }|dz   |z   }||d| |       d {   | dz  }|S 7 c7 J7 07 w)Nrf   )rS   infoview_url?aid=T)r}   r~   m3u8_urlr   new_cookies)rt   rR   )r   _result	aid_token_anchor_name	_broad_no_view_url_data	_view_url	_m3u8_urlr   r   r9   s           r   
fetch_dataz8SoopLiveStream.fetch_web_stream_data.<locals>.fetch_data   s     "&"6"6s%"6"HH	040D0DSPV0D0W*W'i'+'A'A)'L!L*:6	%/);	#/# )+7	+B%B#)   I*W!L &CsC   BA>BB BB B2B3B BBBcodeiGzDsooplive live stream failed to retrieve, the live stream just ended.iFr   zKsooplive login failed, please check if the account and password are correctiDiuP   error message：Please check if the input sooplive live room address is correct.resultr   r@   hls_authentication_keyr   r   T)r~   r   r   r   )rm   r4   r   r   r   r#   rM   strlistdictr8   r5   r   rR   )r   r9   ru   ro   rp   r0   rO   rP   rQ   r}   r   r   r   
new_cookier@   r   view_url_datar   r   r   s   ``                 @r   fetch_web_stream_dataz$SoopLiveStream.fetch_web_stream_datai   s     IIcN	 #I 2	!	! #!
 ;"4DOOT__cghhJJx(	)F++#F+K8K)F++!,Qy/@/I.JKK!,!2uE	!S 	!T#Y 	! "d
 "T   (E1 fgg6"6*e3 $0>1
#j/A"5!+J!???"#pqq6"6*e3<<C$5$9!+DLL&!AAA&'tuu6"6*e3 rssX!# (4H%.v%67O%P""&"<"<X"FFM$Z0H'),BBH$HUabjUkOkllF $}W il 2?
 B G Plso   AH H!B+HH	 H-H.AHHAHHH6H
7H	HHHHHrQ   video_qualityc                 \   K   | j                  ||d       d{   }t        |      S 7 w)z_
        Fetches the stream URL for a live room and wraps it into a StreamData object.
        SOOP)platformN)get_stream_urlr   )r   rQ   r   r0   s       r   fetch_stream_urlzSoopLiveStream.fetch_stream_url   s3      ((MF(SS4   Ts   ,*,)NNNN)Fr   )__name__
__module____qualname____doc__r   r   r   r   r?   rR   tuplert   boolr   r   r   r   __classcell__)r   s   @r   r
   r
   
   s     MQEI13: 1sTz 1:18;d
1
 
cDj :C D E ES ES5[ E>ds d$ dSW dL! !S3YQUEU !ak !r   r
   )r#   r   urllib.parserJ   r0   r   r   requests.async_httpr   baser   r
   r   r   r   <module>r      s%     	  + , !J!^ J!r   