]> CyberLeo.Net >> Repos - CDN/taggery.git/blob - lib/taggery.sh
Add debugging options
[CDN/taggery.git] / lib / taggery.sh
1 [ "${taggery_name}" -a "${taggery_fmturl}" -a "${taggery_image_url_filter}" -a "${taggery_image_tags_filter}" ] || {
2   cat <<EOF
3 Taggery v0.1
4 Copyright - http://wiki.cyberleo.net/wiki/CyberLeo/COPYRIGHT?version=4
5
6 Set the following variables before sourcing this library:
7
8  taggery_base              - The base directory where the taggery database
9                              resides. This should contain the directories
10                              md5/ tag/ pool/
11  taggery_libs              - The base directory where the code resides.
12
13 The following should be defined by the profile:
14
15  taggery_name              - A string token to use when formatting things
16  taggery_fmturl            - A printf-compatible format string that will
17                              transform an ID into the URL of a 'view' page.
18  taggery_image_url_filter  - A program or function that takes a webpage on
19                              stdin and provides on stdout the URL to the raw
20                              image to be downloaded.
21  taggery_image_tags_filter - A program or function that takes a webpage on
22                              stdin and provides on stdout a list of newline-
23                              delimited tags.
24  taggery_image_referer     - A program or function that takes an id and
25                              returns the referer URL for that id.
26
27 Examples:
28  Format URL:
29   taggery_fmturl="http://e621.net/post/show/%s"
30   taggery_fmturl="http://gelbooru.com/index.php?page=post&s=view&id=%s"
31
32  Filters:
33   e621_image_url_filter() { sed -e '...'; }
34   taggery_image_url_filter="e621_image_url_filter"
35 EOF
36   kill $$
37   exit 1
38 }
39
40 taggery_cleanup() {
41   local cleanup="$(kvs_get "${taggery_name}" cleanup)"
42   if [ "${cleanup}" ]
43   then
44     local id
45     for id in ${cleanup}
46     do
47       taggery_free_page "${id}"
48     done
49   fi
50   kvs_unset "${taggery_name}" cleanup
51 }
52 [ "${DEBUG}" ] || trap "taggery_cleanup" EXIT HUP INT TERM KILL
53
54 taggery_register_cleanup() {
55   [ "${1}" ] || return 1
56   local id="${1}"
57   kvs_set "${taggery_name}" cleanup "$(kvs_get "${taggery_name}" cleanup) ${id}"
58 }
59
60 taggery_init_page() {
61   [ "${1}" ] || return 1
62   local id="${1}"
63   kvs_set "${taggery_name}/${id}" tmp "$(mktemp "${taggery_temp}/.taggery_${id}.XXXXXXXX")"
64   kvs_set "${taggery_name}/${id}" url "$(printf "${taggery_fmturl}" "${id}")"
65   taggery_register_cleanup "${id}"
66 }
67
68 taggery_free_page() {
69   [ "${1}" ] || return 1
70   local id="${1}"
71   local tmp="$(kvs_get "${taggery_name}/${id}" tmp)"
72   [ -f "${tmp}" -a "${tmp%%_*}" = "${taggery_temp}/.taggery" ] && rm -f "${tmp}"
73   kvs_unset_all "${taggery_name}/${id}"
74 }
75
76 taggery_fetch_page() {
77   [ "${1}" ] || return 1
78   local id="${1}"
79   kvs_has_id "${taggery_name}/${id}" || taggery_init_page "${id}"
80   local url="$(kvs_get "${taggery_name}/${id}" url)"
81   local tmp="$(kvs_get "${taggery_name}/${id}" tmp)"
82   wget ${taggery_user_agent:+--user-agent="${taggery_user_agent}"} -qO "${tmp}" "${url}"
83 }
84
85 taggery_page() {
86   [ "${1}" ] || return 1
87   local id="${1}"
88   kvs_has_id "${taggery_name}/${id}" || taggery_init_page "${id}"
89   local tmp="$(kvs_get "${taggery_name}/${id}" tmp)"
90   [ -s "${tmp}" ] || taggery_fetch_page "${id}"
91   cat "${tmp}"
92 }
93
94 taggery_id() {
95   [ "${1}" ] || return 1
96   local url="${1}"
97   echo "${url}" | "${taggery_id_filter}"
98 }
99
100 taggery_image_url() {
101   [ "${1}" ] || return 1
102   local id="${1}"
103   taggery_page "${id}" | "${taggery_image_url_filter}"
104 }
105
106 taggery_image_referer() {
107   [ "${1}" ] || return 1
108   local id="${1}"
109   [ "${taggery_image_referer}" ] || return 0
110   "${taggery_image_referer}" "${id}"
111 }
112
113 taggery_fetch_image() {
114   [ "${1}" ] || return 1
115   local id="${1}"
116   file="$(taggery_image_url "${id}")"
117   name="$(basename "${file}")"
118   name="${name%%\?*}"
119   referer="$(taggery_image_referer "${id}")"
120   wget ${taggery_user_agent:+--user-agent="${taggery_user_agent}"} ${referer:+--referer="${referer}"} -O "${taggery_base}/md5/${name}" "${file}"
121 }
122
123 taggery_image_tags() {
124   [ "${1}" ] || return 1
125   local id="${1}"
126   echo "${taggery_name}"
127   taggery_page "${id}" | "${taggery_image_tags_filter}"
128 }
129
130 taggery_sanitize_tag() {
131   [ "${1}" ] || return 1
132   local tag="${1}"
133   echo "${tag}" | sed -e 's/\//%47/g; s/[\]/\\&/g'
134 }
135
136 taggery_link_tags() {
137   [ "${1}" ] || return 1
138   local id="${1}"
139   taggery_image_tags "${id}" | while read tag
140   do
141     [ "${tag}" ] || continue
142     echo "${tag}"
143     tag="$(taggery_sanitize_tag "${tag}")"
144     mkdir -p "${taggery_base}/tag/${tag}"
145     ln -sf "../../md5/${name}" "${taggery_base}/tag/${tag}/"
146   done
147 }
148
149 : ${taggery_temp:=${taggery_base}/tmp}
150
151 mkdir -p "${taggery_temp}" "${taggery_base}/md5" "${taggery_base}/tag" "${taggery_base}/pool"
152 TMPDIR="${taggery_temp}"
153 kvs="${taggery_temp}/taggery.kvs"
154 . "${taggery_libs}/kvs.sh"