
    VGh                    l   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZ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 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)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0  G d d	e      Z1 G d
 de1      Z2 G d de1      Z3 G d de1      Z4 G d de1      Z5 G d de1      Z6 G d de6      Z7 G d de6      Z8 G d de1      Z9 G d de9      Z: G d de9      Z; G d de9      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<      ZA G d* d+e      ZB G d, d-e      ZC G d. d/e      ZD G d0 d1eD      ZE G d2 d3eD      ZF G d4 d5e      ZG G d6 d7e      ZH G d8 d9e      ZI G d: d;eI      ZJ G d< d=eI      ZK G d> d?e      ZLy)@    N   )InfoExtractorSearchInfoExtractor   )
Cryptodome)	HTTPError)ExtractorErrorGeoRestrictedErrorInAdvancePagedListOnDemandPagedListbool_or_nonedetermine_extfilter_dictfloat_or_noneformat_fieldget_element_by_classint_or_nonejoin_nonemptymake_archive_idmerge_dictsmimetype2extparse_countparse_qsparse_resolution	qualitiessmuggle_urlsrt_subtitles_timecodestr_or_nonetraverse_objunified_timestampunsmuggle_urlurl_or_noneurlencode_postdatavariadicc                       e Zd ZddiZ ej
                  d      ZdZi Ze	d        Z
d Zd Zd Zd	 ZddZd ZddZd Zd Zd Zd ZddZddZy
)BilibiliBaseIERefererzhttps://www.bilibili.com/z-(\d+)\.m4s\?   c                 T    t        | j                  d      j                  d            S )Nhttps://api.bilibili.comSESSDATA)bool_get_cookiesget)selfs    b/var/www/it7/html/youtubeDownloader/venv/lib/python3.12/site-packages/yt_dlp/extractor/bilibili.pyis_logged_inzBilibiliBaseIE.is_logged_in7   s$    D%%&@AEEjQRR    c                     t        t        |d            t        t        |dfdf      D cg c]  }t        |ddd       c}ddi}|r&| j                  d	| d
| j	                                 y y c c}w )N.qualitysupport_formatsc                     |d   vS Nr5    )_vparsed_qualitiess     r0   <lambda>z7BilibiliBaseIE._check_missing_formats.<locals>.<lambda>@   s    )DT0T r2   new_descriptiondisplay_descr5   delim, z
Format(s) zD are missing; you have to become a premium member to download them. )setr   r   	to_screen_login_hint)r/   	play_infoformatsfmtmissing_formatsr<   s        @r0   _check_missing_formatsz%BilibiliBaseIE._check_missing_formats;   s    |G5EFG'#I!#T0V W*X /K*X e `de NN_- .==A=M=M=O<PRS 	*Xs   A4c                 *    t        |dd f      D ci c]  }|d   t        |dd       c}t        |dddd	t        hf      t        |d
      }|rj                  |       D cg c]  }t        |ddd      t        t        |dd            t        |dt        j
                  hf      dt        |j                  d      d      t        |j                  d            t        |j                  d            d }}|j                   fdt        |d      D               |r j                  ||       t        |dd dt        hfdt        d      hfdt        hfdf      }|r|j                  |d   d   t        t        |d            d t        |      d!kD  r|d"d#ni t        |dt        hfdt        hfdfd$hfd%t        d      hfd&      t        j                  |j                  d                         |S c c}w c c}w )'Nr6   c                     |d   S r8   r9   r:   r;   s     r0   r=   z0BilibiliBaseIE.extract_formats.<locals>.<lambda>I   s    aPYl r2   r5   r>   r?   dash)Ndolbyaudio.)rM   flacrO   baseUrlbase_urlurlmimeType	mime_typecodecsnone	bandwidth  scalesizeid)rS   extacodecvcodectbrfilesize	format_idc              3     K   | ]J  }t        |d dd      t        t        |dd            t        t        |dd            t        |j	                  d            t        |j	                  d            |j	                  d	      rd
nddddj	                  t        |j	                  d                  t        |j	                  d      d      t        |j	                  d            t        |j	                  d            t        |dj
                  j                  hdfdt        hfd      j	                  |j	                  d            d M yw)rQ   rR   rS   rT   rU   	frameRate
frame_ratewidthheightrV   rW   NDVHDR10)~   }   r]   rX   rY   rZ   r\   )rQ   rR   r   Fget_all)rS   r^   fpsrg   rh   r`   r_   dynamic_rangera   rb   r5   rc   format)r   r   r   r   r.   _FORMAT_ID_REsearchr   ).0videoaudiosformat_namesr/   s     r0   	<genexpr>z1BilibiliBaseIE.extract_formats.<locals>.<genexpr>Z   s!     H    y*eDUJ LM e[,!OP 7!34!%))H"56ii) &fD#'g6::;uyyQU;WX ;!7tD#EIIf$56"599T?3%/$2D2D2K2K1LaP}%u6 #&&uyy7
 Hs   EE)rM   ru   .durlc                     t        |d         S )NrS   r"   rL   s     r0   r=   z0BilibiliBaseIE.extract_formats.<locals>.<lambda>o   s    +aPUhBW r2   length)rS   durationrb   r   ).rb   )rS   rb   r   http_dash_segments)	fragmentsprotocolc                 &    j                  |       S Nr.   )xrw   s    r0   r=   z0BilibiliBaseIE.extract_formats.<locals>.<lambda>   s    ,:J:J1:M r2   
timelength)r5   rc   format_noter}   )r   dictappendr   strlowerr   r.   r   r   extendrI   r"   sumlenr   )	r/   rE   r
flac_audiorO   rF   r   rv   rw   s	   `      @@r0   extract_formatszBilibiliBaseIE.extract_formatsF   sT    ").?AZ-[\
 iL,q*;^LL

 i&/7CRVQW)XY!)-FG
MM*%    y*eDUJ LM"58cii[*AB ;!7tD#EIIf$56$UYYt_5
   	 H  $I/EF!H 	H$ ''	7; V5WK=)!M$=#>?+/Z
 - 	
 NN |E*Y8I JK ^a' "+ 4 .0 y )K=9"+k]!;$-0M/N#O!-D0I/J K	+  #<#3#3IMM)4L#MN  {
s   H)BHc           	         t        j                          | j                  j                  dd      | j                  z   k  r| j                  d   S | j	                  d|d      }dj                  t        |dd	d
d hf            g d}| j                  j                  dj                  fd|D              d d t        j                          d       | j                  d   S )Ntsr   keyz,https://api.bilibili.com/x/web-interface/navzDownloading wbi signnote datawbi_img)img_urlsub_urlc                 N    | j                  d      d   j                  d      d   S )N/r   .r   )
rpartition	partitionr   s    r0   r=   z-BilibiliBaseIE._get_wbi_key.<locals>.<lambda>   s$    q||C(+55c:1= r2   )@.   /      r   5                2   
      :      -   #      +      1   !   	   *               '      &   )      %   0            7   (   =         r   r   <   3   r(            6      8   ;      ?   9   >      $      "   ,   4   c              3   (   K   | ]	  }|     y wr   r9   )rt   ilookups     r0   rx   z.BilibiliBaseIE._get_wbi_key.<locals>.<genexpr>   s     @6!9@s   r   )r   r   )time_wbi_key_cacher.   _WBI_KEY_CACHE_TIMEOUT_download_jsonjoinr   update)r/   video_idsession_datamixin_key_enc_tabr   s       @r0   _get_wbi_keyzBilibiliBaseIE._get_wbi_key   s    99;,,00q9D<W<WWW&&u--**:HKa + c lI5=>5@ A B

 	""77@.?@@"E))+$
 	 ""5))r2   c                    t        t        j                               |d<   t        |j                               D ci c]+  \  }}|dj	                  t        d t        |                  - }}}t        j                  j                  |      }t        j                  | | j                  |       j                               j                         |d<   |S c c}}w )Nwtsr   c                 
    | dvS )Nz!'()*r9   )chars    r0   r=   z*BilibiliBaseIE._sign_wbi.<locals>.<lambda>   s    4w+> r2   w_rid)roundr   sorteditemsr   filterr   urllibparse	urlencodehashlibmd5r   encode	hexdigest)r/   paramsr   kr;   querys         r0   	_sign_wbizBilibiliBaseIE._sign_wbi   s    diik*u v||~.
1 rwwv>AGHH
 
 &&v.!++0A0A(0K/L&M&T&T&VWaacw
s   0CNc                     ||dd|xs i }| j                   r|j                  dd        |j                  d      x}r	d| d| }nd| }| j                  d|| j	                  ||      ||	      d
   S )Ni  )bvidcidfnvaltry_lookqnzDownloading video format z	 for cid z"Downloading video formats for cid z-https://api.bilibili.com/x/player/wbi/playurlr   headersr   r   )r1   popr.   r   r   )r/   r   r   r  r   r   r  r   s           r0   _download_playinfoz!BilibiliBaseIE._download_playinfo   s    sTKekrKJJz4(D!!2!.rd)C5AD7u=D"";T...d # LLRT 	Tr2   c           
          d}t        |j                  d      xs g       D ]4  \  }}||dz    dt        |d          dt        |d          d|d    d	z  }6 |S )
Nr   bodyr   
from --> tocontent

)	enumerater.   r   )r/   	json_datasrt_dataidxlines        r0   json2srtzBilibiliBaseIE.json2srt   s    "9==#8#>B? 	3ICC!G9B24<@AG]^bcg^hGiFjjl O,D2 3H	3 r2   c           
         ddd| ddgi}| j                  d||r||dn||dd	| | j                  
      }t        |d      r$| j                  d| j	                          d       t        |dddd f      D ]K  }|j                  |d   g       j                  d| j                  | j                  |d   |            d       M |S )Ndanmakuxmlzhttps://comment.bilibili.com/z.xmlr^   rS   (https://api.bilibili.com/x/player/wbi/v2aidr   r   r   zExtracting subtitle info r   r   r  )r   need_login_subtitlez-Subtitles are only available when logged in. T)	only_oncer   subtitle	subtitlesc                     |d   xr |d   S )Nsubtitle_urllanr9   rL   s     r0   r=   z/BilibiliBaseIE._get_subtitles.<locals>.<lambda>   s    a>O>\TUV[T\ r2   r%  srtr$  r^   r   )r   _HEADERSr   report_warningrD   
setdefaultr   r  )r/   r   r   r  r"  
video_infoss          r0   _get_subtitleszBilibiliBaseIE._get_subtitles   s   6se4@ 
	 ((6.1#c*QT7U,SE2DMM ) K
 
$CD?@P@P@R?ST`d   fj
K1\+^ _ 	A  52.55d&9&9!N:KX&VW7 	 r2   c           
          |xr( |xr$ | j                  d|||ddd| j                        }t        |dddd	d
ddf      xs d S )Nr  r  zExtracting chaptersF)r   r   fatalr  r   view_points.r  r  r  )title
start_timeend_time)r   r(  r   )r/   r  r   chapterss       r0   _get_chapterszBilibiliBaseIE._get_chapters   su     L3 L4#6#663WZC[&eT]] $7 $L Hv}c D
 '   		r2   c           
   #      K   t        j                  d      D ]T  }t        | j                  d| d| d|d| d      d      }|s y t	        | j
                  |      D ]  }|E d {     V y 7 	w)	Nr   z'https://api.bilibili.com/x/v2/reply?pn=z&oid=z*&type=1&jsonp=jsonp&sort=2&_=1567227301685zExtracting comments from page F)r   r/  )r   replies)	itertoolscountr   r   map_get_all_children)r/   r  r  r7  childrens        r0   _get_commentszBilibiliBaseIE._get_comments   s     ??1% 		$C"##=cU%uLvw >seDE $ S $	%G
  6 6@ $###$		$ $s   A$A2&A0'
A2c              #   "  K   t        |d      t        |d      |j                  d      t        |d      |j                  d      |j                  d      xs dd t        | j                  t        |d	            D ]  }|E d {     y 7 w)
N)memberunamer?  midrpidr  messagectimeparentroot)author	author_idr]   text	timestamprG  )r7  .)r   r.   r:  r;  )r/   replyr<  s      r0   r;  z BilibiliBaseIE._get_all_children   s     "5*=>%e->?))F# (>?7+ii)3V
 	
 D22LHX4YZ 	 H	 s   BBBBc           
   #      K   | j                  d|dd|id|i| j                               }t        |dddd	 f      D ]6  }| j                  |d
   t        t        |j                  d                   8 y w)Nz/https://api.bilibili.com/pgc/web/season/sectionDownloading season info	season_idr'   )r   r   r  resultmain_sectionepisodesc                 ,    t        |d         xr |d   S )N	share_urlr]   r{   rL   s     r0   r=   z:BilibiliBaseIE._get_episodes_from_season.<locals>.<lambda>   s    [;8DQtW r2   rU  r]   )r   geo_verification_headersr   
url_resultBiliBiliBangumiIEr   r.   )r/   ss_idrS   season_infoentrys        r0   _get_episodes_from_seasonz(BilibiliBaseIE._get_episodes_from_season   s     ))=u*;2FGt'D'D'FG * I
 "+.*D0F G 	gE //%"46GUZU^U^_cUdIeff	gs   A6A8c                 (   |xs i }| j                  d|||dd       }|j                  i       j                  t        |ddfddt        hfd	t
        hfd
fd             |   j                  t        |ddt        hfddddddt
        hfd	t
        hfdt        hfdfdf             |   |j                  |   d	   i       <   t        |ddf      D ]0  }|d   |vsd	|d	   i||d   <   | j                  ||||d   |       2 |S )Nz,https://api.bilibili.com/x/stein/edgeinfo_v2)graph_versionedge_idr   zExtracting divisions from edge r   r   r   
story_listc                     |d   k(  S )Nr_  r9   )r:   r;   r_  s     r0   r=   z/BilibiliBaseIE._get_divisions.<locals>.<lambda>	  s    AiL\cLc r2   r1  r   )r1  r   Frm   edges	questions.choicesr]   option)r_  r   rK  )r1  re  r_  )	cid_edges)r   r*  r   r   r   r   _get_divisions)r/   r   r^  rc  r_  rg  division_datachoices       `   r0   rh  zBilibiliBaseIE._get_divisions  s   O	++:H$1gxX27)< , > 	"%,,?c!C5)}-f ) 	  	gl=6u%c9c ;-0}-!C5)D D
 ;  	 DI>	U7^E2B7@"57Is*CD 	lFi -,16%=+AfY'(##HmUF9DUaj#k	l r2   c              #   f  K   t        | j                  d|d||d|      dddt        hf      }| j                  ||dd	|iid      }|j	                         D ]  \  }}| j                  |||d
di      }i || d| |j                  d       dt        t        |j                                     j                  d       | j                  |      t        j                  |d       d|j                  dd       t        |j                  d      d      | j                  ||      d  y w)Nr  zExtracting graph versionr  r   r  r   interactionr^  r   r   r  r  r   r:   r1   - F)ensure_asciir
  descriptionr   r   rY   rZ   )r]   r1  rF   rq  r}   r"  )r   r   r   rh  r   r  r.   nextitervaluesr   jsondumpsr   extract_subtitles)	r/   r   r   metainfor  r^  rg  rc  rE   s	            r0   _get_interactive_entriesz'BilibiliBaseIE._get_interactive_entries  sV    $:H*8C2PZa   c ]Ok]C	E
 ''-!eS\ARTUV	#//+ 
	JC//#wWacdVe/fI!
!C5)$LL12#d4;O6P6T6TU\6]5^_//	:"&**U"G!H8<<XegiKjJkl))--*ETR!33HcB 
	s   D/D1NNr   )__name__
__module____qualname__r(  recompilerr   r   r   propertyr1   rI   r   r   r   r  r  r-  r5  r=  r;  r\  rh  ry  r9   r2   r0   r&   r&   1   s    67HBJJ/0MNS S	S>@*2T.
$
 	g8r2   r&   c                   ~   e Zd ZdZdddddddd	d
eeddeedgdddddddddddddeeeeddgdddidd d!d"d#d$d%d&d'dd(d)d*d	d+d,eed-ed.d/d0gd1igd2d3d4d'dd(d)d*d	d+d,eed-ed.d/d0gd1d5d6ddddd7dddd	d
eeeedgd8ddid9d:d;i d<d=d>dd?d@dAdBdCdDdEdFdGedHdIdJdKdLdMdNdOdPedQedRedSd	dTdUgddiddVdWdXddYdZd[d\d]d^d_eed	d`gdad5dbdcddddedfdgdhdidjdkeed	dlgdad5dmdndodpdqdrdsedtdueeeed	dvgdwdxdydzd{giiid|d&d}d~dpddigddddddddddddeeeed	dgdd5dddddddedddeeed	dgddd&ddddddedddeeed	dgdigd2ddddddddddddddddd	dd5ddi d<dd>dd?ddGedEddJddCddHddAddLddPedQedRedSd	dddTdgddidddddddddĜdddddddĜdddddddĜddddϜgZdЄ Zy)
BiliBiliIEzhhttps?://(?:www\.)?bilibili\.com/(?:video/|festival/[^/?#]+\?(?:[^#]*&)?bvid=)[aAbB][vV](?P<id>[^/?#&]+)z+https://www.bilibili.com/video/BV13x41117TLBV13x41117TLu(   阿滴英文｜英文歌分享#6 "Closermp4u   滴妹今天唱Closer給你聽! 有史以来，被推最多次也是最久的歌曲，其实歌词跟我原本想像差蛮多的，不过还是好听！ 微博@阿滴英文65880958u   阿滴英文 re:^https?://.*\.(jpg|jpeg|png)$g-P@20170301i*zXzbilibili 8903802_part1)r]   r1  r^   rq  uploader_iduploader	thumbnailr}   tagscomment_countupload_daterL  
like_count
view_count_old_archive_idsrS   	info_dictzold av URL versionz(http://www.bilibili.com/video/av1074402/BV11x411K7CNu   【金坷垃】金泡沫u	   菊子桑156160g(\Es@20140420iSSz$md5:ce18c2a2d2193f0df2917d270f2e5923zre:^https?://.*\.(jpg|jpeg)$zbilibili 1074402_part1)r]   r^   r1  r  r  r}   r  rL  rq  r  r  r  r  r  r  skip_downloadT)r   rS   r  r   	Anthologyz+https://www.bilibili.com/video/BV1bK411W797BV1bK411W797u/   物语中的人物是如何吐槽自己的OP的r]   r1  r   r  BV1bK411W797_p1uR   物语中的人物是如何吐槽自己的OP的 p01 Staple Stable/战场原+羽川zcount:10ie^u   打牌还是打桩	15025998420200516z$md5:e3c401cf7bc363118d1783dd74068a68gjtV@zbilibili 498159642_part1)r]   r^   r1  r  rL  r  r  r  r  r  r  r  rq  r}   r  )r   rS   r  playlist_countplaylistzSpecific page of Anthologyz/https://www.bilibili.com/video/BV1bK411W797?p=1r   rS   r  z)https://www.bilibili.com/video/av8903802/z$md5:3b1b9e25b78da4ef87e9b548b88ee76ar]   r^   r1  r  rq  rL  r  r  r  r}   r  r  r  r  r  rS   r  r   zvideo has chapterz,https://www.bilibili.com/video/BV1vL411G7N7/r]   BV1vL411G7N7r^   r1  u.   如何为你的B站视频添加进度条分段rL  iRmar  20211018rq  z$md5:a9a3d6702b3a94518d419b2e9c320a6dr  r  u   爱喝咖啡的当麻r}   g`"@r  1680903r4  zcount:6r  r  r  r  r  zbilibili 463665680_part1z video redirects to festival pagez+https://www.bilibili.com/video/BV1wP4y1P72hBV1wP4y1P72hu   牛虎年相交之际，一首传统民族打击乐《牛斗虎》祝大家新春快乐，虎年大吉！【bilibili音乐虎闹新春】ia20220204z$md5:8681a0d4d2c06b4ae27e59c8080a7fe6u   叨叨冯聊音乐g^In@	528182630zbilibili 893839363_part1)r]   r^   r1  rL  r  rq  r  r}   r  r  r  r  r  znewer festival videozIhttps://www.bilibili.com/festival/2023honkaiimpact3gala?bvid=BV1ay4y1d77fBV1ay4y1d77fu7   【崩坏3新春剧场】为特别的你送上祝福！i@cc20230121z$md5:58af66d15c6a0122dc30c8adfd828dd8u	   果蝇轰gS^@8469526zbilibili 778246196_part1zlegacy flv/mp4 videoz0https://www.bilibili.com/video/BV1ms411Q7vw/?p=4BV1ms411Q7vw_p4uX   [搞笑]【动画】云南方言快乐生产线出品 p04 新烧包谷之漫游桃花岛i߶V20160317u!   云南方言快乐生产线出品u   一笑颠天3916081zbilibili 4120229_part4)r]   r1  rL  r  rq  r}   r  r  r  r  r  r  r  r  extractor_argsbilibiliprefer_multi_flv32r   BV1ms411Q7vw_p4_0flvgʡx@)r]   r^   r1  r}   )r   rS   r  r   r  r  zlegacy mp4-only videoz+https://www.bilibili.com/video/BV1nx411u79KBV1nx411u79Ku9   【练习室】201603声乐练习《No Air》with VigoVanioY20171025u4   @ZERO-G伯远
声乐练习 《No Air》with Vigo VangjtT@u   伯远10584494zbilibili 15700301_part1)r]   r^   r1  rL  r  rq  r}   r  r  r  r  r  r  r  r  zinteractive/split-path videoz,https://www.bilibili.com/video/BV1af4y1H7ga/BV1af4y1H7gauI   【互动游戏】花了大半年时间做的自我介绍~请查收！！i>v/a20210901z$md5:01113e39ab06e28042d74ac356a08786u   钉宫妮妮Ninicoi  8881297zbilibili 292734508_part1)r]   r1  rL  r  rq  r  r  r}   r  r  r  r  r  r  r   BV1af4y1H7ga_400950101u\   【互动游戏】花了大半年时间做的自我介绍~请查收！！ - 听见猫猫叫~z$md5:db66ac7a2813a94b8291dbce990cc5b2g(\5'@r]   r^   r1  rL  r  rq  r  r  r}   r  r  r  r  r  r  z301 redirect to bangumi linkz+https://www.bilibili.com/video/BV1TE411f7f1288525u@   李永乐老师 钱学森弹道和乘波体飞行器是什么？u   我和我的祖国4780u   幕后纪实28609r   u0   钱学森弹道和乘波体飞行器是什么？i   g@i|r]20191021)r]   r1  r^   series	series_idseasonrP  season_numberepisode
episode_idepisode_numberr}   rL  r  r  z)video has subtitles, which requires loginz+https://www.bilibili.com/video/BV12N4y1M7rhBV12N4y1M7rhz$md5:96e8bb42c2b432c0d4ce3434a61479c1z$md5:afde2b7ba9025c01d9e3dde10de221e4gxs@20220709u   小夫太渴iCb
1326814124r"  zcount:2zbilibili 898179753_part1listsubtitleszlogin required for subtitle)r   rS   r  r   skipz,https://www.bilibili.com/video/BV1jL41167ZG/BV1jL41167ZGu`   一场大火引发的离奇死亡！古典推理经典短篇集《不可能犯罪诊断书》！)r]   r1  r^   zsupporter-only videorS   r  r  z,https://www.bilibili.com/video/BV1Ks411f7aQ/BV1Ks411f7aQu)   【BD1080P】狼与香辛料I【华盟】login requiredz,https://www.bilibili.com/video/BV1GJ411x7h7/BV1GJ411x7h7u4   【官方 MV】Never Gonna Give You Up - Rick Astleyzgeo-restrictedz)has - in the last path segment of the urlz<https://www.bilibili.com/festival/bh3-7th?bvid=BV1tr4y1f7p2&)r   rS   only_matchingc                      j                  |       j                         } j                  ||      \  }} j                  |j                        s j                  |j                        S ||d<    j                  d|d      }t        |d      dk(  r j                          t        |d      dk(  rt        dd	
      d|v}|r|d   }n|d   }|d   |j                  d      c}| xr* t         j                  ddddd|      dt              xs g }	t        |	      dkD  }
t        t        |      j                  dd g      d         }|
r1|s/ j!                        r j#                  |	|t$        fd      S |
r%|xs d}|d|ddt        |	|dz
  df      xs d  z  }|j                  d!      }t'        |d d"|xs d       }|rt        |d#|dz
  d$f      n|j                  d$      }i }|r)t        |d%dd&t(        hfd'd(t        hfd)fd*d+fd,d-      }i t        |d.d/d0t(        hfdd1d(t        hfd2dd3t*        hfd4      |t        |d5d6t        hfd7t        hfd1d8t        hfd9d-       t'        |d d:       |rt-         |      gnd |d|id;}t        |d<      }|rL  j.                   j1                  |||      fi |t        |dd=t        hf       j3                  |      d>S d } j4                  r't         j                  d?|d@d A      dt6        hf      }|s j9                  ||dBdiC      } j;                  |      |j                  dD      ryt        |dEdFdGt6        hf      xs i }t=        ddH|dIJ       dK j?                          }st        dL| d	
      dMt        |dNdOt@        hf      v r jC                  dP| Q       t        |dR      s	fdSt        |dTfdUtD        hf      D ]D  }jG                  t         j;                   j9                  ||dV|iC            fdW             F  jI                  |       t        dX       }|rt        |      t              k  rn jK                  dY      s=dZjM                  d[ |D              }t        d\       |r6 jO                  d]| d^       n t         fd_      xs tQ        |d` a      gt        db      ri |dctS        dd   de         D cg c]b  \  }}|df    dg| |d   |dh   i |didd   j                  di      ig|ddk(  r jU                  |      nd |ddk(  r j3                  |      nd djd c}}tW        |j                  dk      dlm      dnS i |tW        |j                  dk      dlm       jY                  ||       jU                  |       j3                  |      doS c c}}w )pNr  r'   window\.__INITIAL_STATE__\s*=initial state)errortrueCodemilziThis video may be deleted or geo-restricted. You might want to try a VPN or a proxy server (with --proxy)Texpected	videoData	videoInfor   r1  z*https://api.bilibili.com/x/player/pagelistFjsonp)r   r  zExtracting videos in anthology)r/  r   r   r  r   expected_typer   pc                     d d| d    S )Nhttps://www.bilibili.com/video/z?p=pager9   )r[  r   s    r0   r=   z*BiliBiliIE._real_extract.<locals>.<lambda>  s    'FxjPSTYZ`TaSb%c r2   )iegetterz p02d partr   r  z%s_partpagesr   )r  upNameupMidvideoStatuslikesectionEpisodesc                     |d   k(  S )Nr   r9   r:   r;   r   s     r0   r=   z*BiliBiliIE._real_extract.<locals>.<lambda>  s    ai8>S r2   cover)r  r  r  r  rm   )upDatanamer  rB  stat)r  .tag_namepic)r  r  r  r  r  descpubdate)	viewCount)r  viewrM  )rq  rL  r  r  z_p%d)r]   r  r1  http_headers)rightsis_stein_gater}   )r}   __post_extractorzwindow\.__playinfo__\s*=z	play infodefaultr  rn  is_upower_exclusiveelecFullInfo	show_info
high_level	sub_titleu   ，)	from_dictr@   z. z This is a supporter-only video: u   试看accept_description.zDThis is a supporter-only video, only the preview will be extracted: )r   rM   c                      | t        d      v S )Nr4   )r   )r   rF   s    r0   r=   z*BiliBiliIE._real_extract.<locals>.<lambda>  s    qL:J$KK r2   accept_qualityc                      |       S r   r9   r:   r;   has_qns     r0   r=   z*BiliBiliIE._real_extract.<locals>.<lambda>  s    RXYZR[m r2   r  c                      |d          S r8   r9   r  s     r0   r=   z*BiliBiliIE._real_extract.<locals>.<lambda>  s    VAiL%9!9 r2   c                     |d   S Nr   r9   rL   s     r0   r=   z*BiliBiliIE._real_extract.<locals>.<lambda>  s
    Q{^ r2   r  rA   c              3   h   K   | ]*  }|j                  d        d|j                  d       d , yw)r    (rc   )Nr   )rt   fs     r0   rx   z+BiliBiliIE._real_extract.<locals>.<genexpr>  s8      -_MN155/01553E2FaH-_s   02c                 &    |j                  d       S r  r   rL   s     r0   r=   z*BiliBiliIE._real_extract.<locals>.<lambda>  s    QUU;EWAW r2   z$Dropping incompatible flv format(s) zZ since mp4 is available. To extract flv, pass --extractor-args "bilibili:prefer_multi_flv"c                 J    |d   t        j                  d      d         k(  S )Nr5   r  r   )int_configuration_arg)r:   r;   r/   s     r0   r=   z*BiliBiliIE._real_extract.<locals>.<lambda>  s'    a	lc$BYBYZlBmnoBp>q.q r2   c                     | d   S r8   r9   r   s    r0   r=   z*BiliBiliIE._real_extract.<locals>.<lambda>  s
    9 r2   )r   )r   r   multi_videor   r   r]   r:   r  rc   )r]   r1  r  rF   r"  r   r   rY   rZ   )_typeentriesr}   )rF   r}   r4  r"  r   )-	_match_idrV  _download_webpage_handle_match_valid_urlrS   rW  _search_jsonr   raise_login_requiredr	   r.   r   listr   r   r   _yes_playlistplaylist_from_matchesr  r   r   r"   r   playlist_resultry  extract_commentsr1   r   r  r   r   rD   r   r)  r  r   rI   r  r   rC   maxr  rw  r   r5  )r/   rS   r  webpageurlhinitial_stateis_festival
video_datar1  page_list_jsonis_anthologypart_idr  old_video_idr   festival_inforx  is_interactiverE   r  msgr  flv_formatsdropped_fmtsr  fragmentrF   r  r   s   `                         @@@r0   _real_extractzBiliBiliIE._real_extract}  sg   >>#&//155c8W5U$$TXX.??488,, 	))*JGUdfno'<=E%%''<=E OY]_ _ "6&{3J&{3J$V,jnnW.E% */ (l<hHw#G5w   H $/( /
 -/ 	 >*Q.hsm//dV<R@AD,>,>x,R--%Jc . e e lGr'#a^gPQkSYEZ([(a_a'bccEnnU##CA/GHIPl:1e'DEV`VdVdejVk(3 +W{mD,f{mD/1SU\]	9
 M
=. (%+?*FF[MJ1)5;-@+ 
 
 :%'+7>N"('K=!A	(
 
 J|GT6BCDIU|!D E[_&,%
* &j2MN'4''--hXw-W=[c=%mk:P[}5]^!%!6!6s!;= =
 	$!!"=wU]gk!l$ "I //#wWacdVe/fI&&y1>>/0%mnkS_bfag5hiomoJ"7K:UZ[\\^_c_o_o_q^rsC$'Gu%MX\]]<	4H#PSu3UVV##Z[^Z_`% $ ' Iv.KF"9/?A[^a]b.cd <|(()@)@3X_hlnpgq)@)rs9 ; << ''	7;&w0KLKs;/#g,>../AB#'99 -_R]-_ $_L*74WXG#B<. Q` `a +!q H k/EFG 
 !12& (1K1H'I
K $c8 &d^,AcU3%g.$,^$<!"!#WQZ^^K%@!   KNQR(!7!7#!FX\FIQh(=(=c(BTX
 
K *)--*ETR "

%immL&AN**34//#> $ 5 5c :
 	

Ks   %A'X
N)	r{  r|  r}  
_VALID_URLr#  r  float_TESTSr8  r9   r2   r0   r  r  2  s   |J = ? J%&< %#!9 :
( %9 /##%#A 8!9 :
" #D)), < F
 'm"'@0*!!$)!E"%?$@
 8 -@#i#<,& %A!; <
* ; ?%A#%&< !9 :
$ T
'. $=
.
5
 E
 	

 :
 A
 D
 /
 
 9
 	
 S
 #
 #
 <
  !; <!
$ #D)+. 3<  a#%A,&<!; <
& 'Z N#%A# $<!; <
& 'A#o#%>&$ <!9 :
  $j3Ev2N%OP)s#	
 +< (< P#%R % <!: ;
* /= `#%A,$ <!; <
  .w')E0"(!$!!@%?$@
 )'P /<W*$ I"! #%<
* <<
.
5
 ;
 D	

 A
 
 :
 
 
 <
 S
 #
 #
 <
 
  !; <!
$ #D)--0 > w

 ' > @

 ! > K

 ! <ME
FFP
]
r2   r  c                       e 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/d0dd"d#d$d%d&d1d0d2d3d4d5d6dddgZd7 Zy8)9rX  z;https?://(?:www\.)?bilibili\.com/bangumi/play/ep(?P<id>\d+)z.https://www.bilibili.com/bangumi/play/ep21495/21495r  u   悠久之翼774	   第二季1182r   u   forever／efr   u   12 forever／efgl)3@i(N20111104r  r]   r^   r  r  r  rP  r  r  r  r  r1  r}   rL  r  r  r  znew playurlSSRData schemez.https://www.bilibili.com/bangumi/play/ep678060678060u   去你家吃饭好吗619842542u6   吴老二：你家大公鸡养不熟，能煮熟吗…r   uI   一只小九九丫 吴老二：你家大公鸡养不熟，能煮熟吗…gp@i/$c20220916r  z.https://www.bilibili.com/bangumi/play/ep267851267851   鬼灭之刃4358u	   立志篇26801r   u   残酷u   1 残酷g/$E@i ͨ\20190406zGeo-restrictedr  z,a making-of which falls outside main sectionz.https://www.bilibili.com/bangumi/play/ep345120345120u   炭治郎篇r   u   #1 炭治郎篇gt@i䛉_20201016c                 ~   | j                  |      | j                         }| j                  ||      }d|v rt        d      d|v r| j	                  d       ||d<   | j                  d|dd	d 
      xs | j                  dddd|      }t        |dddd ddt        ht        f      }|j                  d      dk(  }t        |ddt        ht        f      xs i }| j                  |      }|s.|r| j                          n|sd|v sd|v r| j	                  d       t        |dt        d hf      r"| j                  d| j                                 | j                  dd d!i|      d"   }	t!        fd#t#        t        |	d$d%t        hf      d&      D        d&i f      \  }
|	j                  d'      xr( t!        fd(t#        t        |	d)            D        d*      \  }}|
j                  d+      }|d,t        |	d-d.t$        hfd-d/t&        hfd0t(        hfd1      t        |
d2t$        hfd3t*        hfd4hfd5t*        hfd6 hd7      t'        |      t'              |t-        |j                  d8      d9:      | j/                  |
j                  d;      |<      | j1                  |      d|id=S )>Nr  u$   您所在的地区无法观看本片zThis video is restrictedu-   正在观看预览，大会员免费看全片z&This video is for premium members onlyr'   zplayurlSSRData\s*=zembedded page infor
  )end_patternr  z2https://api.bilibili.com/pgc/player/web/v2/playurlzExtracting episodei/  )r  ep_idrl  rawr   pluginsc                     |d   dk(  S )Nr  AreaLimitPanelr9   rL   s     r0   r=   z1BiliBiliBangumiIE._real_extract.<locals>.<lambda>  s    1V9@P3P r2   configis_blockcodei])rQ  )rQ  r   r+  u   成为大会员抢先看u   开通大会员观看))rQ  
play_checkplay_detail)rQ  r   play_video_typec                 
    | dv S )N)PLAY_PREVIEWpreviewr9   r   s    r0   r=   z1BiliBiliBangumiIE._real_extract.<locals>.<lambda>  s    1 ;; r2   z\Only preview format is available, you have to become a premium member to access full video. z,https://api.bilibili.com/pgc/view/web/seasonzGet episode detailsrP  rQ  c              3   f   K   | ](  \  }}t        |j                  d             k(  r||f * yw)r]   N)r   r.   )rt   r  epr  s      r0   rx   z2BiliBiliBangumiIE._real_extract.<locals>.<genexpr>  s6      -8!#r266$<(J6 "I-8s   .1)rS  )section.rS  .r   rP  c              3   x   K   | ]1  \  }}|j                  d       k(  r|dz   |j                  d      f 3 yw)rP  r   season_titleNr   )rt   r  erP  s      r0   rx   z2BiliBiliBangumiIE._real_extract.<locals>.<genexpr>  s@      :
17auu[!Y. 1WaeeN+,:
s   7:)seasons.rz  r  )r]   rF   r  series_titler  square_cover)r  r  r  
long_titler1  c                     | xs S r   r9   )r   r  s    r0   r=   z1BiliBiliBangumiIE._real_extract.<locals>.<lambda>  s    aFY> r2   pub_timec                 (    | xr t        ddd|       S )Nr1  rg  r  r@   r  r   r;   s    r0   r=   z1BiliBiliBangumiIE._real_extract.<locals>.<lambda>  s    A$f-UXde*f r2   )r  r  rL  r1  r   rY   rZ   r   r  )r  r  rP  r  r}   r"  r   r  )r  rV  _download_webpager
   r"  r!  r   r   r,   anyr.   r   r   raise_geo_restrictedr)  rD   rr  r  r   r   r"   r   r   rw  r'  )r/   rS   r  r)  rE   geo_blockedpremium_onlyr+  rF   bangumi_infoepisode_infor  rb  r  r  r  rP  s                 @@@r0   r8  zBiliBiliBangumiIE._real_extractq  s{   ^^C(
//1((j'(J1W<$%?@@<G%%&NO 	 %w0Dj $  0 ! ""Dj$ej,Q # !	 	 #969&PRZ\fimhnps/u v }}V,6!).I<Z^Y_ad-efljl
&&z2))+!;w!FJaelJl))*RS	 %
 ;<$> ? MMQM]M]M_L`bc **:JH]J' + ::BD (, -8%.|I3QUPVW0YZ[&]-8 ;<R(B$
 !$$[1	&/ 'D :
;D\+;<<>:
 	5#| u% 
 <#^cU;&k]C,{m<* 
 <(3%0#*[M<Y;Z"[(;-8fg	* 
 %!,/$Y/*%jnn\&B$O//
L<L<LU<SY\/] $ 5 5c :&,+
 	
r2   Nr{  r|  r}  r9  r;  r8  r9   r2   r0   rX  rX    s   OJ @$!%! & #%<
( ,?-! O" `#%<
* @$! " #%<
" !'* ??$! %" & #%<
wOFbR
r2   rX  c                   f    e 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igdgZd Zy) BiliBiliBangumiMediaIEz<https?://(?:www\.)?bilibili\.com/bangumi/media/md(?P<id>\d+)z1https://www.bilibili.com/bangumi/media/md2409789124097891zCAROLE & TUESDAYz$md5:42417ad33d1eaa1c93bfd2dd1626b829r]   r1  rq  r   rS   r  playlist_mincountz.https://www.bilibili.com/bangumi/media/md1565/1565u   攻壳机动队 S.A.C. 2nd GIGz$md5:46cac00bafd645b97f4d6df616fc576dr   r  68540r  u   攻壳机动队1077r?  r   u   再启动 REEMBODYr   u   1 再启动 REEMBODYgSח@iT20150227r  rB  rS   r  r  r  c                    | j                  |      }| j                  ||      }| j                  d|d|      }|d   d   } | j                  | j	                  ||      |fi t        |ddt        hfdt        hfdf      S )Nr  r+  	mediaInforP  r1  evaluater1  rq  )r  ro  r!  r&  r\  r   r   )r/   rS   media_idr)  r+  rY  s         r0   r8  z$BiliBiliBangumiMediaIE._real_extract  s    >>#&((h7)),gRk*;7#t##**5#6=;!C5) *SE29 +  	r2   Nrv  r9   r2   r0   rx  rx    s    PJB'A

   @5A

 +#%#!"/%"#/$')@
 #FJr2   rx  c                   f    e 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igdgZd Zy)BiliBiliBangumiSeasonIEz?(?x)https?://(?:www\.)?bilibili\.com/bangumi/play/ss(?P<id>\d+)z-https://www.bilibili.com/bangumi/play/ss26801rJ  rH  z$md5:e2cc9848b6f69be6db79fc2a82d9661brz  r   r{  z,https://www.bilibili.com/bangumi/play/ss22512251u   玲音z$md5:1fd40e3df4c08d4d9d89a6a34844bdc4r   r  50188r  1526TVr   WEIRDz1 WEIRDgs@i`P20120725r  rB  r  c                     | j                  |      }| j                  ||      }t        | j                  d|d|      dddt        hfdt        hfdfd	      } | j
                  | j                  ||      |fi |S )
Nz-<script[^>]+type="application/ld\+json"[^>]*>infoitemListElement.r  rq  r  Frm   )r  ro  r   r!  r   r&  r\  )r/   rS   rY  r)  rx  s        r0   r8  z%BiliBiliBangumiSeasonIE._real_extract$  s    s#((e4NPWY_afg 3% -u5&   $t##D$B$B5#$NPUbYabbr2   Nrv  r9   r2   r0   r  r    s    SJ>#A

   >A

 "##!""%"#"$')@
 #FJ
cr2   r  c                       e Zd Zd Zd Zy)BilibiliCheeseBaseIEc                    t        |dfdfd      }|d   |d   }}t        |d      dk(  rt        d	d
      t        |d      s| j                  d       | j                  d||ddd| j                  d      d   }t              t              | j                  |      t        j                         t        j                  d dt        |dt        hfd hdt        hfdt        hfdt        hfdt        hfdt        hfdt        hfd      t        |d d!t        hfd d"t
        hfd#      | j                  ||$      | j                  |      | j                  d%S )&NrS  c                 &    |d   t              k(  S )Nr]   )r  )r:   r;   rP  s     r0   r=   z7BilibiliCheeseBaseIE._extract_episode.<locals>.<lambda>4  s    QtWE
%: r2   Frm   r  r   	ep_statusr  z)This course episode is not yet available.Tr  playablez8You need to purchase the course to download this episodez0https://api.bilibili.com/pugv/player/web/playurlr   r   )avidr   rP  r  fourkzDownloading playinfor  r   z'https://www.bilibili.com/cheese/play/ep)r]   r  rF   extractor_key	extractorwebpage_urlr1  c                 (    | xr t        ddd|       S )Nindexr1  ro  rk  rl  rm  s    r0   r=   z7BilibiliCheeseBaseIE._extract_episode.<locals>.<lambda>J  s    A$c-PUab*c r2   r!  r}   r  r  release_dateplay)r  r1  	alt_titler}   r  r  rL  r  up_infor@  rB  )r  r  rn  )r"  r   r  )r   r	   r"  r   r(  r   r   BilibiliCheeseIEie_keyIE_NAMEr   r   r"   rw  r'  )r/   rZ  rP  ru  r  r   rE   s     `    r0   _extract_episodez%BilibiliCheeseBaseIE._extract_episode2  s   #K:2<EJL&U(;Sk2b8 !LW[\\L*5%%&`a''>sURRSTMM(> ( @ AGH	 e$%e,++I6-446)11DUGL
 <#cU+cd(3%0'+7#*[M":%}5,{m<%}5	* 	
" ;&#7 )5;-@) #
* //s/D $ 5 5c : MM/
 	
r2   c                 R    | j                  d| d| || j                  d      d   S )Nz.https://api.bilibili.com/pugv/view/web/season?=rO  )r  r   r   )r   r(  )r/   	query_keyr   s      r0   _download_season_infoz*BilibiliCheeseBaseIE._download_season_info[  sB    ""<YKq
SU]MM(A # CCIK 	Kr2   N)r{  r|  r}  r  r  r9   r2   r0   r  r  1  s    '
RKr2   r  c                   @    e Zd ZdZdddddddd	dd
ddddeddgZd Zy)r  z:https?://(?:www\.)?bilibili\.com/cheese/play/ep(?P<id>\d+)z-https://www.bilibili.com/cheese/play/ep229832229832r     1 - 课程先导片   视频课 · 3分41秒	   马督工	316568752   课程先导片r      e20230924r  r]   r^   r1  r  r  r  r  r  r  r}   rL  r  r  r  r  c                 h    | j                  |      }| j                  | j                  d|      |      S )NrP  )r  r  r  )r/   rS   rP  s      r0   r8  zBilibiliCheeseIE._real_extractw  s1    s#$$T%?%?%OQVWWr2   N)r{  r|  r}  r9  r  r;  r8  r9   r2   r0   r  r  a  sK    NJ>*5#&("#%<
 F(Xr2   r  c                   p    e Zd ZdZdddddddd	d
ddddddddddedigddidddddddddgZd Zd Zy)BilibiliCheeseSeasonIEz:https?://(?:www\.)?bilibili\.com/cheese/play/ss(?P<id>\d+)z+https://www.bilibili.com/cheese/play/ss59185918uB   【限时五折】新闻系学不到：马督工教你做自媒体u?   帮普通人建立世界模型，降低人与人的沟通门槛rz  r  r  r  r  r  r  r  r  r   r  r  r  r  r  playlist_items1)rS   r  r  r   r   zpaid video in listrS   r  r|  r  c              #   ^   K   t        |dd df      D ]  }| j                  ||        y w)NrS  c                     |d   S )Nepisode_can_viewr9   rL   s     r0   r=   z<BilibiliCheeseSeasonIE._get_cheese_entries.<locals>.<lambda>  s    K]I^ r2   r]   )r   r  )r/   rZ  rP  s      r0   _get_cheese_entriesz*BilibiliCheeseSeasonIE._get_cheese_entries  s8     !+
<^`d/ef 	<E''U;;	<s   +-c           
          | j                  |      }| j                  d|      } | j                  | j                  |      |fi t	        |dt
        hfdt
        hfd      S )NrP  r1  r!  r  )r  r  r&  r  r   r   )r/   rS   rP  rZ  s       r0   r8  z$BilibiliCheeseSeasonIE._real_extract  so    NN3'	00iH#t##$$[19;!C5) *SE2)  	r2   N)r{  r|  r}  r9  r  r;  r  r8  r9   r2   r0   r  r  |  s    NJ<Y\
 .9'*,&"#')@!
 $ $S)36 =Y\

 $	5#FJ<	r2   r  c                       e Zd Zd Zy)BilibiliSpaceBaseIEc                 `     d       |      }t        fd|d   |d         }||fS )Nr   c                 0     | r |             S       S r   r9   )r  
fetch_page
first_pageget_entriess    r0   r=   z7BilibiliSpaceBaseIE._extract_playlist.<locals>.<lambda>  s    sJsOK 
K r2   
page_count	page_size)r   )r/   r  get_metadatar  metadata
paged_listr  s    ` `  @r0   _extract_playlistz%BilibiliSpaceBaseIE._extract_playlist  s?    ]

+'K\"H[$9;
 ##r2   N)r{  r|  r}  r  r9   r2   r0   r  r    s    $r2   r  c                   6    e Zd ZdZdddidddddid	dgZd
 Zy)BilibiliSpaceVideoIEzShttps?://space\.bilibili\.com/(?P<id>\d+)(?P<video>(?:/upload)?/video)?/?(?:[?#]|$)z(https://space.bilibili.com/3985676/videor]   3985676   r{  z*https://space.bilibili.com/313580179/video	313580179\   c                       j                        j                  dd      \  }|s j                  d        fd}d } fd} j                  |||      \  }} j	                  |      S )Nr]   ru   z{A channel URL was given. Only the channel's videos will be downloaded. To download audios, add a "/upload/audio" to the URLc                    dt        t              d      xs ddd| dz   ddd	d
t        j                  dj	                  t        j                  t        j                  t        j                  dd                  j                               d d j                         t        j                  dj	                  t        j                  t        j                  t        j                  dd                  j                               d d j                         dd}	 j                  dj                  |      d|  di      }|d   }|dk(  rt        dd      |dk(  rt        dd      |dk7  r$t        d | d!|j'                  d"      xs d#       |d$   S # t        $ rF}t        |j                   t"              r&|j                   j$                  dk(  rt        dd       d }~ww xY w)%Nr   )orderr   r  truewebr   r(   r   i z[]r   @   )r   r      z0{"ds":[],"wh":[6093,6631,31],"of":[430,760,380]})keywordrB  r  order_avoidedplatformpnpstidweb_locationdm_img_list
dm_img_strdm_cover_img_strdm_img_interz/https://api.bilibili.com/x/space/wbi/arc/searchzDownloading space page r'   r  i  z>Request is blocked by server (412), please wait and try later.Tr  rW  ioz>Request is blocked by server (401), please wait and try later.iz#Request is rejected by server (352)zRequest failed (z): rE  zUnknown errorr   )r   r   base64	b64encoder   randomre  string	printablerandintr   decoder   r   r	   
isinstancecauser   statusr.   )page_idxr   responserc  status_codeplaylist_idr/   rS   s        r0   r  z6BilibiliSpaceVideoIE._real_extract.<locals>.fetch_page  s   "%hsm\BOi!'!l '#$..GGFNN6+;+;v~~bRT?UVW^^`bbeceggmgmgo$*$4$4GGFNN6+;+;v~~bRU?VWX__a%ccfdf%hhnhnhp RE$	..E{..<28*=	SVGW / Y #6*Kd"$T_ce e$$%JUYZZ!$'7}CU^H_HrcrGs%tuuF## " aggy1aggnn6K(Xcgi i	s   +F 	G.(AG))G.c                 X    | d   d   }| d   d   }t        j                  ||z        |dS )Nr  r  r9  r  r  )mathceil)	page_datar  entry_counts      r0   r  z8BilibiliSpaceVideoIE._real_extract.<locals>.get_metadata  s>    !&)$/I#F+G4K"iii(?@& r2   c              3   |   K   t        | d      xs g D ]$  }j                  d|d    t        |d          & y w)N)r#  vlistr  r   )r   rW  r  r  r[  r/   s     r0   r  z7BilibiliSpaceVideoIE._real_extract.<locals>.get_entries  sL     %i1BCIr too(Gf&WYcejkqerssts   9<)r   grouprC   r  r&  )	r/   rS   is_video_urlr  r  r  r  r  r  s	   ``      @r0   r8  z"BilibiliSpaceVideoIE._real_extract  s{    $($9$9#$>$D$DT7$S!\NN R S%	$N		t  $55j,P[\*##J<<r2   Nrv  r9   r2   r0   r  r    sC    gJ9)
 ! <+
  F:=r2   r  c                   (    e Zd ZdZdddiddgZd Zy)	BilibiliSpaceAudioIEz;https?://space\.bilibili\.com/(?P<id>\d+)/(?:upload/)?audioz1https://space.bilibili.com/313580179/upload/audior]   r  r   r{  c                       j                  |       fd}d } fd} j                  |||      \  }} j                  |      S )Nc                 L    j                  dd|  | dz   dddd      d   S )	Nz;https://api.bilibili.com/audio/music-service/web/song/upperDownloading page r   r(   r  )uidr  r  r  r  r   r   r   r   )r  r  r/   s    r0   r  z6BilibiliSpaceAudioIE._real_extract.<locals>.fetch_page  sM    &&M{(
3)ARRS^ef ' h iop pr2   c                     | d   | d   dS )N	pageCountpageSizer  r9   )r  s    r0   r  z8BilibiliSpaceAudioIE._real_extract.<locals>.get_metadata  s    '4&z2 r2   c              3      K   | j                  d      xs g D ]$  }j                  d|d    t        |d          & y w)Nr   !https://www.bilibili.com/audio/aur]   )r.   rW  BilibiliAudioIEr  s     r0   r  z7BilibiliSpaceAudioIE._real_extract.<locals>.get_entries%  sN     "v.4" woo(I%PT+&WYhjoptjuvvws   >A)r  r  r&  )r/   rS   r  r  r  r  r  r  s   `      @r0   r8  z"BilibiliSpaceAudioIE._real_extract  sQ    nnS)	p		w
  $55j,P[\*##J<<r2   Nrv  r9   r2   r0   r  r    s*    OJB+
  F=r2   r  c                   ,     e Zd ZddZd Z fdZ xZS )BilibiliSpaceListBaseIEc              #      K   t        |g t        |t        t        t        t
        f      d|t        h      D ]  }| j                  d| t        |         y w)N.r  )r   r$   r   bytesr   rB   rW  r  )r/   r  	bvid_keys
ending_keyr   s        r0   _get_entriesz$BilibiliSpaceListBaseIE._get_entries/  sf      ,shy3tUXBY.Z,s\_,sak,snqmr,st 	^D//$CD6"JJX\]]	^s   AAc                 Z    | j                  d| |d      }| j                  d|dd      S )Nzhttps://space.bilibili.com/Fr/  u)   (?s)<title\b[^>]*>([^<]+)的个人空间-r  )ro  _search_regex)r/   r  r  r)  s       r0   _get_uploaderz%BilibiliSpaceListBaseIE._get_uploader3  s@    ((+Fse)Lkaf(g!!"NPWYckp!qqr2   c                 |    t         |   |||      \  }}|j                  dd        |j                  dd        ||fS )Nr  r  )superr  r  )r/   r  r  r  r  	page_list	__class__s         r0   r  z)BilibiliSpaceListBaseIE._extract_playlist7  sC    #g7
LR]^)\4([$'""r2   )r   )r{  r|  r}  r  r  r  __classcell__r  s   @r0   r  r  .  s    ^r# #r2   r  c            
       f     e Zd ZddgZddddddeed	d
ddddddddgZe fd       Zd Z	 xZ
S )BilibiliCollectionListIEzWhttps?://space\.bilibili\.com/(?P<mid>\d+)/channel/collectiondetail/?\?sid=(?P<sid>\d+)z=https?://space\.bilibili\.com/(?P<mid>\d+)/lists/(?P<sid>\d+)z<https://space.bilibili.com/2142762/lists/3662502?type=season2142762_3662502u)   合集·《黑神话悟空》流程解说u   黑神话悟空 相关节目u   老戴在此2142762zThttps://archive.biliimg.com/bfs/archive/22302e17dc849dd4533606d71bc89df162c3a9bf.jpg)r]   r1  rq  r  r  rL  r  r  r   r{  z0https://space.bilibili.com/2142762/lists/3662502TrS   r  zEhttps://space.bilibili.com/2142762/channel/collectiondetail?sid=57445c                 P    t         j                  |      rdS t        |   |      S )NF)BilibiliSeriesListIEsuitabler  )clsrS   r  s     r0   r'  z!BilibiliCollectionListIE.suitableX  s&    ,55c:uU@PQT@UUr2   c                     	  j                        j                  dd      \  	 d	  	fd} fd} fd} j                  |||      \  }}  j                  |fi |S )NrB  sidr:   c                 P    j                  dd|  di| dz   dd      d   S )	NzBhttps://api.bilibili.com/x/polymer/web-space/seasons_archives_listr  r'   r   r(   )rB  rP  page_numr  r   r  r   r   r  r  rB  r  r/   r*  rS   s    r0   r  z:BilibiliCollectionListIE._real_extract.<locals>.fetch_page`  sS    &&T$5hZ"@9VYJZ!A\^_ ' a bhi ir2   c                     | d   d   }| d   d   }t        j                  ||z        |j                        dt        | ddt        hfddt        hfddt
        hfdd	t        hfdd
t        hfd      S )Nr  r  totalr  r  r  metar  rq  rB  ptimer  )r1  rq  r  rL  r  )r  r  r  r   r   r   r   r"   )r  r  r  rB  r  r/   s      r0   r  z<BilibiliCollectionListIE._real_extract.<locals>.get_metadataf  s    !&)+6I#F+G4K"iii(?@& ..sK@ y$fse4$*MC5#A$*EK=#A"('K=!A"('K=!A+ 	 r2   c                 (    j                  | d      S Narchivesr  r  r/   s    r0   r  z;BilibiliCollectionListIE._real_extract.<locals>.get_entriesv      $$Y
;;r2   )r   r  r  r&  )
r/   rS   r  r  r  r  r  rB  r  r*  s
   ``     @@@r0   r8  z&BilibiliCollectionListIE._real_extract\  s    ((-33E5ASQsen	i 	i	 	<  $55j,P[\*#t##JHxHHr2   )r{  r|  r}  r9  r  r   r;  classmethodr'  r8  r  r  s   @r0   r!  r!  >  s|    bHJ
 N#@9&$o	
   B W!F* V VIr2   r!  c                   D    e Zd ZddgZdddddddd	eed
	dddddgZd Zy)r&  zUhttps?://space\.bilibili\.com/(?P<mid>\d+)/channel/seriesdetail/?\?\bsid=(?P<sid>\d+)zahttps?://space\.bilibili\.com/(?P<mid>\d+)/lists/(?P<sid>\d+)/?\?(?:[^#]+&)?type=series(?:[&#]|$)z>https://space.bilibili.com/1958703906/lists/547718?type=series1958703906_547718   直播回放
   靡烟miya
1958703906=a20211127)	r]   r1  rq  r  r  rL  r  modified_timestampmodified_date  r{  zMhttps://space.bilibili.com/1958703906/channel/seriesdetail?sid=547718&ctype=0Tr$  c                    	
  j                        j                  dd      \  
 d
 t         j                  d
 d      ddd	t        hfddd
t        hfdddt
        hfdddt        hfdddt        hfd      	 
fd}	 fd} fd} j                  |||      \  }}  j                  |fi |S )NrB  r*  r:   z3https://api.bilibili.com/x/series/series?series_id=Fr  r   r2  r  rq  rF  mtime)r1  rq  r  rL  rB  c                 P    j                  dd|  di| dz   dd      d   S )	Nz*https://api.bilibili.com/x/series/archivesr  r'   r   r(   )rB  r  r  r  r-  r   r  r.  s    r0   r  z6BilibiliSeriesListIE._real_extract.<locals>.fetch_page  sR    &&<$5hZ"@9VYJZ!8a<rR ' T U[\ \r2   c                     | d   d   }| d   d   }t        j                  ||z        |j                        dS )Nr  r\   r0  r1  )r  r  r  )r  r  r  rB  r  playlist_metar/   s      r0   r  z8BilibiliSeriesListIE._real_extract.<locals>.get_metadata  sY    !&)&1I#F+G4K"iii(?@& ..sK@  	 r2   c                 (    j                  | d      S r5  r7  r8  s    r0   r  z7BilibiliSeriesListIE._real_extract.<locals>.get_entries  r9  r2   )	r   r  r   r   r   r   r   r  r&  )r/   rS   r  r  r  r  r  rB  r  rI  r*  s   ``     @@@@r0   r8  z"BilibiliSeriesListIE._real_extract  s    ((-33E5ASQsen$T%8%8A#G\a &9 &
 ffse4"FMC5A"FEK=A &'K=A#)67[M"J
	\ 	\		<  $55j,P[\*#t##JHxHHr2   Nr{  r|  r}  r9  r  r   r;  r8  r9   r2   r0   r&  r&  }  sZ    `lJ
 P%#)$'#%"% 

 ! _F&!Ir2   r&  c                   F    e Zd ZdZdddddddd	eed
eeddddddgZd Zy)BilibiliFavoritesListIEzlhttps?://(?:space\.bilibili\.com/\d+/favlist/?\?fid=|(?:www\.)?bilibili\.com/medialist/detail/ml)(?P<id>\d+)zDhttps://space.bilibili.com/84912/favlist?fid=1103407912&ftype=create
1103407912   【V2】（旧）r      晓月春日84912_20201109Sre:http://i\d\.hdslb\.com/bfs/archive/14b83c62aa8871b79083df1e9ab4fbc699ad16fe\.jpg)r]   r1  rq  r  r  rL  r  rB  rC  r  r  r  r   r{  z6https://www.bilibili.com/medialist/detail/ml1103407912Tr$  c                    | j                  |      }| j                  d| d|d      }|d   dk(  r| j                  d       | j                  | j                  d	| |d
      d      } | j                  ||fi t        |dddt        hfdt        hfddt        hfd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	f      S )Nz9https://api.bilibili.com/x/v3/fav/resource/list?media_id=z&pn=1&ps=20zDownloading favlist metadatar   rW  r  zAThis is a private favorites list. You need to log in as its ownerr4  z8https://api.bilibili.com/x/v3/fav/resource/ids?media_id=zDownload favlist entriesr   r  r1  introupperr  rB  rF  rF  r  cnt_infor  thumb_up)	r1  rq  r  r  rL  rB  r  r  r  )
r  r   r"  r  r&  r   r   r   r   r"   )r/   rS   fid	list_infor  s        r0   r8  z%BilibiliFavoritesListIE._real_extract  s)   nnS!''GuKX4 ( 6	 V$%%*m%n##D$7$7FseL0 %8 %239; $t##GS 
LVU[u%#cU+ &3%0#U[M:!K=1#*[M":!K=1%v}=%zK=A
^
 
M 
5 
 
	r2   NrK  r9   r2   r0   rM  rM    sZ     AJU(&"#%"% o
  !$ H#F,r2   rM  c                   ,    e Zd ZdZdddddddgZd	 Zy
)BilibiliWatchlaterIEz7https?://(?:www\.)?bilibili\.com/watchlater/?(?:[?#]|$)z*https://www.bilibili.com/watchlater/#/listzre:\d+   稍后再看r  r   r  r  c                     t        | j                  |      j                  d      dd      }| j                  d|      }|d   dk(  r| j	                  d       | j                  |d	      }| j                  ||d
      S )N
DedeUserIDvalue
watchlaterz<https://api.bilibili.com/x/v2/history/toview/web?jsonp=jsonprW  iz0You need to login to access your watchlater listrV  )r   r#  r_  r  )getattrr-   r.   r   r"  r  r&  )r/   rS   list_idwatchlater_infor  s        r0   r8  z"BilibiliWatchlaterIE._real_extract  s    $++C044\BG\Z--JGU6"d*%%*\%]##O5EF##G~#NNr2   Nrv  r9   r2   r0   r^  r^    s/    KJ;#
   FOr2   r^  c                       e 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eeeedgdddiddddid
ddddd d!d"d#d$d%d&d'dd(ddid'ddd)d*d+eed,d-d.dd/dd0id-d1dgZd2 Zd3 Z	y4)5BilibiliPlaylistIEzDhttps?://(?:www\.)?bilibili\.com/(?:medialist/play|list)/(?P<id>\w+)z3https://www.bilibili.com/list/1958703906?sid=5477185_547718r=  r>  r?  r@  rA  )r]   r1  r  r  rL  r  rD  r{  zShttps://www.bilibili.com/list/1958703906?sid=547718&oid=687146339&bvid=BV1DU4y1r7tzBV1DU4y1r7tzr  uB   【直播回放】8.20晚9:30 3d发布喵 2022年8月20日21点场20220820r   i
cr  g%s@zbilibili 687146339_part1r  
noplaylistTr  zbhttps://www.bilibili.com/medialist/play/1958703906?business=space_series&business_id=547718&desc=1r]   zredirect urlr  z*https://www.bilibili.com/list/ml11034079123_1103407912rO  rP  rQ  rR  rS  rT  )r]   r1  r  r  rL  r  r  r   z4https://www.bilibili.com/medialist/play/ml1103407912z(https://www.bilibili.com/list/watchlaterzre:2_\d+r_  )r]   r1  r  r  r   r  z2https://www.bilibili.com/medialist/play/watchlaterrc  zredirect url & login requiredc           
   #     K   t        j                  d      D ]b  }| j                  d||d|d    d|       d   }| j                  |dd	
      E d {    t	        |d      |d<   |j                  dd      rb y  y 7 *w)Nr   z5https://api.bilibili.com/x/v2/medialist/resource/listzgetting playlist biz_idz page r`  r   
media_listbv_id)r  )rp  r  r]   oidhas_moreF)r8  r9  r   r  r   r.   )r/   r   re  r,  r  s        r0   _extract_medialistz%BilibiliPlaylistIE._extract_medialistM  s     !* 	H++Gu->uX>OvV^U_+` ,  I ((LW(UUU'	3KLE%L==U3	
 Vs   AB A>%B :B c                    | j                  |      }t        t        |      d      }| j                  ||      s| j	                  d| t
              S | j                  ||      }| j                  d|d|      }t        |dt        d t        f      }|r~|d   dk7  rv|j                  d	      }|d
k(  r|dk(  r| j                  d       n)|dk(  r| j                  d       n|dk(  rt        dd      t        d| d|j                  d             dddt        |ddt        hfddt        hfdt        hfdt        hfdt        ht        ht         j"                  hfd      }d|d    d |d!    it        |d"d#t         hfd$d%t         hfd$d&t        hfd't        ht$        fd(t&        hfd)f      }	 | j(                  | j+                  ||      fi |	S )*N)r   r   r  r  r  )r  	listErrorc                     |d   S )NrW  r9   rL   s     r0   r=   z2BilibiliPlaylistIE._real_extract.<locals>.<lambda>a  s    WXY_W` r2   rW     r  iprc  z4You need to login to access your watchlater playlistr  z:This is a private playlist. You need to login as its owneri+  zPlaylist is no longer availableTr  zCould not access playlist: r  rE  r   F)r  with_currentr  typer]   r  	sortFiledr  )rz  ro  r  
sort_fieldr  r:   ro  mediaListInfor1  rX  r  rB  rF  r  )r1  r  r  rL  r  )r  r   r   r$  rW  r  ro  r!  allrp  r.   r"  r	   r   r   r   r   r   r   r"   r&  rt  )
r/   rS   re  r   r)  r+  r  
error_coder   r  s
             r0   r8  z BilibiliPlaylistIE._real_extractX  s   ..%HSM;7!!'40??%DTF#KZXX((g6))*JGUdfmn]-CSJ`be,fgU6]c):.JT!g&=))*`at#))*fgu$$%FQUVV #>zl!EIIV_L`Ka!bcc !

 =#Vk];%tk];}-*[M:,+L+ 

 U6]O1U8_$56	
=?!C5)$fse4 '>%}f=%}5= + 	
 $t##D$;$;E7$KXxXXr2   N)
r{  r|  r}  r9  r#  r  r   r;  rt  r8  r9   r2   r0   rh  rh    s)   XJD#$'#%
 ! e Y%#'$<  !; <
"  &'* t*
 ! < (&"#%o
   F.
   :#	
  
 DL)/	GHFT	)Yr2   rh  c                   D    e Zd ZdZdZdZdddddddid	gZd
 Zd Zd Z	y)BilibiliCategoryIEzBilibili category extractori@B z7https?://(?:www\.)?bilibili\.com/v/[a-zA-Z]+\/[a-zA-Z]+z&https://www.bilibili.com/v/kichiku/madzkichiku: madr  r   playlistend)rS   r  r|  r   c           	   #      K   | j                  ||||dd| d|       }t        |dt              }|st        d|       |D ],  }| j	                  dj                  |d	         d
|d	          . y w)N
Search_keyr  Extracting results from page z of r`  )r   r6  r  z'Failed to retrieve video list for page z!https://www.bilibili.com/video/{}r   BiliBili)r   r   r#  r	   rW  rq   )r/   api_url	num_pagesr   r,  parsed_json
video_listru   s           r0   _fetch_pagezBilibiliCategoryIE._fetch_page  s     ))Uh"G0
$ykJ * L "+/CSWX
 #J8*!UVV 	fE//3::5=I:W\]cWdf f	fs   A3A5c           	      L   dddddddi}||vr(t        d| d	t        |j                                      |||   vr+t        d
| dt        ||   j                                      ||   |   }d|z  }| j                  |||dd      }t	        |dt
              }t        |j                  d            t        |j                  d            }
}	|	|
st        d      t        j                  |	|
z        }t        t        j                  | j                  |||      |
      S )Nkichikur   rk   r         )madmanual_vocaloidguidetheatrecoursezThe category z( isn't supported. Supported categories: zThe subcategory z= isn't supported for this category. Supported subcategories: zPhttps://api.bilibili.com/x/web-interface/newlist?rid=%d&type=1&ps=20&jsonp=jsonpr  r  r   )r   r  r  r9  r\   z-Failed to calculate either page count or size)r	   r#  keysr   r   r   r   r.   r  r  r   	functoolspartialr  )r/   categorysubcategoryr   rid_map	rid_valuer  	page_jsonr  r9  r\   r  s               r0   _entrieszBilibiliCategoryIE._entries  s    #&
 7" z)RSWX_XdXdXfSgRhik kgh// ";-/mnrsz  |D  tE  tJ  tJ  tL  oM  nN  OP PH%k2	dgpp''UZ]>^'_	 ,<DQ	!)--"89;y}}U[G\;]t= !PQQIIedl+	 !2!2gy%"9:>@ 	@r2   c                     t         j                  j                  |      j                  j	                  d      dd \  }}| d| }| j                  | j                  |||      ||      S )Nr   r   r   : )r   r   urlparsepathsplitr&  r  )r/   rS   r  r  r   s        r0   r8  z BilibiliCategoryIE._real_extract  sg     & 5 5c : ? ? E Ec J1Q O+*B{m,##DMM(K$OQVX]^^r2   N)
r{  r|  r}  r  _MAX_RESULTSr9  r;  r  r  r8  r9   r2   r0   r  r    sM    +GLKJ7 #
  2

 
Ff@@_r2   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dddeeeddgdigdgZd Z	y)BiliBiliSearchIEzBilibili video searchi 
bilisearchuX   bilisearch3:靡烟 出道一年，我怎么还在等你单推的女人睡觉后开播啊r   uL   靡烟 出道一年，我怎么还在等你单推的女人睡觉后开播啊r  r  BV1n44y1Q7scr  um   “出道一年，我怎么还在等你单推的女人睡觉后开播啊？”【一分钟了解靡烟miya】ic20221201z$md5:43343c0973defff527b5a4b403b4abf9r>  gDl^@r?  r  zbilibili 988222410_part1r  )rS   r  r  r  c              #     K   | j                  d      j                  d      s(| j                  ddt        j                          d       t        j                  d      D ]f  }| j                  d|d| |||dd	dd
dd	dd
      d   j                  d      }|s y |D ]&  }| j                  |d   dt        |d                ( h y w)Nr*   buvid3z.bilibili.cominfocr   z4https://api.bilibili.com/x/web-interface/search/typer  r   r   r  ru   )
r  r  r  contextr}   tids_2__refresh__search_typetids	highlightr  r   rQ  arcurlr  r  )
r-   r.   _set_cookieuuiduuid4r8  r9  r   rW  r   )r/   r   r,  videosru   s        r0   _search_resultsz BiliBiliSearchIE._search_results  s       !;<@@J_h4::<.8NO!* 	VH((F4XJ?"'$$! ! #)#*!"H )   3x=   VooeHoz3uU|CTUUV#	Vs   CC
N)
r{  r|  r}  IE_DESCr  _SEARCH_KEYr#  r  r;  r  r9   r2   r0   r  r    s{    %GLKi`c

 $ I')E(#+!$!!@%?$@
  F8Vr2   r  c                       e Zd ZddZy)BilibiliAudioBaseIENc                 B    |sd|i}| j                  d|z   ||      d   S )Nr*  z3https://www.bilibili.com/audio/music-service-c/web/r  r   r  )r/   r  r*  r   s       r0   	_call_apizBilibiliAudioBaseIE._call_api  s;    CLE""ADHu # $& 	&r2   r   )r{  r|  r}  r  r9   r2   r0   r  r     s    &r2   r  c                   H    e Zd ZdZddddddedd	d
ddigiddddeddZd Zy)r  z4https?://(?:www\.)?bilibili\.com/audio/au(?P<id>\d+)z(https://www.bilibili.com/audio/au1003142 fec4987014ec94ef9e666d4d158ad03b1003142m4au   【tsukimi】YELLOW / 神山羊tsukimiu   YELLOW的mp3版！   originr^   lrczre:^https?://.+\.jpgiE]20190803u   tsukimi-つきみぐー)r]   r^   r1  artistr  rq  r}   r"  r  rL  r  r  r  )rS   r   r  c                    | j                  |      }| j                  d|      }|d   d   t        |j                  d            ddg}|D ]%  }|j	                  di       j                  d|i       ' | j                  d	|      }|d
   }|j                  d      xs i }d }	|j                  d      }
|
rdd|
igi}	||||j                  d      t        |j                  d            |j                  d      t        |j                  d            |	|j                  d      t        |j                  d            |j                  d      t        |j                  d            dS )NrS   cdnsr   r\   rW   )rS   rb   r`   r  r'   z	song/infor1  	statisticlyricr  rI  commentrW  r}   r  passtimer@  r  )r]   r1  rF   r  r  rq  r}   r"  r  rL  r  r  )r  r  r   r.   r*  r   )r/   rS   au_id	play_datarF   a_formatsongr1  r  r"  r  s              r0   r8  zBilibiliAudioIE._real_extract#  sl   s#NN5%0	V$Q'#IMM&$9:
    	H3::3< 	
 ~~k51WHH[)/R		!5 I hhx((y)AB88G,#DHHZ$89"'*$TXXj%9:)%immF&;<
 	
r2   N)r{  r|  r}  r9  r  _TESTr8  r9   r2   r0   r  r  	  s[    HJ916 /5 
 1#%1#
E0)
r2   r  c                   *    e Zd ZdZdddddddZd	 Zy
)BilibiliAudioAlbumIEz4https?://(?:www\.)?bilibili\.com/audio/am(?P<id>\d+)z&https://www.bilibili.com/audio/am1062410624u)   每日新曲推荐（每日11:00更新）u,   每天11:00更新，为你推送最新音乐rz  r   )rS   r  r  c                    | j                  |      }| j                  d||ddd      d   }g }|D ]V  }t        |j                  d            }|s |j	                  | j                  d|z   t        j                         |             X |rX| j                  d|      xs i }|j                  d	      }|r/|D ]  }	||	d
<   	 | j                  ||||j                  d            S | j                  ||      S )Nzsong/of-menur   d   )r*  r  r  r   r]   r  z	menu/infor1  albumrW  )	r  r  r   r.   r   rW  r  r  r&  )
r/   rS   am_idsongsr  r  r*  
album_dataalbum_titler[  s
             r0   r8  z"BilibiliAudioAlbumIE._real_extract[  s   s#E5#EGGMO  	0Ddhhtn-CNN4??3c9&&(#/ 0		0 U;ArJ$..1K$ 1E%0E'N1++UK1HJ J ##GU33r2   Nr{  r|  r}  r9  r  r8  r9   r2   r0   r  r  O  s)    HJ7@I

 E4r2   r  c                        e Zd ZdZdddZd Zy)BiliBiliPlayerIEzAhttps?://player\.bilibili\.com/player\.html\?.*?\baid=(?P<id>\d+)zHhttp://player.bilibili.com/player.html?aid=92494333&cid=157926707&page=1Tr$  c                 x    | j                  |      }| j                  d| dt        j                         |      S )Nzhttp://www.bilibili.tv/video/avr   )r  r   )r  rW  r  r  )r/   rS   r   s      r0   r8  zBiliBiliPlayerIE._real_extract}  s@    >>#&-hZq9  "X  7 	7r2   Nr  r9   r2   r0   r  r  v  s    UJYE
7r2   r  c                       e Zd ZdZdi ddddddd	ed
dgdddddddddededddddddededgZd Zy )!BiliBiliDynamicIEzFhttps?://(?:t\.bilibili\.com|(?:www\.)?bilibili\.com/opus)/(?P<id>\d+)z)https://t.bilibili.com/998134289197432852r]   BV1TAmBYVEJrr^   r  r  
1192648858r  r  zbilibili 113457567568273_part1r  zLhttp://i2.hdslb.com/bfs/archive/50091efd965d9f13ff6814f7ad374f90ab21e77d.jpgr}   gCl	@r  20241110r  u   何同学工作室r  r  r1  u>   美国小朋友就玩这个？！何同学工作室11月开箱rq  up   本期产品信息：
机器狗
气味模拟器
Cloudboom Strike LS
无弦吉他
蓝牙磁带音箱
神奇画板rL  i 0gr  r4  r  c                 4   | j                  |      }| j                  d|d|iddi      }t        |dddd	d
ddt        ht        | j
                  hf
      }|r%| j                  |      r!|| j                  |      k(  rt        dd      | j                  |      S )Nz8https://api.bilibili.com/x/polymer/web-dynamic/v1/detailr]   z
User-AgentzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36rl  r   item)Norigmodulesmodule_dynamic))major)archivepgc)
additional)reservecommonjump_urlzNo valid video URL foundTr  )	r  r   r   r"   rp  _proto_relative_urlr'  r	   rW  )r/   rS   post_id	post_data	video_urls        r0   r8  zBiliBiliDynamicIE._real_extract  s    ..%''F/  P, ( 	
 !FNI7GRsT-E-E,F-H I	 T]]95'T^^T]E^:^ !;dKKy))r2   N)r{  r|  r}  r9  r  r#  r;  r8  r9   r2   r0   r  r    s    ZJ:
.
5
 <
 S	

 !A B
 g
 
 :
 ,
 #
 #
 U
   T
 
 D
  !
 F,*r2   r  c                   P    e Zd ZdZdZddiZd Zd Zdddd	Zdddd
Z	d Z
d Zy)BiliIntlBaseIEz$https://api.bilibili.tv/intl/gatewaybiliintlr'   zhttps://www.bilibili.tv/c                     | j                   | j                  |z   g|i |} |j                  d      r|d   dv r| j                          n|d   dk(  r| j	                          n |j                  d      r<t        |d         |d   k7  r(|j                  dd       d| j                   d|d    }n|j                  dd      }|j                  d	      rt        |      | j                  |        |j                  d
      S )NrW  )i$ i% i^ i! rE  errnote Unable to download JSON metadatar   said: r/  r   )	r   _API_URLr.   r"  rq  r   r  r	   r)  )r/   endpointargskwargsru  errmsgs         r0   r  zBiliIntlBaseIE._call_api  s   "t""4==8#;MdMfM488FF|==))+f)))+488I&3tF|+<Y+O &

96X YZZ\]a]i]i\jjqrv  xA  sB  rC  DF#ZZ	3UVF::g&(00''/txxr2   c           
      ^    dj                  d t        t        |dd f            D              S )Nr  c           	   3   x   K   | ]2  \  }}|d z    dt        |d          dt        |d          d|d     4 yw)r   r
  r  r  r  r  N)r   )rt   r   r  s      r0   rx   z*BiliIntlBaseIE.json2srt.<locals>.<genexpr>  s[      P4 1ugR.tF|<=UCYZ^_cZdCeBffhimnwixhyzPs   8:r	  c                 (    |d   xr |d   xr |d   S )Nr  r  r  r9   )r:   ls     r0   r=   z)BiliIntlBaseIE.json2srt.<locals>.<lambda>  s    Qy\%Kai%KAdG r2   )r   r  r   )r/   ru  s     r0   r  zBiliIntlBaseIE.json2srt  s@    {{ P$\$K9M &N OP P 	Pr2   NrP  r  c                   | j                  d|xs |dddt        dd||d            xs i }i }t               }t        |d	d
t        hf      D ]  }t        |ddt
        hf      D ]  }||v r|j                  |       t        |      }|j                  d      xs d}	|dk(  r%|j                  |	g       j                  d|d       c|dk(  rc| j                  ||xs |ddt        |dd       d|	 dd      }
|
s|j                  |	g       j                  d| j                  |
      d       | j                  d|xs |         |S )Nz/web/v2/subtitleFzDownloading subtitles listz!Unable to download subtitles listr  en_US)r  s_localer  r  )r/  r   r  r   )r"  video_subtitle.)Nassr&  rS   lang_keyenr  r  ru  zDownloading subtitleslangz for %sr  r  zUnable to download subtitles)r/  r   r  r&  r'  zUnexpected subtitle extension)r  r   rB   r   r   r"   addr   r.   r*  r   r   r   r  r)  )r/   rP  r  sub_jsonr"  fetched_urlssubrS   sub_extsub_langsub_datas              r0   r-  zBiliIntlBaseIE._get_subtitles  s   >>E-7Z!##	  "    	 	u+JCRVQW*XY 	WC#C*>})UV W,&  %',77:.6$e#((26==$"?  &#22U\c4\#vy5Y4ZZ\]e\ffgh >  3  @H
  !,,Xr:AA#($(MM($;C 
 ''(GRUV1W	W6 r2   c                   | j                  d|xs |ddt        d||d            }|d   }g }|j                  d      xs g D ]  }|j                  d	      xs i }|j                  d
      xs i }|j                  d      s?|j                  |d   d|j                  d      |j                  d      |j                  d      |j                  d      d|j                  d      |j                  d      d	        |j                  d      xs g D ]\  }|j                  d      s|j                  |d   d|j                  d      |j                  d      d|j                  d      d       ^ |S )Nz/web/playurlzDownloading video formatsz Unable to download video formatsr  )r  rP  r  )r   r  r   playurlru   video_resourcestream_inforS   r  
desc_wordsrg   rh   rX   rW   rV   r\   )	rS   r^   r   rg   rh   vbrr_   r`   rb   audio_resource)rS   r^   abrr_   r`   rb   )r  r   r.   r   )	r/   rP  r  
video_jsonrF   vid	video_resr+  auds	            r0   _get_formatszBiliIntlBaseIE._get_formats  s{   ^^ELS/J6k!K ? $ 
  	*
>>'*0b 	C 017RI/52J=='NN ')~~l;"w/#--1 }}[1 #--1%MM&1
 
	  >>"239r 
	C775>NN5zww{+''(+ GGFO 
	 r2   c                     |j                  d      xs |j                  d      |j                  d      |j                  d      t        |j                  d            t        | j                  d|j                  d      xs ddd 	            d
S )Ntitle_displayr1  r  r  formatted_pub_datez^E(\d+)(?:$| - )r   zepisode numberr  )r1  rq  r  rL  r  )r.   r    r   r  )r/   r-  s     r0   _parse_video_metadataz$BiliIntlBaseIE._parse_video_metadata  s    ^^O4O
w8O%>>&1#0*:>>:N+OP)$*<*<#Z^^O%D%JL\fj += +l m
 	
r2   c                 ^   t         j                  st        dd      | j                  dd dd      d   }t         j                  j	                  |d	         }t         j
                  j                  |      j                  |d
   |z   j                               }| j                  dd t        |t        j                  |      j                  d      dddd      dd      }|j                  d      r<|j                  d      r t        d| j                   d|d    d      t        d      y )Nz'pycryptodomex not found. Please installTr  zEhttps://passport.bilibili.tv/x/intl/passport-login/web/key?lang=en-USzDownloading login keyzUnable to download login key)r   r  r   r   hashzPhttps://passport.bilibili.tv/x/intl/passport-login/web/login/password?lang=en-USasciir  r
  )usernamepasswordkeep_mer  	isTrustedz
Logging inzUnable to log in)r   r   r  rW  rE  zUnable to log in: r  )r   RSAr	   r   	importKey
PKCS1_v1_5newencryptr   r#   r  r  r  r.   r  )r/   r,  r-  key_data
public_keypassword_hash
login_posts          r0   _perform_loginzBiliIntlBaseIE._perform_login%  s:   ~~ !JUYZZ&&SUY(2P ' RRXZ  ^^--huo>
"--11*=EExPVGWZbGbFjFjFlm((^`d#$",,];BB7K!##%  "+= ) ?
 >>&!~~i($'9$,,wzZcOdNe%fquvv$%788	 "r2   )r{  r|  r}  r  _NETRC_MACHINEr(  r  r  r-  r$  r(  r9  r9   r2   r0   r  r    sF    5HN56H $P '+ 'R %)d &P
9r2   r  c                   n   e 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g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d#
dd$d%dd&dd'd(d)d*d+d,dd-d.d/d0d1d2d3edd4ddd4d5ddd6d7ddgd8d9d:id;d<d=dd>d?d@dAedBdCd9d:id;dDdEddFdGdHdIdJdKdLdM	ddNd:dOdPd:dOdQd:dOdRd:dOg
ZedYdT       ZdU ZdZdVZ	dW Z
dX ZyS)[
BiliIntlIEzzhttps?://(?:www\.)?bili(?:bili\.tv|intl\.com)/(?:[a-zA-Z]{2}/)?(play/(?P<season_id>\d+)/(?P<ep_id>\d+)|video/(?P<aid>\d+))z,https://www.bilibili.tv/en/play/34613/341736341736r  zE2 - The First Night.re:^https://pic\.bstarstatic\.com/ogv/.+\.png$r   20201009z	Episode 2i,_$md5:297b5a17155eb645e14a14b385ab547er   gsh|S@z<Untitled Chapter 1>r2  r3  r1  gx&%d@Introg@g'1@Outro)
r]   r^   r1  r  r  r  r  rL  rq  r4  r  z0https://www.bilibili.tv/en/play/1033760/1100500611005006z	E3 - Who?r   z$md5:e1a775e71a35c43f141484715470ad09z	Episode 320211219i|Sag      V@g     c@g     T@gq=
#@)
r]   r^   r1  r  r  rq  r  r  rL  r4  z0https://www.bilibili.tv/en/play/1005144/1013179010131790z$E140 - Two Heartbeats: Kabuto's Trap   )r]   r^   r1  r  r  zZAccording to the copyright owner's request, you may only watch the video after you log in.r  z,https://www.bilibili.tv/en/play/34580/340317340317i_20201030r   zE5 - My Own Steelz$md5:2b17ab10aebb33e3c2a54da9e8e487e2z.re:https?://pic\.bstarstatic\.com/ogv/.+\.png$z	Episode 5g     N@g     `@g     (@g     @)r]   r^   rL  r  r  r1  rq  r  r  r  r4  getcommentsTr  z+https://www.bilibili.tv/en/video/2045730385
2045730385z$md5:693b6f3967fb4e7e7764ea817857c33aijc20221108zUThat Time I Got Reincarnated as a Slime: Scarlet Bond - Official Trailer 3| AnimeStanzRre:https://pic\.bstarstatic\.(?:com|net)/ugc/f6c363659efd2eabe5683fbb906b1582\.jpg)r]   r^   rq  rL  r  r1  r  r  z0https://www.bilibili.tv/en/play/1048837/1124648911246489zE1 - Operation 'Strix' <Owl>$md5:b4434eb1a9a97ad2bccb779514b89f17ipQbzLhttps://pic.bstarstatic.com/ogv/62cb1de23ada17fb70fbe7bdd6ff29c29da02a64.pngz	Episode 1r   20220409)	r]   r^   r1  rq  rL  r  r  r  r  z-https://www.biliintl.com/en/play/34613/341736r$  z'https://bilibili.tv/en/video/2019955076z(https://www.bilibili.tv/video/2019955076z+https://www.bilibili.tv/EN/video/2019955076Nc                      |rd| d|  S d|  S )Nz https://www.bilibili.tv/en/play/r   z!https://www.bilibili.tv/en/video/r9   )r   r  s     r0   	_make_urlzBiliIntlIE._make_url  s%    5i[(LL28*==r2   c           	      :   t        |i       \  }}|j                  d      r|S | j                  |      }| j                  d|di       xs | j	                  |ddd       }t        |dd	d
t              xs i }|r2|s0| j                  d| d      }t        |dddfdft        d      }t        | j                  |      t        d|      xs | j                  d|      t        d|      xs | j                  d|      d| j                  |i             S )Nr1  z&window\.__INITIAL_(?:DATA|STATE)__\s*=zpreload stater  __initialStateF)r/  traverse)OgvVideoepDetail)UgcVideor  )ugcr  r  $/web/v2/ogv/play/episodes?season_id=&platform=websections.rS  c                 &    t        |d         k(  S )Nr  )r   r  s     r0   r=   z4BiliIntlIE._extract_video_metadata.<locals>.<lambda>  s    #ao:NRZ:Z r2   )r  rn   zbstar-meta__titlezog:titlezbstar-meta__desczog:descriptionr  )r!   r.   ro  r!  _search_nuxt_datar   r   r  r   r(  r   _html_search_meta_search_json_ld)	r/   rS   r   rP  smuggled_datar)  initial_datar-  season_jsons	     `      r0   _extract_video_metadataz"BiliIntlIE._extract_video_metadata  sp   *33]W%  ((h7 GRackuwx g%%gx9IQVae%f 	 "24MOaquw }z| 	 Z..+OPY{Zg)hjrsK%kC-Z4!52J
 &&z2-'2 a595K5KJX_5`3& 1  f484J4JK[]d4e	5
 ##GXr#BD 	Dr2   c              #     K   | j                  d|d| d| dd||d      }t        |d      D ]  }t        |d	      t        |d
      t        |d      t        |d      |j                  d      t        |j                  d            |j                  d      t	        |j                  d            d  t        |d      s%| j                  ||d   d   d   |      E d {    y y 7 w)Nz(https://api.bilibili.tv/reply/web/detailzDownloading reply comment of ro  r  r   )r  r  rH  rr  r  r   r7  .r?  r  rA  r?  facerD  rC  r  rG  
ctime_text)rI  rJ  author_thumbnailrK  r]   r  rG  rL  r   cursoris_endr   rl  rr  )r   r   r.   r   r    _get_comments_reply)r/   root_idnext_id
display_idcomment_api_raw_datar7  s         r0   rn  zBiliIntlIE._get_comments_reply  s    #226
0	WIF!	  3   $$8:RS 
	G&w0BC)'3DE$0:L$M$W.DEkk&))'++l*CD!++h/.w{{</HI	 	
	 02NO//-f5h?GU U U PUs   C C+"C)#C+c              #   X  K   t        j                  d      D ]  }| j                  d|d|dz    d|d||rdnddd	      }t        |d
      D ]  }t        |d      t        |d      t        |d      t        |d      |j	                  d      t        |j	                  d            t        |j	                  d            t        t        |d            d |j	                  d      s| j                  |j	                  d      |      E d {     t        |d      s y  y 7 w)Nr   z&https://api.bilibili.tv/reply/web/rootzDownloading comment page r   r  r   r   )r  r  r  rr  rz  	sort_typer  re  rf  rA  rg  rD  rC  r  ri  )r?  rz  )rI  rJ  rj  rK  r]   r  rL  author_is_uploaderr9  )rq  rk  )	r8  r9  r   r   r.   r   r    r,   rn  )r/   r   rP  r   rr  r7  s         r0   r=  zBiliIntlIE._get_comments	  s:    # 	A#'#6#68(0Q8 %#!&AA!" $7 
$  ((<>VW b*74FG!-g7H!I(4W>P(Q(2HI!++f-"-gkk,.G"H!27;;|3L!M*.|GEW/X*Y	 	 ;;w'#77F8KX`7aaab 02NO9	2 bs   C'D**%D*D(D*$D*c                 *   | j                  |      j                  ddd      \  }}}|xs |}d }|r| j                  d| d|d      xs i }|j                  d      r\t	        t        |d	      d
      t	        t        |d      d
      ddt	        t        |d      d
      t	        t        |d      d
      ddg}d|i| j                  |||      | j                  ||      | j                  ||      || j                  ||      | j                  dS )NrP  rP  r  z$/web/v2/ogv/play/episode?episode_id=rZ  Fr  r  )r  opening_start_timerY   )r  opening_end_timerB  rA  )r  ending_start_time)r  ending_end_timerC  r]   r  )rF   r"  r4  r   r  )r   r  r  r.   r   r   rc  r$  rw  r'  r(  )r/   rS   rP  rP  r  r   r4  intro_ending_jsons           r0   r8  zBiliIntlIE._real_extract-	  sS    $ 5 5c : @ @gW\ ]	5#<C $6ug]K !/ !' !-*,  !$$V, #0=NPn0oqu"v -l;LNj.kmq r$
 #0=NPm0npt"u -l;LNi.jlp q$	 (
**3)D
 ((u#(>//e/E  $ 5 5h F MM
 	
r2   r   )r   N)r{  r|  r}  r9  r  r;  staticmethodrQ  rc  rn  r=  r8  r9   r2   r0   r<  r<  ?  s    OJ >+J%"#A"/
 %# 
 '$ 
: B JA"%# /
 #! 
 %$ 
: B<J!
 n >#%(AJ"  /
 #! 
 %" 
4 4
9B =A#%l n	
 4
$ B5A#g"%

 ?
 9 : =SMF^ > >
D:U6>
r2   r<  c            	       r    e Zd ZdZdZdddddg dd	ed
ddidddddg dded
ddddddddgZd Zd Zy)BiliIntlSeriesIEzbiliIntl:serieszehttps?://(?:www\.)?bili(?:bili\.tv|intl\.com)/(?:[a-zA-Z]{2}/)?(?:play|media)/(?P<id>\d+)/?(?:[?#]|$)z%https://www.bilibili.tv/en/play/34613r   34613zTONIKAWA: Over the Moon For Your@  )zSlice of lifeComedyRomancer>  )r]   r1  rq  
categoriesr  r  r  T)rS   r|  r  r   z(https://www.bilibili.tv/en/media/10488371048837u   SPY×FAMILYrN  )	AdventureActionr  z.re:^https://pic\.bstarstatic\.com/ogv/.+\.jpg$r   r{  z&https://www.biliintl.com/en/play/34613r$  z&https://www.biliintl.com/EN/play/34613c           	   #     K   | j                  d| d|      }t        |dt              D ]V  }t        |d         }| j	                  t        t        j                  ||      | j                  |            t        |       X y w)NrY  rZ  )r[  .rS  .r  r  )	r  r   r   r   rW  r   r<  rQ  r(  )r/   r  series_jsonr  r  s        r0   r  zBiliIntlSeriesIE._entriesr	  s     nn'KI;Vc%dfop#K1Scgh 	'GW\23J//+$$Z;**73# :' '	's   BBc                    | j                  |      }| j                  d| d|      j                  d      xs i }| j                  | j	                  |      ||j                  d      |j                  d      t        |dt              t        |j                  d            t        |j                  d	            
      S )Nz'/web/v2/ogv/play/season_info?season_id=rZ  r  r1  rq  )styles.r1  r  horizontal_coverr  )r  r  r  )	r  r  r.   r&  r  r   r   r"   r   )r/   rS   r  series_infos       r0   r8  zBiliIntlSeriesIE._real_extract{	  s    NN3'	nn5i[NPY[[^[^_g[holn 	##MM)$i1I;??[hKi#K1IYde!+//2D"EFS^_j_n_nou_vSw $ y 	yr2   N)	r{  r|  r}  r  r9  r  r;  r  r8  r9   r2   r0   r~  r~  N	  s    GyJ66A@J
 T
 :"A;J
   8 89FB'yr2   r~  c            	           e Zd ZdZdddddddd	d
dddddddgZddddddddddddddddddddddZ e e ee                  Z	d Z
d  Zd! Zy")#
BiliLiveIEz3https?://live\.bilibili\.com/(?:blanc/)?(?P<id>\d+)zhttps://live.bilibili.com/19633989u   周六杂谈回，其他时候随机游戏。 | 
录播：@下播型泛式录播组。 | 
直播通知群（全员禁言）：666906670，902092584，59971⑧481 （功能一样，别多加）r  u-   太空狼人杀联动，不被爆杀就算赢zYhttps://i0.hdslb.com/bfs/live/new_room_cover/e607bc1529057ef4b332e1026e62cf46984c314d.jpgiQ@eb)r]   rq  r^   r1  r  rL  znot liver  zwhttps://live.bilibili.com/196?broadcast_type=0&is_room_feed=1?spm_id_from=333.999.space_home.strengthen_live_card.clickTr$  z#https://live.bilibili.com/blanc/196lowu   流畅)rc   r   high_resu   高清ultra_high_resu   超清blue_rayu   蓝光sourceu   原画4KrN   u   杜比)P         i  i'  i N  i0u  c                     | j                  d| ||      }|j                  d      dk7  rt        |j                  d      xs d      |j                  d      xs i S )Nzhttps://api.live.bilibili.com/r  rW  r   rE  r  r   )r   r.   r	   )r/   r  room_idr   
api_results        r0   r  zBiliLiveIE._call_api	  sb    ((+I$)PRYaf(g
>>&!Q& 	!:!`>`aa~~f%++r2   c              #   &  K   |j                  d      xs g D ]u  }|j                  d      |k7  r|d   D ]V  }|d    |d    |d    |j                  d      |j                  d      | j                  |      d	| j                  |    X w y w)
Ncodec
current_qnurl_infohostrR   extraformat_name
codec_name)rS   r^   r`   r5   )r.   _quality_FORMATS)r/   r  rG   r  r  s        r0   _parse_formatszBiliLiveIE._parse_formats	  s     WWW%+ 
	Eyy&",!*- &v./j0A/B8GCTBUV77=1#ii5#}}R0	
 mmB' 
	s   BBc                    | j                  |      }| j                  d|d|i      }|j                  d      dk(  rt        dd      g }| j                  D ]T  }| j                  d|||d	d
dddd	d      }t        |d      xs g D ]#  }|j                  | j                  ||             % V ||j                  d      |j                  d      |j                  d      j                  d      |dd|idS )Nzroom/v1/Room/get_infor]   live_statusr   zStreamer is not liveTr  z'xlive/web-room/v2/index/getRoomPlayInfoz0,1z0,20r  )r  r  r  rq   mask
no_playurlr  r   )playurl_infor  stream.rq   .r1  rq  
user_cover	live_timer'   )r]   r1  rq  r  rL  rF   is_liver  )r  r  r.   r	   r  r   r   r  )r/   rS   r  	room_datarF   r  stream_datarG   s           r0   r8  zBiliLiveIE._real_extract	  s   ..%NN#:GdG_U	=='1, !7$GG-- 	=B..)RT["!!!	^ 	K $K1jkqoq =t222s;<=	= ]]7+$==7"|4$53
 	
r2   N)r{  r|  r}  r9  r;  r  r|  r   r#  r  r  r  r8  r9   r2   r0   r  r  	  s    GJ / `Dt#
  I 5F(  9%h?+HE%h?%h?!$7$X>H Id8n56H, 
r2   r  )Mr  r  r   r8  ru  r  r  r~  r  r   urllib.parser   r  r  r   r   dependenciesr   networking.exceptionsr   utilsr	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r&   r  rX  rx  r  r  r  r  r  r  r  r  r!  r&  rM  r^  rh  r  r  r  r  r  r  r  r  r<  r~  r  r9   r2   r0   <module>r     s          	     6 % -       @~] ~Bh
 h
Vf
 f
R4^ 4n1cn 1ch-K> -K`X+ X641 4n	$. 	$J=. J=Z=. =D#1 # <I6 <I~9I2 9Ix/5 /dO2 O,@Y0 @YFA_ A_H5V* 5Vp&- &C
) C
L$4. $4N7} 7&* &*RO9] O9dL
 L
^4y~ 4ynU
 U
r2   