
    VGhF                         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e      Z G d d	e      Z G d
 de      Z G d de      Z G d de      Zy)    N   )InfoExtractor   )	ExtractorErrorOnDemandPagedListfilter_dictint_or_noneparse_qsstr_or_nonetraverse_objunified_timestampurl_or_nonec                   (    e Zd ZdZd Zd Zd Zd Zy)NiconicoChannelPlusBaseIEhttps://nicochannel.jpc                 2     | j                   d| fd|i|S )Nz"https://nfc-api.nicochannel.jp/fc/video_id)_download_json)selfpathitem_idkwargss       m/var/www/it7/html/youtubeDownloader/venv/lib/python3.12/site-packages/yt_dlp/extractor/niconicochannelplus.py	_call_apiz#NiconicoChannelPlusBaseIE._call_api   s5    "t""07UBIUMSU 	U    c                       j                  dd dd      d   d   }t        | fdd	fd
      }|st        d dd      |S )Nzcontent_providers/channelsz	channels/zFetching channel listzUnable to fetch channel list)r   noteerrnotedatacontent_providersc                 2    |d   j                    d k(  S )Ndomain/)_WEBPAGE_BASE_URL)_vchannel_namer   s     r   <lambda>zANiconicoChannelPlusBaseIE._find_fanclub_site_id.<locals>.<lambda>   s"    84+A+A*B!L>(RR r   idFget_allzChannel z does not existT)expected)r   r   r   )r   r'   fanclub_list_json
fanclub_ids   ``  r   _find_fanclub_site_idz/NiconicoChannelPlusBaseIE._find_fanclub_site_id   s}     NN(Il^2L(2P + 
  &' ""3RTX6Z
  8L>!ITXYYr   c           	      h    t        | j                  d| dd| ddd      ddt        hf      xs i 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_ids     r   _get_channel_base_infoz0NiconicoChannelPlusBaseIE._get_channel_base_info%   sX    DNN_-_=XgWhGi-7Zbg + 
 NTF+- 3 13	3r   c                     t        | j                  d| dd| dddt        j                  d      j	                  d            d	d
t
        hf      xs i S )Nr1   z
/user_infozFetching channel user infoz!Unable to fetch channel user infoFnullascii)r   r   r   r2   r   r   r3   )r   r   jsondumpsencoder4   r5   s     r   _get_channel_user_infoz0NiconicoChannelPlusBaseIE._get_channel_user_info+   so    DNN_-Z8NSbRcBd-7ZbgF#**73 + 
 NTF+	- 3 13		3r   N)__name__
__module____qualname__r$   r   r/   r7   r>    r   r   r   r      s    0U
33r   r   c                       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! Zd" Z	d# Z
y$)%NiconicoChannelPlusIENiconicoChannelPlusu$   ニコニコチャンネルプラスzLhttps?://nicochannel\.jp/(?P<channel>[\w.-]+)/(?:video|live)/(?P<code>sm\w+)z<https://nicochannel.jp/kaorin/video/smsDd8EdFLcVZk9yyAhD6H7HsmsDd8EdFLcVZk9yyAhD6H7Hu*   前田佳織里はニコ生がしたい！mp4u$   前田佳織里の世界攻略計画kaorinzhttps://nicochannel.jp/kaorinnot_livezIhttps://nicochannel.jp/public_html/contents/video_pages/74/thumbnail_pathu|   ２０２１年１１月に放送された
「前田佳織里はニコ生がしたい！」アーカイブになります。i+ai  20220105)r)   titleextchannel
channel_idchannel_urllive_status	thumbnaildescription	timestampdurationcomment_count
view_counttagsupload_dateskip_downloadT)url	info_dictparamsz=https://nicochannel.jp/testman/video/smDXbcrtyPNxLx9jc4BW69VesmDXbcrtyPNxLx9jc4BW69Veztest oshirou-   本番チャンネルプラステストマンtestmanzhttps://nicochannel.jp/testman   was_liveifRciQ 20221021)r)   rK   rL   rM   rN   rO   	age_limitrP   rS   rT   rU   rV   rW   rX   c                 2   | j                  |      j                  dd      \  }}| j                  |      }| j                  d| |ddidd      d	   d
   }| j	                  ||      \  }}|j                  d      }g }	|dk(  r |rd| d}
nd}
| j                  |
d|       n)| j                  |d   d   j                  |      |      }	||	d| j                  |      j                  d      || j                   d| t        | j                  |      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)      *      iS )+NcoderM   video_pages/fc_use_devicer9   zFetching video page infozUnable to fetch video page info)r   headersr   r   r   
video_pagelive_scheduled_start_atis_upcomingzThis live event will begin at z UTCzThis event has not started yetT)r,   r   video_streamauthenticated_url)
session_id)m3u8_urlr   )tbrvcodecacodecfanclub_site_namer#   )content_providerrb   )	r)   formats_format_sort_fieldsrM   rN   rO   rb   rP   release_timestamprK   thumbnail_urlrR   released_atactive_video_filenamelengthvideo_aggregate_infonumber_of_commentstotal_views
video_tags.tag)rK   rQ   rR   rS   rT   rU   rV   rW   __post_extractor)video_comment_settingcomment_group_id)content_coder   )_match_valid_urlgroupr/   r   _get_live_status_and_session_idgetraise_no_formats_extract_m3u8_formatsformatr7   r$   r   r>   r   strr   r	   extract_comments)r   rZ   r   rN   r6   	data_jsonrP   rm   release_timestamp_strrt   msgs              r   _real_extractz#NiconicoChannelPlusIE._real_extracte   s   #'#8#8#=#C#CFI#V j44Z@NN<.)</[aIb+5V # 
   	
 #'"F"F|U^"_Z ).G H-'$67L6MTR6!!#|!L00">23FGNNZdNe% 1 'G #>22?CGGH[\$"445QzlC%d&A&A/&RTuv&!23H!I
 9!C5)-}= -u5+.?-@A4hN"8:NQ\P]!^5}{mT%sEC59	' 	
(  5 5)!-i9f!g !6 !i)
 	
r   c              #     K   | d}|sy | j                  d| d|dd      d   d   }| j                  d	|d
dddidt        | j                  ddg      d         xs ddt	        j
                  ||d      j                  d            }t        |d      D ]@  }t        |dt        hfdt        hfdt        hfdt        hfdt        hfdd hfdd        B y w)!Nz	/commentsre   z/comments_user_tokenzGetting comment tokenzUnable to get comment token)r   r   r   access_tokenz,https://comm-api.sheeta.com/messages.historyzFetching commentszUnable to fetch commentsContent-Typeapplication/jsonascmax_comments r   x   )sort_directionlimit)tokengroup_idr:   )r   r   r   rg   queryr   .nickname	sender_idr)   message)
updated_atsent_at
created_atc                     | dk(  S )Nz-1rB   )xs    r   r(   z5NiconicoChannelPlusIE._get_comments.<locals>.<lambda>   s
    qDy r   )author	author_idr)   textrS   author_is_uploaderFr*   )r   r   r	   _configuration_argr;   r<   r=   r   r   r   r   )r   r   r   r   comment_access_tokencomment_listcomments          r   _get_commentsz#NiconicoChannelPlusIE._get_comments   s@    !N),#~~<.(<=w(2O  .  
   ! "
 **:W$.H#%78"'$T%<%<^bT%RST%UV]Z] -,  vg +   $L#6 	Gw%u-)K=9k]+"SE*EHYGZ['25H4I&J)  	s   CCc           	         |j                  d      }|j                  d      }i }|dk(  r|rd}nxd}nu|dk(  r_|j                  d      sy|sd	}nYd}d
di}t        |d      }t        |d      }| j                  d| d| d       |r|st        d|d      t        d| |d      | j                  | d| d|        | j	                  d| d| dt        j                  |      j                  d      ddddd d!"      d#   d$   }	||	fS )%Ntypelive_finished_atvodr`   rI   livelive_started_at)rj   r   is_livebroadcast_typedvr)videoallow_dvr_flg)r   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=re   z/session_idsz/sessionr:   r   r9   r   )r   rf   originzGetting session idzUnable to get session id)r   r   rg   r   r   r   rm   )r   r   write_debugr   r   r;   r<   r=   )
r   r   r   
video_typer   payloadrP   video_allow_dvr_flgvideo_convert_to_vod_flgrm   s
             r   r   z5NiconicoChannelPlusIE._get_live_status_and_session_id   sw   ]]6*
$==);<((6!==!23(#'(+U3&29>X&Y#+7	Cb+c(  #34G3HH_`x_yyz!{|+0H(IT`koq q !>*!>`effL>zl.Q\P]^_^^<.5,x?XG$++G4 2!'2?
 &/I $ 
   
 J&&r   N)r?   r@   rA   IE_NAMEIE_DESC
_VALID_URLint_TESTSr   r   r   rB   r   r   rD   rD   3   s    #G4G`JM,A=":%d [# %
$ T
'0 O,"F#;%# %
" T
'-,F\2
h D+'r   rD   c                       e Zd ZdZd Zy) NiconicoChannelPlusChannelBaseIE   c           
   #      K   | j                  ||i ||dz   | j                  dddid|dz    dd|dz    d      }t        |d	      D ],  }| j                  | j                   d
| d| t
               . y w)Nr   )pageper_pagerf   r9   zGetting channel info (page )z!Unable to get channel info (page )r   rg   r   r   )r   video_pageslist.r   r#   z/video/)r   
_PAGE_SIZEr   
url_resultr$   rD   )r   r   r   r'   r   r   responser   s           r   _fetch_paged_channel_video_listz@NiconicoChannelPlusChannelBaseIE._fetch_paged_channel_video_list   s     >>' "" OO"
 %f-.taxj:7qzC " E )3gh 	hL//))*!L>OQfh h	hs   A8A:N)r?   r@   rA   r   r   rB   r   r   r   r      s    Jhr   r   c                       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 Zy)"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)   rK   r_   rZ   r[   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                    | j                  |      }| j                  |      }| j                  |      j                  d      }t	        |      }| j                  t        t        j                  | j                  d| dt        t        |d      t        |dd      t        |dd	      d
      || d      | j                        | 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)
        rr   r1   z/video_pages)r   r   )sortr   z-released_at)default)vodTyper   0)r   r   vod_typez/videosz-videosplaylist_idplaylist_title)	_match_idr/   r7   r   r
   playlist_resultr   	functoolspartialr   r   r   r   )r   rZ   rN   r6   r'   qss         r   r   z0NiconicoChannelPlusChannelVideosIE._real_extractS  s    " ^^C(
44Z@22?CGGH[\c]##!!88N?J[[g:h+B
; ,Rn U$0^S$Q! 
 :,g 68 	! &,g.,w?W $ Y 	Yr   Nr?   r@   rA   r   r   r   r   r   rB   r   r   r   r      s,   2GwGQJ 7"K
   9$E
  9$E
   W"K
  A"K
   I"K
   a"K
  i"K
  S"K
   s"K
 QPFd!Yr   r   c                   R    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 Zy)!NiconicoChannelPlusChannelLivesIEz!NiconicoChannelPlus:channel:livesui   ニコニコチャンネルプラス - チャンネル - ライブリスト. nicochannel.jp/channel/livesz3https?://nicochannel\.jp/(?P<id>[a-z\d\._-]+)/livesz$https://nicochannel.jp/testman/livesztestman-livesu3   本番チャンネルプラステストマン-livesr   r_   r   z&https://nicochannel.jp/testtarou/livesztesttarou-livesu-   チャンネルプラステスト太郎-livesr   z&https://nicochannel.jp/testjirou/livesztestjirou-livesu-   チャンネルプラステスト二郎-livesr   c                 6   | j                  |      }| j                  |      }| j                  |      j                  d      }| j	                  t        t        j                  | j                  d| dddi|| d      | j                        | 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.
        rr   r1   z/live_pages	live_type   z/livesz-livesr   )
r   r/   r7   r   r   r   r   r   r   r   )r   rZ   rN   r6   r'   s        r   r   z/NiconicoChannelPlusChannelLivesIE._real_extract  s     ^^C(
44Z@22?CGGH[\##!!88N?J[[f:g#Q :,f 57 ! &,f-f>U $ 	W 		Wr   Nr   rB   r   r   r   r   w  sj    1GyGGJ5!J
   8#D
  8#D
 F.Wr   r   )r   r;   commonr   utilsr   r   r   r	   r
   r   r   r   r   r   rD   r   r   r   rB   r   r   <module>r      sj      !
 
 
3 3Bs'5 s'lh'@ h(wY)I wYt3W(H 3Wr   