U
    $PfO                     @   s   d dl m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	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 G dd	 d	eZG d
d deZdS )    )unicode_literalsN   )InfoExtractor   )compat_parse_qscompat_urllib_parse_urlparse)determine_extdict_getExtractorErrorfloat_or_noneInAdvancePagedListint_or_noneparse_durationparse_iso8601remove_starttry_getunified_timestampurlencode_postdata
xpath_textc                   @   s:  e Zd ZdZdZddddddd	d
deddee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d#ed$	ddd%d&dd'd(dd)d*d+d,d-	d.dd/d0d1dd2d3dd4d5d6d7d8eed9ddd:d;dd<d=d>d?d@dAddBeedCdddDdEdFddGdHdIdJdKdKddLeedCdddMdNdOgZdPZdZdQdR Z	dSdT Z
dUdV ZdWdX ZdKS )Y
NiconicoIEZniconicou   ニコニコ動画z(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!   )idexttitle	thumbnailuploaderuploader_idupload_date	timestampdescriptionduration
view_countcomment_countzRequires an account)urlmd5	info_dictskipz(http://www.nicovideo.jp/watch/nm14296458Z
nm14296458Zswfu;   【鏡音リン】Dance on media【オリジナル】take2!z$md5:689f066d74610b3b22e0f1739add0f58u   りょうたZ18822557Z20110429i|wM   )
r   r   r   r    r   r   r   r   r   r!   )r$   r&   r'   z%http://www.nicovideo.jp/watch/sm10000Zsm10000Zunknown_videodeleteduM   ドラえもんエターナル第3話「決戦第3新東京市」＜前編＞Z20071224i0  )	r   r   r    r   r   r   r   r!   r"   z(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 8fa81c364eb619d4085354eab075598aZ	sm1151009uZ   マスターシステム本体内蔵のスペハリのメインテーマ（ＰＳＧ版）z$md5:6ee077e0581ff5019773e2e714cdd0b7   i;5FZ20070927Zdenden2Z1392194)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:e52974af9a96e739196b2c1ca72b5febiQYZ20170626u	   ゲストZ40826363   )r   r   r   r    r   r   r   r   r   r!   r"   r#   z(http://www.nicovideo.jp/watch/sm18238488Z d265680a1f92bdcbbd2a507fc9e78a9eZ
sm18238488u0   【実写版】ミュータントタートルズz$md5:15df8988e47a86f9e978af2064bf6d8ei{OZ20120701Ni  z<http://sp.nicovideo.jp/watch/sm28964488?ss_pos=1&cp_in=wt_tgTr$   Zonly_matchingzPhttps?://(?:www\.|secure\.|sp\.)?nicovideo\.jp/watch/(?P<id>(?:[a-z]{2})?[0-9]+)c                 C   s   |    d S N)_login)self r0   A/tmp/pip-unpacked-wheel-7zdooeg3/youtube_dl/extractor/niconico.py_real_initialize   s    zNiconicoIE._real_initializec                 C   s   |   \}}|sdS d}||d}| jdd ddt|d}|dkrHd}n,t| }t|jdd gd	 d
krtd}|s| j	d |S )NT)Zmail_telpasswordz)https://account.nicovideo.jp/api/v1/loginz
Logging inzUnable to log in)noteZerrnotedataFmessager   Z
cant_loginz*unable to log in: bad username or password)
Z_get_login_infoZ_request_webpager   r   geturlr   querygetZ_downloaderZreport_warning)r/   usernamer3   Zlogin_okZlogin_form_strsZurlhpartsr0   r0   r1   r.      s,      zNiconicoIE._loginc                 C   st  dd }|d d d }|d d }d td	d
 ||g}| j|d |ddiddid| tdd|d i|d |d d  |d d|d d|d dd|d g|d gdigigddd d!|d" ii|d# d$d%d&d'||d( ||d) d*iiid+|d, d-|d. |d/ d0id1d2i d3}	|d4i }
|	d5 d d6 |d7t|d8d9t|d8d9|
d:|
d;d<S )=Nc                 S   s   | rdS dS )Nyesnor0   )booleanr0   r0   r1   yesno   s    z5NiconicoIE._extract_format_for_quality.<locals>.yesnovideodmcInfoZsession_apiurlsr   -c                 S   s   t | d dS )Nr   Zarchive_)r   )sr0   r0   r1   <lambda>       z8NiconicoIE._extract_format_for_quality.<locals>.<lambda>r$   _formatjsonzContent-Typezapplication/jsonz Downloading JSON metadata for %ssessionZ	player_idZ
auth_typesZ	protocolscontent_key_timeoutZ	nicovideoservice_user_id)Z	auth_typerJ   Z
service_idrK   
content_idZcontent_src_idsZsrc_id_to_muxr   )Zaudio_src_idsZvideo_src_idsZmovie Z	heartbeatZlifetimeZheartbeat_lifetimepriorityhttpZhttp_parameters
parametersZhttp_output_download_parametersZis_sslZis_well_known_port)Zuse_sslZuse_well_known_port)namerP   	recipe_idZ#session_operation_auth_by_signature	signaturetoken)rS   rT   Z	unlimited)Zclient_infoZcontent_authrL   Zcontent_src_id_setscontent_typecontent_uriZkeep_methodrN   protocolrR   Zsession_operation_authZtiming_constraint)r8   headersr4   r5   
resolutionr5   rV   r   Zbitratei  heightwidth)r$   	format_idr   ZabrZvbrrZ   r[   )joinmap_download_jsonrH   dumpsencoder9   r   )r/   api_datavideo_idaudio_qualityvideo_qualityr?   Zsession_api_dataZsession_api_endpointr\   Zsession_responserY   r0   r0   r1   _extract_format_for_quality   s       

9z&NiconicoIE._extract_format_for_qualityc                    sX  |  |}| d| |\}}|dr6|  | }| | jd|ddd| fdd}z d	 d
 d W n tk
r^   | d| d |d}t|}d|krd|krt	dddnFd|krt	dddn0d|krt	d| j
|d d f ddnt	d| jd| |ddfdd}|d d |d}	|	sHt}	|	|dg}
Y nX g }
 d	 d }|r|d! }|d" D ]D}|d# D ]4}|d$ r|d$ sq|
|  ||| qq| |
 nd%|dg}
 fd&d}|d'}|s| j|d d}|s(| d(|d)}| jd*|d+d d}|rL| ||ni }|d,i }|d-d.gp| jd/|d0d dp|d0}|d1}t|d2pt|d3}|s| jd4|d5d d}|rt|d6d7}|s|d8rt|d8 d9d:d;tjd<d=d>}t|d?d@g}|sJ| jdA|dBd d}|rJt|dCdD}|pX|d@}t|dEp|dFpt dGdH }|s| jdI|dJd d}|rt|dCdD}t|dKp| jdL|dMd dp|dKp|dN}|dOp|}t dPdH tpi }|dQdRgp |dS}|dTdUgp8|dV}|||
|||||||||dWS )XNzhttp://www.nicovideo.jp/watch/sozdata-api-data="([^"]+)"zAPI dataz{})defaultc                    s     drdS dS )NlowZeconomynormal)endswith)Z	video_url)video_real_urlr0   r1   _format_id_from_url  s    z5NiconicoIE._real_extract.<locals>._format_id_from_urlr@   Z	smileInfor$   z%http://flapi.nicovideo.jp/api/getflv/z?as3=1zDownloading flv infor)   zThe video has been deleted.T)expectedclosedz&Niconico videos now require logging inerrorz%s reports error: %sr   zUnable to find video URLz)http://ext.nicovideo.jp/api/getthumbinfo/zDownloading video info page)r4   c                    s8   t | ts| g} | D ]}t d| }|r|  S qd S )Nz.//)
isinstancelistr   )itemsitemret)video_info_xmlr0   r1   get_video_info<  s    
z0NiconicoIE._real_extract.<locals>.get_video_infoZ
movie_type)r$   r   r\   rA   qualityZaudiosZvideos	availabler   c                    s   t  d | S )Nr@   )r	   )rs   )rb   r0   r1   rw   d  s    r   z6<span[^>]+class="videoHeaderTitle"[^>]*>([^<]+)</span>zvideo titlez6<div[^>]+id="watchAPIDataContainer"[^>]+>([^<]+)</div>zwatch api dataZvideoDetailZthumbnail_urlZthumbnailURLimager   r    Zfirst_retrieveZpostedDateTimeZdatePublishedzdate published+z:00+ZpostedAt/rC    	   )hours)	delimitertimezoneZview_counterZ	viewCountz%>Views: <strong[^>]*>([^<]+)</strong>z
view count,rM   Zcomment_numcommentCountc                 S   s   | d d S )Nthreadr   r0   xr0   r0   r1   rE     rF   z*NiconicoIE._real_extract.<locals>.<lambda>z(>Comments: <strong[^>]*>([^<]+)</strong>zcomment countlengthzvideo:durationzvideo durationr!   Z	watch_urlc                 S   s
   |  dS )Nownerr9   r   r0   r0   r1   rE     rF   Zch_idZuser_idr   Zch_nameZuser_nicknameZnickname)r   r   formatsr   r    r   r   r   r"   r#   r!   webpage_url)	_match_idZ_download_webpage_handle
startswithr7   Z_parse_jsonZ_html_search_regexKeyErrorZ_download_webpager   r
   IE_NAMEZ_download_xmlr   r9   appendrf   Z_sort_formatsZ_og_search_titleZ_html_search_metar   r   replacedatetime	timedeltar   r   r   dict)r/   r$   rc   Zwebpagehandlerm   Zflv_info_webpageZflv_inforw   	extensionr   Zdmc_infoZquality_inford   re   r   Zwatch_api_data_stringZwatch_api_dataZvideo_detailr   r    r   matchr"   r#   r!   r   r   r   r   r0   )rb   rv   rl   r1   _real_extract  sN   
 
  
 
 
       
 
    
   zNiconicoIE._real_extract)__name__
__module____qualname__r   ZIE_DESCint_TESTS
_VALID_URLZ_NETRC_MACHINEr2   r.   rf   r   r0   r0   r0   r1   r      s   Nr   c                   @   sV   e Zd ZdZdddddddd	d
dddgZdZdd Zdd Zdd Zdd Z	dS )NiconicoPlaylistIEzAhttps?://(?:www\.)?nicovideo\.jp/(?:user/\d+/)?mylist/(?P<id>\d+)z'http://www.nicovideo.jp/mylist/27411728Z27411728u&   AKB48のオールナイトニッポンz$md5:d89694c5ded4b6c693dea2db6e41aa08u	   のっくZ805442)r   r   r    r   r      )r$   r&   Zplaylist_mincountz4https://www.nicovideo.jp/user/805442/mylist/27411728Tr,   d   c                 C   s(   | j d| |d| |ddidd d S )Nz&https://nvapi.nicovideo.jp/v2/mylists/zDownloading %s JSON metatdatazX-Frontend-Id   )r8   rX   r5   mylist)r_   )r/   list_idresourcer8   r0   r0   r1   	_call_api  s      zNiconicoPlaylistIE._call_apic                 C   s,   | dpi }|r(| d| ddS i S )Nr   rQ   r   )r   r   r   )r/   rt   r   r0   r0   r1   _parse_owner  s    zNiconicoPlaylistIE._parse_ownerc           	      #   s   |d7 }|  |d| || jdd }|D ]}|dp:i }|d}|sLq*|dpXi   fdd	}d
||dd| |dt|d|d|dt d	}|| | |V  q*d S )Nr   zpage %d)pagepageSizers   r@   r   countc                    s   t  | S r-   )r   r9   r   r   r0   r1   rE     rF   z0NiconicoPlaylistIE._fetch_page.<locals>.<lambda>r$   r   zhttps://www.nicovideo.jp/watch/ZshortDescriptionr!   viewcomment)	_typer   r   r$   r    r!   r"   r#   ie_key)r   
_PAGE_SIZEr9   r   r   r   updater   )	r/   r   r   rs   rt   r@   rc   Z	get_countinfor0   r   r1   _fetch_page  s4    
zNiconicoPlaylistIE._fetch_pagec                 C   st   |  |}| |dddi}tt| j|t|d | j | j}| 	|||
d|
d}|| | |S )Nrr   r   r   ZtotalItemCountrQ   r    )r   r   r   	functoolspartialr   mathceilr   Zplaylist_resultr9   r   r   )r/   r$   r   r   entriesresultr0   r0   r1   r     s$    
    z NiconicoPlaylistIE._real_extractN)
r   r   r   r   r   r   r   r   r   r   r0   r0   r0   r1   r     s&   	r   )
__future__r   r   r   rH   r   commonr   compatr   r   utilsr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r0   r0   r0   r1   <module>   s   <   