Compare commits

..

No commits in common. "master" and "66c2231a1522a3ad3625d1cd4ece201965808db6" have entirely different histories.

6 changed files with 88 additions and 173 deletions

2
.gitignore vendored
View file

@ -1,2 +0,0 @@
archives/
previews/

View file

@ -5,7 +5,3 @@ An upcoming project. This will be a single program that fully automates the cont
It will be written in a mixture of Bash and Python. Tails and Whonix will be supported, with the goal of making the program work natively in Tails without the need to install additional software.
Anyone is welcome to collaborate with me.
## Collaborators
Currently it is not possible to submit pull requests when using the Tor Browser on the Safest setting. Please do not fork this repo attempting to submit a pull request. Instead leave a comment in [this thread](http://onion.tor.my/PedoDeveloper/autoshare/issues/7) and you will be added as a collaborator

View file

@ -1,43 +0,0 @@
#!/bin/bash
# Common utility functions shared across multiple files.
RESET="\033[0m"
GREEN="\033[1;32m"
YELLOW="\033[1;33m"
RED="\033[1;31m"
check_dependencies() {
# Usage: check_dependencies "7z" "unrar" "curl" ...
local dependencies=()
local dependency
for dependency in "$@"; do
if ! command -v "$dependency" >/dev/null; then
dependencies+=("$dependency")
fi
done
if (( "${#dependencies[@]}" > 0 )); then
log "ERROR" "Missing dependencies" "${dependencies[@]}"
return 1
fi
}
log() {
# Usage: log "NOTICE|WARN|ERROR" "this is a log message" ...
local caller="${0##*/}"
local level="$1"; shift
local color
case "$level" in
NOTICE) color="$GREEN" ;;
WARN) color="$YELLOW" ;;
ERROR) color="$RED" ;;
# No color for these levels.
INFO) color="" ;;
*) color="" ;;
esac
echo -e "$caller: ${color}[$level]: $*${RESET}" >&2
}

81
modules/archive.sh Executable file
View file

@ -0,0 +1,81 @@
#!/bin/bash
# This script packs a file or directory into a 7z archive with the given password.
# It can (optionally) split the archives into volumes of a fixed size in megabytes.
archive_dir="$(dirname "$0")/../archives"
input_file="${1}"
archive_pwd="${2}"
size="$3"
cleanup() {
[[ -n "$archive" ]] && rm -f "$archive*"
echo "Cleaned up all $archive files" >&2
}
check_dependencies() {
if ! mkdir -p "$archive_dir"; then
echo "ERROR: Unable to create archive directory"
exit 1
elif ! command -v 7z 2>&1 >/dev/null; then
echo "ERROR: 7z must be installed"
exit 1
fi
}
check_input() {
if [[ ! -e "${input_file}" ]]; then
echo "ERROR: Input file '${input_file}' does not exist"
exit 2
elif [[ -z "${archive_pwd}" ]]; then
echo "ERROR: No password given"
exit 2
elif [[ ! "$size" =~ ^([1-9][0-9]*)?$ ]]; then
echo "Invalid size $size, must be empty or a positive number"
exit 2
fi
echo "Archiving file/directory '${input_file}' with password '${archive_pwd}' and size '$size'" >&2
}
# Calculates a "smart" volume size so that each volume (including the final part) will be approximately the same size
calc_smart_volumes() {
total_size=$(du -s -BM "${input_file}" | grep -oP '^\d+') || return 0
# If total file size is smaller than volume size, don't pack it into volumes
(( total_size < size )) && return 1
num_volumes=$(( (total_size + size - 1) / size ))
size=$(( (total_size + num_volumes - 1) / num_volumes ))
echo "Calculated smart volume size '$size'" >&2
}
set_volumes() {
[[ -n "$size" ]] && calc_smart_volumes && volumes="-v${size}m"
echo "Volumes set to '$volumes'" >&2
}
# Generates a random archive name of 20 alphanumeric characters
generate_name() {
archive="$archive_dir/$(tr -dc [:alnum:] < /dev/urandom | head -c 20).7z"
echo "Generated archive name '$archive'" >&2
}
create_archive() {
echo "Packing '${input_file}' into archive '$archive' with password '${archive_pwd}'"
[[ -n "$volumes" ]] && echo "and volumes of size $size MB"
7z a -mhe=on "-p${archive_pwd}" "$volumes" "$archive" "${input_file}" >&2
}
trap cleanup 1 2 3 6
check_dependencies
check_input
set_volumes
generate_name
create_archive

View file

@ -1,116 +0,0 @@
#!/bin/bash
# This script packs a file or directory into a 7z archive with the given password.
# It can (optionally) split the archives into volumes of a fixed size in megabytes.
source "$(dirname "$0")/../includes/functions.sh"
set -euo pipefail
cleanup() {
local archive_name="$1"
rm -f "${archive_name}"*
log "INFO" "Cleaning up ${archive_name##*/} remains before exit"
}
check_input() {
local input_file="$1"
local password="$2"
local size="$3"
[[ -e "$input_file" ]] || { log "ERROR" "Input file '${input_file}' does not exist"; exit 2; }
[[ -n "${password}" ]] || { log "ERROR" "No password given"; exit 2; }
[[ "$size" =~ ^([1-9][0-9]*)?$ ]] || { log "ERROR" "Invalid size '$size', must be empty or a positive number"; exit 2; }
}
calc_smart_volumes() {
# Calculates a "smart" volume size so that each volume (including the final part)
# will be approximately the same size
local input_file="$1"
local size="$2"
local total_size num_volumes smart_size
total_size=$(du -s -BM "${input_file}" | grep -oP '^\d+') || return 1
# If total file size is smaller than volume size, don't pack it into volumes
if (( total_size < size)); then
log "WARN" "$input_file is smaller than ${size}MB, skipping volumes"
return 1
fi
num_volumes=$(( (total_size + size - 1) / size ))
smart_size=$(( (total_size + num_volumes - 1) / num_volumes ))
log "INFO" "Calculated smart volume size '$smart_size'"
echo "$smart_size"
}
get_volumes() {
local input_file="$1"
local size="${2:-}"
local volumes=""
local smart_size=""
if [[ -n "$size" ]]; then
log "INFO" "Volumes size is set to ${size}MB"
smart_size="$(calc_smart_volumes "$input_file" "$size" || true)"
fi
if [[ -n "$smart_size" ]]; then
volumes="-v${smart_size}m"
log "INFO" "Volumes set to '$volumes'"
else
log "INFO" "Volumes argument unset"
fi
echo "$volumes"
}
generate_name() {
# Generates a random archive name of 20 alphanumeric characters
local archive_dir="$1"
local archive_name
archive_name="$archive_dir/$(tr -dc '[:alnum:]' < /dev/urandom | head -c 20).7z"
log "INFO" "Generated archive name '$archive_name'"
echo "$archive_name"
}
create_archive() {
local input_file="$1"
local password="$2"
local volumes="$3"
local archive_name="$4"
7z a -mhe=on "-p${password}" "$volumes" "$archive_name" "${input_file}"
}
main() {
local input_file="${1:-}"
local password="${2:-}"
local size="${3:-}"
local volumes archive_name archive_dir
check_dependencies "7z"
check_input "$input_file" "$password" "$size"
archive_dir="$(dirname "$0")/../archives"
mkdir -p "$archive_dir"
archive_name="$(generate_name "$archive_dir")"
volumes="$(get_volumes "$input_file" "$size")"
log "INFO" "Packing '${input_file}' into archive '$archive_name' with password '${password}'"
trap 'cleanup "$archive_name"' ERR INT
create_archive \
"$input_file" \
"$password" \
"$volumes" \
"$archive_name"
log "NOTICE" "Archive created"
}
main "$@"

View file

@ -8,8 +8,8 @@ check_dependencies() {
if ! mkdir -p "$preview_dir"; then
echo "ERROR: Unable to create preview directory"
exit 1
elif ! command -v ffmpeg xargs 2>&1 >/dev/null; then
echo "ERROR: FFmpeg and xargs must be installed"
elif ! command -v ffmpeg 2>&1 >/dev/null; then
echo "ERROR: FFmpeg must be installed"
exit 1
fi
}
@ -23,7 +23,7 @@ check_input() {
# Search for videos recursively using the MIME type
find_videos() {
video_list=$(find ${search_dir} -type f -print0 | xargs -0 file -i | grep -oP '.*(?=:\s+video/)')
video_list=$(find "${search_dir}" -type f -exec file -i {} \; | grep -oP '.*(?=: video/)')
echo "${video_list}" >&2
}
@ -37,9 +37,9 @@ create_previews() {
get_size() {
IFS=','
read -r width height <<< $(ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=p=0 "${video}")
read -r width height <<< $(ffprobe -v error -select_streams v -show_entries stream=width,height -of csv=p=0 "${video}")
if (( $width >= $height )); then
if [[ $width -gt $height ]]; then
rows=4 cols=5
scale_format="200:-1"
else
@ -61,10 +61,9 @@ make_preview() {
get_size
get_num_frames
filename="$preview_dir/$(basename "${video}").webp"
filters="select=not(mod(n\,$frames_per_snapshot)),scale=$scale_format,tile=${rows}x${cols}"
filename="$(basename "${video}")"
ffmpeg -nostdin -loglevel panic -i "${video}" -frames 1 -q:v 90 -vf "$filters" "${filename}"
ffmpeg -nostdin -loglevel panic -i "${video}" -frames 1 -q:v 90 -vf "select=not(mod(n\,$frames_per_snapshot)),scale=$scale_format,tile=${rows}x${cols}" "$preview_dir/${filename}.webp"
}
check_dependencies