add icerbox.sh
This commit is contained in:
parent
44be5545ba
commit
c9abcd8922
143
icerbox.sh
Normal file
143
icerbox.sh
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -ueo pipefail
|
||||||
|
|
||||||
|
api='https://icerbox.com/api/v1/'
|
||||||
|
jwt='/dev/shm/icerbox.token'
|
||||||
|
cfg=~/.icerbox.conf
|
||||||
|
|
||||||
|
err() {
|
||||||
|
echo "$1" >/dev/stderr
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
warn() {
|
||||||
|
echo "$1" >/dev/stderr
|
||||||
|
}
|
||||||
|
|
||||||
|
icerbox_handle_response() {
|
||||||
|
test -n "$1" || err "empty http status code"
|
||||||
|
test -s "$2" || err "empty json reponse body"
|
||||||
|
if [ "$1" -ne 200 ]; then
|
||||||
|
jq -r '.status_code?' "${2}" >/dev/stderr
|
||||||
|
jq -r '.message?' "${2}" >/dev/stderr
|
||||||
|
err "request failed with http ${1}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
icerbox_auth_login() {
|
||||||
|
out='/dev/shm/icerbox.auth.login.json'
|
||||||
|
test -f "$out" && rm "$out"
|
||||||
|
code=$(curl -s -w '%{http_code}' -H 'Content-Type: application/json' -o "$out" -d "email=${1}" -d "password=${2}" "${api}auth/login")
|
||||||
|
test $? -eq 0 || err "curl request failed"
|
||||||
|
icerbox_handle_response "$code" "$out"
|
||||||
|
token=$(jq -r '.token?' "$out")
|
||||||
|
test -n "$token" || err "empty jwt token"
|
||||||
|
echo "$token"
|
||||||
|
}
|
||||||
|
|
||||||
|
icerbox_auth_refresh() {
|
||||||
|
out='/dev/shm/icerbox.auth_refresh.json'
|
||||||
|
test -f "$out" && rm "$out"
|
||||||
|
# force POST without --data
|
||||||
|
code=$(curl -s -w '%{http_code}' -XPOST -H "Authorization: Bearer ${1}" -H 'Content-Type: application/json' -o "$out" "${api}auth/refresh")
|
||||||
|
test $? -eq 0 || err "curl request failed"
|
||||||
|
icerbox_handle_response "$code" "$out"
|
||||||
|
token=$(jq -r '.token?' "$out")
|
||||||
|
test -n "$token" || err "empty jwt token"
|
||||||
|
echo "$token"
|
||||||
|
}
|
||||||
|
|
||||||
|
icerbox_user_account() {
|
||||||
|
out='/dev/shm/icerbox.user.account.json'
|
||||||
|
test -f "$out" && rm "$out"
|
||||||
|
code=$(curl -s -w '%{http_code}' -H "Authorization: Bearer ${1}" -H 'Content-Type: application/json' -o "$out" "${api}user/account")
|
||||||
|
test $? -eq 0 || err "curl request failed"
|
||||||
|
icerbox_handle_response "$code" "$out"
|
||||||
|
}
|
||||||
|
|
||||||
|
icerbox_file() {
|
||||||
|
out='/dev/shm/icerbox.file.json'
|
||||||
|
test -f "$out" && rm "$out"
|
||||||
|
code=$(curl -s -w '%{http_code}' -H "Authorization: Bearer ${1}" -H 'Content-Type: application/json' -o "$out" -d id="$2" -G "${api}file")
|
||||||
|
test $? -eq 0 || err "curl request failed"
|
||||||
|
icerbox_handle_response "$code" "$out"
|
||||||
|
status=$(jq -r '.data?.status?' "$out")
|
||||||
|
test $? -eq 0 || err "failed parsing json"
|
||||||
|
test -n "$status" || err "empty status"
|
||||||
|
if [ "$status" != "active" ]; then
|
||||||
|
warn "file ${2} is not active"
|
||||||
|
return 1
|
||||||
|
else
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
icerbox_dl_ticket() {
|
||||||
|
out='/dev/shm/icerbox.dl.ticket.json'
|
||||||
|
test -f "$out" && rm "$out"
|
||||||
|
# endpoint does not accept file parameter with json as content type
|
||||||
|
code=$(curl -s -w '%{http_code}' -H "Authorization: Bearer ${1}" -o "$out" -d file="$2" "${api}dl/ticket")
|
||||||
|
test $? -eq 0 || err "curl request failed"
|
||||||
|
icerbox_handle_response "$code" "$out"
|
||||||
|
url=$(jq -r '.url?' "$out")
|
||||||
|
test $? -eq 0 || err "failed parsing json"
|
||||||
|
test -n "$url" || err "empty ticket url"
|
||||||
|
echo "$url"
|
||||||
|
}
|
||||||
|
|
||||||
|
icerbox_file_id() {
|
||||||
|
test -n "$1" || err "empty url"
|
||||||
|
test "${1:0:20}" = "https://icerbox.com/" || err "not a icerbox url: $1"
|
||||||
|
test "${#1}" -ge 28 || err "url $1 does not contain valid file id"
|
||||||
|
echo "${1:20:8}"
|
||||||
|
}
|
||||||
|
|
||||||
|
test "$#" -eq 0 && err "usage $0 https://icerbox.com/abcdefgh https://icerbox.com/abcdefgh ..."
|
||||||
|
test -f "$cfg" && source "$cfg" || err "please set 'email' and 'password' in ${cfg}"
|
||||||
|
test -n "$email" || err "email not set"
|
||||||
|
test -n "$password" || err "password not set"
|
||||||
|
type curl >/dev/null || err "need curl"
|
||||||
|
type jq >/dev/null || err "need jq"
|
||||||
|
|
||||||
|
if [ -f $jwt ] && [ -s $jwt ]; then
|
||||||
|
token=$(< $jwt)
|
||||||
|
token_age=$(stat --format=%Y "$jwt")
|
||||||
|
now=$(date +%s)
|
||||||
|
if [ $token_age -le $(( $now - 1800 )) ]; then
|
||||||
|
token=$(icerbox_auth_refresh "$token")
|
||||||
|
echo "$token" > "${jwt}.tmp"
|
||||||
|
mv "${jwt}.tmp" "$jwt"
|
||||||
|
echo "session refreshed"
|
||||||
|
else
|
||||||
|
echo "using active session"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
token=$(icerbox_auth_login "$email" "$password")
|
||||||
|
echo "$token" > "${jwt}.tmp"
|
||||||
|
mv "${jwt}.tmp" "${jwt}"
|
||||||
|
echo "new session acquired"
|
||||||
|
fi
|
||||||
|
|
||||||
|
test -n "$token" || echo "no session token"
|
||||||
|
|
||||||
|
#icerbox_user_account "$token"
|
||||||
|
|
||||||
|
tickets=()
|
||||||
|
for url in $@; do
|
||||||
|
file_id=$(icerbox_file_id "$url")
|
||||||
|
icerbox_file "$token" "$file_id"
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "Skipping $url"
|
||||||
|
continue
|
||||||
|
else
|
||||||
|
dl_url=$(icerbox_dl_ticket "$token" "$file_id")
|
||||||
|
tickets+=(-OJL "$dl_url")
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ ${#tickets} -gt 0 ]; then
|
||||||
|
curl --progress-bar --parallel-max 10 -Z "${tickets[@]}"
|
||||||
|
else
|
||||||
|
err "nothing to download"
|
||||||
|
fi
|
||||||
|
|
Loading…
Reference in New Issue
Block a user