2024-03-21 06:35:38 -07:00
|
|
|
#!/usr/bin/env sh
|
2024-03-26 15:08:14 -07:00
|
|
|
# YES_ZSH YES_BASH YES_DASH YES_ASH
|
2024-03-21 06:35:38 -07:00
|
|
|
|
2024-03-21 06:45:36 -07:00
|
|
|
__oshi() { ### @oshi
|
2024-03-21 06:35:38 -07:00
|
|
|
### upload files (or stdin) to [oshi.at.](https://oshi.at)
|
|
|
|
### this script exits with the number of failed uploads; up to 255 at once.
|
|
|
|
### directories are skipped. for now, file expiry is hard-coded at 2 weeks.
|
|
|
|
###
|
|
|
|
### ```
|
|
|
|
### $ echo test | oshi
|
|
|
|
### MANAGE: https://oshi.at/a/7809e5e8a8b5c28555b1e8cadc99b069d08a5d09
|
|
|
|
### DL: https://oshi.at/ReTn/Dxzy
|
|
|
|
###
|
|
|
|
### $ oshi ~/play/{hey,you,fake,empty}
|
|
|
|
### MANAGE: https://oshi.at/a/9b56e4c5843006d491fabe859ea5746a8f36760c
|
|
|
|
### DL: https://oshi.at/obFf/hey
|
|
|
|
### oshi: expires in 14 days: /home/notwa/play/hey
|
|
|
|
### MANAGE: https://oshi.at/a/f2dc46ae900ca7465a377d7a7942e722f87ff483
|
|
|
|
### DL: https://oshi.at/JLBc/you
|
|
|
|
### oshi: expires in 14 days: /home/notwa/play/you
|
|
|
|
### oshi: no such file: /home/notwa/play/fake
|
|
|
|
### oshi: skipping directory: /home/notwa/play/empty
|
|
|
|
### oshi: successfully uploaded 2/4 files
|
|
|
|
### oshi: failed to upload 2/4 files
|
|
|
|
### ```
|
|
|
|
|
|
|
|
inform() { printf '\033[1moshi: %s\033[m\n' "$*"; } >&2
|
|
|
|
mutter() { printf '\033[31moshi: %s\033[m\n' "$*"; } >&2
|
|
|
|
lament() { printf '\033[1;33moshi: %s\033[m\n' "$*"; } >&2
|
|
|
|
recede() { printf '\033[1;31moshi: %s\033[m\n' "$*"; } >&2
|
|
|
|
|
|
|
|
hits=0 total=0
|
|
|
|
|
|
|
|
if [ $# = 0 ]; then
|
|
|
|
curl -f -F f=@- -F expire=20160 -F randomizefn=1 https://oshi.at && hits=1 || true
|
|
|
|
total=1
|
|
|
|
elif [ $# -gt 255 ]; then
|
|
|
|
recede "too many arguments (max: 255)"
|
|
|
|
return 255
|
|
|
|
else
|
|
|
|
total=$#
|
|
|
|
fi
|
|
|
|
|
|
|
|
for f; do
|
|
|
|
if [ ! -e "$f" ]; then
|
|
|
|
mutter "no such file: $f"
|
|
|
|
continue
|
|
|
|
elif [ -d "$f" ]; then
|
|
|
|
mutter "skipping directory: $f"
|
|
|
|
continue
|
|
|
|
elif [ ! -s "$f" ]; then
|
|
|
|
mutter "skipping empty file: $f"
|
|
|
|
continue
|
|
|
|
fi
|
|
|
|
|
|
|
|
# i have no idea why, but mingw64 curl on msys2 is replacing each unicode codepoint with a question mark.
|
|
|
|
# the irony is that it seems to be properly decoding the UTF-8 encoding and then replacing it all anyway.
|
|
|
|
[ -d /C ] && g="$(LC_ALL= cygpath -ws "$f")" || g="$f"
|
|
|
|
|
|
|
|
bytes="$(du -b -- "$f")" || bytes=0
|
|
|
|
if [ "$bytes" -gt 5000000000 ] 2>&-; then
|
|
|
|
mutter "file too large: $f"
|
|
|
|
continue
|
|
|
|
fi
|
|
|
|
|
|
|
|
if curl -fg -F f=@"$g" -F expire=20160 -F filename="${f##*/}" https://oshi.at; then
|
|
|
|
inform "expires in 14 days: $f"
|
|
|
|
: $((hits+=1))
|
|
|
|
else
|
|
|
|
mutter "failed to upload file: $f"
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
|
|
|
|
if [ $hits -gt 0 ]; then
|
|
|
|
[ $hits = 1 ] && s= || s=s
|
|
|
|
inform "successfully uploaded $hits/$total file$s"
|
|
|
|
fi
|
|
|
|
|
|
|
|
fails=$((total-hits))
|
|
|
|
if [ $fails -gt 0 ]; then
|
|
|
|
[ $fails = 1 ] && s= || s=s
|
|
|
|
recede "failed to upload $fails/$total file$s"
|
|
|
|
fi
|
|
|
|
|
|
|
|
return $fails
|
|
|
|
}
|
|
|
|
|
|
|
|
oshi()(__oshi "$@")
|
|
|
|
[ -n "${preload+-}" ] || __oshi "$@"
|