# HG changeset patch # User edhoprima # Date 1258138022 0 # Node ID 265a9ca47a19502b9cd33be379bceb233dcdc61a # Parent 0ac1805621d43e74d6161bedbd97976cc2106375 - 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) diff -r 0ac1805621d4 -r 265a9ca47a19 moefetch.sh --- a/moefetch.sh Sat Jul 18 09:10:42 2009 +0000 +++ b/moefetch.sh Fri Nov 13 18:47:02 2009 +0000 @@ -18,15 +18,11 @@ # USE WITH CARE # # what it does: fetch every picture that has the specified TAGS. -# requirement: wget, libxslt, md5sum (or md5) +# requirement: wget, libxslt, openssl -# program additional paths for: cut, sed, wc, MD5(sum), wget, xsltproc, grep +# program additional paths for: cut, sed, wc, openssl, wget, xsltproc, grep ADDITIONAL_PATH= -# custom md5 path with arguments, expected output: <32digit md5> -# Leave empty for "md5sum" (Linux, Solaris), "md5 -r" (*BSD) -MD5= - # default server address. Danbooru only! I do not take responsibility of stupidity. DEFAULT_SITE="moe.imouto.org" @@ -47,12 +43,19 @@ # useless welcome message. Also version Msg_Welcome() { - MOEFETCHVERSION="0.3-beta1" + MOEFETCHVERSION="0.3-beta2" echo "moefetch ${MOEFETCHVERSION} Copyright (c) 2009 edogawaconan " } +get_md5() { cat -- "$1" | openssl dgst -md5; } +get_basename() { basename -- "$1"; } +get_filename() { get_basename "${1%.*}"; } +get_cleantags() { printf "%s " "$@" | sed -e 's/\&/%26/g;s/=/%3D/g'; } +Is_NotMD5() { get_filename "$1" | sed -e 's/\([0-9a-f]\{32\}\)//g'; } + + # fatal error handler Err_Fatal() { echo " @@ -89,7 +92,7 @@ iternum=1 > "${TEMP_PREFIX}-list" while [ "${tempnum}" -ge 1000 ]; do - wget "http://${SITE}/post/index.xml?tags=${TAGS}&offset=0&limit=1000&page=${_i}" -O "${TEMP_PREFIX}-xml" -e continue=off + 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 printf "Processing XML file... " # xslt evilry xsltproc - "${TEMP_PREFIX}-xml" < "${TEMP_PREFIX}-templist" @@ -110,9 +113,6 @@ [ "${numfiles}" -gt 0 ] || Err_Fatal "Error in processing list or no files can be found with specified tag(s) or site." } -Is_NotMD5() { - echo "${*}" | sed -e 's/\([0-9a-f]\{32\}\..*\)//g' -} Progress_Init() { _last="-" @@ -145,17 +145,7 @@ # check tools availability Check_Tools() { # verify all programs required do indeed exist - #MD5 - if [ -z "${MD5}" ]; then - case "$(uname)" in - *BSD) MD5="md5 -r";; - Linux|SunOS) MD5="md5sum";; - *) Fatal_Err "No known md5 tool for this platform. Please specify manually";; - esac - fi - md5_command=$(echo ${MD5} | cut -d' ' -f1) - # basic tools - commands="cut sed wc wget xsltproc xargs rm mkdir chown comm grep date ${md5_command}" + commands="cut sed wc wget xsltproc xargs rm mkdir chown comm grep date openssl" for cmd in ${commands} do [ "$(command -v "${cmd}")" ] || Err_Fatal "${cmd} doesn't exist in ${PATH}" @@ -199,12 +189,12 @@ for trash in "${BASE_DIR}/${SITE_DIR}/${TARGET_DIR}/"* do is_trash= - if [ -d "${trash}" ] || [ -n "$(Is_NotMD5 "$(basename "${trash}")")" ] || [ -z "$(grep "$(basename "${trash}")" "${TEMP_PREFIX}-list")" ]; then + if [ -d "${trash}" ] || [ -n "$(Is_NotMD5 "${trash}")" ] || [ -z "$(grep "$(get_basename "${trash}")" "${TEMP_PREFIX}-list")" ]; then is_trash=1 has_trash=1 - mv -f "${trash}" "${trash_dir}" || Err_Impossible + mv -f -- "${trash}" "${trash_dir}" || Err_Impossible trashes="${trashes} - $(basename "${trash}")" + $(get_basename "${trash}")" fi Progress_Anim done @@ -228,18 +218,18 @@ for file in "${BASE_DIR}/${SITE_DIR}/${TARGET_DIR}/"* do if [ "${file}" != "${BASE_DIR}/${SITE_DIR}/${TARGET_DIR}/*" ]; then - if [ -n "$(Is_NotMD5 "$(basename "${file}")")" ] || [ -d "${file}" ]; then + if [ -n "$(Is_NotMD5 "${file}")" ] || [ -d "${file}" ]; then files_notdanbooru="${files_notdanbooru} - $(basename "${file}")" + $(get_basename "${file}")" has_err_filename=1 else - if [ "$(${MD5} "${file}" | cut -d ' ' -f 1)" = "$(basename "${file}" | cut -d '.' -f 1)" ]; then - echo "$(basename "${file}")" >> "${TEMP_PREFIX}-ok" + if [ "$(get_md5 "${file}")" = "$(get_filename "${file}")" ]; then + echo "$(get_basename "${file}")" >> "${TEMP_PREFIX}-ok" else rm "${file}" || Err_Fatal "Error removing ${file}" - echo "$(basename "${file}")" >> "${TEMP_PREFIX}-error" + echo "$(get_basename "${file}")" >> "${TEMP_PREFIX}-error" files_error="${files_error} - $(basename "${file}")" + $(get_basename "${file}")" has_err_md5=1 fi fi @@ -312,25 +302,19 @@ shift SITE= TAGS= - while [ "${1}" ]; do - case "$1" in - -s|--site) - shift - SITE="$1" - ;; - -nc|--noclean) - NOCLEAN=1 - ;; - *) - if [ "${TAGS}" ]; then - TAGS="$1 ${TAGS}" - else - TAGS="$1" - fi - ;; + x=1 + while getopts "s:(site)n(noclean)u:(user)p:(password)" opt + do + case "$opt" in + s) SITE="$OPTARG";; + n) NOCLEAN=1;; + p) LOGIN_PASS=$(printf "%s" "$OPTARG" | openssl dgst -sha1);; + u) LOGIN_USER="$OPTARG";; esac - shift + x=${OPTIND} done + shift $(($x-1)) + TAGS="$@" [ -n "${SITE}" ] || SITE=${DEFAULT_SITE} [ -n "${TAGS}" ] || Err_Fatal "No tag specified" # Get base folder - default, current folder or fallback to ${HOME}