
    yfH                         d dl Z d dlZd dl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  G d de      Z G d	 d
e      Z G d de      Z G d de      Zy)    N   )InfoExtractor   )
compat_str)KNOWN_EXTENSIONSExtractorErrorfloat_or_noneint_or_noneparse_filesizestr_or_nonetry_getunified_strdateunified_timestampupdate_url_queryurl_or_noneurljoinc                      e Zd ZdZdgZddddddd	d
ddd	dd	ddd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/dd0d1d2d3d4d5d6d7i dd8dddd9dddd:d d;d"d<d$d=d&d>d'd?d)d@d+dAd-d8d.d:d/d:d0dBdCdDdEdFidGdHdIi ddJddddKddddLd dMd"dNd$dOd&dPd'dQd)dRd+dSd-dJd.dLd/dTd0dUdCdVdEdWidGgZd[dXZdY ZyZ)\
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 "'/\ä↭20121129iѷPu5   youtube-dl "'/\ä↭ - youtube-dl test song "'/\ä↭zhttps://youtube-dl.bandcamp.comz
youtube-dlz+https://f4.bcbits.com/img/a3216802731_5.jpg)idexttitledurationuploaderupload_date	timestamptrackalbum_artisttrack_idartistuploader_urluploader_id	thumbnailz@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   m4aacodecz
re:[fa]lacr   zBen Prunty - Lanius (Battle)r&   zre:^https?://.*\.jpg$r   z
Ben Pruntyr   iK=Sr   20140403release_timestampi<Srelease_dater   gy&1Np@r    zLanius (Battle)track_numberr   r"   r#   r!   albumz FTL: Advanced Edition Soundtrackzhttps://benprunty.bandcamp.com	benprunty)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 Mastodonr$   z"https://relapsealumni.bandcamp.comr%   relapsealumni)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   
Diskotopiaz"DSK F/W 2016-2017 Free Compilationzhttps://diskotopia.bandcamp.com
diskotopiac                 \    | j                  | j                  d|z  ||dz   d      ||      S )Nzdata-%s=(["\'])({.+?})\1z datar   )groupfatal)_parse_json_html_search_regex)selfwebpagevideo_idattrrF   s        ;/usr/lib/python3/dist-packages/yt_dlp/extractor/bandcamp.py_extract_data_attrzBandcampIE._extract_data_attrx   sD     7 7'$.7N! !8 !%&.e   = 	=    c                  
   | 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)|z  d* d+      }!|!st        |!j                  d,            }"|"s|j                  | j                  |"d      |j                  |      ||j                  d-      t;        |j                  d.            d|j                  d      d/   d0       . |r|d1|n|}|
st!        | j=                  d|d 2            }
i d|d
|d3|d|d4|d5d6| d7d8|d9t%        |j                  d:            d|
d;|d<|	d|d|d=|j                  d>      d?|d@|S )ANr   r   c                     | d   d   S )N	trackinfor    xs    rM   <lambda>z*BandcampIE._real_extract.<locals>.<lambda>   s    +q0A rO   file-r   zhttp:none)	format_idr'   r   vcodecr-   abrr   r"   	track_numr   embedFcurrentr#   zO<h3 class="albumTitle">[\S\s]*?by\s*<span>\s*<a href="[^>]+">\s*([^>]+?)\s*</a>zalbum artistrE   publish_datealbum_publish_datefreeDownloadPagezDownloading free downloads pageblobc                     | d   d   S )Ndigital_itemsr   rS   rT   s    rM   rV   z*BandcampIE._real_extract.<locals>.<lambda>   s    ?!3A!6 rO   c                     | d   d   S )Ndownload_itemsr   rS   rT   s    rM   rV   z*BandcampIE._real_extract.<locals>.<lambda>   s    #3!4Q!7 rO   	downloads	thumb_urldownload_formatsnamefile_extensionc              3   <   K   | ]  }t        |t                y wN)
isinstancer   ).0rU   s     rM   	<genexpr>z+BandcampIE._real_extract.<locals>.<genexpr>   s     "R:a#<"Rs   .r'   z
/download/z/statdownload/z.randi  encoding_namezDownloading %s JSONc                 N    | | j                  d      | j                  d      dz    S )N{}r   )indexrindex)ss    rM   rV   z*BandcampIE._real_extract.<locals>.<lambda>   s#    qahhsmVWFW7X rO   )transform_sourcerF   	retry_urldescriptionsize_mbr   )r'   r   rZ   format_notefilesizer[   r-   z - )defaultr&   r%   r$   zhttps://z.bandcamp.comr   r/   album_release_dater    r1   r2   album_titler!   formats)_match_valid_urlrD   _download_webpagerN   _og_search_thumbnailr   dictgetro   itemsr   splitappend_proto_relative_urlr
   r   r	   rH   r   r   listallstripr   replaceinttimerandom_download_jsonr   _html_search_meta)#rI   r'   r   r   rJ   tralbumr&   r"   r    r1   r   r   
track_infofile_rZ   
format_urlr   abr_strr^   r_   r#   r!   r   download_linkdownload_webpagerc   inforh   rj   download_formats_listfrk   stat_urlstatr{   s#                                      rM   _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!'$-0H#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""RtSk"RR9<3 0 6H
 )2(9 	1%&UU5\
)$ $4&..|=MN 'TYY[4-?&--/-Q)RQ$ %&EE/$:$Gi	#22$h0E	0Q-X"'  3  )  $$$/0E$F	($#'#;#;Iw#O#3#7#7	#B)2+,55+?(6quuY7G(H&,&/ooc&:1&=( )< 06VU+5$T%;%;GT &< &3 4H
(
U
 
 	

 8
 hxj>
 
  !27;;?S3T!U
 
 U
 L
 
 f
 UYY}-
 L
  w!
 	
rO   N)r   T)__name__
__module____qualname__
_VALID_URL_EMBED_REGEX_TESTSrN   r   rS   rO   rM   r   r      s$   VJZ[LJ1i0%#P4$.='F
  T', C
,
5
 m
 3	

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

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

 

 
 :
  
 J
 
 +
 A
 
 j
 L
  9!
" =#
$ <%
	I\F|=
~
rO   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gdd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-gZe fd.       Zd/ Z xZ	S )0BandcampAlbumIEzBandcamp:albumzHhttps?://(?:(?P<subdomain>[^.]+)\.)?bandcamp\.com/album/(?P<id>[^/?#&]+)z9http://blazo.bandcamp.com/album/jazz-format-mixtape-vol-1 39bc1eded3476e927c724321ddf116cf
1353101989r   zBlazo - Introi/N20110727Blazo)r   r   r   r   r   r   )r(   r)    1a2c32e2691474643e912cc6cd4bffaa38097443z.Blazo - Kero One - Keep It Alive (Blazo remix)i/NzJazz Format Mixtape vol.1zjazz-format-mixtape-vol-1blazo)r   r   r%   playlistendr   z!Bandcamp imposes download limits.)r'   playlistr)   paramsskipzChttp://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|   r@   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                     t         j                  |      st        j                  |      rdS t        t        |   |      S )NF)BandcampWeeklyIEsuitabler   superr   )clsr'   	__class__s     rM   r   zBandcampAlbumIE.suitableC  s@     $,,S1Z5H5H5M  	@?C9#>	@rO   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 )NrR   z#The page doesn't contain any tracksr   
title_linkr"   r   r   r_   r   about)_typer%   r   r   r|   entries)r   groupsr   rN   r   r   
url_resultr   r   ie_keyr   )rI   r'   r%   album_idplaylist_idrJ   r   r   tr   r_   s              rM   r   zBandcampAlbumIE._real_extractI  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   @rM   r   r      s   G\J K :& ,!+#- '
 :$ M!+#- '

2 1-"
 1
 4E#H U3)0

  B#'A	
 
 H%(&A	
 
k?FB @ @

rO   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 b00df799c733cf7e0c567ed187dea0fd224opusz(BC Weekly April 4th 2017 - Magic Momentsz$md5:5d48150916e8e02d030623a48512c874gQŶ@20170404Bandcamp WeeklyzMagic Moments)	r   r   r   r|   r   r0   seriesepisode
episode_idformatzopus-lo)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  z  }|||j                  d
      xs |j                  d      t        |j                  d            dt        |j                  d            d|j                  d      ||d
S )Nrc   bcw_dataaudio_streamrY   )rZ   r'   r   r[   audio_titler   subtitlez - %sdesc
short_descaudio_durationFpublished_date)
r   r   r|   r   is_liver0   r   r   r   r   )
	_match_idr   rN   r   r   r   r   r   r	   r   )rI   r'   show_idrJ   rc   showr   rZ   r   	known_extr   r   r   s                rM   r   zBandcampWeeklyIE._real_extract~  sX   ..%((g6&&w@J(%).%9%?%?%A 	!Izz*- 		)#C
 NN&! 	 	  '<+<88J'Wx''E 88F+Etxx/E%dhh/?&@A+DHH5E,FG'xx
+!
 	
rO   Nr   r   r   r   r   r   r   rS   rO   rM   r   r   e  s\    GQJ/1?A&'&

 i
$ ;#F,)
rO   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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                     | j                        }| j                  |      }t        j                  d|      xs t        j                  d|      }| j	                  ||d| fd      S )NzH<li data-item-id=["\'][^>]+>\s*<a href=["\'](?![^"\'/]*?/merch)([^"\']+)z-<div[^>]+trackTitle["\'][^"\']+["\']([^"\']+)zDiscography of c                     t        |       S rn   )r   )rU   r'   s    rM   rV   z.BandcampUserIE._real_extract.<locals>.<lambda>  s    W^_bdeWf rO   )getter)r   r   refindallplaylist_from_matches)rI   r'   r   rJ   discography_datas    `   rM   r   zBandcampUserIE._real_extract  s{    >>#&((h7JJ'rt{| e!zz*Z\cd 	 ))h/((DMf * h 	hrO   Nr   rS   rO   rM   r   r     s    GYJ 7$6
   ..
  8%7
  9 2
 >%7
 E ,>
M-F^hrO   r   )r   r   r   commonr   compatr   utilsr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   rS   rO   rM   <module>r     sc     	  !     d
 d
Nd
j d
NB
z B
J;h] ;hrO   