Mercurial > ec-dotfiles
comparison moefetch.sh @ 225:265a9ca47a19
- Replaced md5(sum) with openssl. Less platform dependent because the tool is same across platforms
- Preparation for name-safe file operations.
- Sanity against sed
- Correctly encoded url (hopefully)
- getopts replacing fail hackjob with while and shift
- support for login (provided with openssl)
author | edhoprima |
---|---|
date | Fri, 13 Nov 2009 18:47:02 +0000 |
parents | 0ac1805621d4 |
children | f8be4a3d3b4a |
comparison
equal
deleted
inserted
replaced
224:0ac1805621d4 | 225:265a9ca47a19 |
---|---|
16 # | 16 # |
17 # Lots of bugs here. Use with care | 17 # Lots of bugs here. Use with care |
18 # USE WITH CARE | 18 # USE WITH CARE |
19 # | 19 # |
20 # what it does: fetch every picture that has the specified TAGS. | 20 # what it does: fetch every picture that has the specified TAGS. |
21 # requirement: wget, libxslt, md5sum (or md5) | 21 # requirement: wget, libxslt, openssl |
22 | 22 |
23 # program additional paths for: cut, sed, wc, MD5(sum), wget, xsltproc, grep | 23 # program additional paths for: cut, sed, wc, openssl, wget, xsltproc, grep |
24 ADDITIONAL_PATH= | 24 ADDITIONAL_PATH= |
25 | |
26 # custom md5 path with arguments, expected output: <32digit md5><space(s)><filename> | |
27 # Leave empty for "md5sum" (Linux, Solaris), "md5 -r" (*BSD) | |
28 MD5= | |
29 | 25 |
30 # default server address. Danbooru only! I do not take responsibility of stupidity. | 26 # default server address. Danbooru only! I do not take responsibility of stupidity. |
31 DEFAULT_SITE="moe.imouto.org" | 27 DEFAULT_SITE="moe.imouto.org" |
32 | 28 |
33 # base directory. make sure it's writeable. I do not take responsibility if you don't own the folder and files as no check is done for this one. | 29 # base directory. make sure it's writeable. I do not take responsibility if you don't own the folder and files as no check is done for this one. |
45 ### - sanity checking | 41 ### - sanity checking |
46 ### WILL BE FOR 0.3 | 42 ### WILL BE FOR 0.3 |
47 | 43 |
48 # useless welcome message. Also version | 44 # useless welcome message. Also version |
49 Msg_Welcome() { | 45 Msg_Welcome() { |
50 MOEFETCHVERSION="0.3-beta1" | 46 MOEFETCHVERSION="0.3-beta2" |
51 echo "moefetch ${MOEFETCHVERSION} | 47 echo "moefetch ${MOEFETCHVERSION} |
52 Copyright (c) 2009 edogawaconan <me@myconan.net> | 48 Copyright (c) 2009 edogawaconan <me@myconan.net> |
53 " | 49 " |
54 } | 50 } |
51 | |
52 get_md5() { cat -- "$1" | openssl dgst -md5; } | |
53 get_basename() { basename -- "$1"; } | |
54 get_filename() { get_basename "${1%.*}"; } | |
55 get_cleantags() { printf "%s " "$@" | sed -e 's/\&/%26/g;s/=/%3D/g'; } | |
56 Is_NotMD5() { get_filename "$1" | sed -e 's/\([0-9a-f]\{32\}\)//g'; } | |
57 | |
55 | 58 |
56 # fatal error handler | 59 # fatal error handler |
57 Err_Fatal() { | 60 Err_Fatal() { |
58 echo " | 61 echo " |
59 Fatal error: ${1}" | 62 Fatal error: ${1}" |
87 Fetching XML file" | 90 Fetching XML file" |
88 tempnum=1000 | 91 tempnum=1000 |
89 iternum=1 | 92 iternum=1 |
90 > "${TEMP_PREFIX}-list" | 93 > "${TEMP_PREFIX}-list" |
91 while [ "${tempnum}" -ge 1000 ]; do | 94 while [ "${tempnum}" -ge 1000 ]; do |
92 wget "http://${SITE}/post/index.xml?tags=${TAGS}&offset=0&limit=1000&page=${_i}" -O "${TEMP_PREFIX}-xml" -e continue=off | 95 wget "http://${SITE}/post/index.xml?tags=$(get_cleantags "${TAGS}")&offset=0&limit=1000&page=${iternum}&login=${LOGIN_USER}&password_hash=${LOGIN_PASS}" -O "${TEMP_PREFIX}-xml" -e continue=off |
93 printf "Processing XML file... " | 96 printf "Processing XML file... " |
94 # xslt evilry | 97 # xslt evilry |
95 xsltproc - "${TEMP_PREFIX}-xml" <<EOF | sed 's/.*\(http.*\)\(\/[a-f0-9]\{32\}\).*\.\([^\.]*\)/\1\2.\3/g' | grep ^http > "${TEMP_PREFIX}-templist" | 98 xsltproc - "${TEMP_PREFIX}-xml" <<EOF | sed 's/.*\(http.*\)\(\/[a-f0-9]\{32\}\).*\.\([^\.]*\)/\1\2.\3/g' | grep ^http > "${TEMP_PREFIX}-templist" |
96 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> | 99 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> |
97 <xsl:output method="xml" indent="yes"/> | 100 <xsl:output method="xml" indent="yes"/> |
108 numfiles=$(echo $(wc -l < "${TEMP_PREFIX}-list")) | 111 numfiles=$(echo $(wc -l < "${TEMP_PREFIX}-list")) |
109 echo "${numfiles} file(s) available on server" | 112 echo "${numfiles} file(s) available on server" |
110 [ "${numfiles}" -gt 0 ] || Err_Fatal "Error in processing list or no files can be found with specified tag(s) or site." | 113 [ "${numfiles}" -gt 0 ] || Err_Fatal "Error in processing list or no files can be found with specified tag(s) or site." |
111 } | 114 } |
112 | 115 |
113 Is_NotMD5() { | |
114 echo "${*}" | sed -e 's/\([0-9a-f]\{32\}\..*\)//g' | |
115 } | |
116 | 116 |
117 Progress_Init() { | 117 Progress_Init() { |
118 _last="-" | 118 _last="-" |
119 printf "${_last}" | 119 printf "${_last}" |
120 } | 120 } |
143 } | 143 } |
144 | 144 |
145 # check tools availability | 145 # check tools availability |
146 Check_Tools() { | 146 Check_Tools() { |
147 # verify all programs required do indeed exist | 147 # verify all programs required do indeed exist |
148 #MD5 | 148 commands="cut sed wc wget xsltproc xargs rm mkdir chown comm grep date openssl" |
149 if [ -z "${MD5}" ]; then | |
150 case "$(uname)" in | |
151 *BSD) MD5="md5 -r";; | |
152 Linux|SunOS) MD5="md5sum";; | |
153 *) Fatal_Err "No known md5 tool for this platform. Please specify manually";; | |
154 esac | |
155 fi | |
156 md5_command=$(echo ${MD5} | cut -d' ' -f1) | |
157 # basic tools | |
158 commands="cut sed wc wget xsltproc xargs rm mkdir chown comm grep date ${md5_command}" | |
159 for cmd in ${commands} | 149 for cmd in ${commands} |
160 do | 150 do |
161 [ "$(command -v "${cmd}")" ] || Err_Fatal "${cmd} doesn't exist in ${PATH}" | 151 [ "$(command -v "${cmd}")" ] || Err_Fatal "${cmd} doesn't exist in ${PATH}" |
162 done | 152 done |
163 } | 153 } |
197 fi | 187 fi |
198 fi | 188 fi |
199 for trash in "${BASE_DIR}/${SITE_DIR}/${TARGET_DIR}/"* | 189 for trash in "${BASE_DIR}/${SITE_DIR}/${TARGET_DIR}/"* |
200 do | 190 do |
201 is_trash= | 191 is_trash= |
202 if [ -d "${trash}" ] || [ -n "$(Is_NotMD5 "$(basename "${trash}")")" ] || [ -z "$(grep "$(basename "${trash}")" "${TEMP_PREFIX}-list")" ]; then | 192 if [ -d "${trash}" ] || [ -n "$(Is_NotMD5 "${trash}")" ] || [ -z "$(grep "$(get_basename "${trash}")" "${TEMP_PREFIX}-list")" ]; then |
203 is_trash=1 | 193 is_trash=1 |
204 has_trash=1 | 194 has_trash=1 |
205 mv -f "${trash}" "${trash_dir}" || Err_Impossible | 195 mv -f -- "${trash}" "${trash_dir}" || Err_Impossible |
206 trashes="${trashes} | 196 trashes="${trashes} |
207 $(basename "${trash}")" | 197 $(get_basename "${trash}")" |
208 fi | 198 fi |
209 Progress_Anim | 199 Progress_Anim |
210 done | 200 done |
211 rmdir "${trash_dir}" 2>/dev/null | 201 rmdir "${trash_dir}" 2>/dev/null |
212 Progress_Done | 202 Progress_Done |
226 > "${TEMP_PREFIX}-error" | 216 > "${TEMP_PREFIX}-error" |
227 > "${TEMP_PREFIX}-ok" | 217 > "${TEMP_PREFIX}-ok" |
228 for file in "${BASE_DIR}/${SITE_DIR}/${TARGET_DIR}/"* | 218 for file in "${BASE_DIR}/${SITE_DIR}/${TARGET_DIR}/"* |
229 do | 219 do |
230 if [ "${file}" != "${BASE_DIR}/${SITE_DIR}/${TARGET_DIR}/*" ]; then | 220 if [ "${file}" != "${BASE_DIR}/${SITE_DIR}/${TARGET_DIR}/*" ]; then |
231 if [ -n "$(Is_NotMD5 "$(basename "${file}")")" ] || [ -d "${file}" ]; then | 221 if [ -n "$(Is_NotMD5 "${file}")" ] || [ -d "${file}" ]; then |
232 files_notdanbooru="${files_notdanbooru} | 222 files_notdanbooru="${files_notdanbooru} |
233 $(basename "${file}")" | 223 $(get_basename "${file}")" |
234 has_err_filename=1 | 224 has_err_filename=1 |
235 else | 225 else |
236 if [ "$(${MD5} "${file}" | cut -d ' ' -f 1)" = "$(basename "${file}" | cut -d '.' -f 1)" ]; then | 226 if [ "$(get_md5 "${file}")" = "$(get_filename "${file}")" ]; then |
237 echo "$(basename "${file}")" >> "${TEMP_PREFIX}-ok" | 227 echo "$(get_basename "${file}")" >> "${TEMP_PREFIX}-ok" |
238 else | 228 else |
239 rm "${file}" || Err_Fatal "Error removing ${file}" | 229 rm "${file}" || Err_Fatal "Error removing ${file}" |
240 echo "$(basename "${file}")" >> "${TEMP_PREFIX}-error" | 230 echo "$(get_basename "${file}")" >> "${TEMP_PREFIX}-error" |
241 files_error="${files_error} | 231 files_error="${files_error} |
242 $(basename "${file}")" | 232 $(get_basename "${file}")" |
243 has_err_md5=1 | 233 has_err_md5=1 |
244 fi | 234 fi |
245 fi | 235 fi |
246 fi | 236 fi |
247 Progress_Anim | 237 Progress_Anim |
310 ;; | 300 ;; |
311 esac | 301 esac |
312 shift | 302 shift |
313 SITE= | 303 SITE= |
314 TAGS= | 304 TAGS= |
315 while [ "${1}" ]; do | 305 x=1 |
316 case "$1" in | 306 while getopts "s:(site)n(noclean)u:(user)p:(password)" opt |
317 -s|--site) | 307 do |
318 shift | 308 case "$opt" in |
319 SITE="$1" | 309 s) SITE="$OPTARG";; |
320 ;; | 310 n) NOCLEAN=1;; |
321 -nc|--noclean) | 311 p) LOGIN_PASS=$(printf "%s" "$OPTARG" | openssl dgst -sha1);; |
322 NOCLEAN=1 | 312 u) LOGIN_USER="$OPTARG";; |
323 ;; | |
324 *) | |
325 if [ "${TAGS}" ]; then | |
326 TAGS="$1 ${TAGS}" | |
327 else | |
328 TAGS="$1" | |
329 fi | |
330 ;; | |
331 esac | 313 esac |
332 shift | 314 x=${OPTIND} |
333 done | 315 done |
316 shift $(($x-1)) | |
317 TAGS="$@" | |
334 [ -n "${SITE}" ] || SITE=${DEFAULT_SITE} | 318 [ -n "${SITE}" ] || SITE=${DEFAULT_SITE} |
335 [ -n "${TAGS}" ] || Err_Fatal "No tag specified" | 319 [ -n "${TAGS}" ] || Err_Fatal "No tag specified" |
336 # Get base folder - default, current folder or fallback to ${HOME} | 320 # Get base folder - default, current folder or fallback to ${HOME} |
337 [ -n "${BASE_DIR}" ] || BASE_DIR=${PWD} | 321 [ -n "${BASE_DIR}" ] || BASE_DIR=${PWD} |
338 [ -n "${BASE_DIR}" ] || BASE_DIR=${HOME} | 322 [ -n "${BASE_DIR}" ] || BASE_DIR=${HOME} |