
    V|hS                         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  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   )KNOWN_EXTENSIONSExtractorError
clean_htmlextract_attributesfloat_or_noneint_or_noneparse_filesizestr_or_nonetry_getunified_strdate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-   r/   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-   r.   r/   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attrrX   s        S/home/james-whalen/.local/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    r_   <lambda>*BandcampIE._real_extract.<locals>.<lambda>   s    +q0Arb   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 artistrW   publish_datealbum_publish_datefreeDownloadPagezDownloading free downloads pageblobc                     U S   S   $ )Ndigital_itemsr   rf   rg   s    r_   ri   rj      s    ?!3A!6rb   c                     U S   S   $ )Ndownload_itemsr   rf   rg   s    r_   ri   rj      s    #3!4Q!7rb   	downloads	thumb_urldownload_formatsnamefile_extensionc              3   B   #    U  H  n[        U[        5      v   M     g 7f)N)
isinstancestr).0rh   s     r_   	<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    r_   ri   rj      s    qahhsmVWFW7Xrb   )transform_sourcerX   	retry_urldescriptionsize_mbr   )r-   r    rn   format_notefilesizero   rp    - )defaultr%   r*   r)   zhttps://z.bandcamp.comr&   r4   album_release_dater'   r6   r7   album_titlealbum_artistformatsr9   tag)cls.)"_match_valid_urlrV   _download_webpager`   _og_search_thumbnailr   dictgetr   itemsr   splitappend_proto_relative_urlr   r   r
   rZ   r   r   listallstripr   replaceinttimerandom_download_jsonr   _html_search_metar   r   r   )#r[   r-   r!   r#   r\   tralbumr%   r(   r'   r6   r"   r   
track_infofile_rn   
format_urlr    abr_strrs   rt   ru   r   r&   download_linkdownload_webpagery   infor~   r   download_formats_listfr   stat_urlstatr   s#                                      r_   _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#
 	
rb   rf   N)r   T)__name__
__module____qualname____firstlineno__
_VALID_URL_EMBED_REGEX_TESTS_WEBPAGE_TESTSr`   r   __static_attributes__rf   rb   r_   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=

rb   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.comr5   r4   g   @ՋAr'   Intror*   blazor6   r   r7   zJazz Format Mixtape vol.1r+   r"   g(\U3@r(   )r.   r/    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-   playlistr/   paramsr0   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-   r/   playlist_mincountz0https://jstrecords.bandcamp.com/album/entropy-epz"Entropy" EP
jstrecordsz
entropy-epz$md5:0ff22959c943622972596062f2f366a5)r!   r*   r   r   rL   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-   r/   playlist_countc                    > [         R                  U5      (       d  [        R                  U5      (       a  S$ [        TU ]  U5      $ )NF)BandcampWeeklyIEsuitabler   super)r   r-   	__class__s     r_   r   BandcampAlbumIE.suitablez  sB     $,,S11Z5H5H5M5M  	,W%c*	,rb   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 )Nre   z#The page doesn't contain any tracksr"   
title_linkr(   r   r!   rt   r   about)_typer*   r   r!   r   entries)r   groupsr   r`   r   r   
url_resultr   r   ie_keyr   )r[   r-   r*   album_idplaylist_idr\   r   r   tr   rt   s              r_   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rf   )r   r   r   r   IE_NAMEr   r   classmethodr   r   r   __classcell__)r   s   @r_   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 , ,

 
rb   r   c                   R    \ rS rSrSrSr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:weeklyz=https?://(?:www\.)?bandcamp\.com/?\?(?:.*?&)?show=(?P<id>\d+)zhttps://bandcamp.com/?show=224 61acc9a002bed93986b91168aa3ab433224r   z(BC Weekly April 4th 2017 - Magic Momentsz$md5:5d48150916e8e02d030623a48512c874gQŶ@20170404Bandcamp WeeklyzMagic Moments)	r   r    r!   r   r"   r5   seriesepisode
episode_idformatzmp3-128)r-   r.   r/   r   z)https://bandcamp.com/?blah/blah@&show=228T)r-   only_matchingc                    U R                  U5      nU R                  X5      nU R                  X2S5      nUS   U   n/ nUS   R                  5        HE  u  px[	        U5      (       d  M  [
         H  n	X;   d  M
  U	n
  O   S n
UR                  UUU
SS.5        MG     UR                  S5      =(       d    SnUR                  S5      nU(       a  US	U 3-  nUUUR                  S
5      =(       d    UR                  S5      [        UR                  S5      5      S[        UR                  S5      5      SUR                  S5      UUS.
$ )Nry   bcw_dataaudio_streamrm   )rn   r-   r    ro   audio_titler   subtitler   desc
short_descaudio_durationFpublished_date)
r   r!   r   r"   is_liver5   r   r   r   r   )
	_match_idr   r`   r   r   r   r   r   r
   r   )r[   r-   show_idr\   ry   showr   rn   r   	known_extr    r!   r   s                r_   r   BandcampWeeklyIE._real_extract  sL   ..%((6&&w@J(%).%9%?%?%A!Iz**-	)#C .
 NN&! 	  &B  '<+<88J's8*%%E 88F+Etxx/E%dhh/?&@A+DHH5E,FG'xx
+!
 	
rb   rf   N)	r   r   r   r   r   r   r   r   r   rf   rb   r_   r   r     s\    GQJ/1?A&'&

 i
$ ;#F,)
rb   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   r/   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	   jsonloadsr   )r[   r\   s     r_   _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_matchesr  r   )r[   r-   r#   r\   s       r_   r   BandcampUserIE._real_extract  sX    >>#&((7))g&OH:2N3< * ! 	!rb   rf   N)
r   r   r   r   r   r   r   r  r   r   rf   rb   r_   r  r    s    GYJ 7$6
   ..
  8%7
  9 2
 >%7
 E ,>
M-F^H!rb   r  )r  r   r  r   commonr   utilsr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   utils.traversalr   r   r   r   r   r   r  rf   rb   r_   <module>r'     sl      	  !     H G
 
D}
j }
@B
z B
JB!] B!rb   