bookmarks-dl/bookmarks-dl.sh

122 lines
3.0 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/sh
#―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
# Name: bookmarks-dl
# Desc: A script used to download remote bookmarks into the XBEL format.
# Auth: Jaidyn Ann <jadedctrl@posteo.at>
# Date: 2023-09-02
# Reqs: lynx, jq
# Lisc: GPLv3
#―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
SOURCE_DIRS="./sources/ $HOME/.local/libexec/bookmarks-dl/ /usr/local/libexec/bookmarks-dl/ /usr/libexec/bookmarks-dl/"
usage() {
1>&2 echo "usage: $(basename "$0") SOURCE ..."
1>&2 echo " $(basename "$0") --list"
1>&2 echo " $(basename "$0") --help"
1>&2 echo ""
1>&2 echo " SOURCE is a source of bookmarks."
1>&2 echo " You can see a list of sources with '--list'."
}
# Return the paths to all available bookmarks-dl “source” scripts.
all_sources() {
find $SOURCE_DIRS -type f -name '*.sh' \
2> /dev/null
}
# Return the path to a specific bookmarks-dl source.
get_source() {
local source_name="$1"
all_sources \
| grep "/$source_name.sh" \
| head -1
}
# List all available bookmarks-dl sources user-friendly-like.
list_sources() {
for source in $(all_sources); do
printf '%s\t%s\n' \
"$(basename "$source" | sed 's/\.sh//')" \
"$source"
done
}
# Given some HTML, return its plain-text and deescaped form.
html_text_deescape() {
lynx -dump -stdin
}
# Print a piped string in HTML-escaped form.
html_escape() {
json_escape \
| jq -r '. | @html'
}
# Print a piped string in JSON-escaped format.
json_escape() {
sed 's!"!\\"!g' \
| perl -pe 's!\n!\\n!' \
| sed 's/^/"/' \
| sed 's/$/"/'
}
# In case we want to look (mostly) like a normal web-browser.
curl_browseresque() {
curl $@ \
--compressed \
-H 'sec-ch-ua: "Not:A-Brand";v="99", "Chromium";v="112"' \
-H 'sec-ch-ua-mobile: ?0' \
-H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36' \
-H 'sec-ch-ua-platform: "Linux"' \
-H 'Accept: applincation/json' \
-H 'Accept-Language: en-US,en;q=0.5' \
-H 'Accept-Encoding: gzip, deflate, br' \
-H 'DNT: 1' \
-H 'Connection: keep-alive' \
-H 'Sec-Fetch-Dest: empty' \
-H 'Sec-Fetch-Mode: cors' \
-H 'Sec-Fetch-Site: same-origin' \
-H 'TE: trailers'
}
SOURCE_NAME="$1"
case "$SOURCE_NAME" in
--list|list)
list_sources
exit 0
;;
--help|-h|help|'')
usage
exit 1
;;
*)
source "$(get_source "$SOURCE_NAME")" \
2> /dev/null > /dev/null
if test "$?" -ne 0; then
1>&2 echo "The source '$SOURCE_NAME' couldnt be found."
1>&2 echo "Try '$(basename "$0") --list' to see a list of possible sources."
fi
;;
esac
if test -z "$1"; then
usage
exit 1
else
shift
fi
# Overloaded by the `source`-d bookmarks-dl “source.”
source_start $@