summaryrefslogtreecommitdiff
path: root/search
blob: 191882eb9dd4dc4fa772f1d80404c68857a9d801 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#!/bin/bash
set -e
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}
}

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
        [ ${#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
        PS3='Choose <number> to install, [n]ext, [p]revious, or m<number> for [m]ore> '
        select i in "${OPTIONS[@]}"
        do
                if [ "$i" ]
                then
                        i=$((REPLY - 1))
                        (
                                set -x
                                mkdir repo/"${href[$i]##*/}"
                        )
                        continue
                fi
                case "${REPLY@L}" in
                        n )
                                let ++page
                                search "$@"
                                return
                                ;;
                        p )
                                let --page
                                search "$@"
                                return
                                ;;
                        m*[^0-9\ ] )
                                continue
                                ;;
                        m*[0-9]* )
                                i=${REPLY#?}
                                i=$((i - 1))
                                if [ $i -gt 0 -a $i -lt ${#OPTIONS[@]} ]
                                then
                                        w3m "${href[$i]}"
                                fi
                                ;;
                esac
        done
}

search "${@:-music}"