U
    gF                     @   s   d dl Z d dl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 G dd deZG dd	 d	eZG d
d deZG dd deZG dd deZdS )    N   )InfoExtractor   )	ExtractorErrorOnDemandPagedListfilter_dictint_or_noneparse_qsstr_or_nonetraverse_objunified_timestampurl_or_nonec                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )NiconicoChannelPlusBaseIEhttps://nicochannel.jpc                 K   s   | j d| fd|i|S )Nz"https://nfc-api.nicochannel.jp/fc/video_id)_download_json)selfpathitem_idkwargs r   H/tmp/pip-unpacked-wheel-q5ljy6pj/yt_dlp/extractor/niconicochannelplus.py	_call_api   s    z#NiconicoChannelPlusBaseIE._call_apic                    sX   j dd  dddd d }t| fdd	d
fdd}|sTtd  ddd|S )Nzcontent_providers/channelsz	channels/zFetching channel listzUnable to fetch channel list)r   noteerrnotedataZcontent_providersc                    s   |d j  d  kS )Ndomain/)_WEBPAGE_BASE_URL)_vchannel_namer   r   r   <lambda>       zANiconicoChannelPlusBaseIE._find_fanclub_site_id.<locals>.<lambda>idFget_allzChannel z does not existT)expected)r   r   r   )r   r"   Zfanclub_list_jsonZ
fanclub_idr   r!   r   _find_fanclub_site_id   s&       z/NiconicoChannelPlusBaseIE._find_fanclub_site_idc                 C   s4   t | jd| dd| ddddddthfp2i S )	Nfanclub_sites/z/page_base_infozFetching channel base infoz!Unable to fetch channel base infoF)r   r   r   fatalr   fanclub_site)r   r   dictr   fanclub_site_idr   r   r   _get_channel_base_info%   s    
   
z0NiconicoChannelPlusBaseIE._get_channel_base_infoc              
   C   sB   t | jd| dd| dddtdddd	d
thfp@i S )Nr*   z
/user_infozFetching channel user infoz!Unable to fetch channel user infoFnullascii)r   r   r   r+   r   r   r,   )r   r   jsondumpsencoder-   r.   r   r   r   _get_channel_user_info+   s    
   
z0NiconicoChannelPlusBaseIE._get_channel_user_infoN)__name__
__module____qualname__r   r   r)   r0   r6   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eeg ddddiddddddddddddeeg dd ddidgZd!d" Zd#d$ Z	d%d& Z
d'S )(NiconicoChannelPlusIEZNiconicoChannelPlusu$   ニコニコチャンネルプラスzLhttps?://nicochannel\.jp/(?P<channel>[\w.-]+)/(?:video|live)/(?P<code>sm\w+)z<https://nicochannel.jp/kaorin/video/smsDd8EdFLcVZk9yyAhD6H7HZsmsDd8EdFLcVZk9yyAhD6H7Hu*   前田佳織里はニコ生がしたい！Zmp4u$   前田佳織里の世界攻略計画Zkaorinzhttps://nicochannel.jp/kaorinnot_livezIhttps://nicochannel.jp/public_html/contents/video_pages/74/thumbnail_pathu|   ２０２１年１１月に放送された
「前田佳織里はニコ生がしたい！」アーカイブになります。i+ai  Z20220105)r%   titleextchannel
channel_idchannel_urllive_status	thumbnaildescription	timestampdurationcomment_count
view_counttagsupload_dateZskip_downloadT)url	info_dictparamsz=https://nicochannel.jp/testman/video/smDXbcrtyPNxLx9jc4BW69VeZsmDXbcrtyPNxLx9jc4BW69Veztest oshirou-   本番チャンネルプラステストマンZtestmanzhttps://nicochannel.jp/testman   was_liveifRciQ Z20221021)r%   r<   r=   r>   r?   r@   	age_limitrA   rD   rE   rF   rG   rH   rI   c                 C   s^  |  |dd\}}| |}| jd| |ddidddd	 d
 }| ||\}}|d}g }	|dkr|r~d| d}
nd}
| j|
d|d n| j|d d j|d|d}	||	d| 	|d|| j
 d| t| |d|t|d	t|dthfdthfdthfdthfdd thfd!d"thfd!d#thfd$d%d&thfd'd(| j|t|d)d*iS )+Ncoder>   video_pages/fc_use_devicer1   zFetching video page infozUnable to fetch video page info)r   headersr   r   r   Z
video_pageZlive_scheduled_start_atis_upcomingzThis live event will begin at z UTCzThis event has not started yetT)r(   r   Zvideo_streamZauthenticated_url)
session_id)Zm3u8_urlr   )ZtbrZvcodecZacodecfanclub_site_namer   )Zcontent_providerrO   )	r%   formatsZ_format_sort_fieldsr>   r?   r@   rO   rA   Zrelease_timestampr<   Zthumbnail_urlrC   Zreleased_atZactive_video_filenamelengthZvideo_aggregate_infoZnumber_of_commentsZtotal_viewsZ
video_tags.tag)r<   rB   rC   rD   rE   rF   rG   rH   Z__post_extractor)Zvideo_comment_settingcomment_group_id)content_coderZ   )Z_match_valid_urlgroupr)   r   _get_live_status_and_session_idgetZraise_no_formatsZ_extract_m3u8_formatsformatr0   r   r   r6   r   strr   r   Zextract_comments)r   rJ   r[   r?   r/   	data_jsonrA   rU   Zrelease_timestamp_strrW   msgr   r   r   _real_extracte   sf    
   





 z#NiconicoChannelPlusIE._real_extractc                 c   s   | d}|sd S | j d| d|dddd d }| jd	|d
dddidt| ddgd p`ddt||ddd}t|dD ]J}t|dthfdt	hfdt	hfdthfdt
hfddd hfdd d!V  qd S )"Nz	/commentsrQ   z/comments_user_tokenzGetting comment tokenzUnable to get comment token)r   r   r   Zaccess_tokenz,https://comm-api.sheeta.com/messages.historyzFetching commentszUnable to fetch commentsContent-Typeapplication/jsonZascZmax_comments r   x   )Zsort_directionlimit)tokenZgroup_idr2   )r   r   r   rS   queryr   .ZnicknameZ	sender_idr%   message)Z
updated_atZsent_atZ
created_atc                 S   s   | dkS )Nz-1r   )xr   r   r   r#      r$   z5NiconicoChannelPlusIE._get_comments.<locals>.<lambda>)authorZ	author_idr%   textrD   Zauthor_is_uploaderFr&   )r   r   r   Z_configuration_argr3   r4   r5   r   r`   r
   r   )r   r[   rZ   r   Zcomment_access_tokenZcomment_listcommentr   r   r   _get_comments   sP    

    z#NiconicoChannelPlusIE._get_commentsc           
      C   s  | d}| d}i }|dkr0|r*d}qd}n|dkr| dsFdS |sPd	}qd}d
di}t|d}t|d}| d| d| d |r|std|ddntd| |dd| | d| d|  | jd| d| dt|dddddd d!d"d# d$ }	||	fS )%Ntypelive_finished_atZvodrN   r;   ZliveZlive_started_at)rT   rf   Zis_liveZbroadcast_typeZdvr)videoZallow_dvr_flg)rs   Zconvert_to_vod_flgzallow_dvr_flg = z, convert_to_vod_flg = .z/Live was ended, there is no video for download.T)r   r(   zUnknown type: Fz: video_type=z, live_status=rQ   z/session_idsz/sessionr2   re   r1   r   )rd   rR   originzGetting session idzUnable to get session id)r   r   rS   r   r   r   rU   )r^   r   Zwrite_debugr   r   r3   r4   r5   )
r   r[   ra   Z
video_typerr   payloadrA   Zvideo_allow_dvr_flgZvideo_convert_to_vod_flgrU   r   r   r   r]      sR    




  
  
z5NiconicoChannelPlusIE._get_live_status_and_session_idN)r7   r8   r9   IE_NAMEIE_DESC
_VALID_URLint_TESTSrc   rp   r]   r   r   r   r   r:   3   s`     .4"r:   c                   @   s   e Zd ZdZdd ZdS ) NiconicoChannelPlusChannelBaseIE   c              	   c   sv   | j ||||d | jdddid|d  dd|d  dd}t|d	D ]$}| | j d
| d| tV  qLd S )Nr   )pageZper_pagerR   r1   zGetting channel info (page )z!Unable to get channel info (page )rj   rS   r   r   )r   Zvideo_pageslist.r[   r   z/video/)r   
_PAGE_SIZEr   Z
url_resultr   r:   )r   r   rj   r"   r   r~   responser[   r   r   r   _fetch_paged_channel_video_list   s      
 z@NiconicoChannelPlusChannelBaseIE._fetch_paged_channel_video_listN)r7   r8   r9   r   r   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ddddd	dddddd	dddddd	dddddd	dddddd	dddddd	dddddd	dddddd	g
Zdd ZdS )"NiconicoChannelPlusChannelVideosIEz"NiconicoChannelPlus:channel:videosug   ニコニコチャンネルプラス - チャンネル - 動画リスト. nicochannel.jp/channel/videosz=https?://nicochannel\.jp/(?P<id>[a-z\d\._-]+)/videos(?:\?.*)?z%https://nicochannel.jp/testman/videosztestman-videosu4   本番チャンネルプラステストマン-videosr%   r<   rM   rJ   rK   Zplaylist_mincountz'https://nicochannel.jp/testtarou/videosztesttarou-videosu.   チャンネルプラステスト太郎-videosr   z'https://nicochannel.jp/testjirou/videosztestjirou-videosu.   チャンネルプラステスト二郎-videosr}   zEhttps://nicochannel.jp/testman/videos?tag=%E6%A4%9C%E8%A8%BC%E7%94%A8   z/https://nicochannel.jp/testman/videos?vodType=1z7https://nicochannel.jp/testman/videos?sort=-released_atzOhttps://nicochannel.jp/testman/videos?tag=%E6%A4%9C%E8%A8%BC%E7%94%A8&vodType=1zWhttps://nicochannel.jp/testman/videos?tag=%E6%A4%9C%E8%A8%BC%E7%94%A8&sort=-released_atzAhttps://nicochannel.jp/testman/videos?vodType=1&sort=-released_atzahttps://nicochannel.jp/testman/videos?tag=%E6%A4%9C%E8%A8%BC%E7%94%A8&vodType=1&sort=-released_atc                 C   s   |  |}| |}| |d}t|}| jtt| j	d| dt
t|dt|dddt|dd	dd
|| d| j| d| ddS )u  
        API parameters:
            sort:
                -released_at         公開日が新しい順 (newest to oldest)
                 released_at         公開日が古い順 (oldest to newest)
                -number_of_vod_views 再生数が多い順 (most play count)
                 number_of_vod_views コメントが多い順 (most comments)
            vod_type (is "vodType" in "url"):
                0 すべて (all)
                1 会員限定 (members only)
                2 一部無料 (partially free)
                3 レンタル (rental)
                4 生放送アーカイブ (live archives)
                5 アップロード動画 (uploaded videos)
        rV   r*   z/video_pages)rY   r   )sortr   z-released_at)default)ZvodTyper   0)rY   r   Zvod_typez/videosz-videosZplaylist_idZplaylist_title)	_match_idr)   r0   r^   r	   playlist_resultr   	functoolspartialr   r   r   r   )r   rJ   r?   r/   r"   qsr   r   r   rc   S  s,    

 
 
 z0NiconicoChannelPlusChannelVideosIE._real_extractNr7   r8   r9   rw   rx   ry   r{   rc   r   r   r   r   r      s   








Rr   c                   @   sT   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	gZdd ZdS )!NiconicoChannelPlusChannelLivesIEz!NiconicoChannelPlus:channel:livesui   ニコニコチャンネルプラス - チャンネル - ライブリスト. nicochannel.jp/channel/livesz3https?://nicochannel\.jp/(?P<id>[a-z\d\._-]+)/livesz$https://nicochannel.jp/testman/livesztestman-livesu3   本番チャンネルプラステストマン-livesr   rM   r   z&https://nicochannel.jp/testtarou/livesztesttarou-livesu-   チャンネルプラステスト太郎-livesr   z&https://nicochannel.jp/testjirou/livesztestjirou-livesu-   チャンネルプラステスト二郎-livesr   c              
   C   sj   |  |}| |}| |d}| jtt| jd| dddi|| d| j	| d| ddS )	u  
        API parameters:
            live_type:
                1 放送中 (on air)
                2 放送予定 (scheduled live streams, oldest to newest)
                3 過去の放送 - すべて (all ended live streams, newest to oldest)
                4 過去の放送 - 生放送アーカイブ (all archives for live streams, oldest to newest)
            We use "4" instead of "3" because some recently ended live streams could not be downloaded.
        rV   r*   z/live_pagesZ	live_type   z/livesz-livesr   )
r   r)   r0   r^   r   r   r   r   r   r   )r   rJ   r?   r/   r"   r   r   r   rc     s&    

 
   z/NiconicoChannelPlusChannelLivesIE._real_extractNr   r   r   r   r   r   w  s.   r   )r   r3   commonr   utilsr   r   r   r   r	   r
   r   r   r   r   r:   r|   r   r   r   r   r   r   <module>   s   ,! 7z