commit 6dd14c50c46bb606d2e8cc40c23ea1655dd0051f Author: Jaidyn Lev Date: Sun Jan 20 15:32:54 2019 -0600 Init diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..eb8ac20 --- /dev/null +++ b/README.txt @@ -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 +Sauce is at https://git.eunichx.us/bandcamp-dl diff --git a/bandcamp-dl b/bandcamp-dl new file mode 100755 index 0000000..04f382f --- /dev/null +++ b/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 +# +#################### + +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 "")" + track_stack="$(echo "$track_stack" | sed 's%.* 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 diff --git a/gendl b/gendl new file mode 100755 index 0000000..6f4ea9e --- /dev/null +++ b/gendl @@ -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