]> CyberLeo.Net >> Repos - CDN/taggery.git/blob - lib/taggery.sh
Bug in taggery_image_name
[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_name() {
101   [ "${1}" ] || return 1
102   local id="${1}"
103   local url="$(taggery_image_url "${id}")"
104   if [ "${taggery_image_name_filter}" ]
105   then
106     "${taggery_image_name_filter}" "${id}" "${url}"
107   else
108     name="$(basename "${url}")"
109     name="${name%%\?*}"
110     echo "${name}"
111   fi
112 }
113
114 taggery_image_url() {
115   [ "${1}" ] || return 1
116   local id="${1}"
117   taggery_page "${id}" | "${taggery_image_url_filter}"
118 }
119
120 taggery_image_referer() {
121   [ "${1}" ] || return 1
122   local id="${1}"
123   [ "${taggery_image_referer}" ] || return 0
124   "${taggery_image_referer}" "${id}"
125 }
126
127 taggery_fetch_image() {
128   [ "${1}" ] || return 1
129   local id="${1}"
130   name="$(taggery_image_name "${id}")"
131   file="$(taggery_image_url "${id}")"
132   referer="$(taggery_image_referer "${id}")"
133   wget ${taggery_user_agent:+--user-agent="${taggery_user_agent}"} ${referer:+--referer="${referer}"} -O "${taggery_base}/md5/${name}" "${file}"
134 }
135
136 taggery_image_tags() {
137   [ "${1}" ] || return 1
138   local id="${1}"
139   echo "${taggery_name}"
140   taggery_page "${id}" | "${taggery_image_tags_filter}"
141 }
142
143 taggery_sanitize_tag() {
144   [ "${1}" ] || return 1
145   local tag="${1}"
146   echo "${tag}" | sed -e 's/\//%47/g; s/[\]/\\&/g'
147 }
148
149 taggery_link_tags() {
150   [ "${1}" ] || return 1
151   local id="${1}"
152   taggery_image_tags "${id}" | while read tag
153   do
154     [ "${tag}" ] || continue
155     echo "${tag}"
156     tag="$(taggery_sanitize_tag "${tag}")"
157     mkdir -p "${taggery_base}/tag/${tag}"
158     ln -sf "../../md5/${name}" "${taggery_base}/tag/${tag}/"
159   done
160 }
161
162 : ${taggery_temp:=${taggery_base}/tmp}
163
164 mkdir -p "${taggery_temp}" "${taggery_base}/md5" "${taggery_base}/tag" "${taggery_base}/pool"
165 TMPDIR="${taggery_temp}"
166 kvs="${taggery_temp}/taggery.kvs"
167 . "${taggery_libs}/kvs.sh"