Mercurial > ec-dotfiles
comparison moefetch.sh @ 232:5438d80244a3
- version bump
| author | edhoprima |
|---|---|
| date | Sun, 14 Mar 2010 18:35:03 +0000 |
| parents | 4c0fd276665e |
| children | 58ad057cd2ec |
comparison
equal
deleted
inserted
replaced
| 231:4c0fd276665e | 232:5438d80244a3 |
|---|---|
| 32 # Leave empty to use whatever folder you're running this at | 32 # Leave empty to use whatever folder you're running this at |
| 33 BASE_DIR= | 33 BASE_DIR= |
| 34 | 34 |
| 35 # not user modifiable from here | 35 # not user modifiable from here |
| 36 | 36 |
| 37 ### TODO: | |
| 38 ### - sanity validator(?) | |
| 39 ### - unified repository to save bandwidth | |
| 40 ### - bug stomping | |
| 41 ### - sanity checking | |
| 42 ### - MOAR comments | |
| 43 ### WILL BE FOR 0.3 | |
| 44 | |
| 45 # useless welcome message. Also version | 37 # useless welcome message. Also version |
| 46 msg_welcome() { | 38 msg_welcome() { |
| 47 echo "moefetch ${_version} | 39 echo "moefetch ${_version} |
| 48 Copyright (c) 2009 edogawaconan <me@myconan.net> | 40 Copyright (c) 2009 edogawaconan <me@myconan.net> |
| 49 " | 41 " |
| 51 | 43 |
| 52 # Sanitize path. Totally safe. Usage: cmd "$(safe_path "${filename}")" | 44 # Sanitize path. Totally safe. Usage: cmd "$(safe_path "${filename}")" |
| 53 safe_path() | 45 safe_path() |
| 54 { | 46 { |
| 55 # It all depends on the first character. | 47 # It all depends on the first character. |
| 56 __start=$(printf "%s" "$*" | cut -c 1) | 48 start=$(printf "%s" "$*" | cut -c 1) |
| 57 __path= | 49 path= |
| 58 case "${__start}" in | 50 case "${start}" in |
| 59 .|/) __path="$*";; # . and / is safe. No change. | 51 .|/) path="$*";; # . and / is safe. No change. |
| 60 *) __path="./$*";; # Anything else must be prefixed with ./ | 52 *) path="./$*";; # Anything else must be prefixed with ./ |
| 61 esac | 53 esac |
| 62 printf "%s" "${__path}" # Return. | 54 printf "%s" "${path}" # Return. |
| 63 } | 55 } |
| 64 | 56 |
| 65 # Checks md5. OpenSSL should be available on anything usable. | 57 # Checks md5. OpenSSL should be available on anything usable. |
| 66 get_md5() { cat "$(safe_path "${1}")" | openssl dgst -md5 | tail -n 1 | sed -e 's/.*\([[:xdigit:]]\{32\}\).*/\1/'; } | 58 get_md5() { cat "$(safe_path "${1}")" | openssl dgst -md5 | tail -n 1 | sed -e 's/.*\([[:xdigit:]]\{32\}\).*/\1/'; } |
| 67 | 59 |
| 118 | 110 |
| 119 # generate link by transforming xml | 111 # generate link by transforming xml |
| 120 Generate_Link() { | 112 Generate_Link() { |
| 121 echo " | 113 echo " |
| 122 Fetching XML file" | 114 Fetching XML file" |
| 123 __tempnum=1000 | 115 tempnum=1000 |
| 124 __iternum=1 | 116 iternum=1 |
| 125 > "${TEMP_PREFIX}-list" | 117 > "${TEMP_PREFIX}-list" |
| 126 while [ "${__tempnum}" -ge 1000 ]; do | 118 while [ "${tempnum}" -ge 1000 ]; do |
| 127 __url="http://${SITE}/post/index.xml?tags=$(get_cleantags "${TAGS}")&offset=0&limit=1000&page=${__iternum}" | 119 url="http://${SITE}/post/index.xml?tags=$(get_cleantags "${TAGS}")&offset=0&limit=1000&page=${iternum}" |
| 128 [ ${_use_login} -eq 1 ] && __url="${__url}&login=${LOGIN_USER}&password_hash=${LOGIN_PASS}" | 120 [ ${_use_login} -eq 1 ] && url="${url}&login=${LOGIN_USER}&password_hash=${LOGIN_PASS}" |
| 129 wget --quiet "${__url}" -O "${TEMP_PREFIX}-xml" -e continue=off || Err_Fatal "Failed download catalog file" | 121 wget --quiet "${url}" -O "${TEMP_PREFIX}-xml" -e continue=off || Err_Fatal "Failed download catalog file" |
| 130 printf "Processing XML file... " | 122 printf "Processing XML file... " |
| 131 # xslt evilry | 123 # xslt evilry |
| 132 xsltproc - "${TEMP_PREFIX}-xml" <<EOF | sed 's/.*\(http.*\)\(\/[a-f0-9]\{32\}\).*\.\([^\.]*\)/\1\2.\3/g' | grep ^http > "${TEMP_PREFIX}-templist" | 124 xsltproc - "${TEMP_PREFIX}-xml" <<EOF | sed 's/.*\(http.*\)\(\/[a-f0-9]\{32\}\).*\.\([^\.]*\)/\1\2.\3/g' | grep ^http > "${TEMP_PREFIX}-templist" |
| 133 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> | 125 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> |
| 134 <xsl:output method="xml" indent="yes"/> | 126 <xsl:output method="xml" indent="yes"/> |
| 135 <xsl:template match="post"> | 127 <xsl:template match="post"> |
| 136 <xsl:value-of select="@file_url" /> | 128 <xsl:value-of select="@file_url" /> |
| 137 </xsl:template> | 129 </xsl:template> |
| 138 </xsl:stylesheet> | 130 </xsl:stylesheet> |
| 139 EOF | 131 EOF |
| 140 __tempnum=$(echo $(wc -l < "${TEMP_PREFIX}-templist")) | 132 tempnum=$(echo $(wc -l < "${TEMP_PREFIX}-templist")) |
| 141 __iternum=$((__iternum + 1)) | 133 iternum=$((iternum + 1)) |
| 142 cat "${TEMP_PREFIX}-templist" >> "${TEMP_PREFIX}-list" | 134 cat "${TEMP_PREFIX}-templist" >> "${TEMP_PREFIX}-list" |
| 143 echo "${__tempnum} file(s) available" | 135 echo "${tempnum} file(s) available" |
| 144 done | 136 done |
| 145 numfiles=$(echo $(wc -l < "${TEMP_PREFIX}-list")) | 137 numfiles=$(echo $(wc -l < "${TEMP_PREFIX}-list")) |
| 146 echo "${numfiles} file(s) available on server" | 138 echo "${numfiles} file(s) available on server" |
| 147 [ "${numfiles}" -gt 0 ] || Err_Fatal "Error in processing list or no files can be found with specified tag(s) or site." | 139 [ "${numfiles}" -gt 0 ] || Err_Fatal "Error in processing list or no files can be found with specified tag(s) or site." |
| 148 } | 140 } |
| 241 Check_Files() { | 233 Check_Files() { |
| 242 if [ ! -n "${ISNEW}" ]; then | 234 if [ ! -n "${ISNEW}" ]; then |
| 243 [ -z "${NOCLEAN}" ] && Cleanup_Repository | 235 [ -z "${NOCLEAN}" ] && Cleanup_Repository |
| 244 printf "Checking for errors... " | 236 printf "Checking for errors... " |
| 245 progress_init | 237 progress_init |
| 246 __files_error="These files do not match its md5:" | 238 files_error="These files do not match its md5:" |
| 247 __files_notdanbooru="These files are not checked:" | 239 files_notdanbooru="These files are not checked:" |
| 248 __has_err_filename= | 240 has_err_filename= |
| 249 __has_err_md5= | 241 has_err_md5= |
| 250 > "${TEMP_PREFIX}-error" | 242 > "${TEMP_PREFIX}-error" |
| 251 > "${TEMP_PREFIX}-ok" | 243 > "${TEMP_PREFIX}-ok" |
| 252 for file in "${BASE_DIR}/${SITE_DIR}/${TARGET_DIR}/"* | 244 for file in "${BASE_DIR}/${SITE_DIR}/${TARGET_DIR}/"* |
| 253 do | 245 do |
| 254 if [ "${file}" != "${BASE_DIR}/${SITE_DIR}/${TARGET_DIR}/*" ]; then | 246 if [ "${file}" != "${BASE_DIR}/${SITE_DIR}/${TARGET_DIR}/*" ]; then |
| 255 if [ -n "$(is_not_md5 "${file}")" ] || [ -d "${file}" ]; then | 247 if [ -n "$(is_not_md5 "${file}")" ] || [ -d "${file}" ]; then |
| 256 __files_notdanbooru="${__files_notdanbooru} | 248 files_notdanbooru="${files_notdanbooru} |
| 257 $(get_basename "${file}")" | 249 $(get_basename "${file}")" |
| 258 __has_err_filename=1 | 250 has_err_filename=1 |
| 259 else | 251 else |
| 260 if [ "$(get_md5 "${file}")" = "$(get_filename "${file}")" ]; then | 252 if [ "$(get_md5 "${file}")" = "$(get_filename "${file}")" ]; then |
| 261 echo "$(get_basename "${file}")" >> "${TEMP_PREFIX}-ok" | 253 echo "$(get_basename "${file}")" >> "${TEMP_PREFIX}-ok" |
| 262 else | 254 else |
| 263 rm "${file}" || Err_Fatal "Error removing ${file}" | 255 rm "${file}" || Err_Fatal "Error removing ${file}" |
| 264 echo "$(get_basename "${file}")" >> "${TEMP_PREFIX}-error" | 256 echo "$(get_basename "${file}")" >> "${TEMP_PREFIX}-error" |
| 265 __files_error="${__files_error} | 257 files_error="${files_error} |
| 266 $(get_basename "${file}")" | 258 $(get_basename "${file}")" |
| 267 __has_err_md5=1 | 259 has_err_md5=1 |
| 268 fi | 260 fi |
| 269 fi | 261 fi |
| 270 fi | 262 fi |
| 271 progress_anim | 263 progress_anim |
| 272 done | 264 done |
| 273 progress_done | 265 progress_done |
| 274 if [ ! -n "${__has_err_md5}" ] && [ ! -n "${__has_err_filename}" ]; then | 266 if [ ! -n "${has_err_md5}" ] && [ ! -n "${has_err_filename}" ]; then |
| 275 echo "All files OK" | 267 echo "All files OK" |
| 276 else | 268 else |
| 277 if [ -n "${__has_err_md5}" ]; then | 269 if [ -n "${has_err_md5}" ]; then |
| 278 echo "${__files_error}" | 270 echo "${files_error}" |
| 279 echo "$(echo $(wc -l < "${TEMP_PREFIX}-error")) file(s) removed" | 271 echo "$(echo $(wc -l < "${TEMP_PREFIX}-error")) file(s) removed" |
| 280 fi | 272 fi |
| 281 [ -n "${__has_err_filename}" ] && echo "${__files_notdanbooru}" | 273 [ -n "${has_err_filename}" ] && echo "${files_notdanbooru}" |
| 282 fi | 274 fi |
| 283 echo "$(echo $(wc -l < "${TEMP_PREFIX}-ok")) file(s) available locally" | 275 echo "$(echo $(wc -l < "${TEMP_PREFIX}-ok")) file(s) available locally" |
| 284 | 276 |
| 285 printf "Generating list of new files... " | 277 printf "Generating list of new files... " |
| 286 progress_init | 278 progress_init |
| 341 ;; | 333 ;; |
| 342 esac | 334 esac |
| 343 shift | 335 shift |
| 344 SITE= | 336 SITE= |
| 345 TAGS= | 337 TAGS= |
| 346 __has_pass=0 | 338 has_pass=0 |
| 347 __has_user=0 | 339 has_user=0 |
| 348 x=1 | 340 x=1 |
| 349 while getopts "s:nu:p:" opt | 341 while getopts "s:nu:p:" opt |
| 350 do | 342 do |
| 351 case "$opt" in | 343 case "$opt" in |
| 352 s) SITE="$OPTARG";; | 344 s) SITE="$OPTARG";; |
| 353 n) NOCLEAN=1;; | 345 n) NOCLEAN=1;; |
| 354 p) | 346 p) |
| 355 LOGIN_PASS=$(printf "%s" "$OPTARG" | openssl dgst -sha1) | 347 LOGIN_PASS=$(printf "%s" "$OPTARG" | openssl dgst -sha1) |
| 356 __has_pass=1 | 348 has_pass=1 |
| 357 ;; | 349 ;; |
| 358 u) | 350 u) |
| 359 LOGIN_USER="$OPTARG" | 351 LOGIN_USER="$OPTARG" |
| 360 __has_user=1 | 352 has_user=1 |
| 361 ;; | 353 ;; |
| 362 esac | 354 esac |
| 363 x=$OPTIND | 355 x=$OPTIND |
| 364 done | 356 done |
| 365 shift $(($x-1)) | 357 shift $(($x-1)) |
| 370 # Get base folder - default, current folder or fallback to ${HOME} | 362 # Get base folder - default, current folder or fallback to ${HOME} |
| 371 [ -n "${BASE_DIR}" ] || BASE_DIR=${PWD} | 363 [ -n "${BASE_DIR}" ] || BASE_DIR=${PWD} |
| 372 [ -n "${BASE_DIR}" ] || BASE_DIR=${HOME} | 364 [ -n "${BASE_DIR}" ] || BASE_DIR=${HOME} |
| 373 [ -n "$(echo "${BASE_DIR}" | cut -c1 | grep \/)" ] || BASE_DIR="/${BASE_DIR}" | 365 [ -n "$(echo "${BASE_DIR}" | cut -c1 | grep \/)" ] || BASE_DIR="/${BASE_DIR}" |
| 374 # see if both pass and use are set. If they're set, switch _use_login variable content to 1. | 366 # see if both pass and use are set. If they're set, switch _use_login variable content to 1. |
| 375 [ ${__has_pass} -eq 1 -a ${__has_user} -eq 1 ] && _use_login=1 | 367 [ ${has_pass} -eq 1 -a ${has_user} -eq 1 ] && _use_login=1 |
| 376 | 368 |
| 377 echo "Tags: ${TAGS}" | 369 echo "Tags: ${TAGS}" |
| 378 # slash is not wanted for folder name | 370 # slash is not wanted for folder name |
| 379 TARGET_DIR=$(echo "${TAGS}" | sed -e 's/\//_/g') | 371 TARGET_DIR=$(echo "${TAGS}" | sed -e 's/\//_/g') |
| 380 SITE_DIR=$(echo "${SITE}" | sed -e 's/\/$//g;s/\//_/g') | 372 SITE_DIR=$(echo "${SITE}" | sed -e 's/\/$//g;s/\//_/g') |
| 382 } | 374 } |
| 383 | 375 |
| 384 # global variables goes here | 376 # global variables goes here |
| 385 init_globals() | 377 init_globals() |
| 386 { | 378 { |
| 387 _version="0.3-rc1" # version of this script | 379 _version="1.0-rc2" # version of this script |
| 388 _use_login=0 # variable to check whether a login is used or not | 380 _use_login=0 # variable to check whether a login is used or not |
| 389 } | 381 } |
| 390 | 382 |
| 391 main() | 383 main() |
| 392 { | 384 { |
