if [ ! -d "${LOCAL_STORE}" ]; then
abort "Aborting, no local storage directory at ${LOCAL_STORE}."
fi
-if echo "${SELECTION}" | grep -v "^${PATTERN_HASH_CHAR}*\$" > /dev/null; then
- abort "Bad SELECTION format: ${SELECTION}"
-fi
+
+
prefixed_msg 'Collecting known media …'
OVERVIEW_LOCAL=
cd "${LOCAL_STORE}"
parse_line() {
local TITLE="$1"
- local HASH='?'
- local SIZE='?'
+ local HASH=${PLACEHOLDER_HASH}
+ local SIZE=${PLACEHOLDER_SIZE}
local STATUS='?'
local PATH_DOWNLOAD="${TITLE}/${DIRNAME_DOWNLOAD}"
local PATH_SESSION="${TITLE}/${DIRNAME_SESSION}"
if [ -d "${PATH_DOWNLOAD}" ]; then
- SIZE=$(du --bytes --human-readable --summarize "${PATH_DOWNLOAD}" | cut -f 1)
+ SIZE=$(du --bytes --human-readable --summarize "${PATH_DOWNLOAD}" | cut -f 1)
+ STATUS='D'
fi
if [ -d "${PATH_SESSION}" ]; then
local SESSION_FILES_LISTING=$(ls -1 "${PATH_SESSION}")
if [ $(echo "${SESSION_FILES_LISTING}" | wc -l) -eq 3 ]; then
local MAYBE_HASH=$(basename $(echo "${SESSION_FILES_LISTING}" | head -1) "${EXT_TORRENT}" | grep -E "${PATTERN_HASH_ONLY}")
- if [ ! -z "${MAYBE_HASH}" ] && expected_rtorrent_files "${PATH_SESSION}/${MAYBE_HASH}${EXT_TORRENT}"; then
+ if [ ! -z "${MAYBE_HASH}" ] \
+ && expected_rtorrent_files "${PATH_SESSION}/${MAYBE_HASH}${EXT_TORRENT}"
+ then
HASH="${MAYBE_HASH}"
+ test "${STATUS}" = '?'&& STATUS='S'
+ test "${STATUS}" = 'D'&& STATUS='+'
fi
fi
fi
- if [ "${SIZE}" != "?" -a "${HASH}" != "?" ]; then
- STATUS='+'
- fi
OVERVIEW_LOCAL=$(printf '%s %s %s %s\n%s' "${STATUS}" "${HASH}" "${SIZE}" "${TITLE}" "${OVERVIEW_LOCAL}")
}
for_line_in "$(ls -1)" parse_line
cd - > /dev/null
OVERVIEW_REMOTE=$(ssh -t -q "${SERVER}" "sh -cl ${CMD_PRINT_TORRENTS}")
+
+
+prefixed_msg 'Comparing presence here vs there …'
OVERVIEW_BOTH=
OVERVIEW_ONLY_REMOTE=
OVERVIEW_ONLY_LOCAL="${OVERVIEW_LOCAL}"
OVERVIEW_ONLY_LOCAL="${NEXT_UNUSED}"
}
for_line_in "${OVERVIEW_REMOTE}" compare_overviews
-
if [ -z "${SELECTION}" ]; then
list_overview() {
- local MSG="$1"
- local OVERVIEW="$2"
+ local MSG=$1
+ local OVERVIEW=$(echo "$2" | sort -k 4)
prefixed_msg "${MSG}"
if [ -z "${OVERVIEW}" ]; then
prefixed_msg '(none)'
exit 0
fi
-FOUND=
+
+
+prefixed_msg "Analyzing selection: ${SELECTION}"
find_match() {
- local LINE_CUT=$(printf '%s' "$1" | cut -c 3-)
- local HASH_START=$(printf '%s' "${LINE_CUT}" | cut -c -${#SELECTION})
- if [ "${HASH_START}" = "${SELECTION}" ]; then
- if [ ! -z "${FOUND}" ]; then
- abort "Ambiguous selection, more than one hash starting with: ${SELECTION}"
+ local LINE=$1
+ local LOCAL_HASH=$(echo "${LINE}" | cut -d' ' -f 2)
+ local LOCAL_TITLE=$(echo "${LINE}" | cut -d' ' -f 4)
+ if $(echo "${LOCAL_HASH}" | grep -iqv "${SELECTION}")\
+ && $(echo "${LOCAL_TITLE}" | grep -iqv "${SELECTION}")
+ then
+ return
+ fi
+ local MSG_AMBIGUITY='Ambiguous selection, more than one selectable match found.'
+ if [ ! -z "${TITLE}" ] && [ "${LOCAL_TITLE}" != "${TITLE}" ]; then
+ abort "${MSG_AMBIGUITY}"
+ fi
+ TITLE="${LOCAL_TITLE}"
+ if [ "${LOCAL_HASH}" != "${PLACEHOLDER_HASH}" ]; then
+ if [ -z "${HASH}" ]; then
+ HASH="${LOCAL_HASH}"
+ elif [ "${LOCAL_HASH}" != "${HASH}" ]; then
+ abort "${MSG_AMBIGUITY}"
fi
- FOUND=1
- HASH=$(printf '%s' "${LINE_CUT}" | cut -d' ' -f 1)
- TITLE=$(printf '%s' "${LINE_CUT}" | cut -d' ' -f 3-)
fi
+ STATUS=$(echo "${LINE}" | cut -d' ' -f 1)
+ if [ "${STATUS}" = '?' ]; then
+ abort "Confounded by status for title: ${TITLE}"
+ elif [ "${STATUS}" = '+' ]; then
+ STORING='DS'
+ elif [ "${STATUS}" = '+' ]; then
+ STORING=${STATUS}
+ fi
+ STORES=$(echo "${STORES}:${STORING}")
}
-SYNC_DOWN=
-BOTHSIDED=
-for_line_in "${OVERVIEW_BOTH}" find_match
-if [ ! -z "${FOUND}" ]; then
- BOTHSIDED=1
-fi
+HASH=
+TITLE=
+STATUS=
for_line_in "${OVERVIEW_ONLY_REMOTE}" find_match
-if [ ! -z "${FOUND}" ]; then
- SYNC_DOWN=1
-fi
+STATUS_REMOTE=${STATUS}
+STATUS=
for_line_in "${OVERVIEW_ONLY_LOCAL}" find_match
-if [ -z "${FOUND}" ]; then
- abort "No known hash starting with: ${SELECTION}"
-elif [ ! -z "${BOTHSIDED}" ]; then
- abort 'Target present on both sides, nothing to do.'
+STATUS_LOCAL=${STATUS}
+if [ -z "${TITLE}" ]; then
+ abort 'No matching selectable found.'
fi
-prefixed_msg_no_nl "Hash ${HASH} selected for "
-if [ -z "${SYNC_DOWN}" ]; then printf 'LOCAL'; else printf 'REMOTE'; fi
-printf ' media: %s\n' "${TITLE}"
+
+
+
+prefixed_msg "Selected hash, title: ${HASH} ${TITLE}"
+calc_what_to_sync() {
+ local STATUS_THIS=$1 # S
+ local STATUS_THAT=$2 # D
+ local SYNC=
+ if [ "${STATUS_THIS}" = '' ]; then
+ SYNC='+'
+ elif [ "${STATUS_THIS}" = 'D' ]; then
+ SYNC='S'
+ elif [ "${STATUS_THIS}" = 'S' ]; then
+ SYNC='D'
+ fi
+ if [ ! -z "${SYNC}" ] && [ '+' != "${STATUS_THAT}" ]; then
+ if [ -z "${STATUS_THAT}" ] || [ "${STATUS_THAT}" != "${SYNC}" ]; then
+ abort 'Not enough stored data on both sides for sync.'
+ fi
+ fi
+ echo "${SYNC}"
+}
+SYNC_UP=$(calc_what_to_sync "${STATUS_REMOTE}" "${STATUS_LOCAL}")
+SYNC_DOWN=$(calc_what_to_sync "${STATUS_LOCAL}" "${STATUS_REMOTE}")
+prefixed_msg_no_nl 'Task: '
+print_task() {
+ local SYNC=$1
+ local DIRECTION=$2
+ local TARGET='nothing'
+ if [ "${SYNC}" = '+' ]; then
+ TARGET='ALL'
+ elif [ "${SYNC}" = 'S' ]; then
+ TARGET='SESSION'
+ elif [ "${SYNC}" = 'D' ]; then
+ TARGET='CONTENT'
+ fi
+ printf '%sloading %s' "${DIRECTION}" "${TARGET}"
+
+}
+print_task "${SYNC_UP}" 'up'
+printf ', '
+print_task "${SYNC_DOWN}" 'down'
+printf '\n'
+
+
TARGET_DIR="${LOCAL_STORE}/${TITLE}"
-if [ -z "${SYNC_DOWN}" ]; then
+if [ ! -z "${SYNC_UP}" ]; then
prefixed_msg 'Uploading …'
TMP_STORE=$(ssh -t -q "${SERVER}" "TMPDIR=~/tmp mktemp -d" | tr -d "\r")
-else
+ handle_subdir() {
+ local SUBDIR_LOCAL=$1
+ local SUBDIR_REMOTE=$2
+ local TMP_STORE_SUBDIR="${TMP_STORE}/${SUBDIR_LOCAL}"
+
+ local SUBDIR=$1
+ local TMP_STORE_SUBDIR="${TMP_STORE}/${SUBDIR}"
+ scp -r "${TARGET_DIR}/${SUBDIR_LOCAL}" "${SERVER}:${TMP_STORE}/"
+ ssh -t -q "${SERVER}" "mv -i ${TMP_STORE_SUBDIR}/* ~/${SUBDIR_REMOTE}/"
+ ssh -t -q "${SERVER}" "rmdir ${TMP_STORE_SUBDIR}"
+ }
+ if [ "${SYNC_UP}" = '+' -o "${SYNC_UP}" = 'D' ]; then
+ handle_subdir "${DIRNAME_DOWNLOAD}" "${DIRNAME_DOWNLOADS}"
+ fi
+ if [ "${SYNC_UP}" = '+' -o "${SYNC_UP}" = 'S' ]; then
+ handle_subdir "${DIRNAME_SESSION}" "${DIRNAME_SESSION}"
+ fi
+ ssh -t -q "${SERVER}" "rmdir ${TMP_STORE}"
+ ssh -t -q "${SERVER}" 'sh -cl kill_rtorrent'
+fi
+if [ ! -z "${SYNC_DOWN}" ]; then
prefixed_msg 'Downloading …'
- abort_if_exists "${TARGET_DIR}"
TMP_STORE=$(mktemp -d)
trapp "prefixed_msg 'With abortion, removing'${TMP_STORE}; rm -rf ${TMP_STORE}"
-fi
-TMP_STORE_DOWNLOAD="${TMP_STORE}/${DIRNAME_DOWNLOAD}"
-TMP_STORE_SESSION="${TMP_STORE}/${DIRNAME_SESSION}"
-if [ -z "${SYNC_DOWN}" ]; then
- scp -r "${TARGET_DIR}/"* "${SERVER}:${TMP_STORE}/"
- ssh -t -q "${SERVER}" "mv -i ${TMP_STORE_DOWNLOAD}/* ~/${DIRNAME_DOWNLOADS}/"
- ssh -t -q "${SERVER}" "mv -i ${TMP_STORE_SESSION}/* ~/${DIRNAME_SESSION}/"
- ssh -t -q "${SERVER}" "rmdir ${TMP_STORE_SESSION} && rmdir ${TMP_STORE_DOWNLOAD} && rmdir ${TMP_STORE}"
- ssh -t -q "${SERVER}" 'sh -cl kill_rtorrent'
-else
- mkdir "${TMP_STORE_SESSION}"
- mkdir "${TMP_STORE_DOWNLOAD}"
- scp "${SERVER}:~/${DIRNAME_SESSION}/${HASH}"* "${TMP_STORE_SESSION}/"
- scp -r "${SERVER}:~/${DIRNAME_DOWNLOADS}/${TITLE}" "${TMP_STORE_DOWNLOAD}/"
- prefixed_msg "Storing in: ${TARGET_DIR}"
- mv -i "${TMP_STORE}" "${TARGET_DIR}"
+ handle_subdir() {
+ local SUBDIR_LOCAL=$1
+ local SUBDIR_REMOTE=$2
+ local TMP_STORE_SUBDIR="${TMP_STORE}/${SUBDIR_LOCAL}"
+ local TO_COPY_PATTERN=$3
+ local GLOB=$4
+ mkdir "${TMP_STORE_SUBDIR}"
+ scp -r "${SERVER}:~/${SUBDIR_REMOTE}/${TO_COPY_PATTERN}"${GLOB} "${TMP_STORE_SUBDIR}/"
+ if [ "${SYNC_DOWN}" != '+' ]; then
+ mv -i "${TMP_STORE_SUBDIR}" "${TARGET_DIR}/"
+ fi
+ }
+ if [ "${SYNC_DOWN}" = '+' -o "${SYNC_DOWN}" = 'D' ]; then
+ handle_subdir "${DIRNAME_DOWNLOAD}" "${DIRNAME_DOWNLOADS}" "${TITLE}"
+ fi
+ if [ "${SYNC_DOWN}" = '+' -o "${SYNC_DOWN}" = 'S' ]; then
+ handle_subdir "${DIRNAME_SESSION}" "${DIRNAME_SESSION}" "${HASH}" '*'
+ fi
+ if [ "${SYNC_DOWN}" = '+' ]; then
+ mv -i "${TMP_STORE}" "${TARGET_DIR}"
+ fi
trapp
fi
+prefixed_msg 'Success!'
prefixed_msg_exit