Mercurial > ec-dotfiles
comparison moefetch.sh @ 228:5d3a0645b504
- Restructured some things.
- Removed -- from commands. Replaced with safe_path command.
- Updated help.
- All global variables should be initally set at init_globals command.
| author | edhoprima@gmail.com <edhoprima@gmail.com> |
|---|---|
| date | Tue, 15 Dec 2009 04:39:46 +0000 |
| parents | 8b1f6f6b6a3b |
| children | b03fef57b465 |
comparison
equal
deleted
inserted
replaced
| 227:8b1f6f6b6a3b | 228:5d3a0645b504 |
|---|---|
| 41 ### - sanity checking | 41 ### - sanity checking |
| 42 ### - MOAR comments | 42 ### - MOAR comments |
| 43 ### WILL BE FOR 0.3 | 43 ### WILL BE FOR 0.3 |
| 44 | 44 |
| 45 # useless welcome message. Also version | 45 # useless welcome message. Also version |
| 46 Msg_Welcome() { | 46 msg_welcome() { |
| 47 MOEFETCHVERSION="0.3-beta2" | 47 echo "moefetch ${_version} |
| 48 echo "moefetch ${MOEFETCHVERSION} | |
| 49 Copyright (c) 2009 edogawaconan <me@myconan.net> | 48 Copyright (c) 2009 edogawaconan <me@myconan.net> |
| 50 " | 49 " |
| 51 } | 50 } |
| 52 | 51 |
| 53 get_md5() { cat -- "$1" | openssl dgst -md5; } | 52 # Sanitize path. Totally safe. Usage: cmd "$(safe_path "${filename}")" |
| 54 get_basename() { basename /"$1"; } | 53 safe_path() |
| 54 { | |
| 55 # It all depends on the first character. | |
| 56 __start=$(printf "%s" "$*" | cut -c 1) | |
| 57 __path= | |
| 58 case "${__start}" in | |
| 59 .|/) __path="$*";; # . and / is safe. No change. | |
| 60 *) __path="./$*";; # Anything else must be prefixed with ./ | |
| 61 esac | |
| 62 printf "%s" "${__path}" # Return. | |
| 63 } | |
| 64 | |
| 65 # Checks md5. OpenSSL should be available on anything usable. | |
| 66 get_md5() { cat "$(safe_path "${1}")" | openssl dgst -md5; } | |
| 67 | |
| 68 # Safely get basename. | |
| 69 get_basename() { basename "$(safe_path "${1}")"; } | |
| 70 | |
| 71 # Safely get filename (basename without the extension). | |
| 55 get_filename() { get_basename "${1%.*}"; } | 72 get_filename() { get_basename "${1%.*}"; } |
| 56 get_cleantags() { printf "%s " "$@" | sed -e 's/\&/%26/g;s/=/%3D/g'; } | 73 |
| 57 Is_NotMD5() { get_filename "$1" | sed -e 's/\([0-9a-f]\{32\}\)//g'; } | 74 # Transformation for tag url. |
| 75 get_cleantags() { printf "%s " "$*" | sed -e 's/\&/%26/g;s/=/%3D/g'; } | |
| 76 | |
| 77 # Returns something if not an md5 value. | |
| 78 is_not_md5() { get_filename "$1" | sed -e 's/\([0-9a-f]\{32\}\)//g'; } | |
| 58 | 79 |
| 59 | 80 |
| 60 # fatal error handler | 81 # fatal error handler |
| 61 Err_Fatal() { | 82 Err_Fatal() { |
| 62 echo " | 83 echo " |
| 71 exit 1 | 92 exit 1 |
| 72 } | 93 } |
| 73 | 94 |
| 74 # help message | 95 # help message |
| 75 Err_Help() { | 96 Err_Help() { |
| 76 echo "moefetch.sh COMMAND [-s SITE_URL] TAGS | 97 echo "moefetch.sh COMMAND [-n] [-p PASSWORD] [-s SITE_URL] [-u USERNAME] TAGS |
| 77 | 98 |
| 78 COMMAND: | 99 COMMAND: |
| 79 (quick)fetch: do a complete update. Add prefix quick to skip file checking | 100 (quick)fetch: |
| 80 check: get list of new files, clean up local folder and print total new files | 101 Do a complete update. Add prefix quick to skip file checking |
| 81 | 102 check: |
| 82 -s SITE_URL: Specify URL of the Danbooru powered site you want to leech from. Default is ${DEFAULT_SITE} | 103 Get list of new files, clean up local folder and print total new files |
| 83 | 104 |
| 84 TAGS: Tags you want to download. Separated by spaces. Tag name follows standard Danbooru tagging scheme" | 105 OPTIONS: |
| 106 -n: | |
| 107 Skip checking repository directory. | |
| 108 -p PASSWORD: | |
| 109 Specifies password for login. | |
| 110 -s SITE_URL: | |
| 111 Specify URL of the Danbooru powered site you want to leech from. Default is ${DEFAULT_SITE}. | |
| 112 -u USERNAME: | |
| 113 Specifies username for login. | |
| 114 TAGS: | |
| 115 Tags you want to download. Separated by spaces. Tag name follows standard Danbooru tagging scheme." | |
| 85 exit 2 | 116 exit 2 |
| 86 } | 117 } |
| 87 | 118 |
| 88 # generate link by transforming xml | 119 # generate link by transforming xml |
| 89 Generate_Link() { | 120 Generate_Link() { |
| 90 echo " | 121 echo " |
| 91 Fetching XML file" | 122 Fetching XML file" |
| 92 tempnum=1000 | 123 __tempnum=1000 |
| 93 iternum=1 | 124 __iternum=1 |
| 94 > "${TEMP_PREFIX}-list" | 125 > "${TEMP_PREFIX}-list" |
| 95 while [ "${tempnum}" -ge 1000 ]; do | 126 while [ "${__tempnum}" -ge 1000 ]; do |
| 96 __url="http://${SITE}/post/index.xml?tags=$(get_cleantags "${TAGS}")&offset=0&limit=1000&page=${iternum}" | 127 __url="http://${SITE}/post/index.xml?tags=$(get_cleantags "${TAGS}")&offset=0&limit=1000&page=${__iternum}" |
| 97 [ ${_use_login} -eq 1 ] && __url="${__url}&login=${LOGIN_USER}&password_hash=${LOGIN_PASS}" | 128 [ ${_use_login} -eq 1 ] && __url="${__url}&login=${LOGIN_USER}&password_hash=${LOGIN_PASS}" |
| 98 wget "${__url}" -O "${TEMP_PREFIX}-xml" -e continue=off || Err_Fatal "Failed download catalog file" | 129 wget "${__url}" -O "${TEMP_PREFIX}-xml" -e continue=off || Err_Fatal "Failed download catalog file" |
| 99 printf "Processing XML file... " | 130 printf "Processing XML file... " |
| 100 # xslt evilry | 131 # xslt evilry |
| 101 xsltproc - "${TEMP_PREFIX}-xml" <<EOF | sed 's/.*\(http.*\)\(\/[a-f0-9]\{32\}\).*\.\([^\.]*\)/\1\2.\3/g' | grep ^http > "${TEMP_PREFIX}-templist" | 132 xsltproc - "${TEMP_PREFIX}-xml" <<EOF | sed 's/.*\(http.*\)\(\/[a-f0-9]\{32\}\).*\.\([^\.]*\)/\1\2.\3/g' | grep ^http > "${TEMP_PREFIX}-templist" |
| 104 <xsl:template match="post"> | 135 <xsl:template match="post"> |
| 105 <xsl:value-of select="@file_url" /> | 136 <xsl:value-of select="@file_url" /> |
| 106 </xsl:template> | 137 </xsl:template> |
| 107 </xsl:stylesheet> | 138 </xsl:stylesheet> |
| 108 EOF | 139 EOF |
| 109 tempnum=$(echo $(wc -l < "${TEMP_PREFIX}-templist")) | 140 __tempnum=$(echo $(wc -l < "${TEMP_PREFIX}-templist")) |
| 110 iternum=$((iternum + 1)) | 141 __iternum=$((__iternum + 1)) |
| 111 cat "${TEMP_PREFIX}-templist" >> "${TEMP_PREFIX}-list" | 142 cat "${TEMP_PREFIX}-templist" >> "${TEMP_PREFIX}-list" |
| 112 echo "${tempnum} file(s) available" | 143 echo "${__tempnum} file(s) available" |
| 113 done | 144 done |
| 114 numfiles=$(echo $(wc -l < "${TEMP_PREFIX}-list")) | 145 numfiles=$(echo $(wc -l < "${TEMP_PREFIX}-list")) |
| 115 echo "${numfiles} file(s) available on server" | 146 echo "${numfiles} file(s) available on server" |
| 116 [ "${numfiles}" -gt 0 ] || Err_Fatal "Error in processing list or no files can be found with specified tag(s) or site." | 147 [ "${numfiles}" -gt 0 ] || Err_Fatal "Error in processing list or no files can be found with specified tag(s) or site." |
| 117 } | 148 } |
| 118 | 149 |
| 119 | 150 |
| 120 Progress_Init() { | 151 progress_init() { |
| 121 _last="-" | 152 _last="-" |
| 122 printf "${_last}" | 153 printf "${_last}" |
| 123 } | 154 } |
| 124 | 155 |
| 125 Progress_Anim() { | 156 progress_anim() { |
| 126 case "${_last}" in | 157 case "${_last}" in |
| 127 /) _last="-";; | 158 /) _last="-";; |
| 128 -) _last=\\;; | 159 -) _last=\\;; |
| 129 \\) _last=\|;; | 160 \\) _last=\|;; |
| 130 \|) _last="/";; | 161 \|) _last="/";; |
| 131 esac | 162 esac |
| 132 printf "\b${_last}" | 163 printf "\b${_last}" |
| 133 } | 164 } |
| 134 | 165 |
| 135 Progress_Done() { printf "\bdone\n"; } | 166 progress_done() { printf "\bdone\n"; } |
| 136 | 167 |
| 137 # getting rid of ls (as per suggestion) | 168 # getting rid of ls (as per suggestion) |
| 138 Count_Files() { | 169 Count_Files() { |
| 139 numfiles=0 | 170 numfiles=0 |
| 140 for dircontent in "${*}/"* "${*}/".*; do | 171 for dircontent in "${*}/"* "${*}/".*; do |
| 176 | 207 |
| 177 # Do some cleanup | 208 # Do some cleanup |
| 178 Cleanup_Repository() { | 209 Cleanup_Repository() { |
| 179 # current dir: ${BASE_DIR}/${SITE_DIR}/${TARGET_DIR} | 210 # current dir: ${BASE_DIR}/${SITE_DIR}/${TARGET_DIR} |
| 180 printf "Cleaning up repository folder... " | 211 printf "Cleaning up repository folder... " |
| 181 Progress_Init | 212 progress_init |
| 182 trash_dir="${BASE_DIR}/trash/${trash_dir}/$(date -u "+${SITE_DIR}-${TARGET_DIR}-%Y%m%d-%H.%M")" | 213 trash_dir="${BASE_DIR}/trash/${trash_dir}/$(date -u "+${SITE_DIR}-${TARGET_DIR}-%Y%m%d-%H.%M")" |
| 183 trashes="These files have been moved to ${trash_dir}:" | 214 trashes="These files have been moved to ${trash_dir}:" |
| 184 has_trash= | 215 has_trash= |
| 185 if [ ! -d "${trash_dir}" ]; then | 216 if [ ! -d "${trash_dir}" ]; then |
| 186 mkdir -p "${trash_dir}" || Err_Impossible | 217 mkdir -p "${trash_dir}" || Err_Impossible |
| 190 fi | 221 fi |
| 191 fi | 222 fi |
| 192 for trash in "${BASE_DIR}/${SITE_DIR}/${TARGET_DIR}/"* | 223 for trash in "${BASE_DIR}/${SITE_DIR}/${TARGET_DIR}/"* |
| 193 do | 224 do |
| 194 is_trash= | 225 is_trash= |
| 195 if [ -d "${trash}" ] || [ -n "$(Is_NotMD5 "${trash}")" ] || [ -z "$(grep "$(get_basename "${trash}")" "${TEMP_PREFIX}-list")" ]; then | 226 if [ -d "${trash}" ] || [ -n "$(is_not_md5 "${trash}")" ] || [ -z "$(grep "$(get_basename "${trash}")" "${TEMP_PREFIX}-list")" ]; then |
| 196 is_trash=1 | 227 is_trash=1 |
| 197 has_trash=1 | 228 has_trash=1 |
| 198 mv -f -- "${trash}" "${trash_dir}" || Err_Impossible | 229 mv -f -- "${trash}" "${trash_dir}" || Err_Impossible |
| 199 trashes="${trashes} | 230 trashes="${trashes} |
| 200 $(get_basename "${trash}")" | 231 $(get_basename "${trash}")" |
| 201 fi | 232 fi |
| 202 Progress_Anim | 233 progress_anim |
| 203 done | 234 done |
| 204 rmdir "${trash_dir}" 2>/dev/null | 235 rmdir "${trash_dir}" 2>/dev/null |
| 205 Progress_Done | 236 progress_done |
| 206 [ -n "${has_trash}" ] && echo "${trashes}" | 237 [ -n "${has_trash}" ] && echo "${trashes}" |
| 207 } | 238 } |
| 208 | 239 |
| 209 # check files correctness | 240 # check files correctness |
| 210 Check_Files() { | 241 Check_Files() { |
| 211 if [ ! -n "${ISNEW}" ]; then | 242 if [ ! -n "${ISNEW}" ]; then |
| 212 [ -z "${NOCLEAN}" ] && Cleanup_Repository | 243 [ -z "${NOCLEAN}" ] && Cleanup_Repository |
| 213 printf "Checking for errors... " | 244 printf "Checking for errors... " |
| 214 Progress_Init | 245 progress_init |
| 215 files_error="These files do not match its md5:" | 246 __files_error="These files do not match its md5:" |
| 216 files_notdanbooru="These files are not checked:" | 247 __files_notdanbooru="These files are not checked:" |
| 217 has_err_filename= | 248 __has_err_filename= |
| 218 has_err_md5= | 249 __has_err_md5= |
| 219 > "${TEMP_PREFIX}-error" | 250 > "${TEMP_PREFIX}-error" |
| 220 > "${TEMP_PREFIX}-ok" | 251 > "${TEMP_PREFIX}-ok" |
| 221 for file in "${BASE_DIR}/${SITE_DIR}/${TARGET_DIR}/"* | 252 for file in "${BASE_DIR}/${SITE_DIR}/${TARGET_DIR}/"* |
| 222 do | 253 do |
| 223 if [ "${file}" != "${BASE_DIR}/${SITE_DIR}/${TARGET_DIR}/*" ]; then | 254 if [ "${file}" != "${BASE_DIR}/${SITE_DIR}/${TARGET_DIR}/*" ]; then |
| 224 if [ -n "$(Is_NotMD5 "${file}")" ] || [ -d "${file}" ]; then | 255 if [ -n "$(is_not_md5 "${file}")" ] || [ -d "${file}" ]; then |
| 225 files_notdanbooru="${files_notdanbooru} | 256 __files_notdanbooru="${__files_notdanbooru} |
| 226 $(get_basename "${file}")" | 257 $(get_basename "${file}")" |
| 227 has_err_filename=1 | 258 __has_err_filename=1 |
| 228 else | 259 else |
| 229 if [ "$(get_md5 "${file}")" = "$(get_filename "${file}")" ]; then | 260 if [ "$(get_md5 "${file}")" = "$(get_filename "${file}")" ]; then |
| 230 echo "$(get_basename "${file}")" >> "${TEMP_PREFIX}-ok" | 261 echo "$(get_basename "${file}")" >> "${TEMP_PREFIX}-ok" |
| 231 else | 262 else |
| 232 rm "${file}" || Err_Fatal "Error removing ${file}" | 263 rm "${file}" || Err_Fatal "Error removing ${file}" |
| 233 echo "$(get_basename "${file}")" >> "${TEMP_PREFIX}-error" | 264 echo "$(get_basename "${file}")" >> "${TEMP_PREFIX}-error" |
| 234 files_error="${files_error} | 265 __files_error="${__files_error} |
| 235 $(get_basename "${file}")" | 266 $(get_basename "${file}")" |
| 236 has_err_md5=1 | 267 __has_err_md5=1 |
| 237 fi | 268 fi |
| 238 fi | 269 fi |
| 239 fi | 270 fi |
| 240 Progress_Anim | 271 progress_anim |
| 241 done | 272 done |
| 242 Progress_Done | 273 progress_done |
| 243 if [ ! -n "${has_err_md5}" ] && [ ! -n "${has_err_filename}" ]; then | 274 if [ ! -n "${__has_err_md5}" ] && [ ! -n "${__has_err_filename}" ]; then |
| 244 echo "All files OK" | 275 echo "All files OK" |
| 245 else | 276 else |
| 246 if [ -n "${has_err_md5}" ]; then | 277 if [ -n "${__has_err_md5}" ]; then |
| 247 echo "${files_error}" | 278 echo "${__files_error}" |
| 248 echo "$(echo $(wc -l < "${TEMP_PREFIX}-error")) file(s) removed" | 279 echo "$(echo $(wc -l < "${TEMP_PREFIX}-error")) file(s) removed" |
| 249 fi | 280 fi |
| 250 [ -n "${has_err_filename}" ] && echo "${files_notdanbooru}" | 281 [ -n "${__has_err_filename}" ] && echo "${__files_notdanbooru}" |
| 251 fi | 282 fi |
| 252 echo "$(echo $(wc -l < "${TEMP_PREFIX}-ok")) file(s) available locally" | 283 echo "$(echo $(wc -l < "${TEMP_PREFIX}-ok")) file(s) available locally" |
| 253 | 284 |
| 254 printf "Generating list of new files... " | 285 printf "Generating list of new files... " |
| 255 Progress_Init | 286 progress_init |
| 256 cp -f "${TEMP_PREFIX}-list" "${TEMP_PREFIX}-templist" | 287 cp -f "${TEMP_PREFIX}-list" "${TEMP_PREFIX}-templist" |
| 257 while read -r is_ok; do | 288 while read -r is_ok; do |
| 258 grep -v "${is_ok}" "${TEMP_PREFIX}-templist" > "${TEMP_PREFIX}-newlist" | 289 grep -v "${is_ok}" "${TEMP_PREFIX}-templist" > "${TEMP_PREFIX}-newlist" |
| 259 cp -f "${TEMP_PREFIX}-newlist" "${TEMP_PREFIX}-templist" || Err_Impossible | 290 cp -f "${TEMP_PREFIX}-newlist" "${TEMP_PREFIX}-templist" || Err_Impossible |
| 260 Progress_Anim | 291 progress_anim |
| 261 done < "${TEMP_PREFIX}-ok" | 292 done < "${TEMP_PREFIX}-ok" |
| 262 Progress_Done | 293 progress_done |
| 263 echo "$(echo $(wc -l < "${TEMP_PREFIX}-newlist")) file(s) to be downloaded" | 294 echo "$(echo $(wc -l < "${TEMP_PREFIX}-newlist")) file(s) to be downloaded" |
| 264 else | 295 else |
| 265 if [ -n "${ISQUICK}" ]; then | 296 if [ -n "${ISQUICK}" ]; then |
| 266 echo "Quick mode selected. Skipping check" | 297 echo "Quick mode selected. Skipping check" |
| 267 else | 298 else |
| 295 fi | 326 fi |
| 296 | 327 |
| 297 # misc variables | 328 # misc variables |
| 298 ISQUICK= | 329 ISQUICK= |
| 299 ISNEW= | 330 ISNEW= |
| 300 # variable to check whether a login is used or not | |
| 301 _use_login=0 | |
| 302 | 331 |
| 303 # minimum number of arguments: 2 (command and tag). If less than two, exit and print help message | 332 # minimum number of arguments: 2 (command and tag). If less than two, exit and print help message |
| 304 [ $# -lt 2 ] && Err_Help | 333 [ $# -lt 2 ] && Err_Help |
| 305 case "$1" in | 334 case "$1" in |
| 306 check|fetch|quickfetch) | 335 check|fetch|quickfetch) |
| 346 TARGET_DIR=$(echo "${TAGS}" | sed -e 's/\//_/g') | 375 TARGET_DIR=$(echo "${TAGS}" | sed -e 's/\//_/g') |
| 347 SITE_DIR=$(echo "${SITE}" | sed -e 's/\/$//g;s/\//_/g') | 376 SITE_DIR=$(echo "${SITE}" | sed -e 's/\/$//g;s/\//_/g') |
| 348 TEMP_PREFIX="${BASE_DIR}/temp/${SITE_DIR}-${TARGET_DIR}" | 377 TEMP_PREFIX="${BASE_DIR}/temp/${SITE_DIR}-${TARGET_DIR}" |
| 349 } | 378 } |
| 350 | 379 |
| 380 # global variables goes here | |
| 381 init_globals() | |
| 382 { | |
| 383 _version="0.3-beta3" # version of this script | |
| 384 _use_login=0 # variable to check whether a login is used or not | |
| 385 } | |
| 386 | |
| 351 main() | 387 main() |
| 352 { | 388 { |
| 389 #initialize global variables | |
| 390 init_globals | |
| 391 #print welcome message | |
| 392 msg_welcome | |
| 353 # initialization | 393 # initialization |
| 354 Msg_Welcome | |
| 355 init "$@" | 394 init "$@" |
| 356 Check_Tools | 395 Check_Tools |
| 357 Check_Folders | 396 Check_Folders |
| 358 | 397 |
| 359 | 398 |
