U
    Mfݮ                     @   s|  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 ddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!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)eZ*G dd de)Z+G dd de)eZ,G dd de)Z-G dd de
Z.G dd de
Z/dS )     N   )InfoExtractorSearchInfoExtractor   )Request)	HTTPError)ExtractorErrorOnDemandPagedList
clean_htmlfloat_or_noneint_or_nonejoin_nonemptyparse_durationparse_iso8601parse_resolution	qualitiesremove_startstr_or_nonetraverse_objtry_getunescapeHTMLupdate_url_queryurl_or_noneurlencode_postdataurljoinc                   @   s  e Zd ZdZdZdgZdZddddd	d
dddeddeedgg edddddddd
dddddeedgdddged d!d"d#d$d%d&d
d'ed(ed)	d*d+d,d-dd.d/d
d0d1d2d3d4	d5d+d6d7d8dd9d:d
d;d<d=d>d?eed@gg edAddBdCddDdEdFdGdHdId
dJeedKgg edLd!dMdNdOddPdQdRdSd
dTeedUgg edVddWdXdYdZd[dXd\g	Z	d]Z
dZd^d_d`dadbdcZddde Zdfdg Zdhdi Zdjdk Zdldm Zdndo Zdpdq ZdrS )s
NiconicoIEZniconicou   ニコニコ動画ZJPFz(http://www.nicovideo.jp/watch/sm22312215Z d1a75c0823e2f629128c43e1212760f9Z
sm22312215mp4zBig Buck Bunnyzre:https?://.*Z
takuya0301Z2698420Z20131123z=(c) copyright 2008, Blender Foundation / www.bigbuckbunny.org!   u	   未設定)idexttitle	thumbnailuploaderuploader_idupload_date	timestampdescriptionduration
view_countcomment_countgenrestagsexpected_protocol)urlmd5	info_dictz(http://www.nicovideo.jp/watch/nm14296458Z
nm14296458u4   【Kagamine Rin】Dance on media【Original】take2!z$md5:9368f2b1f4178de64f2602c2f3d6cbf5u   りょうたZ18822557Z20110429i|wMg      j@u   音楽・サウンドZTranslation_RequestZKagamine_RinZRin_Original)r   r   r    r&   r!   r"   r#   r$   r%   r'   r)   r(   r*   r+   r,   )r-   r/   z%http://www.nicovideo.jp/watch/sm10000Zsm10000Zunknown_videoZdeleteduM   ドラえもんエターナル第3話「決戦第3新東京市」＜前編＞Z20071224i0  )	r   r   r&   r    r!   r$   r%   r'   r(   zRequires an account)r-   r/   skipz(http://www.nicovideo.jp/watch/so22543406Z
1388129933u[   【第1回】RADIOアニメロミックス ラブライブ！～のぞえりRadio Garden～z$md5:b27d224bb0ff53d3c8269e9f8b561cf1i 0RZ20140104u   アニメロチャンネルZ312)	r   r   r    r&   r!   r%   r$   r"   r#   zCThe viewing period of the video you were searching for has expired.z'http://www.nicovideo.jp/watch/sm1151009Z f95a3d259172667b293530cc2e41ebdaZ	sm1151009uZ   マスターシステム本体内蔵のスペハリのメインテーマ（ＰＳＧ版）z$md5:f95a3d259172667b293530cc2e41ebda   iFZ20070926Zdenden2Z1392194u	   ゲーム)r   r   r    r&   r!   r'   r%   r$   r"   r#   r(   r)   r*   r+   r,   z(http://www.nicovideo.jp/watch/sm31464864Z
sm31464864uG   新作TVアニメ「戦姫絶唱シンフォギアAXZ」PV 最高画質z$md5:e52974af9a96e739196b2c1ca72b5febiQYZ20170626z
no-namamaeZ40826363   u	   アニメ)r   r   r    r&   r%   r$   r"   r#   r!   r'   r(   r)   r*   r+   r,   z(http://www.nicovideo.jp/watch/sm18238488Z d265680a1f92bdcbbd2a507fc9e78a9eZ
sm18238488u0   【実写版】ミュータントタートルズz$md5:15df8988e47a86f9e978af2064bf6d8eiHOZ20120701i  u   エンターテイメント)r   r   r    r&   r%   r$   r!   r'   r(   r)   r*   r+   r,   z<http://sp.nicovideo.jp/watch/sm28964488?ss_pos=1&cp_in=wt_tgTr-   only_matchingz0a video that is only served as an ENCRYPTED HLS.z)https://www.nicovideo.jp/watch/so38016254noter-   r4   z]https?://(?:(?:www\.|secure\.|sp\.)?nicovideo\.jp/watch|nico\.ms)/(?P<id>(?:[a-z]{2})?[0-9]+)60en-ushttps://www.nicovideo.jp/https://www.nicovideo.jp)X-Frontend-IDX-Frontend-VersionX-Niconico-LanguageRefererOriginc              
   C   s   d}||d}| j dd dd | jdd ddt|dd	d
d}d|kr| jd|ddd}| jtd|d ddtd| didd	id}d|ksd|kr| jd|ddtjd}| 	d| d dS d|k}|s| 	d  |S )!NT)Zmail_telpasswordz"https://account.nicovideo.jp/loginzAcquiring Login sessionr6   zhhttps://account.nicovideo.jp/login/redirector?show_button_twitter=1&site=niconico&show_button_facebook=1z
Logging inzUnable to log inz!application/x-www-form-urlencoded)r?   Content-Type)r6   errnotedataheadersZ	oneTimePwz&<form[^>]+action=(["\'])(?P<url>.+?)\1zpost urlr-   )groupzhttps://account.nicovideo.jpzPerforming MFAzUnable to complete MFAZotpz6 digits coderC   Z	formErrorzformError["\']+>(.*?)</div>Z
form_errorz1There's an error but the message can't be parsed.)defaultflagsz)Unable to log in: MFA challenge failed, ""Fzclass="notice error"z*Unable to log in: bad username or password)
_request_webpage_download_webpager   _search_regexr   Z_get_tfa_info_html_search_regexreDOTALLreport_warning)selfusernamerA   Zlogin_okZlogin_form_strspageZpost_urlerr_msg rV   =/tmp/pip-unpacked-wheel-zk9bgjdq/yt_dlp/extractor/niconico.py_perform_login   sj                
zNiconicoIE._perform_loginc                    s  |d  dd  d\}}|d }|dpTjdd d	d
d t dd tdd } fdd}dd }|dkrd}d|d d d |d d d di}	n|dkrrd}tddd pd}
d }t d}d |
d!|d d d |d d d d"i}	d#|krl|rl|d# |d$ |d% d&i|	d  d'< nd(}ntd)| j	|d d*d+id,d-id.
|d/ td0d1d2itfd3dd4d5d6d7d8d9d:|g|gd;igigd<d!d=d>d?iid@ ddAdB|	iidCdDdEdFddGidHdIi dJ}|dK d0 dL |d< ||dM< |d d |dK d0 dN  dO t|dK td?dPdQ|dR}||fS )SNr-   :r   /r,   	_api_datadata-api-data="([^"]+)"https://www.nicovideo.jp/watch/API data{}rH   c                 S   s   | d d d d S )NmediadeliverymoviesessionrV   xrV   rV   rW   <lambda>       z0NiconicoIE._get_heartbeat_info.<locals>.<lambda>c                 S   s   | d d S )Nurlsr   rV   re   rV   rV   rW   rg      rh   c                     sN   t  d} | rJtdd| i}j|ddjd}t |ddkrJd	 d S )
N)ra   rb   Z
trackingIdz,https://nvapi.nicovideo.jp/v1/2ab0cbaa/watchtz*Acquiring permission for downloading videoF)r6   fatalrF   )metastatus   zHFailed to acquire permission for playing video. Video download may fail.)r   r   _download_json_API_HEADERSrQ   )Ztracking_idZtracking_urlZwatch_request_response)api_datarR   video_idrV   rW   ping   s    
  z,NiconicoIE._get_heartbeat_info.<locals>.pingc                 S   s   | rdS dS )NyesnorV   re   rV   rV   rW   rg     rh   httpZhttp_output_download_parametersri   r   ZisSslZisWellKnownPort)use_ssluse_well_known_portZhlsZm3u8segment_durationc                 S   s   t | d S Nr   )intre   rV   rV   rW   rg     rh   ip  token)ra   rb   
encryptionZhls_parameters )ry   Ztransfer_presetrw   rx   Zhls_encryptionZencryptedKeyZkeyUri)Zencrypted_keyZkey_urir}   Zm3u8_nativezUnsupported DMC protocol: _formatjsonrC   zapplication/jsonz Downloading JSON metadata for {}	format_idrd   Z	player_idZplayerIdc                    s   | d  d d  S )NZ	authTypes	protocolsr   rV   re   )session_api_datarV   rW   rg   1  rh   ZcontentKeyTimeoutZ	nicovideoZserviceUserId)Z	auth_typeZcontent_key_timeoutZ
service_idZservice_user_idZ	contentIdZcontent_src_idsZsrc_id_to_mux)Zaudio_src_idsZvideo_src_idsrc   Z	heartbeatZlifetimeZheartbeatLifetimepriorityZhttp_parameters
parameters)namer   ZrecipeIdZ#session_operation_auth_by_signature	signature)r   r|   Z	unlimited)Zclient_infoZcontent_authZ
content_idZcontent_src_id_setscontent_typecontent_uriZkeep_methodr   protocolZ	recipe_idZsession_operation_authZtiming_constraint)queryrF   r6   rE   rE   r   r   r   z?_format=json&_method=PUTi  Zscale)r-   rE   intervalrs   )splitget_parse_jsonrN   rL   r   _configuration_argr   r   ro   formatr   dumpsencoder   )rR   r/   Zvideo_src_idZaudio_src_iddmc_protocolZsession_api_endpointrs   Zyesnor   Zprotocol_parametersry   Zparsed_tokenr}   Zsession_responseZheartbeat_info_dictrV   )rq   rR   r   rr   rW   _get_heartbeat_info   s    
 	

    4zNiconicoIE._get_heartbeat_infoc              
   C   s   | dr| dsd S ddd ||fD |g }t|d}d||d |d |td|| d	d
ddddt|ddtjtddhfdt	hfdft|ddtjtddhfddt	hfddt	hfdfd|d krdnd d|dd| ddS ) NisAvailable-c                 S   s   g | ]}t |d  dqS )r   Zarchive_)r   ).0srV   rV   rW   
<listcomp>n  s     z:NiconicoIE._extract_format_for_quality.<locals>.<listcomp>)metadatalabelzniconico_dmc:{}/{}/{}r   ZDMC )delimr   aacZh264)r-   r   Zformat_noter   acodecvcodecr   Zbitrate  r   samplingRate)abrasr
resolutionheightwidth)Zvbrr   r   lowZniconico_dmcr;   r]   )r@   r?   )qualityr   r,   Zhttp_headers)
r   joinr   r   r   upper	functoolspartialr   r   )rR   rr   audio_qualityvideo_qualityr   r   Zvid_qual_labelrV   rV   rW   _extract_format_for_qualityh  s:    


z&NiconicoIE._extract_format_for_qualityc                 c   s   t |d}t |ddthf}t |ddthf}t |dddthf}t|||fsTd S t|||D ]$\}}}	| ||||	 }
rb|
V  qbd S )N)ra   rb   rc   audios.videosrd   r   )r   dictstrall	itertoolsproductr   )rR   rq   rr   Zdmc_datar   r   r   r   r   r   fmtrV   rV   rW   _yield_dmc_formats  s    
zNiconicoIE._yield_dmc_formatsc                 #   s  dd }t |ddd|f}t |ddd|f}t |dddthf}t |dd	thf}t||||fsfd S | jd
| d|tdttdd |D dd |D i	 d|i|dddddd d }| 
||}	t |	dd D ]P  t | fdddthfdtjtddhfdthfdfd d!d"d#d$V  qtd%d |	D d&d d'}
| |
 tt |d(dthfdd)d }|
D ]0}|d*  |8  < d+|d* d,|d-< |V  qxd S ).Nc                 S   s   |d o|d S )Nr   r   rV   _vrV   rV   rW   rg     rh   z/NiconicoIE._yield_dms_formats.<locals>.<lambda>ra   Zdomandr   r   ZaccessRightKeyclientZwatchTrackIdz$https://nvapi.nicovideo.jp/v1/watch/z/access-rights/hlsoutputsc                 s   s   | ]}|d  V  qdS r   NrV   )r   r   rV   rV   rW   	<genexpr>  s     z0NiconicoIE._yield_dms_formats.<locals>.<genexpr>c                 s   s   | ]}|d  V  qdS r   rV   )r   arV   rV   rW   r     s     ZactionTrackId   r   r;   )zx-access-right-keyx-frontend-idx-frontend-versionzx-request-with)rE   r   rF   rE   Z
contentUrlc                 S   s   |d dkS )Nr   nonerV   r   rV   rV   rW   rg     rh   c                    s    d  |d S )Nr   r   )
startswithr   Z	audio_fmtrV   rW   rg     rh   r   ZbitRater   r   r   )r   r   r   F)get_allr   Zm4a)r   r   c                 s   s   | ]}|d  dkr|V  qdS )r   r   NrV   )r   r   rV   rV   rW   r     s      c                 S   s   | d S )NtbrrV   )frV   rV   rW   rg     rh   )key.r`   r   zvideo-z.0fr   )r   r   r   ro   r   r   listr   r   r   _extract_m3u8_formatsr   r   r   r   sortedZ_remove_duplicate_formatsmin)rR   rq   rr   Z
fmt_filterr   r   Z
access_keyZtrack_idZdms_m3u8_urlZdms_fmtsZ
video_fmtsZmin_abrZ	video_fmtrV   r   rW   _yield_dms_formats  sZ    
  "		
zNiconicoIE._yield_dms_formatsc                    s  |  |}zH| d| |\}}|dr6|  |j}| | jd|ddd| W n tk
r } zz2| jd| dtt		 d	  |d
ddd  W n^ tk
r   t
|jts |jj dd}| jd|dd d}|s tt|ddY nX W 5 d }~X Y nX | jf t dddthfdthfdfp:ddi}|  ||  |}|st| jd|dd dd}	|	r| d|	  |	rd|	krd }| j| jdd  nJ|d!kr| jd"dd# n0|d$kr| jd%dd# n|dkr| jd&d# d }
|rXtd'|}ttd d(d) |D }
|
sX| jd*|d d}|rXd+d, |d-D }
|
sht d.}
t d/d0d1d2d3gdd4 fd5d6
}| |d7p| j!|d d||fd8d,|d9pi " D t|d:t d;d<d=t#t d>d?d@t$|dApt$| jdB|dCd dt d<d=t d?d@t%|dDdE|
t dFdG|dDdHt&dIt'| jdJ|dKd dpf|dLt(|pxd| | )| dMS )NNr]   sor\   r^   r_   r`   z&https://www.nicovideo.jp/api/watch/v3/z;?_frontendId=6&_frontendVersion=0&actionTrackId=AAAAAAAAAA_r   zDownloading API JSONzUnable to fetch data)r6   rD   rE   zutf-8replacezZ(?s)<section\s+class="(?:(?:ErrorMessage|WatchExceptionPage-message)\s*)+">(.+?)</section>zerror reasonTexpectedpaymentvideoZ	isPremiumZisAdmission)Zneeds_premiumZneeds_subscriptionZ
needs_authz3<p[^>]+\bclass="fail-message"[^>]*>(?P<msg>.+?)</p>zfail messagemsg)rH   rG   zNiconico said: u?   された地域と同じ地域からのみ視聴できます。)Z	countriesmetadata_availableZpremium_onlyzThis video requires premium)r   Zsubscriber_onlyzThis video is for members onlyFz2<meta\s+property="og:video:tag"\s*content="(.*?)">c                 s   s   | ]}t |d V  qdS )r   N)r
   rG   r   rf   rV   rV   rW   r     s     z+NiconicoIE._real_extract.<locals>.<genexpr>keywordsc                 S   s   g | ]}|r|qS rV   rV   r   rV   rV   rW   r      s      z,NiconicoIE._real_extract.<locals>.<listcomp>,)tagitems.r   r-   Z	middleUrllargeUrlZplayerZogp)	get_firstc                    s   t  d|fd|  i|S )Nr   r   )r   r   )r   r   kwargs)rq   rV   rW   get_video_info  s    z0NiconicoIE._real_extract.<locals>.get_video_info)ZoriginalTitler    c                    s2   g | ]*\}}|r||d  |dt |ddqS )Zjpg)r   r-   r   Z
preferenceTlenient)r   )r   r   r-   )thumb_prefsrV   rW   r     s    
r!   r&   )ownerZnickname)channelr   )	communityr   r   r   )r   r   )r   r   ZregisteredAtzvideo:release_datezdate publishedcountview)genrer   )r   r   comment)Zexpected_typezvideo:durationzvideo durationr'   )r   r[   r    formatsavailability
thumbnailsr&   r"   r#   r%   r   
channel_idr(   r+   r   r)   r'   Zwebpage_urlZ	subtitles)*	_match_id_download_webpage_handler   r-   r   rN   r   ro   roundtime
isinstancecauser   responsereaddecoder
   Z_availabilityr   boolr   r   	to_screenZraise_geo_restricted_GEO_COUNTRIESraise_login_requiredrO   finditerr   filter_html_search_metar   r   Z_og_search_titler   r   r   r   r{   r   r   Zextract_subtitles)rR   r-   rr   webpagehandlee	error_msgr   r   fail_msgr+   Zog_video_tagskwdsr   rV   )rq   r   rW   _real_extract  s    
 
      (

   









zNiconicoIE._real_extractc                 C   s   t |ddthfpi }|ds$d S t | j|d  d|ti |d|dd dd	d
ddddddddd}ddt|dgiS )Nr   Z	nvCommentserverz/v1/threadsparams	threadKey)Zadditionalsr  r  Fr:   r;   ztext/plain;charset=UTF-8Zothersr7   r8   )r?   r@   rC   zx-client-os-typer   r   zDownloading commentszFailed to download comments)rE   rk   rF   r6   rD   )rE   threads.comments.r  r   )r   rE   )r   r   r   ro   r   r   r   )rR   rr   rq   Zcomments_infoZdanmakurV   rV   rW   _get_subtitles)  s:    
  
 zNiconicoIE._get_subtitlesN)__name__
__module____qualname__IE_NAMEIE_DESCr   Z_GEO_BYPASSr{   r   _TESTS
_VALID_URLZ_NETRC_MACHINErp   rX   r   r   r   r   r  r  rV   rV   rV   rW   r   #   s&    ( #-er   c                   @   s@   e Zd ZdZddddZdd Zedd	 Zd
d Zdd Z	dS )NiconicoPlaylistBaseIEd   r7   r8   r9   )r<   r=   r>   c                 C   s   t dd S )Nz!Must be implemented in subclasses)NotImplementedErrorrR   list_idresourcer   rV   rV   rW   	_call_apiP  s    z NiconicoPlaylistBaseIE._call_apic                 C   s   t | dt | ddS )N)r   r   r   )r"   r#   r   )itemrV   rV   rW   _parse_ownerS  s    z#NiconicoPlaylistBaseIE._parse_ownerc                 #   s   |d7 }|  |d| || jd}t|dp0g D ]}|d}|sFq2|dpRi   fdd}d	||d
d| |dt|d|d|dt|dt d
| |V  q2d S )Nr   zpage )rT   pageSize)r   .)r   Nr   r   c                    s   t  | S N)r   r   re   r   rV   rW   rg   g  rh   z4NiconicoPlaylistBaseIE._fetch_page.<locals>.<lambda>r-   r    r]   ZshortDescriptionr'   r   r   )r!   )ZnHdUrlr   Z
listingUrlr-   )
_typer   r    r-   r&   r'   r(   r)   r!   ie_key)r  
_PAGE_SIZEr   r   r   r   r&  r!  )rR   r  rT   respr   rr   Z	get_countrV   r$  rW   _fetch_pageZ  s0    
z"NiconicoPlaylistBaseIE._fetch_pagec                 C   s   t t| j|| jS r#  )r	   r   r   r)  r'  )rR   r  rV   rV   rW   _entriesv  s    zNiconicoPlaylistBaseIE._entriesN)
r  r  r  r'  rp   r  staticmethodr!  r)  r*  rV   rV   rV   rW   r  G  s   
r  c                   @   sN   e Zd ZdZdZddddddd	d
dddddddgZdd Zdd ZdS )NiconicoPlaylistIEzniconico:playlistzbhttps?://(?:(?:www\.|sp\.)?nicovideo\.jp|nico\.ms)/(?:user/\d+/)?(?:my/)?mylist/(?:#/)?(?P<id>\d+)z'http://www.nicovideo.jp/mylist/27411728Z27411728u&   AKB48のオールナイトニッポンz$md5:d89694c5ded4b6c693dea2db6e41aa08u	   のっくZ805442)r   r    r&   r"   r#   i#  r-   r/   Zplaylist_mincountz4https://www.nicovideo.jp/user/805442/mylist/27411728Tr3   z-https://www.nicovideo.jp/my/mylist/#/68048635c                 C   s*   | j d| |d| || jdd d S )Nz&https://nvapi.nicovideo.jp/v2/mylists/Downloading r   rF   rE   mylistro   rp   r  rV   rV   rW   r    s      zNiconicoPlaylistIE._call_apic                 C   sH   |  |}| |dddi}| j| |||d|df| |S )Nr   r"  r   r   r&   )r   r  playlist_resultr*  r   r!  )rR   r-   r  r0  rV   rV   rW   r    s    
   z NiconicoPlaylistIE._real_extractN)r  r  r  r  r  r  r  r  rV   rV   rV   rW   r,  z  s(   r,  c                   @   sH   e Zd ZdZdZddddddd	d
dddddddgZdd ZdS )NiconicoSeriesIEzniconico:serieszShttps?://(?:(?:www\.|sp\.)?nicovideo\.jp(?:/user/\d+)?|nico\.ms)/series/(?P<id>\d+)z4https://www.nicovideo.jp/user/44113208/series/110226Z110226u   ご立派ァ！のシリーズr   r    
   r-  z&https://www.nicovideo.jp/series/12312/Z12312u>   バトルスピリッツ　お勧めカード紹介(調整中)g   zhttps://nico.ms/series/203559Tr3   c                 C   s`   |  |}| ||}| jd|ddd}|r4t|}t| j|d dd}| jt|d||tdS )N)u   <title>「(.+)（全z:<div class="TwitterShareButton"\s+data-text="(.+)\s+https:r    Frk   )ZitemListElement.r-   Zie)	r   rL   rM   r   nextZ_yield_json_ldZplaylist_from_matchesr   r   )rR   r-   r  r  r    Z	json_datarV   rV   rW   r    s"    
     zNiconicoSeriesIE._real_extractN)r  r  r  r  r  r  r  rV   rV   rV   rW   r3    s&   r3  c                	   @   sh   e Zd ZdZdZdZdddddd	ddd
dddddddddddddddgZdd Zdd ZdS )NiconicoHistoryIEzniconico:historyz1NicoNico user history or likes. Requires cookies.zBhttps?://(?:www\.|sp\.)?nicovideo\.jp/my/(?P<id>history(?:/like)?)zPC page, with /videoz)https://www.nicovideo.jp/my/history/videoTr5   zPC page, without /videoz#https://www.nicovideo.jp/my/historyzmobile page, with /videoz(https://sp.nicovideo.jp/my/history/videozmobile page, without /videoz"https://sp.nicovideo.jp/my/historyzPC pagez(https://www.nicovideo.jp/my/history/likezMobile pagez'https://sp.nicovideo.jp/my/history/likec                 C   s6   |dkrdnd}| j d| |d| || jdd S )Nzhistory/likeZlikeszwatch/historyz'https://nvapi.nicovideo.jp/v1/users/me/r.  r/  rE   r1  )rR   r  r  r   pathrV   rV   rW   r    s       zNiconicoHistoryIE._call_apic              
   C   s   |  |}z| |dddi}W nF tk
rf } z(t|jtrT|jjdkrT| d  W 5 d }~X Y nX | j| 	||f| 
|S )Nr   r"  r   i  z,You have to be logged in to get your history)r   r  r   r   r   r   rm   r  r2  r*  r!  )rR   r-   r  r0  r  rV   rV   rW   r    s    

zNiconicoHistoryIE._real_extractN)	r  r  r  r  r  r  r  r  r  rV   rV   rV   rW   r:    s<   r:  c                   @   s"   e Zd ZdZdddZdd ZdS )	NicovideoSearchBaseIEsearchNDownloading page %(page)sc           
      c   s   |pi }d|kr|d gnt d}|D ]^}t||d< | j||||d|i d}td|}|D ]}	| d|	 d|	V  qb|s( qq(d S )NrT   r   r   r6   z2(?<=data-video-id=)["\']?(?P<videoid>.*?)(?=["\'])r]   ZNiconico)r   r   r   rL   rO   findall
url_result)
rR   r-   item_idr   r6   Zpagespage_numr  resultsr   rV   rV   rW   r*    s    zNicovideoSearchBaseIE._entriesc                 C   s    |  | d| j d| |S )Nz//www.nicovideo.jp/rZ   )r*  Z_proto_relative_url_SEARCH_TYPE)rR   r   rV   rV   rW   _search_results  s     z%NicovideoSearchBaseIE._search_results)Nr>  )r  r  r  rE  r*  rF  rV   rV   rV   rW   r<    s   
r<  c                   @   s   e Zd ZdZdZdZdS )NicovideoSearchIEzNico video searchznicovideo:searchZ
nicosearchN)r  r  r  r  r  _SEARCH_KEYrV   rV   rV   rW   rG  
  s   rG  c                   @   sL   e Zd Zej dZdZdZddddddd	dddd
dgZdd ZdS )NicovideoSearchURLIE_urlzNico video search URLsz8https?://(?:www\.)?nicovideo\.jp/search/(?P<id>[^?#&]+)?z"http://www.nicovideo.jp/search/sm9Zsm9r4  (   r-  zRhttps://www.nicovideo.jp/search/sm9?sort=h&order=d&end=2020-12-31&start=2020-01-01   )r-   r/   Zplaylist_countc                 C   s    |  |}| | ||||S r#  r   r2  r*  rR   r-   r   rV   rV   rW   r  $  s    
z"NicovideoSearchURLIE._real_extractN)	r  r  r  rG  r  r  r  r  r  rV   rV   rV   rW   rI    s"   rI  c                       sf   e Zd ZdZej dZdZddddddgZe	d	d
d
Z
dZdZdddZd fdd	Z  ZS )NicovideoSearchDateIEzNico video search, newest firstz:dateZnicosearchdateznicosearchdateall:ar   r4  iJ  r-  i  r       2   Nc                 c   s   |p| j |ptj   }}tt| j||||| jd| d| d}|| j	kr||kr||| d  }| 
||||E d H  | 
||||E d H  n4| | d| d|  | j||||ddE d H  d S )NzChecking number of videos from z to rB   r   z: Downloading results from z    Downloading page %(page)s)_START_DATEdtdatetimenowdatelenr   _get_entries_for_date
_MAX_PAGES_RESULTS_PER_PAGEr*  r   )rR   r-   rB  
start_dateend_dateZlast_page_lenZmidpointrV   rV   rW   r*  :  s*        
    zNicovideoSearchDateIE._entriesc                 #   sH   t |t |p|ddd}|r*t ||d< t j||||dE d H  d S )Nr   d)startendsortorderrT   r?  )r   superr*  )rR   r-   rB  r[  r\  rC  r6   r   	__class__rV   rW   rX  J  s    
z+NicovideoSearchDateIE._get_entries_for_date)NN)NNN)r  r  r  r  rG  r  rH  r  rS  rV  rR  rZ  rY  r*  rX  __classcell__rV   rV   rc  rW   rO  )  s   	
rO  c                   @   s8   e Zd ZdZdZdZdZdddddd	gZd
d ZdS )NicovideoTagURLIEzniconico:tagzNicoNico video tag URLsr   z5https?://(?:www\.)?nicovideo\.jp/tag/(?P<id>[^?#&]+)?u;   https://www.nicovideo.jp/tag/ドキュメンタリー淫夢u   ドキュメンタリー淫夢r4  i  r-  c                 C   s    |  |}| | ||||S r#  rM  rN  rV   rV   rW   r  e  s    
zNicovideoTagURLIE._real_extractN)	r  r  r  r  r  rE  r  r  r  rV   rV   rV   rW   rf  W  s   	rf  c                   @   sB   e Zd ZdZdddiddZdZdZd	d
dZdd Zdd Z	dS )NiconicoUserIEz=https?://(?:www\.)?nicovideo\.jp/user/(?P<id>\d+)/?(?:$|[#?])z$https://www.nicovideo.jp/user/419948r   Z419948e   r-  zehttps://nvapi.nicovideo.jp/v1/users/%s/videos?sortKey=registeredAt&sortOrder=desc&pageSize=%s&page=%sr  r7   r8   )r<   r=   c                 c   s   d}d }}||k r| j | j|| j|d f || jd|rBd| nd d}|sbt|d d}|d d	 D ]"}|d7 }| d
|d V  qn|d7 }qd S )Nr   r   zDownloading JSON metadata%sz page r~   )rF   r6   rE   Z
totalCountr   z!https://www.nicovideo.jp/watch/{}r   )ro   _API_URLr'  rp   r   r   rA  r   )rR   r  Ztotal_countr   rC  Zjson_parsedentryrV   rV   rW   r*  {  s     zNiconicoUserIE._entriesc                 C   s$   |  |}| j| ||t dS )Nr8  )r   r2  r*  r   r&  )rR   r-   r  rV   rV   rW   r    s    
zNiconicoUserIE._real_extractN)
r  r  r  r  Z_TESTri  r'  rp   r*  r  rV   rV   rV   rW   rg  j  s    rg  c                   @   sd   e Zd ZdZdZdZ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gZdZdd ZdS )NiconicoLiveIEzniconico:liveu   ニコニコ生放送zDhttps?://(?:sp\.)?live2?\.nicovideo\.jp/(?:watch|gate)/(?P<id>lv\d+)zJthis test case includes invisible characters for title, pasting them as-isz+https://live.nicovideo.jp/watch/lv339533123Zlv339533123uW   激辛ペヤング食べます‪( ;ᯅ; )‬（歌枠オーディション参加中）i  i  u[   初めましてもかって言います❕
のんびり自由に適当に暮らしてますu   もかu$   ゲストさんのコミュニティZ	co5776900z,https://com.nicovideo.jp/community/co5776900iPcT)r   r    r(   r)   r&   r"   r   r   channel_urlr%   is_liveZ
livestream)r6   r-   r/   r0   z,https://live2.nicovideo.jp/watch/lv339533123r3   z.https://sp.live.nicovideo.jp/watch/lv339533123z/https://sp.live2.nicovideo.jp/watch/lv339533123)highr   c              
   C   sR  |  |}| d| |\}}| t| d|d|}t|d}|sTtdddt|dt|d	pfd
i}tt	j
|jjd}t| ddd }|| jkrd}| jt|dd| id|dd}	| d |	tddd|dddddddd |	 }
|
sqt|
}t|ts&q|dd krT|d! d" }|d! d# }qq|dd$krx| |
 td%q|dd&kr| |
 t|d'p|
}t|q| d(drt|
d)kr|
d d) d* }
| d+|
  qt|d,p| jd-|d.dd/}t|d0pi }g }| D ]\}}t|tsV| ||d1t!|dd2 q"| D ]^\}}t!|dd2p~t!|dd2}|d3|d4 }}| | d5| d6| |d1| q^q"| j"||d7dd8}t#|t$|d9d  D ]"\}}|%|d:|	|||d; q||d<t|d=d>d?d@dAdBdCt&t|dDt't|dEd||dFS )GNz https://live.nicovideo.jp/watch/z1<script\s+id="embedded-data"\s*data-props="(.+?)"zembedded data)siteZreliveZwebSocketUrlz-The live hasn't started yet or already ended.Tr   Zfrontend_id)ro  Z
frontendId9zsp.latencyc                 S   s   | d S rz   rV   re   rV   rV   rW   rg     rh   z.NiconicoLiveIE._real_extract.<locals>.<lambda>rn  r@   zhttps://)rF   zConnecting to WebSocket server)rr   r6   z"[debug] Sending HLS server requestZstartWatchingr   zhls+fmp4F)r   r   rq  Z	chasePlayZ	webSocket)r   Zcommentable)streamroomZ	reconnect)typerE   rt  rr  rE   uriZavailableQualitiesZ
disconnectz$Disconnected at middle of extractionerror)bodycodeverboser  z...zServer said: )programr    )zog:titleztwitter:titlez
live titler7  )rz  r!   )r   r-   r   r   r   r   rf   r   )r   Zliver   Zniconico_live)r   r   wsrr   Zlive_latencyoriginr4  )rz  
statisticsZ
watchCount)rz  r}  ZcommentCount)rz  Zsupplierr   )socialGroupr   )r~  r   )r~  ZsocialGroupPageUrl)r(   r)   r"   r   r   rl  )rz  r&   )rz  ZopenTime)r&   r%   rm  r   r   )(r   r   r   r   rM   r   r   r   r   urllibparseurlparser-   hostnamer   r   _KNOWN_LATENCYrK   r   Zwrite_debugsendr   r   recvloadsr   r   r   	get_paramrW  r  r   appendr   r   zipreversedupdater
   r   )rR   r-   rr   r  ZurlhZembedded_dataZws_urlr  rq  r{  r  rE   Zm3u8_urlr   messager    Z
raw_thumbsr   r   valuekZimg_urlresr   r   r   r   qrV   rV   rW   r    s    

  
 
 






   

zNiconicoLiveIE._real_extractN)	r  r  r  r  r  r  r  r  r  rV   rV   rV   rW   rk    s>   rk  )0rT  rS  r   r   r   rO   r   urllib.parser  commonr   r   Z
networkingr   Znetworking.exceptionsr   utilsr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r,  r3  r:  r<  rG  rI  rO  rf  rg  rk  rV   rV   rV   rW   <module>   s4   T    (3&&0.%