ref: f3afdf563f784c0a5703496f48c1a72dff4617f4
dir: /bandcamp/
#!/bin/rc
# data matches 'https://[^.]+\.bandcamp.com/(track|album)/[^ /]+'
# plumb start window -scroll bandcamp $data
if(! ~ $1 https://?*.bandcamp.com/^(track album)^/?*){
echo 'usage: bandcamp https://artist.bandcamp.com/(track|album)/name' >[1=2]
exit usage
}
{echo $1; hget $1} | awk '
BEGIN{
getline
sub("^https:/", "/tmp/mp3")
if(sub("\.bandcamp\.com/track", "/singles")){
single = $0
system("mkdir -p `{basename -d "single"}")
}
else{
sub("\.bandcamp\.com/album", "")
dir = $0
system("mkdir -p "dir)
}
RS = "{"
}
!single && /"@type":"ListItem"/{n++}
!single && match($0, /"@id":"[^"]+\/track\/[^\/"]+/){
track[n] = substr($0, RSTART, RLENGTH)
sub(".+/", "", track[n])
}
/"name":"file_mp3-128"/{
match($0, /"https?:\/\/[^"]+/)
if(single){
src = substr($0, RSTART + 1, RLENGTH - 1)
print "track: "single".mp3"
system("hget ''"src"'' > "single".mp3")
}
else
url[n] = substr($0, RSTART + 1, RLENGTH - 1)
}
match($0, /"text":"[^"]+/){
lyr = substr($0, RSTART + 8, RLENGTH - 8)
gsub(/\\"/, "\"", lyr)
gsub(/\\r\\n/, "\n", lyr)
if(!single)
lyrics[n] = lyr
}
match($0, /<meta name="description" content="([^"]|\n)+/){
info = substr($0, RSTART + 35, RLENGTH - 35)
gsub("\r", "", info)
gsub("&#39;", "''", info)
gsub("&amp;", "\&", info)
}
match($0, /<a class="popupImage" href="[^"]+">/){
src = substr($0, RSTART + 28, RLENGTH - 30)
match(src, /\.[^.]+$/)
if(single)
art = single substr(src, RSTART, RLENGTH)
else
art = dir"/art"substr(src, RSTART, RLENGTH)
print "art: "art
system("hget ''"src"'' > "art)
}
END{
if(single){
out = single".txt"
if(info){
print "single info: "out
print info > out
}
if(lyr){
print "lyrics: "lyr
print lyr >> out
}
}
else{
if(info){
out = dir"/info.txt"
print "album info: "out
print info > out
}
if(n > 99) fmt = "%s/%03d_%s"
else if(n > 9) fmt = "%s/%02d_%s"
else fmt = "%s/%d_%s"
for(i = 1; i <= n; i++){
out = sprintf(fmt".mp3", dir, i, track[i])
print "track: "out
system("hget ''"url[i]"'' > "out)
if(lyrics[i]){
out = sprintf(fmt".txt", dir, i, track[i])
print "lyrics: "out
print lyrics[i] > out
}
}
}
}
'