U
    g                     @   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eddeedgg dddiddddddd	dddddeedgddd gd!ddidd"d#d$d%d&d	d'ed(ed)	d*d+d,d-dd.d/d	d0d1d2d3d4	d5d+d6d7dd8d9d	d:d;d<d=d>eed?gg d@ddiddAdBddCdDdEdFdGdHd	dIeedJgg dKddiddLdMddNdOdPdQd	dReedSgg dTddiddUdVdWdXdYdVdZg	Zd[Z	dZ
d\d]d^d_d`daZdbdc Zddde Zdfdg Zdhdi Zdjdk Zdldm Zdndo ZdpS )q
NiconicoIEZniconicou   ニコニコ動画ZJPFz(http://www.nicovideo.jp/watch/sm22312215Z
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tagsZskip_downloadm3u8)url	info_dictparamsz(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+   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	sm1151009uZ   マスターシステム本体内蔵のスペハリのメインテーマ（ＰＳＧ版）z$md5:f95a3d259172667b293530cc2e41ebda   iFZ20070926Zdenden2Z1392194u	   ゲーム)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+   z(http://www.nicovideo.jp/watch/sm18238488Z
sm18238488u0   【実写版】ミュータントタートルズz$md5:15df8988e47a86f9e978af2064bf6d8eiHOZ20120701i  u   エンターテイメント)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-q5ljy6pj/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   /expected_protocol	_api_datazdata-api-data="([^"]+)"https://www.nicovideo.jp/watch/zAPI dataz{}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   rc   rV   rV   rW   re      rf   c                     sN   t  d} | rJtdd| i}j|ddjd}t |ddkrJd	 d S )
N)r_   r`   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   rc   rV   rV   rW   re      rf   httpZhttp_output_download_parametersrg   r   ZisSslZisWellKnownPort)use_ssluse_well_known_portZhlsr,   segment_durationc                 S   s   t | d S Nr   )intrc   rV   rV   rW   re     rf   ip  token)r_   r`   
encryptionZhls_parameters )rw   Ztransfer_presetru   rv   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_idrb   Z	player_idZplayerIdc                    s   | d  d d  S )NZ	authTypes	protocolsr   rV   rc   )session_api_datarV   rW   re   -  rf   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_idsra   Z	heartbeatZlifetimeZheartbeatLifetimepriorityZhttp_parameters
parameters)namer   ZrecipeIdZ#session_operation_auth_by_signature	signature)r   rz   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   intervalrq   )splitget_parse_jsonrN   rL   r   _configuration_argr   r   rm   formatr~   dumpsencoder   )rR   r.   Zvideo_src_idZaudio_src_iddmc_protocolZsession_api_endpointrq   Zyesnor   Zprotocol_parametersrw   Zparsed_tokenr{   Zsession_responseZheartbeat_info_dictrV   )ro   rR   r   rp   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>j  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   rp   audio_qualityvideo_qualityr   r   Zvid_qual_labelrV   rV   rW   _extract_format_for_qualityd  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)r_   r`   ra   audios.videosrb   r   )r   dictstrall	itertoolsproductr   )rR   ro   rp   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 }| 
||d}	t |	dd D ]N  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$i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   re     rf   z/NiconicoIE._yield_dms_formats.<locals>.<lambda>r_   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
contentUrlr   c                 S   s   |d dkS )Nr   nonerV   r   rV   rV   rW   re     rf   c                    s    d  |d S )Nr   r   )
startswithr   Z	audio_fmtrV   rW   re     rf   r   ZbitRater   r   r   )r   r   r   F)get_allr   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   re     rf   )key.r^   r   zvideo-z.0fr   )r   r   r   rm   r~   r   listr   r   r   _extract_m3u8_formatsr   r   r   r   sortedZ_remove_duplicate_formatsmin)rR   ro   rp   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  |  |}z`| d| |\}}|dr6|  |j}t| | d|pJd|ddthf  sht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pTddi}|  ||  |}|st| 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 }
|rrtd(|}ttd d)d* |D }
|
sr| jd+|d d}|rrd,d- | d.D }
|
st d/}
t!d0d1d2d3d4gdd5 fd6d7
}| |d8p| j"|d d||fd9d-|d:pi # D t|d;t d<d=d>t$t d?d@dAt%|dBp*t%| jdC|dDd dt d=d>t d@dAt&|dEdF|
t dGdH|dEdIt'dJt(| jdK|dLd dp|dMt)|pd| | *| dNS )ONr]   sozserver-responser|   rE   responsezServer response data not foundz&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   zutf-8replacezZ(?s)<section\s+class="(?:(?:ErrorMessage|WatchExceptionPage-message)\s*)+">(.+?)</section>zerror reasonr^   T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   rd   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)ro   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   r   _html_search_metar   r   rm   roundtime
isinstancecauser   r   readdecoderN   r
   Z_availabilityboolr   r   	to_screenZraise_geo_restricted_GEO_COUNTRIESraise_login_requiredrO   finditerr   filterr   r   Z_og_search_titler   r   r   r   ry   r   r   Zextract_subtitles)rR   r-   rp   webpagehandlee	error_msgr   r   fail_msgr+   Zog_video_tagskwdsr   rV   )ro   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/threadsr/   	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   ri   rF   r6   rD   )rE   threads.comments.r  r~   )r   rE   )r   r   r   rm   r~   r   r   )rR   rp   ro   Zcomments_infoZdanmakurV   rV   rW   _get_subtitles&  s:    
  
 zNiconicoIE._get_subtitlesN)__name__
__module____qualname__IE_NAMEIE_DESCr   Z_GEO_BYPASSry   _TESTS
_VALID_URLZ_NETRC_MACHINErn   rX   r   r   r   r   r	  r  rV   rV   rV   rW   r   #   s     
( #,gr   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_apiM  s    z NiconicoPlaylistBaseIE._call_apic                 C   s   t | dt | ddS )N)r   r   r   )r"   r#   r   )itemrV   rV   rW   _parse_ownerP  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   rc   r   rV   rW   re   d  rf   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   rp   Z	get_countrV   r!  rW   _fetch_pageW  s0    
z"NiconicoPlaylistBaseIE._fetch_pagec                 C   s   t t| j|| jS r   )r	   r   r   r&  r$  )rR   r  rV   rV   rW   _entriess  s    zNiconicoPlaylistBaseIE._entriesN)
r  r  r  r$  rn   r  staticmethodr  r&  r'  rV   rV   rV   rW   r  D  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rm   rn   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  r-  rV   rV   rW   r	    s    
   z NiconicoPlaylistIE._real_extractN)r  r  r  r  r  r  r  r	  rV   rV   rV   rW   r)  w  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ri   )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   r0    s&   r0  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   r.  )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   rk   r   r/  r'  r  )rR   r-   r  r-  r  rV   rV   rW   r	    s    

zNiconicoHistoryIE._real_extractN)	r  r  r  r  r  r  r  r  r	  rV   rV   rV   rW   r7    s<   r7  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  rB  r'  rC  rV   rV   rV   rW   r9    s   
r9  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   rD    s   rD  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sm9r1  (   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   r/  r'  rR   r-   r   rV   rV   rW   r	  !  s    
z"NicovideoSearchURLIE._real_extractN)	r  r  r  rD  r  r  r  r  r	  rV   rV   rV   rW   rF    s"   rF  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   r1  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-   r?  
start_dateend_dateZlast_page_lenZmidpointrV   rV   rW   r'  7  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-   r?  rX  rY  r@  r6   r   	__class__rV   rW   rU  G  s    
z+NicovideoSearchDateIE._get_entries_for_date)NN)NNN)r  r  r  r  rD  r  rE  r  rP  rS  rO  rW  rV  r'  rU  __classcell__rV   rV   r`  rW   rL  &  s   	
rL  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   ドキュメンタリー淫夢r1  i  r*  c                 C   s    |  |}| | ||||S r   rJ  rK  rV   rV   rW   r	  b  s    
zNicovideoTagURLIE._real_extractN)	r  r  r  r  r  rB  r  r  r	  rV   rV   rV   rW   rc  T  s   	rc  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   )rm   _API_URLr$  rn   r   r   r>  r   )rR   r  Ztotal_countr   r@  Zjson_parsedentryrV   rV   rW   r'  x  s     zNiconicoUserIE._entriesc                 C   s$   |  |}| j| ||t dS )Nr5  )r   r/  r'  r   r#  )rR   r-   r  rV   rV   rW   r	    s    
zNiconicoUserIE._real_extractN)
r  r  r  r  Z_TESTrf  r$  rn   r'  r	  rV   rV   rV   rW   rd  g  s    rd  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)rl  Z
frontendId9zsp.latencyc                 S   s   | d S rx   rV   rc   rV   rV   rW   re     rf   z.NiconicoLiveIE._real_extract.<locals>.<lambda>rk  r@   zhttps://)rF   zConnecting to WebSocket server)rp   r6   z"[debug] Sending HLS server requestZstartWatchingr   zhls+fmp4F)r   r   rn  Z	chasePlayZ	webSocket)r   Zcommentable)streamroomZ	reconnect)typerE   rq  ro  rE   uriZavailableQualitiesZ
disconnectz$Disconnected at middle of extractionerror)bodycodeverboser  z...zServer said: )programr    )zog:titleztwitter:titlez
live titler4  )rw  r!   )r   r-   r   r   r   r   rd   r   )r   Zliver   Zniconico_live)r   r   wsrp   Zlive_latencyoriginr1  )rw  
statisticsZ
watchCount)rw  rz  ZcommentCount)rw  Zsupplierr   )socialGroupr   )r{  r   )r{  ZsocialGroupPageUrl)r(   r)   r"   r   r   ri  )rw  r&   )rw  ZopenTime)r&   r%   rj  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_paramrT  r   r   appendr   r   zipreversedupdater
   r   )rR   r-   rp   r  ZurlhZembedded_dataZws_urlr  rn  rx  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   rh    s>   rh  )0rQ  rP  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)  r0  r7  r9  rD  rF  rL  rc  rd  rh  rV   rV   rV   rW   <module>   s4   T    %3&&0.%