PATTERN_TORRENTNAME=".*e4:name[0-9]+:(.+)12:piece length.*"
PATTERN_DU_NONSUMMARY="^[[:graph:]]+[[:blank:]]+\.\/"
PATTERN_DU_SIZE_NAME="^([[:graph:]]+)\t\.\/(.+)$"
-PATH_SESSIONS="${HOME}/session"
-PATH_DOWNLOADS="${HOME}/downloads"
-SESSION_IGNORE='--hide=rtorrent.lock --hide=rtorrent.input_history'
+PATH_SESSIONS="${HOME}/${DIRNAME_SESSION}"
+PATH_DOWNLOADS="${HOME}/${DIRNAME_DOWNLOADS}"
+SESSION_FILES_TO_IGNORE='rtorrent.lock rtorrent.input_history'
cd "${PATH_SESSIONS}"
HASHED_TITLES=
-COLLECTED_HASHES=
+ALREADY_COLLECTED=
hash_titles() {
local FILENAME=$1
local HASH=$(printf '%s' "${FILENAME}" | sed 's/\'"${EXT_TORRENT}"'.*//g' | grep -E "${PATTERN_HASH_ONLY}")
- if [ ! -z "${HASH}" ]; then
+ if [ -z "${HASH}" ]; then
+ local TO_IGNORE
+ for TO_IGNORE in ${SESSION_FILES_TO_IGNORE}; do
+ if [ "${TO_IGNORE}" = "${FILENAME}" ]; then
+ return
+ fi
+ done
+ printf '? ? %s\n' "${FILENAME}"
+ else
echo "${ALREADY_COLLECTED}" | grep "${HASH}" > /dev/null && continue
- ALREADY_COLLECTED=$(printf '%s\n%s' "${HASH}" "${ALREADY_COLLECTED}")
+ ALREADY_COLLECTED=$(printf '%s\n%s' "${HASH}" "${ALREADY_COLLECTED}")
local TITLE=$(cat -v "${FILENAME}" | head -1 | sed -E "s/${PATTERN_TORRENTNAME}/\1/g")
HASHED_TITLES=$(printf '%s:%s\n%s' "${HASH}" "${TITLE}" "${HASHED_TITLES}")
fi
}
-for_line_in "$(ls -1 *${EXT_TORRENT}*)" hash_titles
-print_error( ) { printf '? ? %s\n' "$1"; }
-for_line_in "$(ls -1 ${SESSION_IGNORE} | grep -vE "^${PATTERN_HASH}"'\'"${EXT_TORRENT}")" print_error
+for_line_in "$(ls -1)" hash_titles
cd "${PATH_DOWNLOADS}"
SIZED_DOWNLOADS=$(du -ad1 -bh | grep -E "${PATTERN_DU_NONSUMMARY}" | sed -E "s/${PATTERN_DU_SIZE_NAME}/\1:\2/g")
. lib/path_tmp_timestamped
DIRNAME_DOWNLOAD='download'
-DIRNAME_SESSION='session'
+CMD_PRINT_TORRENTS='print_torrents'
prefixed_msg_init
abort_if_offline
}
for_line_in "$(ls -1)" parse_line
cd - > /dev/null
-OVERVIEW_REMOTE=$(ssh -t -q "${SERVER}" 'sh -cl print_torrents')
+OVERVIEW_REMOTE=$(ssh -t -q "${SERVER}" "sh -cl ${CMD_PRINT_TORRENTS}")
+
+OVERVIEW_BOTH=
+OVERVIEW_ONLY_REMOTE=
+OVERVIEW_ONLY_LOCAL="${OVERVIEW_LOCAL}"
+compare_overviews() {
+ local LINE_REMOTE="$1"
+ local FOUND=
+ local NEXT_UNUSED=
+ find_local_mirror() {
+ local LINE_LOCAL="$1"
+ if [ "${LINE_LOCAL}" = "${LINE_REMOTE}" ]; then
+ OVERVIEW_BOTH=$(printf '%s\n%s' "${LINE_LOCAL}" "${OVERVIEW_BOTH}")
+ FOUND=1
+ else
+ NEXT_UNUSED=$(printf '%s\n%s' "${LINE_LOCAL}" "${NEXT_UNUSED}")
+ fi
+ }
+ for_line_in "${OVERVIEW_ONLY_LOCAL}" find_local_mirror
+ if [ -z "${FOUND}" ]; then
+ OVERVIEW_ONLY_REMOTE=$(printf '%s\n%s' "${LINE_REMOTE}" "${OVERVIEW_ONLY_REMOTE}")
+ fi
+ OVERVIEW_ONLY_LOCAL="${NEXT_UNUSED}"
+}
+for_line_in "${OVERVIEW_REMOTE}" compare_overviews
if [ -z "${SELECTION}" ]; then
- prefixed_msg 'Found remotely:'
- for_line_in "${OVERVIEW_REMOTE}" prefixed_msg
- prefixed_msg 'Found locally:'
- for_line_in "${OVERVIEW_LOCAL}" prefixed_msg
+ list_overview() {
+ local MSG="$1"
+ local OVERVIEW="$2"
+ prefixed_msg "${MSG}"
+ if [ -z "${OVERVIEW}" ]; then
+ prefixed_msg '(none)'
+ else
+ for_line_in "${OVERVIEW}" prefixed_msg
+ fi
+ }
+ list_overview 'Found remotely and locally:' "${OVERVIEW_BOTH}"
+ list_overview 'Found only remotely:' "${OVERVIEW_ONLY_REMOTE}"
+ list_overview 'Found only locally:' "${OVERVIEW_ONLY_LOCAL}"
exit 0
fi
abort "Ambiguous selection, more than one hash starting with: ${SELECTION}"
fi
FOUND=1
- HASH=$(printf '%s' "${_LINE_CUT}" | cut -d' ' -f 1)
- TITLE=$(printf '%s' "${_LINE_CUT}" | cut -d' ' -f 3-)
+ HASH=$(printf '%s' "${LINE_CUT}" | cut -d' ' -f 1)
+ TITLE=$(printf '%s' "${LINE_CUT}" | cut -d' ' -f 3-)
fi
}
SYNC_DOWN=
-for_line_in "${OVERVIEW_REMOTE}" find_match
+BOTHSIDED=
+for_line_in "${OVERVIEW_BOTH}" find_match
+if [ ! -z "${FOUND}" ]; then
+ BOTHSIDED=1
+fi
+for_line_in "${OVERVIEW_ONLY_REMOTE}" find_match
if [ ! -z "${FOUND}" ]; then
SYNC_DOWN=1
fi
-for_line_in "${OVERVIEW_LOCAL}" find_match
+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.'
fi
prefixed_msg_no_nl "Hash ${HASH} selected for "
if [ -z "${SYNC_DOWN}" ]; then printf 'LOCAL'; else printf 'REMOTE'; fi
TARGET_DIR="${LOCAL_STORE}/${TITLE}"
TMP_DIR=/$(path_tmp_timestamped "${TITLE}")
+TMP_DIR_DOWNLOAD="${TMP_DIR}/${DIRNAME_DOWNLOAD}"
+TMP_DIR_SESSION="${TMP_DIR}/${DIRNAME_SESSION}"
if [ -z "${SYNC_DOWN}" ]; then
prefixed_msg 'Uploading …'
- #ssh -t -q "${SERVER}" "mkdir ${TMP_DIR}"
- #scp -r "${TARGET_DIR}/"* "${SERVER}:${TMP_DIR}/"
- #ssh -t -q "${SERVER}" "mv ${TMP_DIR}/download downloads/${TITLE}"
- #ssh -t -q "${SERVER}" "mv ${TMP_DIR}/session/* session/"
- #ssh -t -q "${SERVER}" "rmdir -p ${TMP_DIR}/session"
+ ssh -t -q "${SERVER}" "mkdir ${TMP_DIR}"
+ scp -r "${TARGET_DIR}/"* "${SERVER}:${TMP_DIR}/"
+ ssh -t -q "${SERVER}" "mv ${TMP_DIR_DOWNLOAD} ~/${DIRNAME_DOWNLOADS}/${TITLE}"
+ ssh -t -q "${SERVER}" "mv ${TMP_DIR_SESSION}/* ~/${DIRNAME_SESSION}/"
+ ssh -t -q "${SERVER}" "rmdir ${TMP_DIR_SESSION} && rmdir ${TMP_DIR}"
else
prefixed_msg 'Downloading …'
- #abort_if_exists "${TARGET_DIR}"
- #SESSION_DIR="${TMP_DIR}/session"
- #DOWNLOAD_DIR="${TMP_DIR}/download"
- #mkdir -p "${SESSION_DIR}"
- #mkdir -p "${DOWNLOAD_DIR}"
- #scp "${SERVER}:~/session/${HASH}"* "${SESSION_DIR}/"
- #scp -r "${SERVER}:~/downloads/${TITLE}" "${DOWNLOAD_DIR}/"
- #prefixed_msg "Storing in: ${TARGET_DIR}"
- #mv "${TMP_DIR}" "${TARGET_DIR}"
+ abort_if_exists "${TARGET_DIR}"
+ mkdir -p "${TMP_DIR_SESSION}"
+ mkdir -p "${TMP_DIR_DOWNLOAD}"
+ scp "${SERVER}:~/${DIRNAME_SESSION}/${HASH}"* "${TMP_DIR_SESSION}/"
+ scp -r "${SERVER}:~/${DIRNAME_DOWNLOADS}/${TITLE}" "${TMP_DIR_DOWNLOAD}/"
+ prefixed_msg "Storing in: ${TARGET_DIR}"
+ mv "${TMP_DIR}" "${TARGET_DIR}"
fi
prefixed_msg_exit