
    ukiS                         d dl Z d dlZd dlZd dlZddlmZ ddlmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZ ddlmZmZmZ  G d de      Z G d	 d
e      Z G d de      Z G d de      Zy)    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                   T   e Zd ZdZdgZddddddd	d
ddddddd	gd	gddddi 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/d0d1g d2dgdgd3d4d5d6i dd7dddd8dd9dddd:dd;d!d<d#d=d$d>d&d?d(d@d*d7d+dAd-dBd/dCd1dDgd9gd9gd3dEdFdGi ddHddddIddJddddKddLd!dMd#dNd$dOd&dPd(dQd*dHd+dRd-dSd/dTd1dUgdJgdVgd3dEgZdWi ddXddddYd+dZd[d\gd]d\gd$d^d#d_d!d`ddddad&dbd*dXd(dQddcdd\d/ddd-deid4gZdidfZdg Zyh)j
BandcampIEzBhttps?://(?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                 ^    | j                  | j                  d| d||dz   d      ||      S )Nzdata-z=(["\'])({.+?})\1z datar   )groupfatal)_parse_json_html_search_regex)selfwebpagevideo_idattrrW   s        T/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/yt_dlp/extractor/bandcamp.py_extract_data_attrzBandcampIE._extract_data_attr   sI     7 7TF-.7N! !8 !%&.e   = 	=    c                 b
   | j                  |      j                  dd      \  }}| j                  ||      }| j                  ||      }| j	                  |      }d }d }d }	d }
g }t        |d t              }|r|j                  d      }t        |t              rj|j                         D ]W  \  }}t        |      s|j                  dd      \  }}|j                  || j                  |d      |d|t        |      d	       Y |j                  d
      }t        |j                  d      xs |j                  d            }t        |j                  d            }	t!        |j                  d            }
| j                  ||dd      }|j                  d      xs i }|j                  d      xs$ |j                  d      xs |j                  d      }| j#                  d|dd      }t%        |j                  d      xs |j                  d            }|j                  d      }|r_t'        |d         }| j                  ||d      }| j                  ||d      }t        |d d ft              }|r|j                  d      }t        |t              r|s|j                  d
      }|s|j                  d      }|s|j                  d      }i }|j                  d      }t        |t(              rU|d   D ]M  }|j                  d      |j                  d       }}t+        d! ||fD              s:|j-                  d"      ||<   O |j                         D ],  \  }}|j                  d#      }|st/        |j1                  d$d%      d&t3        t5        j4                         d'z  t7        j6                         z        i      } |j                  d(      xs |}| j9                  | |d)| d*d+ d,      }!|!st        |!j                  d-            }"|"s|j                  | j                  |"d      |j                  |      ||j                  d.      t;        |j                  d/            d|j                  d      d0   d1       / |r| d2| n|}|
st!        | j=                  d|d 3            }
i d|d
|d4|d|d5|d6d7| d8d9|d:t%        |j                  d;            d|
d<|d=|	d|d|d>|j                  d?      d@|dA|dBt?        |tA        dCD      hdEtB        hf      S )FNr   r"   c                     | d   d   S )N	trackinfor    xs    r^   <lambda>z*BandcampIE._real_extract.<locals>.<lambda>   s    +q0A r`   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 artistrV   publish_datealbum_publish_datefreeDownloadPagezDownloading free downloads pageblobc                     | d   d   S )Ndigital_itemsr   rd   re   s    r^   rg   z*BandcampIE._real_extract.<locals>.<lambda>   s    ?!3A!6 r`   c                     | d   d   S )Ndownload_itemsr   rd   re   s    r^   rg   z*BandcampIE._real_extract.<locals>.<lambda>   s    #3!4Q!7 r`   	downloads	thumb_urldownload_formatsnamefile_extensionc              3   <   K   | ]  }t        |t                y w)N)
isinstancestr).0rf   s     r^   	<genexpr>z+BandcampIE._real_extract.<locals>.<genexpr>   s     "K!:a#5"Ks   .r,   z
/download/z/statdownload/z.randi  encoding_namezDownloading z JSONc                 N    | | j                  d      | j                  d      dz    S )N{}r   )indexrindex)ss    r^   rg   z*BandcampIE._real_extract.<locals>.<lambda>   s#    qahhsmVWFW7X r`   )transform_sourcerW   	retry_urldescriptionsize_mbr   )r,   r   rk   format_notefilesizerl   rm    - )defaultr$   r)   r(   zhttps://z.bandcamp.comr%   r3   album_release_dater&   r5   r6   album_titlealbum_artistformatsr8   tag)cls.)"_match_valid_urlrU   _download_webpager_   _og_search_thumbnailr   dictgetr   itemsr   splitappend_proto_relative_urlr   r   r
   rY   r   r   listallstripr   replaceinttimerandom_download_jsonr   _html_search_metar   r   r   )#rZ   r,   r    r"   r[   tralbumr$   r'   r&   r5   r!   r   
track_infofile_rk   
format_urlr   abr_strrp   rq   rr   r   r%   download_linkdownload_webpagerv   infor{   r}   download_formats_listfr~   stat_urlstatr   s#                                      r^   _real_extractzBandcampIE._real_extract   s   //4::4Lx((e4))'59--g6	W&A4H
NN6*E%&-2[[] )Iz&z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!9 HA()fquu=M7N#D""Kc{"KK9<3 0 6H
 )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#
 	
r`   N)r   T)	__name__
__module____qualname__
_VALID_URL_EMBED_REGEX_TESTS_WEBPAGE_TESTSr_   r   rd   r`   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=

r`   r   c            	           e Zd ZdZdZddi 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gd"d#d$did%d&i dd'ddd	d(dddd)dddddd*ddd$d'dd+d"d,dddd ddddgd!dgddid%gd d-dd.d/d0d+id1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@d9dAdBdCdDdEdFd+dGgZe fdH       ZdI Z xZ	S )JBandcampAlbumIEz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.comr4   r3   g   @ՋAr&   Intror)   blazor5   r   r6   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.   paramsr/   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   rK   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                 z    t         j                  |      st        j                  |      rdS t        |   |      S )NF)BandcampWeeklyIEsuitabler   super)r   r,   	__class__s     r^   r   zBandcampAlbumIE.suitablez  s<     $,,S1Z5H5H5M  	,W%c*	,r`   c                 n   | j                  |      j                         \  }}|xs |}| j                  ||      }| j                  ||      }|j	                  d      }|st        d      |D cg c]  }|j	                  d      rm| j                  t        ||d         t        j                         t        |j	                  d      xs |j	                  d            |j	                  d             }	}|j	                  d      xs i }
d	|||
j	                  d      |
j	                  d
      |	dS c c}w )Nrc   z#The page doesn't contain any tracksr!   
title_linkr'   r   r    rq   r   about)_typer)   r   r    r   entries)r   groupsr   r_   r   r   
url_resultr   r   ie_keyr   )rZ   r,   r)   album_idplaylist_idr[   r   r   tr   rq   s              r^   r   zBandcampAlbumIE._real_extract  s-    $ 5 5c : A A CX-+((k:))';?[[-
 !GHH  	" uuZ 	 OOQ|_-z/@/@/BAEE*-<t=quuW~O" " ++i(.B  &[[)";;w/
 	
"s   /BD2)
r   r   r   IE_NAMEr   r   classmethodr   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 , ,

r`   r   c                   J    e Zd ZdZdZddddddd	d
dddd	ddiddddgZd Zy)r   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!   r4   seriesepisode
episode_idformatzmp3-128)r,   r-   r.   r   z)https://bandcamp.com/?blah/blah@&show=228T)r,   only_matchingc                 b   | j                  |      }| j                  ||      }| j                  ||d      }|d   |   }g }|d   j                         D ]<  \  }}t	        |      st
        D ]
  }	|	|v s|	}
 n d }
|j                  |||
dd       > |j                  d      xs d}|j                  d      }|r|d	| z  }|||j                  d
      xs |j                  d      t        |j                  d            dt        |j                  d            d|j                  d      ||d
S )Nrv   bcw_dataaudio_streamrj   )rk   r,   r   rl   audio_titler   subtitler   desc
short_descaudio_durationFpublished_date)
r   r    r   r!   is_liver4   r   r   r   r   )
	_match_idr   r_   r   r   r   r   r   r
   r   )rZ   r,   show_idr[   rv   showr   rk   r   	known_extr   r    r   s                r^   r   zBandcampWeeklyIE._real_extract  sZ   ..%((g6&&w@J(%).%9%?%?%A 	!Izz*- 		)#C
 NN&! 	 	  '<+<88J's8*%%E 88F+Etxx/E%dhh/?&@A+DHH5E,FG'xx
+!
 	
r`   N)r   r   r   r   r   r   r   rd   r`   r^   r   r     s\    GQJ/1?A&'&

 i
$ ;#F,)
r`   r   c            
           e Zd ZdZdZddddddd	d
ddddddddddddddddddddddddddddgZd Zd  Zy!)"BandcampUserIEz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           
   #      K   t        j                  d|      xs t        j                  d|      E d {    t        |t        dd      ht        hdt
        j                  hddt        hf      E d {    y 7 E7 w)	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   )rZ   r[   s     r^   _yield_itemszBandcampUserIE._yield_items  s     JJbdkl UzzJGT	V 	V  \569K8L$**sJ*G H 	H 	H		V	Hs!   2A>A:?A>4A<5A><A>c                     | j                  |      }| j                  ||      }| j                  | j                  |      |d| t	        |            S )NzDiscography of )getter)r   r   playlist_from_matchesr  r   )rZ   r,   r"   r[   s       r^   r   zBandcampUserIE._real_extract  sZ    >>#&((h7))g&OH:2N3< * ! 	!r`   N)r   r   r   r   r   r   r  r   rd   r`   r^   r  r    s    GYJ 7$6
   ..
  8%7
  9 2
 >%7
 E ,>
M-F^H!r`   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  rd   r`   r^   <module>r     sl      	  !     H G
 
D}
j }
@B
z B
JB!] B!r`   