
    =ҐiU                         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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   )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                   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.   r0   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/   r0   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attrrY   s        R/var/www/descvideos/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 rb   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 artistrX   publish_datealbum_publish_datefreeDownloadPagezDownloading free downloads pageblobc                     | d   d   S )Ndigital_itemsr   rf   rg   s    r`   ri   z*BandcampIE._real_extract.<locals>.<lambda>   s    ?!3A!6 rb   c                     | d   d   S )Ndownload_itemsr   rf   rg   s    r`   ri   z*BandcampIE._real_extract.<locals>.<lambda>   s    #3!4Q!7 rb   	downloads	thumb_urldownload_formatsnamefile_extensionc              3   <   K   | ]  }t        |t                y w)N)
isinstancestr).0rh   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`   ri   z*BandcampIE._real_extract.<locals>.<lambda>   s#    qahhsmVWFW7X rb   )transform_sourcerY   	retry_urldescriptionsize_mbr   )r.   r!   rm   format_notefilesizern   ro   z - defaultr&   r+   r*   zhttps://z.bandcamp.comr'   r5   album_release_dater(   r7   r8   album_titlealbum_artistformatsr:   tag)cls.)"_match_valid_urlrW   _download_webpagera   _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(   r7   r#   r   
track_infofile_rm   
format_urlr!   abr_strrr   rs   rt   r   r'   download_linkdownload_webpagerx   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#
 	
rb   N)r   T)	__name__
__module____qualname__
_VALID_URL_EMBED_REGEX_TESTS_WEBPAGE_TESTSra   r   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            	           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.comr6   r5   g   @ՋAr(   Intror+   blazor7   r   r8   zJazz Format Mixtape vol.1r,   r#   g(\U3@r)   )r/   r0    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.   playlistr0   paramsr1   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.   r0   playlist_mincountz0https://jstrecords.bandcamp.com/album/entropy-epz"Entropy" EP
jstrecordsz
entropy-epz$md5:0ff22959c943622972596062f2f366a5)r"   r+   r    r   rM   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.   r0   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.suitable|  s<     $,,S1Z5H5H5M  	,W%c*	,rb   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 )Nre   z#The page doesn't contain any tracksr#   
title_linkr)   r    r"   rs   r   about)_typer+   r    r"   r   entries)r   groupsr   ra   r   r   
url_resultr   r   ie_keyr   )r\   r.   r+   album_idplaylist_idr]   r   r   tr   rs   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 , ,

rb   r   c                   L    e Zd ZdZdZd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: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_idr5   r6   r#   formatzmp3-128)r.   r/   r0   r   z,https://bandcamp.com/radio/?foo=bar&show=224T)r.   only_matchingc                 B   | j                  |      | j                  ddt        j                  di      j	                         ddi      d   }|d   }t        |t        hd	d
f      }|xs dj                  d      \  }}}| j                  |d      }t        | j                  |dd      ddfdt        f      xs i }	|j                  d      xs |	j                  d      }
t        |j                  d            xs t        |	j                  d            }t        |
t        |d      d      |
t        |	ddd       |	j                  d      xs |	j                  d      t!        |j                  d            ||||xs d|xs d dt#        |      d gd!	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 rk   FrX   rx   appDatashowsc                 &    t        |d         k(  S )NshowId)r   )_vshow_ids     r`   ri   z0BandcampWeeklyIE._real_extract.<locals>.<lambda>  s    c!H+.>'.I rb   r"   datez%Y-%m-%dz, )delimimageIdz"https://f4.bcbits.com/img/%s_0.jpgr   desc
short_descr#   r   rl   )r.   rm   r!   ro   rn   rp   )	r    r   r"   r   r&   r   r#   r5   r   )	_match_idr   jsondumpsencoder   r   	partitionr   ra   anyr   r   r   r   r
   r	   r   )r\   r.   
audio_data
stream_urlrm   encodingr   bitrate_strr]   metadataseries_titler5   r  s               @r`   r   z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 ";/ 
 	
rb   N)r   r   r   r   r   r   r   rf   rb   r`   r   r     s_    GYJ412AB'!+&
 i
& >%F.%
rb   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   r0   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   r  loadsr   )r\   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   )r\   r.   r$   r]   s       r`   r   zBandcampUserIE._real_extract  sZ    >>#&((h7))g&OH:2N3< * ! 	!rb   N)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   r   r   utils.traversalr   r   r   r   r   r   r  rf   rb   r`   <module>r,     so      	  !    $ H G
 
D}
j }
@?
z ?
DB!] B!rb   