
    iU                         S SK r S SKrS SKrS SKrSSKJr  SSKJrJrJ	r	J
r
JrJrJrJrJrJrJrJrJrJrJrJr  SSKJrJrJr   " S S\5      r " S	 S
\5      r " S S\5      r " S S\5      rg)    N   )InfoExtractor   )ExtractorError
clean_htmlextract_attributesfloat_or_noneformat_fieldint_or_nonejoin_nonemptyparse_filesizeparse_qsstr_or_nonestrftime_or_nonetry_getunified_timestampupdate_url_queryurl_or_noneurljoin)find_elementfind_elementstraverse_objc                   ^   \ rS rSrSrS/rSSSSSS	S
SSSSSSSS
/S
/S.SS.S0 SS_SS_SS_SS_SS_SS_S S!_S"S#_S$S!_S%S&_S'S(_S)S*_S+S_S,S-_S.S/_S0S1_S2/ S3Q_S/S/S4.ES5.S6S70 SS8_SS_SS9_SS:_SS_SS;_S S<_S"S=_S$S>_S%S?_S'S@_S)SA_S+S8_S,SB_S.SC_S0SD_S2SE/_S:/S:/S4.ESF.SGSH0 SSI_SS_SSJ_SSK_SS_SSL_S SM_S"SN_S$SO_S%SP_S'SQ_S)SR_S+SI_S,SS_S.ST_S0SU_S2SV/_SK/SW/S4.ESF./rSX0 SSY_SS_SSZ_S,S[_S\S]/_S^S]/_S%S__S$S`_S"Sa_SS_SSb_S'Sc_S+SY_S)SR_S Sd_SS]_S0Se_S.Sf0ES5./rSkSg jrSh r	Sir
gj)l
BandcampIE   zBhttps?://(?P<uploader>[^/]+)\.bandcamp\.com/track/(?P<id>[^/?#&]+)zC<meta property="og:url"[^>]*?content="(?P<url>.*?bandcamp\.com.*?)"z9http://youtube-dl.bandcamp.com/track/youtube-dl-test-song c557841d5e50261777a6585648adf439
1812978515mp3uL   youtube-dl "'/\ä↭ - youtube-dl "'/\ä↭ - youtube-dl test song "'/\ä↭gOn#@u   youtube-dl "'/\ä↭20121129're:https?://f4\.bcbits\.com/img/.+\.jpgiѷPu5   youtube-dl "'/\ä↭ - youtube-dl test song "'/\ä↭zhttps://youtube-dl.bandcamp.comz
youtube-dl)idexttitledurationuploaderupload_date	thumbnail	timestamptracktrack_iduploader_urluploader_idartistsalbum_artistsz@There is a limit of 200 free downloads / month for the test song)urlmd5	info_dictskipz1http://benprunty.bandcamp.com/track/lanius-battler!   
2650410135r"   m4ar#   zBen Prunty - Lanius (Battle)r%   z
Ben Pruntyr'   r(   iK=Sr&   20140403release_timestampi<Srelease_dater$   gy&1Np@r)   zLanius (Battle)track_numberr   r*   albumz FTL: Advanced Edition Soundtrackr+   zhttps://benprunty.bandcamp.comr,   	benpruntytags)
soundtrack	chiptunes	cinematic
electroniczvideo game music
California)r-   r.   )r/   r1   z5https://relapsealumni.bandcamp.com/track/hail-to-fire fec12ff55e804bb7f7ebeb77a800c8b7
2584466013zMastodon - Hail to FireMastodoni3N20111122i*$@20040207g(\2^@zHail to Fire   zCall of the Mastodonz"https://relapsealumni.bandcamp.comrelapsealumniPhiladelphia)r/   r0   r1   z/https://diskotopia.bandcamp.com/track/safehouse 19c5337bca1428afa54129f86a2f6a69
1978174799zsubmerse - submerse - Safehousesubmersei!BX20161203i QGX20161207g'1Bc@zsubmerse - Safehouse   z"DSK F/W 2016-2017 Free Compilationzhttps://diskotopia.bandcamp.com
diskotopiaJapan
Diskotopiaz>https://www.punknews.org/article/85809/stay-inside-super-sonic
2475540375zStay Inside - Super SonicLungerr.   zStay Insider-   g/$d@20251003g   7Ag  @AzSuper Sonic20250609
stayinsidezhttps://stayinside.bandcamp.comc           	      P    U R                  U R                  SU S3UUS-   SS9X$S9$ )Nzdata-z=(["\'])({.+?})\1z datar   )groupfatal)_parse_json_html_search_regex)selfwebpagevideo_idattrrZ   s        F/app/mltbenv/lib/python3.13/site-packages/yt_dlp/extractor/bandcamp.py_extract_data_attrBandcampIE._extract_data_attr   sG     7 7TF-.7N! !8 !%&.   = 	=    c                 8   U R                  U5      R                  SS5      u  p#U R                  X5      nU R                  XB5      nU R	                  U5      nS nS nS n	S n
/ n[        US [        5      nU(       Ga  UR                  S5      n[        U[        5      (       aq  UR                  5        H]  u  p[        U5      (       d  M  UR                  SS5      u  nnUR                  UU R                  US5      USU[        U5      S	.5        M_     UR                  S
5      n[        UR                  S5      =(       d    UR                  S5      5      n[        UR                  S5      5      n	[!        UR                  S5      5      n
U R                  XBSS5      nUR                  S5      =(       d    0 nUR                  S5      =(       d)    UR                  S5      =(       d    UR                  S5      nU R#                  SUSSS9n[%        UR                  S5      =(       d    UR                  S5      5      nUR                  S5      nU(       Ga  ['        US   5      nU R                  UUS5      nU R                  UUS5      n[        US S 4[        5      nU(       GaL  UR                  S5      n[        U[        5      (       Ga%  U(       d  UR                  S
5      nU(       d  UR                  S5      nU(       d  UR                  S5      n0 nUR                  S5      n[        U[(        5      (       a]  US    HT  nUR                  S5      UR                  S 5      nn[+        S! UU4 5       5      (       d  M@  UR-                  S"5      UU'   MV     UR                  5        GHC  u  nnUR                  S#5      nU(       d  M!  [/        UR1                  S$S%5      S&[3        [4        R4                  " 5       S'-  [6        R6                  " 5       -  5      05      n UR                  S(5      =(       d    UnU R9                  U US)U S*3S+ SS,9n!U!(       d  M  [        U!R                  S-5      5      n"U"(       d  M  UR                  U R                  U"S5      UR                  U5      UUR                  S.5      [;        UR                  S/5      5      SUR                  S5      S0   S1.5        GMF     U(       a  U S2U 3OUnU
(       d  [!        U R=                  SUS S395      n
0 SU_S
U_S4U_SU_S5U_S6S7U S83_S9U_S:[%        UR                  S;5      5      _SU
_S<U_S=U	_SU_SU_S>UR                  S?5      _S@U_SAU_SB[?        U[A        SCSD91SE[B        145      _$ )FNr!   r%   c                     U S   S   $ )N	trackinfor    xs    ra   <lambda>*BandcampIE._real_extract.<locals>.<lambda>   s    +q0Ard   file-r   zhttp:none)	format_idr/   r"   vcodecacodecabrr#   r*   	track_numr$   embedFcurrentartistzO<h3 class="albumTitle">[\S\s]*?by\s*<span>\s*<a href="[^>]+">\s*([^>]+?)\s*</a>zalbum artistrY   publish_datealbum_publish_datefreeDownloadPagezDownloading free downloads pageblobc                     U S   S   $ )Ndigital_itemsr   rh   ri   s    ra   rk   rl      s    ?!3A!6rd   c                     U S   S   $ )Ndownload_itemsr   rh   ri   s    ra   rk   rl      s    #3!4Q!7rd   	downloads	thumb_urldownload_formatsnamefile_extensionc              3   B   #    U  H  n[        U[        5      v   M     g 7f)N)
isinstancestr).0rj   s     ra   	<genexpr>+BandcampIE._real_extract.<locals>.<genexpr>   s     "K{!:a#5#5{s   .r/   z
/download/z/statdownload/z.randi  encoding_namezDownloading z JSONc                 L    X R                  S5      U R                  S5      S-    $ )N{}r   )indexrindex)ss    ra   rk   rl      s    qahhsmVWFW7Xrd   )transform_sourcerZ   	retry_urldescriptionsize_mbr   )r/   r"   rp   format_notefilesizerq   rr   z - defaultr'   r,   r+   zhttps://z.bandcamp.comr(   r6   album_release_dater)   r8   r9   album_titlealbum_artistformatsr;   tag)cls.)"_match_valid_urlrX   _download_webpagerb   _og_search_thumbnailr   dictgetr   itemsr   splitappend_proto_relative_urlr   r   r	   r\   r   r   listallstripr   replaceinttimerandom_download_jsonr   _html_search_metar   r   r   )#r]   r/   r#   r%   r^   tralbumr'   r*   r)   r8   r$   r   
track_infofile_rp   
format_urlr"   abr_strru   rv   rw   r   r(   download_linkdownload_webpager{   infor   r   download_formats_listfr   stat_urlstatr   s#                                      ra   _real_extractBandcampIE._real_extract   s   //4::4L((4))'9--g6	W&A4H
NN6*E%&&-2[[])I&z22 #,??3#:LCNN%.#77
GL""("%*73$ 	 .; NN7+E"z*BjnnT.BDH&z~~k'BCL$Z^^J%?@H''G++i(.B8$VH(=VXAV..^^5 / 2 &KK'L7;;7K+LN	  $6774=)H#55x)J L **+;XvND679:>@D  HH[1	i..  $ 1!!%(!3$$(HH[$9	')$,0HH5G,H)!"7>>!%&8!9A()fquu=M7N#D""Kc{"KKK9<3 0 6 ":
 )2(9	1%&UU5\
)$ $4&..|=MN 'TYY[4-?&--/-Q)RQ$ %&EE/$:$Gi	#22$h,yk0O-X"'  3  )  $$$/0E$F	($#'#;#;Iw#O#3#7#7	#B)2+,55+?(6quuY7G(H&,&/ooc&:1&=( ) ):< *06(#eW%U$T%;%;GT &< &3 4H
(
U
 
 	

 8
 hxj>
 
  !27;;?S3T!U
 
 U
 L
 
 f
 UYY}-
 L
  w!
" LMe,D+EsZL*YZ#
 	
rd   rh   N)r   T)__name__
__module____qualname____firstlineno__
_VALID_URL_EMBED_REGEX_TESTS_WEBPAGE_TESTSrb   r   __static_attributes__rh   rd   ra   r   r      s1   VJZ[LJ1i0%C#P$='0167
  S', C
,
5
 3
 	

 C
 
 :
  
 J
 
 &
 A
 
 7
 <
  ;!
" l#
$ %~*^'
4 G1
,
5
 .
 
	

 C
 
 :
  
 J
 
 ^
 A
 
 +
 @
  ?!
" ^$#
$ #|(\'
	6 A1
,
5
 6
 
	

 C
 
 :
  
 J
 
 +
 A
 
 9
 =
  <!
" WI#
$ #|*^'
	K^FB P
,
5
 0
 X	

 m_
 
 
 J
  
 C
 
 ]
 
 A
 :
  !
" <#
$ =%
 N2=

rd   r   c            	         ^  \ rS rSrSrSrSS0 SS_SS	_S
S_SS_SS_SS_SS_SS/_SS_SS_SS_SS_SS_SS_S S!_S"S/_S#S$_S%S0ES&.S'0 SS(_SS	_S
S)_SS_SS*_SS_SS_SS+_SS_S%S(_SS,_S#S-_SS_S S!_SS_SS/_S"S/_SS0ES&./S!S.SS/S0.S1S,0S2S3.S4S5S6S7S8.S9S:.S;S<S=S>S?S@.SAS:.SBSCSDSESFSG.S,SH./r\U 4SI j5       rSJ r	SKr
U =r$ )LBandcampAlbumIEi  zBandcamp:albumzHhttps?://(?:(?P<subdomain>[^.]+)\.)?bandcamp\.com/album/(?P<id>[^/?#&]+)z9http://blazo.bandcamp.com/album/jazz-format-mixtape-vol-1 39bc1eded3476e927c724321ddf116cfr!   
1353101989r"   r   r#   zBlazo - Intror'   r    r(   i/Nr&   20110727r%   Blazor.   r+   zhttps://blazo.bandcamp.comr7   r6   g   @ՋAr)   Intror,   blazor8   r   r9   zJazz Format Mixtape vol.1r-   r$   g(\U3@r*   )r0   r1    1a2c32e2691474643e912cc6cd4bffaa38097443z.Blazo - Kero One - Keep It Alive (Blazo remix)i/Nz&Kero One - Keep It Alive (Blazo remix)r   gmf@zjazz-format-mixtape-vol-1z$md5:38052a93217f3ffdc033cd5dbbce2989)r#   r!   r,   r   playlistendz!Bandcamp imposes download limits.)r/   playlistr1   paramsr2   zChttp://nightbringer.bandcamp.com/album/hierophany-of-the-open-gravezHierophany of the Open Gravenightbringerzhierophany-of-the-open-grave)r#   r,   r!   	   r/   r1   playlist_mincountz0https://jstrecords.bandcamp.com/album/entropy-epz"Entropy" EP
jstrecordsz
entropy-epz$md5:0ff22959c943622972596062f2f366a5)r#   r,   r!   r   rN   z6https://insulters.bandcamp.com/album/we-are-the-plaguezwe-are-the-plaguezWE ARE THE PLAGUE	insultersz$md5:b3cf845ee41b2b1141dc7bde9237255f)r!   r#   r,   r   r/   r1   playlist_countc                    > [         R                  U5      (       d  [        R                  U5      (       a  S$ [        TU ]  U5      $ )NF)BandcampWeeklyIEsuitabler   super)r   r/   	__class__s     ra   r   BandcampAlbumIE.suitable|  sB     $,,S11Z5H5H5M5M  	,W%c*	,rd   c                    U R                  U5      R                  5       u  p#U=(       d    UnU R                  X5      nU R                  XT5      nUR	                  S5      nU(       d  [        S5      eU Vs/ s H  nUR	                  S5      (       d  M  U R                  [        XS   5      [        R                  5       [        UR	                  S5      =(       d    UR	                  S5      5      UR	                  S5      5      PM     n	nUR	                  S5      =(       d    0 n
S	UUU
R	                  S5      U
R	                  S
5      U	S.$ s  snf )Nrg   z#The page doesn't contain any tracksr$   
title_linkr*   r!   r#   rv   r   about)_typer,   r!   r#   r   entries)r   groupsr   rb   r   r   
url_resultr   r   ie_keyr   )r]   r/   r,   album_idplaylist_idr^   r   r   tr   rv   s              ra   r   BandcampAlbumIE._real_extract  s-    $ 5 5c : A A C-+((:))'?[[-
 !GHH  	"  uuZ 	ODOO|_-z/@/@/BAEE*-<t=quuW~O  	 	 " ++i(.B  &[[)";;w/
 	
"s   6EA5Erh   )r   r   r   r   IE_NAMEr   r   classmethodr   r   r   __classcell__)r   s   @ra   r   r     s   G\J K :,5 _  !K	
   ":  $gY #$@ #J ( W "7 #A 8  y!" #$ %0 :*5 M  !K	
   ":  E #J 
 #A  #$@ 8 "7  $gY!" y#$ (%1/
b 1-"A	
 1
 4w<z U3)0

  B#'A	
 
 H%(&A	
 
]XFt , ,

 
rd   r   c                   T    \ rS rSrSrSrSSSSSS	S
SSSSSS.
SS0S.SSS./rS rSrg)r   i  zBandcamp:weeklyzEhttps?://(?:www\.)?bandcamp\.com/radio/?\?(?:[^#]+&)?show=(?P<id>\d+)z#https://bandcamp.com/radio?show=224 61acc9a002bed93986b91168aa3ab433224r   zBandcamp Weekly, 2017-04-04z$md5:5d48150916e8e02d030623a48512c874z'https://f4.bcbits.com/img/9982549_0.jpgzBandcamp Weeklyi X20170404gQŶ@)
r!   r"   r#   r   r'   series
episode_idr6   r7   r$   formatzmp3-128)r/   r0   r1   r   z,https://bandcamp.com/radio/?foo=bar&show=224T)r/   only_matchingc                 l  ^ U R                  U5      mU R                  STS[        R                  " ST05      R	                  5       SS0S9S   nUS   n[        U[        1S	S
45      nU=(       d    SR                  S5      u  pVnU R                  UTSS9n[        U R                  UTSSS9SSU4S j[        45      =(       d    0 n	UR                  S5      =(       d    U	R                  S5      n
[        UR                  S5      5      =(       d    [        U	R                  S5      5      nTT[        U
[        US5      SS9U
[        U	SSS S9U	R                  S5      =(       d    U	R                  S5      [!        UR                  S5      5      UUUU=(       d    SU=(       d    S S[#        U5      S ./S!.	$ )"Nz/https://bandcamp.com/api/bcradio_api/1/get_showzDownloading radio show JSONr!   zContent-Typezapplication/json)dataheadersradioShowAudio	streamUrlenc rn   FrY   r{   appDatashowsc                 &   > [        US   5      T:H  $ )NshowId)r   )_vshow_ids     ra   rk   0BandcampWeeklyIE._real_extract.<locals>.<lambda>  s    c!H+.>'.Ird   r#   datez%Y-%m-%dz, )delimimageIdz"https://f4.bcbits.com/img/%s_0.jpgr   desc
short_descr$   r   ro   )r/   rp   r"   rr   rq   rs   )	r!   r   r#   r   r'   r   r$   r6   r   )	_match_idr   jsondumpsencoder   r   	partitionr   rb   anyr   r   r   r   r
   r	   r   )r]   r/   
audio_data
stream_urlrp   encodingr  bitrate_strr^   metadataseries_titler6   r
  s               @ra   r   BandcampWeeklyIE._real_extract  s   ..%((=2T7O,335#%78	 ) : ;K	L
  ,
 xj%-DE	$-O#>#>s#C [((gU(C##GWfE#J!I3OQ WTV 	 "~~g.G(,,w2G-jnnV.DEpIZ[c[g[ghn[oIp !"<1ABSU_1`hlm"%h	;_imn#<</M8<<3M%jnnZ&@A!2!&(5"*d ";/ 
 	
rd   rh   N)	r   r   r   r   r   r   r   r   r   rh   rd   ra   r   r     s_    GYJ412AB'!+&
 i
& >%F.%
rd   r   c            
           \ rS rSrSrSrSSSS.SS	.S
SSS.SS.SSSS.SS.SSSSS.S.SSSSS.S.SSSSS.S./rS  rS! rS"r	g#)$BandcampUserIEi  zBandcamp:userzEhttps?://(?!www\.)(?P<id>[^.]+)\.bandcamp\.com(?:/music)?/?(?:[#?]|$)z%https://adrianvonziegler.bandcamp.comadrianvonzieglerzDiscography of adrianvonziegler)r!   r#      r   zhttp://dotscale.bandcamp.comdotscalezDiscography of dotscaler   r   z&https://nightcallofficial.bandcamp.comnightcallofficialz Discography of nightcallofficial   z'https://steviasphere.bandcamp.com/music/   steviaspherezDiscography of steviasphere)r/   r   r1   z,https://coldworldofficial.bandcamp.com/music   coldworldofficialz Discography of coldworldofficialz3https://nuclearwarnowproductions.bandcamp.com/musici  nuclearwarnowproductionsz'Discography of nuclearwarnowproductionsc           
   #     #    [         R                  " SU5      =(       d    [         R                  " SU5       S h  vN   [        U[        SSS91[        1S[
        R                  1SS[        145       S h  vN   g  NB N7f)	NzH<li data-item-id=["\'][^>]+>\s*<a href=["\'](?![^"\'/]*?/merch)([^"\']+)z-<div[^>]+trackTitle["\'][^"\']+["\']([^"\']+)z
music-gridT)r!   htmlzdata-client-items.page_url)refindallr   r   r   r  loadsr   )r]   r^   s     ra   _yield_itemsBandcampUserIE._yield_items  s     JJbdkl UzzJGT	V 	V  \569K8L$**sJ*G H 	H 	H		V	Hs!   9BA><B8B 9B Bc                     U R                  U5      nU R                  X5      nU R                  U R                  U5      USU 3[	        U5      S9$ )NzDiscography of )getter)r  r   playlist_from_matchesr0  r   )r]   r/   r%   r^   s       ra   r   BandcampUserIE._real_extract  sX    >>#&((7))g&OH:2N3< * ! 	!rd   rh   N)
r   r   r   r   r   r   r   r0  r   r   rh   rd   ra   r  r    s    GYJ 7$6
   ..
  8%7
  9 2
 >%7
 E ,>
M-F^H!rd   r  )r  r   r-  r   commonr   utilsr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   utils.traversalr   r   r   r   r   r   r  rh   rd   ra   <module>r9     so      	  !    $ H G
 
D}
j }
@?
z ?
DB!] B!rd   