a
    h9                     @   s  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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m Z  ddl!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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Z0G d d! d!e%Z1dS )"    N   )InfoExtractorSearchInfoExtractor   )	HTTPError)ExtractorErrorOnDemandPagedList
clean_htmldetermine_extextract_attributesfloat_or_noneint_or_noneparse_bitrateparse_iso8601parse_qsparse_resolution	qualitiesstr_or_nonetime_secondstruncate_stringunified_timestampupdate_url_queryurl_basenameurl_or_noneurlencode_postdataurljoin)find_elementrequiretraverse_objc                   @   sN   e Zd ZdZdZdZdgZdddZdZd	Z	e
d
d ZdddZdd ZdS )NiconicoBaseIEzhttps://nvapi.nicovideo.jphttps://www.nicovideo.jpFZJP60X-Frontend-IDX-Frontend-Versionzhttps://account.nicovideo.jpniconicoc                 C   s   t | ddS )Nr    Zuser_session)boolZ_get_cookiesget)self r*   N/mnt/pikpak/tmp/myenv/lib/python3.9/site-packages/yt_dlp/extractor/niconico.pyis_logged_in3   s    zNiconicoBaseIE.is_logged_inTc                 C   s   t d| |dd S )NzUnable to login: expected)r   )r)   messager.   r*   r*   r+   _raise_login_error7   s    z!NiconicoBaseIE._raise_login_errorc                 C   sx  | j r
d S | | j dd d | j| j dd ddd| j ddt||dd	}| j r`d S t|td
dhtddhthf }r| |pd nd|v rf| j	d|ddd}| j
t| j|d dddditd| did	\}}| j rd S dt|jv r*t|tddhthf}| |p$d n<d|v rft|tddhtddhthf}| |pbd | jdd d! d S )"Nz/loginzRequesting session cookiesz/login/redirectorz
Logging inzUnable to log inz!application/x-www-form-urlencoded)Content-TypeReferer)Zmail_telpassword)headersdataznotice errorclsZnotice__textzInvalid username or passwordZ	oneTimePwz&<form[^>]+action=(["\'])(?P<url>.+?)\1zpost urlurl)groupzPerforming MFAzUnable to complete MFAr1   Zotpz6 digit number shown on appz
error-codeZpageMainMsgzMFA session expiredZ	formErrordiv)tagzMFA challenge failedzUnexpected login errorFr-   )r,   _request_webpage_LOGIN_BASE_download_webpager   r   r   r	   r0   Z_search_regex_download_webpage_handler   Z_get_tfa_infor   r8   )r)   usernamer3   webpageerr_msgZpost_urlZmfaurlhr*   r*   r+   _perform_login:   s\    






zNiconicoBaseIE._perform_loginN)T)__name__
__module____qualname__	_API_BASE	_BASE_URLZ_GEO_BYPASS_GEO_COUNTRIES_HEADERSr=   Z_NETRC_MACHINEpropertyr,   r0   rD   r*   r*   r*   r+   r   '   s   

r   c                   @   s~  e Zd ZdZdZdZdddddd	d
dddd
ddiddidddddiddidZddddZdddddddedd d!d"ged#d$d%d&dded'd(d)id*d+d,dd-dd.d/ed0d,d1d2ged3d$d4d5d.d/ed'd(d)id*d6d7dd8dd9d:ed;d7d<d=ged>d$d?d@d9d:ed'd(d)id*dAdBddCddDdEedFdBdGdHged3d$dIdJdDdEed'd(d)id*dKdLddMddNdOedPdLdQdRgedSd$dTdUdNdOed'd(d)id*dVdWddXdYdZd[ed\dWd]dHged^d$d_d`dZd[ed'd(d)iddadbdcddddedfdgedhdcdid=ged#d$djdkdfdged'd(d)iddadldmddndYdodpedqdmdrdsged#d$dtdudodped'd(d)iddadvdwddxdYdydzed{dwd|dsged}d$d~ddydzed'd(d)iddag	Z	dd Z
dd Zdd ZdS )
NiconicoIEr&   u   ニコニコ動画zLhttps?://(?:(?:embed|sp|www)\.)?nicovideo\.jp/watch/(?P<id>(?:[a-z]{2})?\d+)z-Video unavailable, possibly removed by adminszChannel members onlyz%Video unavailable, channel was closedz/Video unavailable, community deleted or missingzPage unavailable, check the URLz!Sensitive content, login requiredz!Video unavailable, set to privatezNo permissionz'PPV video, payment information requiredzPremium members only)
ZADMINISTRATOR_DELETE_VIDEOCHANNEL_MEMBER_ONLYZDELETED_CHANNEL_VIDEOZDELETED_COMMUNITY_VIDEODEFAULTHARMFUL_VIDEOHIDDEN_VIDEONOT_ALLOWED	PPV_VIDEOPREMIUM_ONLYrO   z/Video unavailable, may not exist or was deletedzMaintenance is in progressz Removed by rights-holder request)rO   ZRIGHT_HOLDER_DELETE_VIDEOz"Invalid session, re-login requiredzFailed to fetch content)	FORBIDDENZINVALID_PARAMETERZMAINTENANCE	NOT_FOUNDUNAUTHORIZEDUNKNOWN)
needs_authpremium_onlysubscriber_onlyz)https://www.nicovideo.jp/watch/1173108780sm9mp4uA   新・豪血寺一族 -煩悩解放 - レッツゴー！陰陽師publicu   中の4z$md5:b7f6d3e6c29552cc19fdea6a4b7dc194Z
1173108780i@  u	   未設定z
mincount:5z8re:https?://img\.cdn\.nimg\.jp/s/nicovideo/thumbnails/.+i,8EZ20070305)idexttitleavailabilitychannel
channel_idcomment_countdescription
display_iddurationgenres
like_counttags	thumbnail	timestampupload_dateuploaderuploader_id
view_countskip_downloadZm3u8r8   	info_dictparamsz(https://www.nicovideo.jp/watch/sm8628149Z	sm8628149u,   【東方】Bad Apple!!　ＰＶ【影絵】u	   あにらZ10731211z$md5:1999669158cb77a45bab123c4fafe1d7   u	   ゲームz
mincount:3iJZ20091026z)https://www.nicovideo.jp/watch/nm14296458Z
nm14296458u;   【鏡音リン】Dance on media【オリジナル】take2!u   りょうたZ18822557z$md5:9368f2b1f4178de64f2602c2f3d6cbf5   u   音楽・サウンドz
mincount:1i|wMZ20110429z(https://www.nicovideo.jp/watch/nl1872567Z	nl1872567u_   【12/25放送分】『生対談!!ひろゆきと戀塚のニコニコを作った人 』前半ZnicoliveZ394z$md5:79fc3a54cfdc93ecc2b883285149e548iJ  u   エンターテイメントiqGZ20071226z)https://www.nicovideo.jp/watch/so38016254Z
so38016254u1   「のんのんびより のんすとっぷ」 PVu(   のんのんびより のんすとっぷZ	ch2647028z$md5:6e2ff55b33e3645d59ef010869cde6a2r   u	   アニメz
mincount:4i_Z20201228z)https://www.nicovideo.jp/watch/so37602536Z
so37602536uN   田中有紀とゆきだるまと！ 限定放送アーカイブ（第12回）r[   u   あみあみ16Z91072761z$md5:2ee357ec4e76d7804fb59af77107ab67i  zcount:4is_Z20200929)r8   ru   rv   skipz)https://www.nicovideo.jp/watch/so41370536Z
so41370536u+   ZUN【出演者別】超パーティー2022rZ   u$   ニコニコ超会議チャンネルZ	ch2607134z$md5:5692db5ac40d3a374fc5ec182d0249c3?   i0qcZ20221114z)https://www.nicovideo.jp/watch/so37574174Z
so37574174u2   ひぐらしのなく頃に 廿回し編　第1回uB   「ひぐらしのなく頃に」オフィシャルチャンネルZ	ch2646036z$md5:5296196d51d9c0b7272b73f9a99c236ai  u	   ラジオim_Z20200925z)https://www.nicovideo.jp/watch/so44060088Z
so44060088ud   松田的超英雄電波。《仮面ライダーガッチャード 放送終了記念特別番組》u   あみあみチャンネルZ	ch2638921z$md5:9dec5bb9a172b6d20a255ecb64fbd03eiY  z
mincount:7i0fZ20240903zEChannel members only; specified continuous membership period requiredc                    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| j d
| d|dd|| jd| jd|itdt	t
dd |D dd |D i dd d }| ||d}	g }
t |	dd D ]Z |
i  t | fdddtddhfdthfdthfdthfd tfd!d"i qtd#d |	D d$d d%}| | t |d&dtddhtthfpd'}|D ]Vtd( d)d' d*< t |fd+ddthtfpd,d-< d.  |8  < q|
| |
S )/Nc                 S   s   |d o|d S )NZisAvailabler`   r*   _vr*   r*   r+   <lambda>o      z-NiconicoIE._extract_formats.<locals>.<lambda>ZmediaZdomandvideosaudiosZaccessRightKeyclientZwatchTrackIdz
/v1/watch/z/access-rights/hlszapplication/json;charset=utf-8zapplication/json)Acceptr1   zX-Access-Right-KeyzX-Request-WithactionTrackIdoutputsc                 s   s   | ]}|d  V  qdS r`   Nr*   ).0r~   r*   r*   r+   	<genexpr>  r   z.NiconicoIE._extract_formats.<locals>.<genexpr>c                 s   s   | ]}|d  V  qdS r   r*   )r   ar*   r*   r+   r     r   )r4   queryr5   r5   Z
contentUrlr]   c                 S   s   |d dkS )Nvcodecnoner*   r|   r*   r*   r+   r     r   c                    s    d  |d S )N	format_idr`   
startswithr|   )a_fmtr*   r+   r     r   ZbitRate  )ZscaleZsamplingRater`   ZqualityLevel)abrZasrr   qualityacodecZaacc                 s   s   | ]}|d  dkr|V  qdS )r   r   Nr*   )r   fmtr*   r*   r+   r     r   c                 S   s   | d S )Ntbrr*   )fr*   r*   r+   r     r   )key.r   r8   .r   c                    s   |d  d kS )Nr`   r   r*   r|   )v_fmtr*   r+   r     r   r   r   )r   strall_download_jsonrH   rI   rK   jsondumpslist	itertoolsproductencode_extract_m3u8_formatsappendr   r   anysortedZ_remove_duplicate_formatsminr   
rpartitionextend)r)   api_datavideo_idZ
fmt_filterr   r   Z
access_keyZtrack_idm3u8_urlZraw_fmtsformatsZv_fmtsZmin_abrr*   )r   r   r+   _extract_formatsn  sr    $

$
zNiconicoIE._extract_formatsc                    s  |  |}| jrdnd}| j| j d| d| |ddi | j|  ddtt d	  id
dgd}|d }t|dt	hf}t|ddt
hf}|dkrt|ddt	jhf}t|dthf}	t| j||	dft	htf}
|	dv r| j| jd nX|	dkrt|ddthfdu rd}
n0|	dkr6|r6d| }
n|	dv rJ| |
 |
r\t|
dd |rx|d!krxtd"dd td#| | jf i t|d$d%d&thtfd'thfd(thfd)fpd*}| ||}| j|}
|s|
r| j|
dd+ tg d, |||t|d-d.t	htttft|| ||t|d/d0d1d2t	htttf fd3d4t|d%d5thfi d6 D d7t|d8td9t	htfd:thfd9t	htfd:thfd;ft|d%d:thfd<t	hfd=thtfd>t hfd?thfd@ft|d%dAdBt hfdCt hfdDt hfdEfS )FNZv3Zv3_guestz/api/watch//zDownloading API JSONzUnable to fetch datar   ZAAAAAAAAAA_r       )r4   r   expected_statusr5   ZpublishScheduledAtmetastatus   Z	errorCodeZ
reasonCoderO   )ZDOMESTIC_VIDEOZHIGH_RISK_COUNTRY_VIDEO)Z	countriesrP   ZviewerallowSensitiveContentsFz3Sensitive content, adjust display settings to watchrQ   z,This content is scheduled to be released at )rN   rP   rQ   rS   rT   Tr-   i  zService temporarily unavailablezAPI returned error status paymentvideo)ZisContinuationBenefitZisPpvZisAdmissionZ	isPremium)rY   Zneeds_subscriptionZneeds_premiumr^   )Zmetadata_available)r8   Z	middleUrllargeUrlZplayerZogpZgenrelabelr;   items.namec                    s.   g | ]&\}}d | ||dt |ddqS )jpg)ra   r`   Z
preferencer8   Tlenient)r   )r   r   r8   Zthumb_prefsr*   r+   
<listcomp>  s   
z,NiconicoIE._real_extract.<locals>.<listcomp>rm   default)rc   rh   r   rj   Zrelease_timestampZ	subtitlesrl   
thumbnails)rd   owner)r   nicknamer`   )rd   re   rp   rq   rb   rg   ri   ZregisteredAt)r`   rb   rg   ri   rn   countcommentlikeview)rf   rk   rr   )!	_match_idr,   r   rI   rK   Zgeo_verification_headersroundr   r   r   intupperr   
_ERROR_MAPr   Zraise_geo_restrictedrJ   r'   raise_login_requiredr   Z_availabilityr   _STATUS_MAPr(   r   filterr   r   Zextract_subtitlesdictr   r	   r   )r)   r8   r   pathZapi_respr   Zscheduled_timer   Zerr_codeZreason_coderB   rc   r   r*   r   r+   _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|ddd| j| j dd	d
| jti |d|dd ddd}ddt|dgiS )Nr   Z	nvCommentserverz/v1/threadszDownloading commentszFailed to download commentsztext/plain;charset=UTF-8r   others)r1   Originr2   zX-Client-Os-Typerv   	threadKey)Zadditionalsrv   r   F)r4   r5   fatal)r5   threads.comments.r   r   )ra   r5   )	r   r   r(   r   rI   rK   r   r   r   )r)   r   r   Zcomments_infoZdanmakur*   r*   r+   _get_subtitles  s6    


zNiconicoIE._get_subtitlesN)rE   rF   rG   IE_NAMEIE_DESC
_VALID_URLr   r   r   _TESTSr   r   r   r*   r*   r*   r+   rM   g   s    `4XrM   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   r!   r"   zen-us)r$   r%   zX-Niconico-Languagec                 C   s   t dd S )Nz!Must be implemented in subclasses)NotImplementedErrorr)   list_idresourcer   r*   r*   r+   	_call_api  s    z NiconicoPlaylistBaseIE._call_apic                 C   s(   t | ddthtft | ddthfdS )Nr   )r   )userr   r`   )rp   rq   )r   r   r   )itemr*   r*   r+   _parse_owner"  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 )pagepageSize)r   .)r   Nr`   r   c                    s   t  | S N)r   r(   )xr   r*   r+   r   6  r   z4NiconicoPlaylistBaseIE._fetch_page.<locals>.<lambda>r8   rb   https://www.nicovideo.jp/watch/ZshortDescriptionri   r   r   )rm   )ZnHdUrlr   Z
listingUrlr8   )
_typer`   rb   r8   rg   ri   rr   rf   rm   ie_key)r   
_PAGE_SIZEr   r(   r   rM   r   r   )r)   r   r   respr   r   Z	get_countr*   r   r+   _fetch_page)  s0    
z"NiconicoPlaylistBaseIE._fetch_pagec                 C   s   t t| j|| jS r   )r   	functoolspartialr   r   )r)   r   r*   r*   r+   _entriesE  s    zNiconicoPlaylistBaseIE._entriesN)
rE   rF   rG   r   _API_HEADERSr   staticmethodr   r   r   r*   r*   r*   r+   r     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`   rb   rg   rp   rq   i#  r8   ru   Zplaylist_mincountz4https://www.nicovideo.jp/user/805442/mylist/27411728Tr8   only_matchingz-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   r4   r5   mylistr   r   r   r*   r*   r+   r   _  s    

zNiconicoPlaylistIE._call_apic                 C   sL   |  |}| |dddi}| j| |||d|dfi | |S )Nr   r   r   r   rg   r   r   playlist_resultr   r(   r   )r)   r8   r   r  r*   r*   r+   r   e  s    

z NiconicoPlaylistIE._real_extractNrE   rF   rG   r   r   r   r   r   r*   r*   r*   r+   r   I  s(   r   c                   @   s\   e 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gZdd 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   ご立派ァ！のシリーズur   楽しそうな外人の吹き替えをさせたら終身名誉ホモガキの右に出る人はいませんね…u   アルファるふぁZ44113208r   
   r  z&https://www.nicovideo.jp/series/12312/Z12312u>   バトルスピリッツ　お勧めカード紹介(調整中) u   野鳥Z2275360g   zhttps://nico.ms/series/203559Tr  c                 C   s&   | j d| |d| || jdd S )Nz%https://nvapi.nicovideo.jp/v2/series/r  r  r5   r  r   r*   r*   r+   r     s    

zNiconicoSeriesIE._call_apic                 C   sP   |  |}| |dddid }| j| |||d|dfi | |S )Nr   r   r   Zdetailrb   rg   r  )r)   r8   r   Zseriesr*   r*   r+   r     s    

zNiconicoSeriesIE._real_extractNr
  r*   r*   r*   r+   r  o  s4   r  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/videoT)noter8   r  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  r5   r  )r)   r   r   r   r   r*   r*   r+   r     s    
zNiconicoHistoryIE._call_apic              
   C   s   |  |}z| |dddi}W nH tyh } z0t|jtrR|jjdkrR| d  W Y d }~n
d }~0 0 | j| 	||fi | 
|S )Nr   r   r   i  z,You have to be logged in to get your history)r   r   r   
isinstancecauser   r   r   r	  r   r   )r)   r8   r   r  er*   r*   r+   r     s    

zNiconicoHistoryIE._real_extractN)	rE   rF   rG   r   r   r   r   r   r   r*   r*   r*   r+   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|v r|d gnt d}|D ]^}t||d< | j||||d|i d}td|}|D ]}	| d|	 d|	V  qb|s( qq(d S )Nr   r   r   r  z2(?<=data-video-id=)["\']?(?P<videoid>.*?)(?=["\'])r   ZNiconico)r   r   r   r>   refindall
url_result)
r)   r8   item_idr   r  Zpagespage_numrA   resultsr   r*   r*   r+   r     s    zNicovideoSearchBaseIE._entriesc                 C   s    |  | d| j d| |S )Nz//www.nicovideo.jp/r   )r   Z_proto_relative_url_SEARCH_TYPE)r)   r   r*   r*   r+   _search_results  s    z%NicovideoSearchBaseIE._search_results)Nr  )rE   rF   rG   r  r   r  r*   r*   r*   r+   r    s   
r  c                   @   s   e Zd ZdZdZdZdS )NicovideoSearchIEzNico video searchznicovideo:searchZ
nicosearchN)rE   rF   rG   r   r   _SEARCH_KEYr*   r*   r*   r+   r     s   r   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/sm9r\   r`   rb   (   r  zRhttps://www.nicovideo.jp/search/sm9?sort=h&order=d&end=2020-12-31&start=2020-01-01   )r8   ru   Zplaylist_countc                 C   s    |  |}| | ||||S r   r   r	  r   r)   r8   r   r*   r*   r+   r     s    
z"NicovideoSearchURLIE._real_extractN)	rE   rF   rG   r   r   r   r   r   r   r*   r*   r*   r+   r"    s"   r"  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   r$  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 )r  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   Z	to_screen)r)   r8   r  
start_dateend_dateZlast_page_lenZmidpointr*   r*   r+   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orderr   r  )r   superr   )r)   r8   r  r5  r6  r  r  r   	__class__r*   r+   r2  !  s    
z+NicovideoSearchDateIE._get_entries_for_date)NN)NNN)rE   rF   rG   r   r   r   r!  r   r-  r0  r,  r4  r3  r   r2  __classcell__r*   r*   r=  r+   r)     s   	
r)  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   ドキュメンタリー淫夢r$  r   r  c                 C   s    |  |}| | ||||S r   r'  r(  r*   r*   r+   r   <  s    
zNicovideoTagURLIE._real_extractN)	rE   rF   rG   r   r   r  r   r   r   r*   r*   r*   r+   r@  .  s   	r@  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 )NiconicoUserIEzHhttps?://(?:www\.)?nicovideo\.jp/user/(?P<id>\d+)(?:/video)?/?(?:$|[#?])z$https://www.nicovideo.jp/user/419948r`   Z419948e   r  zehttps://nvapi.nicovideo.jp/v2/users/%s/videos?sortKey=registeredAt&sortOrder=desc&pageSize=%s&page=%sr   r!   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 }| jd
|d d  tdV  qn|d7 }qd S )Nr   r   zDownloading JSON metadata%sz page r  )r4   r  r5   Z
totalCountr   r   Z	essentialr`   )Zie)r   _API_URLr   r   r   r(   r  rM   )r)   r   Ztotal_countr   r  Zjson_parsedentryr*   r*   r+   r   R  s     
zNiconicoUserIE._entriesc                 C   s   |  |}| | ||S r   r'  )r)   r8   r   r*   r*   r+   r   b  s    
zNiconicoUserIE._real_extractN)
rE   rF   rG   r   Z_TESTrC  r   r   r   r   r*   r*   r*   r+   rA  A  s   rA  c                   @   s~   e Zd ZdZdZdZdddeddd	ed
dddddedddiddddeddddeddddddedddidgZdd Z	d S )!NiconicoLiveIEzniconico:liveu   ニコニコ生放送zDhttps?://(?:sp\.)?live2?\.nicovideo\.jp/(?:watch|gate)/(?P<id>lv\d+)z+https://live.nicovideo.jp/watch/lv329299587Zlv329299587r]   u'   ニコニコエンタメチャンネルZ	ch2640322z)https://ch.nicovideo.jp/channel/ch2640322z$md5:281edd7f00309e99ec46a87fb16d7033is_livezre:https?://.+iHd_Z20201224u   株式会社ドワンゴ)r`   ra   rb   rd   re   channel_urlrf   rg   live_statusrm   rn   ro   rp   rr   rs   Trt   z+https://live.nicovideo.jp/watch/lv331050399Zlv331050399   u   みんなのおもちゃ REBOOTZ	ch2642088z)https://ch.nicovideo.jp/channel/ch2642088z$md5:8d0bb5beaca73b911725478a1e7c7b91ia`Z20210329)r`   ra   rb   	age_limitrd   re   rG  rf   rg   rH  rm   rn   ro   rp   rr   c           "      C   s  |  |}| j||dd\}}t|tddhthf }rFt|ddd|jv rTdnd }|r| jsl| d	 | 	d
d d}t|tdddht
hdtjhdthfr| ddd | 	||}ntdddt|tddddht
hdtjhf}t|ddthfdd}	t|dddthtdhf}
t|
d|	i}
| j|
|dd d!id"}| d# |td$dd%d&d'd$d(d)d*d+d,d-d. | }|sq~t|}t|tsq~|d/d0kr|d1 d2 }|d1 d3 }|d1 d4 }qjn|d/d5kr| | td6n^|d/d7krB| | t|d8d9thf|d}t|n$| d:d$r~| d;t|d<  q~t|d=p| jd>|d?d$d@}t|dAdBthfpi }g }| D ]\}}t|ts|||dCt |ddD q| D ]x\}}t |ddDpt |ddD}|dE|dF }}|| dG| dH| |tt!|dIdJt"dKdLhfdM| qq|D ]:}| j|dN |dO |dP t#|dQ|dR |dS dT qjdUdV |dWd  D }dXdYdZ}| j$||d[dd\}|D ]p} d]| d^< | d_d`krt%|| da | da< n>| dbd`krt&| dc ' }!| (|!dd||!| da de q|||t|dAd0dft)hfpldg||
dhdit|djdkdldmdndodptt|dqt*t|drd||dsS )tNr   )r   r/   r6   Tr-   Zage_authrI  z2Login is required to access age-restricted contentzhttps://www.nicovideo.jp/myzChecking age verificationzjs-initial-userpage-data)r`   htmlzdata-environmentr   z.nicovideo.jp1z)Sensitive content setting must be enabledscriptzembedded-data)r;   r`   rK  z
data-propssiteZ
frontendId9r   ZreliveZwebSocketUrlzwebsocket URLfrontend_idzConnecting to WebSocket serverr   zhttps://live.nicovideo.jp)r4   zSending HLS server requestFZ	webSocket)ZcommentableprotocolZsingle_cookiehighZhlsr   )ZaccessRightMethodZ	chasePlayZlatencyrQ  r   )Z	reconnectroomstreamZstartWatching)r5   typerU  rT  r5   uriZavailableQualitiescookiesZ
disconnectz$Disconnected at middle of extractionerrorbodycodeverbosezServer response: r   )programrb   )zog:titleztwitter:titlez
live title)r   r\  rm   )r`   r8   r   widthheightr}   r   imager   r   )Zdefault_ext)r`   r8   ra   domainr   valueexpiresr   secure)expire_timer   rc  c                 s   s   | ]}| d s|V  qdS )Zaudio_Nr   )r   qr*   r*   r+   r     r   z/NiconicoLiveIE._real_extract.<locals>.<genexpr>r   Z	audio_lowZ
audio_high)`      r]   )ra   ZliveZniconico_liverQ  r   r   r   r   r8   z	mp4a.40.2)r   r   r   Z
maxQualitynormal)Zmax_qualitywsws_url)r`   rb   rJ  Zdownloader_options)r\  
statisticsZ
watchCount)r\  rk  ZcommentCount)r\  Zsupplierr   )socialGroupr   )rl  r`   )rl  ZsocialGroupPageUrl)rr   rf   rp   rd   re   rG  )r\  rg   )r\  ZopenTime)rg   rn   rF  r   r   )+r   r?   r   r   r	   r   r8   r,   r   r>   r   r   loadsr'   Z_set_cookier   r   r   r   r<   Zwrite_debugsendr   recvr  r   r(   	get_paramr   Z_html_search_metar   r   r   r   r
   r   r   nextr   lowerupdater   r   )"r)   r8   r   rA   rC   rB   rJ  ZmyZembedded_datarP  rj  ri  ro  r5   r   r   rW  r/   rb   Z
raw_thumbsr   r   ra  kZimg_urlresr]  r^  cookieZq_iterZa_mapr   r   r   r*   r*   r+   r     s   











	zNiconicoLiveIE._real_extractN)
rE   rF   rG   r   r   r   r   r   r   r   r*   r*   r*   r+   rE  g  sT   )rE  )2r.  r-  r   r   r   r  commonr   r   Znetworking.exceptionsr   utilsr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zutils.traversalr   r   r   r   rM   r   r   r  r  r  r   r"  r)  r@  rA  rE  r*   r*   r*   r+   <module>   s0   \@   23&.0.&