Init
This commit is contained in:
commit
6dd14c50c4
|
@ -0,0 +1,40 @@
|
||||||
|
===============================================================================
|
||||||
|
BANDCAMP-DL Jam, not jelly
|
||||||
|
===============================================================================
|
||||||
|
|
||||||
|
A simple script that can download a Bandcamp album or track.
|
||||||
|
(Streaming is for nerds anyway >o>)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
----------------------------------------
|
||||||
|
PRE-REQUISITES
|
||||||
|
----------------------------------------
|
||||||
|
You'll need:
|
||||||
|
* "gendl" in your $PATH
|
||||||
|
* a POSIX-compatible shell (tested with `pdksh` and `bash`)
|
||||||
|
* "curl", "wget", or "ftp" installed
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
----------------------------------------
|
||||||
|
USAGE
|
||||||
|
----------------------------------------
|
||||||
|
Just run "bandcamp-dl" like so:
|
||||||
|
|
||||||
|
bandcamp-dl -a album_url
|
||||||
|
bandcamp-dl -t track_url
|
||||||
|
|
||||||
|
If you're downloading an album, use "-a".
|
||||||
|
If it's a track, use "-t".
|
||||||
|
|
||||||
|
Pretty self-explanatory =w=
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
----------------------------------------
|
||||||
|
BORING STUFF
|
||||||
|
----------------------------------------
|
||||||
|
License is CC-0 (though, "gendl" is GPLv3)
|
||||||
|
Author is Jenga Phoenix <jadedctrl@teknik.io>
|
||||||
|
Sauce is at https://git.eunichx.us/bandcamp-dl
|
|
@ -0,0 +1,124 @@
|
||||||
|
#!/bin/sh
|
||||||
|
########################################
|
||||||
|
# name: bandcamp-dl
|
||||||
|
# lisc: cc0
|
||||||
|
# desc: download the mp3(s) of a
|
||||||
|
# bandcamp track or album
|
||||||
|
# main: Jenga Phoenix
|
||||||
|
# <jadedctrl@teknik.io>
|
||||||
|
####################
|
||||||
|
|
||||||
|
TEMP="$(mktemp)"
|
||||||
|
DOWNLOADER="curl"
|
||||||
|
# supported programmes: `curl`, `ftp`, or `wget`
|
||||||
|
|
||||||
|
|
||||||
|
# STRING --> STRING
|
||||||
|
# Return the URL to the mp3 of a given track (from its URL)
|
||||||
|
function track_mp3
|
||||||
|
{
|
||||||
|
track_url="$1"
|
||||||
|
|
||||||
|
gendl -o "$TEMP" "$track_url"
|
||||||
|
|
||||||
|
grep "trackinfo" "$TEMP" \
|
||||||
|
| sed 's%.*"mp3-128":"%%' \
|
||||||
|
| sed 's%".*%%'
|
||||||
|
}
|
||||||
|
|
||||||
|
# STRING --> STRING
|
||||||
|
# Get the root of a URL.
|
||||||
|
function root_url
|
||||||
|
{
|
||||||
|
url="$1"
|
||||||
|
|
||||||
|
protocol="$(echo "$url" | sed 's%://.*%%')"
|
||||||
|
url="$(echo "$url" | sed 's%.*://%%')"
|
||||||
|
root_url="$(echo "$url" | sed 's%/.*%%')"
|
||||||
|
|
||||||
|
echo "${protocol}://${root_url}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# STRING --> STRING
|
||||||
|
# Get the filename of a URL.
|
||||||
|
function local_url
|
||||||
|
{
|
||||||
|
url="$1"
|
||||||
|
|
||||||
|
local_url="$(echo "$url" | sed 's%.*/%%')"
|
||||||
|
|
||||||
|
echo "$local_url"
|
||||||
|
}
|
||||||
|
|
||||||
|
# STRING --> STRING
|
||||||
|
# Return the URLs of l
|
||||||
|
function track_urls
|
||||||
|
{
|
||||||
|
album_url="$1"
|
||||||
|
root_url="$(root_url "$album_url")"
|
||||||
|
|
||||||
|
gendl -o "$TEMP" "$album_url" > /dev/null
|
||||||
|
|
||||||
|
track_stack="$(grep "\"/track" "$TEMP" | grep "<a href" | grep "</span>")"
|
||||||
|
track_stack="$(echo "$track_stack" | sed 's%.*<a href=\"%%g' | sed 's%".*%%g')"
|
||||||
|
|
||||||
|
track_stack="$(echo "$track_stack" | sed 's%^%'"$root_url"'%g')"
|
||||||
|
|
||||||
|
echo "$track_stack"
|
||||||
|
}
|
||||||
|
|
||||||
|
# STRING --> NIL
|
||||||
|
# Download the MP3s of every track of a given album.
|
||||||
|
function download_album_mp3
|
||||||
|
{
|
||||||
|
album_url="$1"
|
||||||
|
|
||||||
|
track_stack="$(track_urls "$album_url")"
|
||||||
|
track_lines="$(echo "$track_stack" | wc -l)"
|
||||||
|
|
||||||
|
|
||||||
|
while test "$(echo "$track_lines")" -gt 1
|
||||||
|
do
|
||||||
|
download_track_mp3 "$(echo "$track_stack" | head -1)"
|
||||||
|
|
||||||
|
track_stack="$(echo "$track_stack" | tail -$((track_lines - 1)))"
|
||||||
|
track_lines="$(echo "$track_stack" | wc -l)"
|
||||||
|
done
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
# STRING --> NIL
|
||||||
|
# Download a track's MP3 file.
|
||||||
|
function download_track_mp3
|
||||||
|
{
|
||||||
|
track_url="$1"
|
||||||
|
|
||||||
|
gendl -o "$(local_url "$track_url").mp3" \
|
||||||
|
"$(track_mp3 "$track_url")"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# --------------------------------------
|
||||||
|
# invocation
|
||||||
|
|
||||||
|
# NIL --> NIL
|
||||||
|
# Print the usage message and abort.
|
||||||
|
function usage
|
||||||
|
{
|
||||||
|
echo "Usage: bandcamp-dl -a album_url"
|
||||||
|
echo " bandcamp-dl -t track_url"
|
||||||
|
exit 2
|
||||||
|
}
|
||||||
|
|
||||||
|
# --------------------------------------
|
||||||
|
|
||||||
|
ARG="$1"
|
||||||
|
URL="$2"
|
||||||
|
|
||||||
|
if test "$ARG" = "-a"; then
|
||||||
|
download_album_mp3 "$URL"
|
||||||
|
elif test "$ARG" = "-t"; then
|
||||||
|
download_track_mp3 "$URL"
|
||||||
|
else
|
||||||
|
usage
|
||||||
|
fi
|
|
@ -0,0 +1,155 @@
|
||||||
|
#!/bin/sh
|
||||||
|
##############################
|
||||||
|
# name: gendl
|
||||||
|
# lisc: gnu gplv3
|
||||||
|
# desc: download to stdout or
|
||||||
|
# file, independent of
|
||||||
|
# a specific downloader.
|
||||||
|
# ftp/wget/curl support.
|
||||||
|
# main: jadedctrl
|
||||||
|
##############################
|
||||||
|
|
||||||
|
# usage: gendl [-o output] url
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#---------------------------------------
|
||||||
|
# backend bits
|
||||||
|
|
||||||
|
# NIL --> STRING
|
||||||
|
# return the download program you're using
|
||||||
|
function download_program
|
||||||
|
{
|
||||||
|
programs="ftp curl wget"
|
||||||
|
current=""
|
||||||
|
|
||||||
|
for program in $programs
|
||||||
|
do
|
||||||
|
if whereis $program > /dev/null
|
||||||
|
then
|
||||||
|
current=$program
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if uname -s | grep -e "LibertyBSD" -e "OpenBSD" > /dev/null
|
||||||
|
then
|
||||||
|
current="ftp"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "$current"
|
||||||
|
}
|
||||||
|
|
||||||
|
# STRING PATH --> NIL
|
||||||
|
# download URL $1 to stdout
|
||||||
|
function download_stdout
|
||||||
|
{
|
||||||
|
program=$(download_program)
|
||||||
|
url=$1
|
||||||
|
|
||||||
|
case "$program" in
|
||||||
|
"ftp")
|
||||||
|
output="$(ftp -VMo- $url)"
|
||||||
|
;;
|
||||||
|
"curl")
|
||||||
|
output="$(curl $url)"
|
||||||
|
;;
|
||||||
|
"wget")
|
||||||
|
output="$(wget --quiet -O $url)"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
return_code=$?
|
||||||
|
|
||||||
|
echo "$output"
|
||||||
|
return $return_code
|
||||||
|
}
|
||||||
|
|
||||||
|
# STRING PATH --> NIL
|
||||||
|
# download URL $1 to path $2
|
||||||
|
function download_file
|
||||||
|
{
|
||||||
|
program=$(download_program)
|
||||||
|
url=$1
|
||||||
|
path=$2
|
||||||
|
|
||||||
|
case "$program" in
|
||||||
|
"ftp")
|
||||||
|
ftp -VMU "." -o $path $url
|
||||||
|
;;
|
||||||
|
"curl")
|
||||||
|
curl -o $path $url
|
||||||
|
;;
|
||||||
|
"wget")
|
||||||
|
wget --quiet -O $path $url
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
return_code=$?
|
||||||
|
|
||||||
|
if test $return_code -ne 0 2>/dev/null
|
||||||
|
then
|
||||||
|
rm $path 2> /dev/null
|
||||||
|
# for consistency in behavior; wget saves 404s anyway, whereas
|
||||||
|
# ftp doesn't save anything from 404s, etc.
|
||||||
|
fi
|
||||||
|
|
||||||
|
return $return_code
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# --------------------------------------
|
||||||
|
# front-end string-manip
|
||||||
|
|
||||||
|
# STRING --> STRING
|
||||||
|
# return the last word in a string
|
||||||
|
function last_word
|
||||||
|
{
|
||||||
|
string="$1"
|
||||||
|
|
||||||
|
echo "$string" \
|
||||||
|
| rev \
|
||||||
|
| sed 's% .*%%' \
|
||||||
|
| rev
|
||||||
|
}
|
||||||
|
|
||||||
|
function usage
|
||||||
|
{
|
||||||
|
echo "usage: gendl [-o output] URL"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# --------------------------------------
|
||||||
|
# invocation
|
||||||
|
|
||||||
|
args="$(getopt o: $*)"
|
||||||
|
if test -z "$@" 2>/dev/null
|
||||||
|
then
|
||||||
|
usage
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
set -- $args
|
||||||
|
while test $# -ne 0
|
||||||
|
do
|
||||||
|
case "$1"
|
||||||
|
in
|
||||||
|
-o)
|
||||||
|
download_path="$2"; shift; shift;;
|
||||||
|
--)
|
||||||
|
shift; break;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
|
||||||
|
url="$(last_word "$@")"
|
||||||
|
|
||||||
|
|
||||||
|
if test -n "$download_path" 2> /dev/null
|
||||||
|
then
|
||||||
|
download_file $url $download_path
|
||||||
|
else
|
||||||
|
download_stdout "$url"
|
||||||
|
fi
|
Reference in New Issue