#!/bin/bash set -e set -f set -o pipefail shopt -s lastpipe encode_query() { perl -e ' $_ = join " ", map { m/ / ? qq<"$_"> : $_ } @ARGV; s/([^a-zA-Z0-9])/sprintf "%%%x", ord $1/ge; print "$_\n" ' "$@" } search_url() { if [ "$1" -gt 1 ] then p=$1 else p= fi q=$(encode_query "${@:2}") echo https://search.f-droid.org/'?q='"$q"${p:+'&page='$p}'&lang='${lang:-en} } showpage() { ( out=$(mktemp) trap 'rm -f "$out"' EXIT # wget -q "$1" -c -O "$out" curl --fail -s -S -L "$1" -o "$out" show_pkg "$out" | less -E rm -f "$out" trap - EXIT ) } show_pkg() { for x in name summary description do hxextract .package-$x "$1" | w3m -T text/html | sed -e '/^$/d' echo done } search() { page=${page:-1} url=$(search_url "$page" "$@") out=$(mktemp) curl -s "$url" | hxclean | hxselect '.package-header, div.package-info' | hxnormalize -l 2147483647 > "$out" trap 'rm -f "$out"' EXIT hxclean < "$out" | hxselect -s '\n' 'a.package-header::attr(href)' | mapfile -t href hxclean < "$out" | hxselect -s '\n' h4.package-name | mapfile -t name hxclean < "$out" | hxselect -s '\n' span.package-summary | mapfile -t summary rm -f "$out" trap - EXIT [ ${#href[@]} = ${#name[@]} ] [ ${#href[@]} = ${#summary[@]} ] OPTIONS=() for ((i=0; i<${#href[@]}; ++i)) do n=${name[$i]} s=${summary[$i]} h=${href[$i]} h=${h#href=\"} h=${h%\"} href[$i]=$h n=$(w3m -T text/html <<<"$n") s=$(w3m -T text/html <<<"$s") OPTIONS+=("$(printf "%40s: %s" "$n" "$s")") done if [ ${#OPTIONS[@]} = 0 ] then echo "No results for ${@@Q}" >&2 return fi PS3='Choose to install, s to [s]how, or [n]ext/[p]revious page> ' select i in "${OPTIONS[@]}" do if [ "$i" ] then i=$((REPLY - 1)) ( set -x mkdir -p repo/"${href[$i]##*/}" ) continue fi case "${REPLY@L}" in q ) return ;; q* ) page=1 search ${REPLY#?} return ;; n ) let ++page search "$@" return ;; p ) let --page search "$@" return ;; s*[^0-9\ ] ) continue ;; s*[0-9]* ) i=${REPLY#?} i=$((i - 1)) if [ $i -gt 0 -a $i -lt ${#OPTIONS[@]} ] then showpage "${href[$i]}" fi ;; esac done } isearch() { while read -e -p 'Search f-droid.org> ' do if [ "$REPLY" ] then search $REPLY fi done } if [ $# -gt 0 ] then search "$@" else isearch fi