o
    if                     @   sD  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Zd dlZ	d dl
Z
ddlmZ ddlmZ ddlmZ ddlmZ ddlmZmZmZmZmZmZmZmZmZmZ dd	lmZm Z  G d
d deZ!G dd de!Z"G dd de!Z#G dd de!Z$G dd de!Z%G dd de%Z&G dd de%Z'G dd de!Z(dS )    N   )InfoExtractor)NaverBaseIE)	YoutubeIE   )	HTTPError)
ExtractorErrorUserNotLivefloat_or_noneint_or_nonejoin_nonemptyjwt_decode_hs256str_or_nonetry_callupdate_url_queryurl_or_none)requiretraverse_objc                   @   s   e Zd ZdZdZdZdZdZdZdZ	dd	d
dZ
dZddddddZdZi ZdZedd Zejdd Zedd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd:d*d+Zd,d- Zd.d/ Zd0d1 Z d2d3 Z!d4d5 Z"d6d7 Z#d8d9 Z$dS );WeverseBaseIEweversezhttps://accountapi.weverse.ioWEBs(   1b9cb6378d959b45714bec49971ade22e6e24e42we2_access_tokenwe2_refresh_tokenwe2_device_idapplication/jsonzhttps://weverse.iohttps://weverse.io/)AcceptOriginReferera  You can log in using your refresh token with --username "{}" --password "REFRESH_TOKEN" (replace REFRESH_TOKEN with the actual value of the "{}" cookie found in your web browser). You can add an optional username suffix, e.g. --username "{}" , if you need to manage multiple accounts. z4This content is only available for logged-in users. z5"{}" is not valid login username for this extractor. zxYour password is not a valid refresh token. Make sure that you are passing the refresh token, and NOT the access token. zYour access token has expired and there is no refresh token available. Refresh your session/cookies in the web browser and try again. zYour refresh token has expired. Log in to the site again using your web browser to get a new refresh token or export fresh cookies. )login_requiredinvalid_usernameinvalid_passwordno_refresh_tokenexpired_refresh_tokenoauthNc                 C   s   i | j ddtt dS )N 5419526f1c624b38b10787e5c10b2a7ar   )zX-ACC-APP-SECRETzX-ACC-SERVICE-IDzX-ACC-TRACE-ID)_API_HEADERSstruuiduuid4self r,   L/home/ubuntu/.local/lib/python3.10/site-packages/yt_dlp/extractor/weverse.py_oauth_headersB   s   
zWeverseBaseIE._oauth_headersc                 C   s*   |   d }|s
dS t| j|dd S )Nr   cookies+r   )_get_login_infor   _OAUTH_PREFIX	partition)r+   usernamer,   r,   r-   _oauth_cache_keyK   s   zWeverseBaseIE._oauth_cache_keyc                 C   s   t | j| jS N)bool_oauth_tokensget_ACCESS_TOKEN_KEYr*   r,   r,   r-   _is_logged_inR   s   zWeverseBaseIE._is_logged_inc                 C   sR   | j | j dd dddi | jdd| j| j  id}t|dthfd	d
dkS )Nz/api/v1/token/validatezValidating access tokenzUnable to valid access token  AuthorizationBearer )expected_statusheaders	expiresInr   default<   )_download_json_ACCOUNT_API_BASEr.   r8   r:   r   int)r+   responser,   r,   r-   _access_token_is_validV   s   z$WeverseBaseIE._access_token_is_validc                 C   s:   t | j| d t  dk }|| jks|s|S |   S )Nexpi  )r   r8   time_REFRESH_TOKEN_KEYrI   )r+   key
is_expiredr,   r,   r-   _token_is_expired`   s   
zWeverseBaseIE._token_is_expiredc                 C   s  | j | js| d | | jr| d ddi}| jr)d| j | j  |d< z#| j| j dd dd	i | j	|t
jd
| j | j idd d}W nH ty } z<t|jtr|jjdkr| j   | jdkr| jjdd| jd | jjdd| jd n| j| j| j| j  | d  d }~ww | j t|| jdthtdhf| jd
thtdhfi | jdkr| d| j| j | j  | d| j| j | j  d S | j| j| j| j  d S )Nr"   r#   Content-Typer   r>   r=   z/api/v1/token/refreshzRefreshing access tokenzUnable to refresh access tokenrefreshToken),:)
separators)r@   datar<   r/   z.weverse.io/)domainpathnameaccessTokenzaccess tokenzrefresh token)r8   r9   rL   _report_login_errorrO   r;   r:   rE   rF   r.   jsondumpsencoder   
isinstancecauser   statusclearr5   	cookiejarcachestore_NETRC_MACHINEupdater   r'   r   _set_cookie)r+   r@   rH   er,   r,   r-   _refresh_access_tokenf   sL   







z#WeverseBaseIE._refresh_access_tokenc                 C   s4   | j si S | | jr|   dd| j| j  iS )Nr=   r>   )r;   rO   r:   rj   r8   r*   r,   r,   r-   _get_authorization_header   s
   z'WeverseBaseIE._get_authorization_headerc                 C   s   | j | }|  d }|dkr||}| j d| }n|s%| j d}tt|| j| j| j|d| jdddd  d	d
dd)Nr   r    r0   z	+USERNAMEzOr else you can usession_cookies)methodr    )delimTexpected)	_LOGIN_ERRORS_MAPr1   formatr2   r   r   _LOGIN_HINT_TMPLrL   _login_hint)r+   error_id	error_msgr4   r,   r,   r-   r[      s   

z!WeverseBaseIE._report_login_errorc                    s   | j rd S |dd | jkr| d | j| jj| j| j	i d | j r,| 
 r,d S | j}| j|r:| |rNt fdddkrI| d  | j|< |   d S )	Nr0   r   r    rB   c                      s   t  d S )Nscope)r   r,   passwordr,   r-   <lambda>       z.WeverseBaseIE._perform_login.<locals>.<lambda>refreshr!   )r;   r3   r2   r[   r8   rg   rd   loadrf   r5   rI   rL   r9   rO   r   rj   )r+   r4   rz   rt_keyr,   ry   r-   _perform_login   s   


zWeverseBaseIE._perform_loginc              	   C   s   |  d}| jst|| jdfptt | _| jrd S | j	t|| j
| j
df| j| jdfi | jr>|  s@|   d S d S d S )Nr   value)_get_cookies
_device_idr   _DEVICE_ID_KEYr'   r(   r)   r;   r8   rg   r:   rL   rI   rj   )r+   r/   r,   r,   r-   _real_initialize   s   

zWeverseBaseIE._real_initializeDownloading API JSONc           
      C   s8  t |dd| j| jdd}dD ]}tt d }ttj| j|d d  | 	 t
jd  }z(| jd	| |||i | j|  |rLd
dini d| ji||ddW   S  ty }	 z1|slt|	jtsm | jr|	jjdkr|   W Y d }	~	q|	jjdkr| jrtddd| d  d }	~	ww d S )N be4d79eb8fc7bd008ee82c8ec4ff6fd4enpc)appIdlanguageosplatformwpf)FT     )	digestmodz,https://global.apis.naver.com/weverse/wevwebrP   r   zWEV-device-Id)wmsgpadwmd)noterU   r@   queryr<   i  z1Your account does not have access to this contentTrp   r   )r   _CLIENT_PLATFORMrG   rK   base64	b64encodehmacHMAC_SIGNING_KEYr^   hashlibsha1digestdecoderE   r&   rk   r   r   r_   r`   r   r;   ra   rj   r[   )
r+   epvideo_idrU   r   api_pathis_retryr   r   ri   r,   r,   r-   	_call_api   sb   
zWeverseBaseIE._call_apic                 C   s&   | j rdnd}| d| | d|S )Nrn   z/previewz/post/v1.0/post-z?fieldSet=postV1)r;   r   )r+   r   rX   r,   r,   r-   _call_post_api   s   zWeverseBaseIE._call_post_apic                 C   s   t | jd| |ddd S )Nz>/community/v1.0/communityIdUrlPathByUrlPathArtistCode?keyword=zFetching community IDr   communityId)r'   r   )r+   channelr,   r,   r-   _get_community_id   s   zWeverseBaseIE._get_community_idc           	      C   s   t |dddd dddthfddthfd	d
dthfd
dthfdthfddthfdf}t |ddd fD ]D}i }t |ddd fD ]}|dd||d < qA| j|d |ddd|d}|rs|D ]}t|d ||d< tj||d< q_|	| q4|S )Nvideoslistc                 S   s   t |d S )Nsourcer   _vr,   r,   r-   r{      r|   z,WeverseBaseIE._get_formats.<locals>.<lambda>r   encodingOptionwidthheighttypebitratevideoaudiosizeid)urlr   r   vcodecvbrabrfilesize	format_idstreamsc                 S   s   |d dkot |d S )Nr   HLSr   r   r   r,   r,   r-   r{     s    keysc                 S   s   |d dko	|d S )Nr   paramrY   r,   r   r,   r,   r-   r{     s    r   rn   rY   mp4hlsF)m3u8_idfatalr   r   extra_param_to_segment_url)
r   r   r   r9   _extract_m3u8_formatsr   urllibparse	urlencodeextend)	r+   rU   r   formatsstreamr   r   fmtsfmtr,   r,   r-   _get_formats   s.   





zWeverseBaseIE._get_formatsc                    s6   d  fdd}t  |r||d||dgS |gS )Nz\.(?:ttml|vtt)c                    s   t  || S r6   )resub)xysubs_ext_rer,   r-   r{         z)WeverseBaseIE._get_subs.<locals>.<lambda>z.ttmlz.vtt)r   search)r+   caption_urlreplace_extr,   r   r-   	_get_subs  s
   zWeverseBaseIE._get_subsc                 C   s   t |dthfdthfddthfddthfddthtfdd	thfd
ddthfdtddhfd
ddtddhfd
dthfd
ddthfd
ddthfdthfdddS )N))	extension	mediaInfotitler   ))r   r   bodyr   authorprofileNamememberId	communitycommunityNamer   r   r   r   r   playTimepublishedAtr   scaleonAirStartAt))r   	thumbnailr   )r   thumb	playCount	likeCountcommentCount)r   descriptionuploaderuploader_idcreators
channel_idduration	timestamprelease_timestampr   
view_count
like_countcomment_countFget_all)r   r'   allr   r
   r   r   )r+   metadatar,   r,   r-   _parse_post_meta  s"   



zWeverseBaseIE._parse_post_metac              	   C   s.   | j d	i t|ddddfdtdddiS )
N))r   r   NpaidmembershipOnly)needs_premiumneeds_subscriptionF)r   expected_type
needs_authTr,   )_availabilityr   r7   r+   rU   r,   r,   r-   _extract_availability+  s   z#WeverseBaseIE._extract_availabilityc                 C   sZ   t |ddthfp
i }|ddkr$t ddddd|d	thfp#dS |d
r+dS dS )Nr   r   r   LIVEis_live	post_liveis_upcoming)ONAIRDONESTANDBYDELAYra   	liveToVodwas_livenot_live)r   dictr9   r'   r	  r,   r,   r-   _extract_live_status1  s   z"WeverseBaseIE._extract_live_status)Nr   )%__name__
__module____qualname__rf   rF   r   r   r:   rL   r   r&   rt   rr   r2   r8   r   propertyr.   	functoolscached_propertyr5   r;   rI   rO   rj   rk   r[   r   r   r   r   r   r   r   r  r
  r  r,   r,   r,   r-   r      sX    



(
*r   c                   @   s  e Zd ZdZddi dddddd	d
dddddddddddddgddddddddddd d!d"eeed#d$d%d&d'd(i dd)dddd*d
d*dd+dd,dd-dd.dd/dd0gdd1dd2dd1dd2dd3d d!d"eeed#d$d4d4d4d4d4d4d4d4d4d5	d6d&d7i dd8dddd9d
ddd:dd;dd<dd=dd>d?d:dd@ddAddBddAd d!d"edCeed#dDdEdFdGgZdHdI ZdJS )K	WeverseIEzJhttps?://(?:www\.|m\.)?weverse\.io/(?P<artist>[^/?#]+)/live/(?P<id>[\d-]+)z+https://weverse.io/billlie/live/0-107323480 1fa849f00181eef9100d3c8254c47979r   z0-107323480extr   r   u   행복한 평이루💜r   rn   r   Billlier    5ae14aed7b7cdc65fa87c41fe06cc936r   billlier   72channel_urlhttps://weverse.io/billlier   r   i.$Qcupload_date20221020r   i*$Qcrelease_dater   i  r   re:^https?://.*\.jpe?g$r   r  r  r   r   availabilitylive_statusr   md5	info_dictz.https://weverse.io/lesserafim/live/2-102331763 e46125c08b13a6c8c1f4565035cca987z2-102331763u   🎂김채원 생신🎂zLE SSERAFIM  d26ddc1e258488a0a2b795218d14d59d
lesserafim47https://weverse.io/lesserafimLE SSERAFIMi8b20220801i  zcount:2)	id_IDen_USes_ESvi_VNth_THzh_CNzh_TWja_JPko_KR)r   r   r,  r-  	subtitlesz,https://weverse.io/treasure/live/2-117230416z2-117230416u+   re:스껄도려님 첫 스무살 생파🦋TREASURE 77eabbc449ca37f7970054a136f60082treasure20zhttps://weverse.io/treasurecreatori,d20230405i,dr   r  r   r,  r-  Livestream has endedr   r0  skipc                 C   s  |  |dd\}}| |}|d d d }| |}| |}i g }}	|dkr3| jddd	 n|d
krf| jd| d|dd}| |d |}
t|
ddd dt	hfdd}| j
||dddd\}	}n|dkr{|dv rs| | | jddd	 nn|d d d }| jd| d|dd d!d" }| jd#| |d$|t|d%pd&tt tt d' d(|d)rd*nd+d+d+d,d-d,d.d/d0d1}| ||}	t|d2d3d4tjhfd5k}|r|	r| d6| n	|r|	s| | ||d7| |	||d8| |t|| jS )9Nartistr   r   r   videoIdr  zLivestream has not yet startedTrp   r  z/video/v1.3/lives/z0/playInfo?preview.format=json&preview.version=v2Downloading live JSONr   lipPlaybackmediac                 S   s   |d dkS )Nprotocolr   r,   r   r,   r,   r-   r{     r|   z)WeverseIE._real_extract.<locals>.<lambda>rX   Fr   r   r   )r   liver  )premium_onlysubscriber_onlyz:Livestream has ended and downloadable VOD is not availableinfraVideoIdz/video/v1.1/vod/z/inKey?preview=falses   {}zDownloading VOD API key)rU   r   inKeyz:https://global.apis.naver.com/rmcnmv/rmcnmv/vod/play/v2.0/zDownloading VOD JSON)r   r   	serviceId2070r   html5_pcr  YNr   prodz[{"adSystem":"null"}]rV   )rM   sidpidnoncedevtprvaupstpbcplenvlcadiadu)r   r   metaproviderrY   drmzIRequested content is DRM-protected, only a 30-second preview is availabler   )r   r   r%  r   r,  r-  )_match_valid_urlgroupr   r
  r  raise_no_formatsr   _parse_jsonr   r   #_extract_m3u8_formats_and_subtitles
report_drmrE   r'   r(   r)   rG   rK   r9   r   lowerreport_warningr  r   process_subtitlesr   )r+   r   r   r   postapi_video_idr,  r-  
video_infor   playbackm3u8_urlr   infra_video_idin_keyhas_drmr,   r,   r-   _real_extract  s   








zWeverseIE._real_extractNr  r  r  
_VALID_URLrG   _TESTSr}  r,   r,   r,   r-   r  =  s   	
	
&	
Zr  c                   @   s$  e Zd ZdZdi ddddddd	d
ddddddddddddddddddddddd d!d"d#eeeed$d%gd&dd'd(	d)d*d+i dd,dddd-d	d.dd/dd0dd1dd2dd3d4dgdd5dd6d7d5d8d6dd9d:d;d<eeed=d!d>d?gZd@dA ZdBS )CWeverseMediaIEzKhttps?://(?:www\.|m\.)?weverse\.io/(?P<artist>[^/?#]+)/media/(?P<id>[\d-]+)z,https://weverse.io/billlie/media/4-116372884r   ze-C9wLSQs6or   r   r   z5Billlie | 'EUNOIA' Performance Video (heartbeat ver.)r   z$md5:6181caaf2a2397bca913ffe368c104e5r   r!  r   UCyc9sUCxELTDK9vELO5Fzegr%  z8https://www.youtube.com/channel/UCyc9sUCxELTDK9vELO5Fzegr   r   z@Billlieuploader_urlz https://www.youtube.com/@Billlier'  20230403r   i*dr      	age_limitr   playable_in_embedTr-  r  r,  publicz4https://i.ytimg.com/vi/e-C9wLSQs6o/maxresdefault.jpgEntertainmentzcount:7z	count:100)	r   r   r   channel_follower_countr   
categoriestagschannel_is_verifiedheatmap)r   r0  z,https://weverse.io/billlie/media/3-102914520 031551fcbd716bc4f080cb6174a43d8az3-102914520u   From. SUHYEON🌸u.   Billlie 멤버별 독점 영상 공개💙💜Billlie_official f569c6e92f7eaffef0a395037dcaa54fr#  r$  r&  r   i0c20220903r   r)  g      1@r   r*  r   r  r+  r.  c                 C   s   |  |dd\}}| |}t|dddtjhf}t|dddthf}|dkr5| d	| d
| tS |dkrA|rA| |tS |dkrM| j	ddd n
|rWt
d| d| 	d d S )NrL  r   r   r   	mediaTypeyoutubeyoutubeVideoIdvodr   /live/imagez!No video content found in webpageTrp   zUnsupported media type "")rl  rm  r   r   r'   rr  
url_resultr  r   rn  r   )r+   r   r   r   ru  
media_type
youtube_idr,   r,   r-   r}    s   
zWeverseMediaIE._real_extractNr~  r,   r,   r,   r-   r    s    	
	
:r  c                   @   sH   e Zd ZdZdddddddd	d
dgddddeedddgZdd ZdS )WeverseMomentIEzchttps?://(?:www\.|m\.)?weverse\.io/(?P<artist>[^/?#]+)/moment/(?P<uid>[\da-f]+)/post/(?P<id>[\d-]+)zXhttps://weverse.io/secretnumber/moment/66a07e164b56a696ee71c99315ffe27b/post/1-117229444 87733ac19a54081b7dfc2442036d282bz1-117229444r   u.   今日もめっちゃいい天気☀️🌤️u   레아 66a07e164b56a696ee71c99315ffe27bsecretnumber56zSECRET NUMBER
   rG  i,dr*  r  )r   r   r   r   r   r   r   r   r   r'  r   r   r   r   r,  r.  c                 C   s   |  |ddd\}}}| |}|d d d d }| jd| d	| |d
dd }|||| ||| |dt|dthfddthfddthfddthfdddddt	hfdt
ddhfdddddthfdt
hfdt
hfd	ddt|| jS )NrL  uidr   r   momentr   rM  z/cvideo/v1.0/cvideo-z/playInfo?videoId=zDownloading moment JSONr   playInfo)r   r   r   r   r,  ))r   r  r   r   r   r   r   r   r   
uploadInfor   r   r   r   imageUrlemotionCountr   )	r   r   rF  r   r   r   r   r   r   Fr   )rl  rm  r   r   r   r
  r   r'   r   r
   r   r   r   rt  r   )r+   r   r   r   r   ru  rv  rw  r,   r,   r-   r}  G  s>   





zWeverseMomentIE._real_extractNr~  r,   r,   r,   r-   r  /  s,    r  c                   @   s,   e Zd ZdZdZi ZdZdd Zdd ZdS )WeverseTabBaseIENc                 c   s    | j  }tdD ]j}|dkr|n| jt| j| ||d| j d| d}t|ddd fD ]0}| j	d| d	| j d	|d
  | j
|d
 fi | ||d| | || |dV  q1t|dddthf|d< |d su d S qd S )Nr   Downloading z
 tab page r   rU   c                 S   s   |d S )NpostIdr,   r   r,   r,   r-   r{   r  s    z+WeverseTabBaseIE._entries.<locals>.<lambda>r   rV   r  )r   r%  r,  r-  paging
nextParamsafter)_QUERYcopy	itertoolscountr   r   	_ENDPOINT_PATHr   r  
_RESULT_IEr  r
  r  r'   )r+   r   r   
first_pager   pagepostsru  r,   r,   r-   _entriesj  s.   


zWeverseTabBaseIE._entriesc                 C   s   |  |}| |}| jt| j| | j|d| j dd}| j| |||| d| j fi t	|ddddt
hfd	d
thfdfddS )Nr  z tab page 1r   -rU   .r   r   r   profileImageUrl)playlist_titler   Fr   )	_match_idr   r   r   r  r  r  playlist_resultr  r   r'   r   )r+   r   r   r   r  r,   r,   r-   r}  ~  s    



zWeverseTabBaseIE._real_extract)	r  r  r  r  r  r  r  r  r}  r,   r,   r,   r-   r  d  s    r  c                   @   s:   e Zd ZdZdddddddgZd	Zd
ZddiZeZ	dS )WeverseLiveTabIEzChttps?://(?:www\.|m\.)?weverse\.io/(?P<id>[^/?#]+)/live/?(?:[?#]|$)z https://weverse.io/billlie/live/7   zbilllie-liver!  r*  r   r   r   r   playlist_mincountr0  z$/post/v1.0/community-%s/liveTabPostsrR  fieldSetpostsV1N)
r  r  r  r  r  r  r  r  r  r  r,   r,   r,   r-   r    s    
r  c                   @   sL   e Zd ZdZdddddddd	d
ddd
dgZdZdZdddZeZ	dS )WeverseMediaTabIEzRhttps?://(?:www\.|m\.)?weverse\.io/(?P<id>[^/?#]+)/media(?:/|/all|/new)?(?:[?#]|$)z!https://weverse.io/billlie/media/   zbilllie-mediar!  r*  r  r  z'https://weverse.io/lesserafim/media/allTr   only_matchingz'https://weverse.io/lesserafim/media/newz/media/v1.0/community-%s/morerP  r  RECENT)r  
filterTypeN)
r  r  r  r  r  r  r  r  r  r  r,   r,   r,   r-   r    s(    	
r  c                   @   s   e Zd ZdZdi ddddddd	d
ddddddddddddgddddddddddded eed!d"d#d$d%d&i dd'dddd(d	d)dd*dd+dd,dd-dd.gdd&dd/dd0dd1dd0dd2ded eed!d"d#d$d%d3d4d5gZd6d7 Zd8S )9WeverseLiveIEz>https?://(?:www\.|m\.)?weverse\.io/(?P<id>[^/?#]+)/?(?:[?#]|$)zhttps://weverse.io/purplekissr   z3-116560493r   r   r   u   re:모하냥🫶🏻r   u   내일은 금요일~><r   u   채인r    1ffb1d9d904d6b3db2783f876eb9229dr   
purplekissr   35r%  r   zPURPLE KISSr   i\.dr'  20230406r   iS.dr)  r   z6https://weverse-live.pstatic.net/v1.0/live/62044/thumbr   r   r  r  rH  rI  rJ  r5  z4-181521628u   re:심심해서요rn   u
   채채🤎 d49b8b06f3cc1d92d655b25ab27ac2e7r3  r4  r6  ig20241010igz)re:https://phinf\.wevpstatic\.net/.+\.pngzhttps://weverse.io/billlie/Tr  c                    s|     |} |}t jtd| dddd|dddd	 fd
ddthfdd}|s2t|d d| d| tS )Nz/post/v1.0/community-z/liveTabtruezXonAirLivePosts.fieldSet(postsV1).limit(10),reservedLivePosts.fieldSet(postsV1).limit(10))debugMessagefieldsrN  r   )onAirLivePostsreservedLivePostsrU   c                    s     |dv S )N)r  r  )r  r   r*   r,   r-   r{     r   z-WeverseLiveIE._real_extract.<locals>.<lambda>r  Fr   )r   r   r  )	r  r   r   r   r   r'   r	   r  r  )r+   r   r   r   r   r,   r*   r-   r}    s"   

	
zWeverseLiveIE._real_extractNr~  r,   r,   r,   r-   r    s    	
	
7r  ))r   r  r   r   r  r\   r   rK   urllib.parser   r(   commonr   naverr   r  r   networking.exceptionsr   utilsr   r	   r
   r   r   r   r   r   r   r   utils.traversalr   r   r   r  r  r  r  r  r  r  r,   r,   r,   r-   <module>   s6    0    %N5*