
    V|hF                         S SK r S SKrSSKJr  SSKJrJrJrJrJ	r	J
r
JrJrJr   " S S\5      r " S S	\5      r " S
 S\5      r " S S\5      r " S S\5      rg)    N   )InfoExtractor   )	ExtractorErrorOnDemandPagedListfilter_dictint_or_noneparse_qsstr_or_nonetraverse_objunified_timestampurl_or_nonec                   0    \ rS rSrSrS rS rS rS rSr	g)	NiconicoChannelPlusBaseIE   https://nicochannel.jpc                 2    U R                   " SU 34SU0UD6$ )Nz"https://nfc-api.nicochannel.jp/fc/video_id)_download_json)selfpathitem_idkwargss       ^/home/james-whalen/.local/lib/python3.13/site-packages/yt_dlp/extractor/niconicochannelplus.py	_call_api#NiconicoChannelPlusBaseIE._call_api   s3    ""07UBIUMSU 	U    c                    ^ ^ T R                  SST 3SSS9S   S   n[        UUU 4S jS	4S
S9nU(       d  [        ST S3SS9eU$ )Nzcontent_providers/channelsz	channels/zFetching channel listzUnable to fetch channel list)r   noteerrnotedatacontent_providersc                 2   > US   TR                    ST 3:H  $ )Ndomain/)_WEBPAGE_BASE_URL)_vchannel_namer   s     r   <lambda>ANiconicoChannelPlusBaseIE._find_fanclub_site_id.<locals>.<lambda>   s     84+A+A*B!L>(RRr   idFget_allzChannel z does not existT)expected)r   r   r   )r   r)   fanclub_list_json
fanclub_ids   ``  r   _find_fanclub_site_id/NiconicoChannelPlusBaseIE._find_fanclub_site_id   s}     NN(Il^2L(2P + 
  &' ""3RTX6Z
  8L>!ITXYYr   c           
      l    [        U R                  SU S3SU 3SSSS9SS[        145      =(       d    0 $ )	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_info0NiconicoChannelPlusBaseIE._get_channel_base_info%   sX    DNN_-_=XgWhGi-7Zbg + 
 NTF+- 3 13	3r   c                     [        U R                  SU S3SU 3SSS[        R                  " S5      R	                  S5      S9S	S
[
        145      =(       d    0 $ )Nr5   z
/user_infozFetching channel user infoz!Unable to fetch channel user infoFnullascii)r   r   r    r6   r!   r!   r7   )r   r   jsondumpsencoder8   r9   s     r   _get_channel_user_info0NiconicoChannelPlusBaseIE._get_channel_user_info+   so    DNN_-Z8NSbRcBd-7ZbgF#**73 + 
 NTF+	- 3 13		3r    N)
__name__
__module____qualname____firstlineno__r&   r   r2   r;   rC   __static_attributes__rE   r   r   r   r      s    0U
33r   r   c                       \ rS rSrSrSrSrSSSSS	S
SSSSSS\\/ SS.SS0S.SSSSSSSSSSS\\/ S S!.SS0S./rS" r	S# r
S$ rS%rg&)'NiconicoChannelPlusIE3   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/testmanr   was_liveifRciQ 20221021)r,   rT   rU   rV   rW   rX   	age_limitrY   r\   r]   r^   r_   r`   ra   c                    U R                  U5      R                  SS5      u  p#U R                  U5      nU R                  SU 3USS0SSS9S	   S
   nU R	                  X%5      u  pgUR                  S5      n/ n	US:X  a"  U(       a  SU S3n
OSn
U R                  U
SUS9  O#U R                  US   S   R                  US9US9n	UU	SU R                  U5      R                  S5      UU R                   SU 3[        U R                  U5      S5      U[        U5      S.	[        US[        14S[        14S[        14S[        14SS [         14S!S"[         14S!S#[         14S$S%S&[        14S'.5      ES(U R#                  U[        US)5      S*90E$ )+NcoderV   video_pages/fc_use_devicer>   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_providerrj   )	r,   formats_format_sort_fieldsrV   rW   rX   rj   rY   release_timestamprT   thumbnail_urlr[   released_atactive_video_filenamelengthvideo_aggregate_infonumber_of_commentstotal_views
video_tags.tag)rT   rZ   r[   r\   r]   r^   r_   r`   __post_extractor)video_comment_settingcomment_group_id)content_coder   )_match_valid_urlgroupr2   r   _get_live_status_and_session_idgetraise_no_formats_extract_m3u8_formatsformatr;   r&   r   rC   r   strr   r	   extract_comments)r   rc   r   rW   r:   	data_jsonrY   ru   release_timestamp_strr|   msgs              r   _real_extract#NiconicoChannelPlusIE._real_extracte   s   #'#8#8#=#C#CFI#V 44Z@NN<.)</[aIb+5V # 
   	
 #'"F"F|"_ ).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              #     #    U S3nU(       d  g U R                  SU S3USSS9S   S   nU R                  S	US
SSS0S[        U R                  SS/5      S   5      =(       d    SS.[        R
                  " UUS.5      R                  S5      S9n[        US5       H>  n[        US[        14S[        14S[        14S[        14S[        14SS 14S.SS 9v   M@     g 7f)!Nz	/commentsrm   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    ro   queryr!   .nickname	sender_idr,   message)
updated_atsent_at
created_atc                     U S:H  $ )Nz-1rE   )xs    r   r*   5NiconicoChannelPlusIE._get_comments.<locals>.<lambda>   s    qDyr   )author	author_idr,   textr\   author_is_uploaderFr-   )r   r   r	   _configuration_argr@   rA   rB   r   r   r   r   )r   r   r   r   comment_access_tokencomment_listcomments          r   _get_comments#NiconicoChannelPlusIE._get_comments   s:    !N),#~~<.(<=w(2O  .  
   ! "
 **:W$.H#%78"'$T%<%<^bT%RST%UV]Z] -,  vg +   $L#6Gw%u-)K=9k]+"SE*EHYGZ['25H4I&J)   7s   CC!c           	      B   UR                  S5      nUR                  S5      n0 nUS:X  a  U(       a  SnOSnOUS:X  aq  UR                  S5      (       d  gU(       d  S	nO^SnS
S0n[        US5      n[        US5      nU R                  SU SU S35        U(       a  U(       d  [        SUSS9eO[        SU 3USS9eU R                  U SU SU 35        U R	                  SU S3U S3[
        R                  " U5      R                  S5      SSSS.S S!S"9S#   S$   n	Xi4$ )%Ntypelive_finished_atvodrh   rR   livelive_started_at)rr   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=rm   z/session_idsz/sessionr?   r   r>   r   )r   rn   originzGetting session idzUnable to get session id)r   r!   ro   r   r    r!   ru   )r   r   write_debugr   r   r@   rA   rB   )
r   r   r   
video_typer   payloadrY   video_allow_dvr_flgvideo_convert_to_vod_flgru   s
             r   r   5NiconicoChannelPlusIE._get_live_status_and_session_id   s~   ]]6*
$==);<((6!==!233(#'(+U3&29>X&Y#+7	Cb+c(  #34G3HH_`x_yyz!{|+0H(IT`koq q 1I !>*!>`effL>zl.Q\P]^_^^<.5,x?XG$++G4 2!'2?
 &/I $ 
   
 &&r   rE   N)rF   rG   rH   rI   IE_NAMEIE_DESC
_VALID_URLint_TESTSr   r   r   rJ   rE   r   r   rL   rL   3   s    #G4G`JM,A=":%d [# %
$ T
'0 O,"F#;%# %
" T
'-,F\2
h D+'r   rL   c                       \ rS rSrSrS rSrg) NiconicoChannelPlusChannelBaseIE      c           
   #      #    U R                  X0 UEUS-   U R                  S.ESS0SUS-    S3SUS-    S3S9n[        US	5       H-  nU R                  U R                   S
U SU 3[
        5      v   M/     g 7f)Nr   )pageper_pagern   r>   zGetting channel info (page )z!Unable to get channel info (page )r   ro   r   r    )r!   video_pageslist.r   r%   z/video/)r   
_PAGE_SIZEr   
url_resultr&   rL   )r   r   r   r)   r   r   responser   s           r   _fetch_paged_channel_video_list@NiconicoChannelPlusChannelBaseIE._fetch_paged_channel_video_list   s     >> "" OO"
 %f-.taxj:7qzC " E )3ghL//))*!L>OQfh h is   A6A8rE   N)rF   rG   rH   rI   r   r   rJ   rE   r   r   r   r      s    Jhr   r   c                       \ rS rSrSrSrSrSSSS.S	S
.SSSS.SS
.SSSS.SS
.SSSS.SS
.SSSS.S	S
.SSSS.S	S
.SSSS.SS
.SSSS.SS
.SSSS.S	S
.SSSS.SS
./
rS rSr	g)"NiconicoChannelPlusChannelVideosIE   z"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,   rT   r   rc   rd   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                    U R                  U5      nU R                  U5      nU R                  U5      R                  S5      n[	        U5      nU R                  [        [        R                  " U R                  SU S3[        [        US5      [        USSS9[        USS	S9S
.5      X" S35      U R                  5      U S3U S3S9$ )uK  
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)
rz   r5   z/video_pages)r   r   )sortr   z-released_at)default)vodTyper   0)r   r   vod_typez/videosz-videosplaylist_idplaylist_title)	_match_idr2   r;   r   r
   playlist_resultr   	functoolspartialr   r   r   r   )r   rc   rW   r:   r)   qss         r   r   0NiconicoChannelPlusChannelVideosIE._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   rE   N
rF   rG   rH   rI   r   r   r   r   r   rJ   rE   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                   Z    \ rS rSrSrSrSrSSSS.S	S
.SSSS.SS
.SSSS.SS
./rS rSr	g)!NiconicoChannelPlusChannelLivesIEiw  z!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                 0   U R                  U5      nU R                  U5      nU R                  U5      R                  S5      nU R	                  [        [        R                  " U R                  SU S3SS0X" S35      U R                  5      U S3U S3S9$ )	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.
rz   r5   z/live_pages	live_type   z/livesz-livesr   )
r   r2   r;   r   r   r   r   r   r   r   )r   rc   rW   r:   r)   s        r   r   /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   rE   Nr   rE   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   rL   r   r   r   rE   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   