Files
Server-scripts/convert_heic.sh
T

201 lines
4.1 KiB
Bash
Raw Normal View History

2026-07-23 10:10:04 +02:00
#!/usr/bin/env bash
set -euo pipefail
shopt -s nullglob nocaseglob
convert_one() {
local src="$1"
if [[ ! -f "$src" ]]; then
echo "ERROR: file not found: $src"
return 1
fi
local base="${src%.*}"
local dst="${base}.jpg"
local tmp="${base}.tmp.jpg"
echo "Converting: $src"
# Convert HEIC -> JPEG
2026-08-06 10:33:59 +02:00
if command -v magick >/dev/null 2>&1; then
if ! magick "$src" \
-auto-orient \
-quality 100 \
-sampling-factor 4:4:4 \
"jpg:$tmp"; then
echo "ERROR: local conversion failed: $src"
rm -f "$tmp"
return 1
fi
else
if ! docker run --rm \
-u "$(id -u):$(id -g)" \
-v "$PWD:/work" \
-w /work \
--entrypoint magick \
dpokidov/imagemagick \
"$src" \
2026-07-23 10:10:04 +02:00
-auto-orient \
-quality 100 \
-sampling-factor 4:4:4 \
2026-08-06 10:33:59 +02:00
"jpg:$tmp"; then
echo "ERROR: docker conversion failed: $src"
rm -f "$tmp"
return 1
fi
2026-07-23 10:10:04 +02:00
fi
2026-08-06 10:33:59 +02:00
2026-07-23 10:10:04 +02:00
if [[ ! -s "$tmp" ]]; then
echo "ERROR: output JPEG is empty: $tmp"
rm -f "$tmp"
return 1
fi
echo "Copying metadata..."
if ! exiftool \
-overwrite_original \
-TagsFromFile "$src" \
-all:all \
-unsafe \
"$tmp" >/dev/null; then
echo "ERROR: metadata copy failed: $src"
rm -f "$tmp"
return 1
fi
touch -r "$src" "$tmp"
mv -f "$tmp" "$dst"
if [[ ! -s "$dst" ]]; then
echo "ERROR: final JPEG missing: $dst"
return 1
fi
2026-07-31 13:47:29 +02:00
rm -f "$src"
echo "Done: $dst"
echo "Removed: $src"
}
convert_mov() {
local src="$1"
if [[ ! -f "$src" ]]; then
echo "ERROR: file not found: $src"
return 1
fi
local base="${src%.*}"
local dst="${base}.mp4"
local tmp="${base}.tmp.mp4"
echo "Converting: $src"
# MOV -> MP4, keep video/audio, drop unsupported data streams
2026-08-06 10:33:59 +02:00
if ! ffmpeg \
-hide_banner \
-loglevel error \
-i "$src" \
-map 0:0 \
-map 0:1 \
-map_metadata 0 \
-c copy \
-movflags use_metadata_tags+faststart \
"$tmp"; then
echo "ERROR: conversion failed: $src"
rm -f "$tmp"
return 1
fi
2026-07-31 13:47:29 +02:00
if [[ ! -s "$tmp" ]]; then
echo "ERROR: output MP4 is empty: $tmp"
rm -f "$tmp"
return 1
fi
echo "Copying metadata..."
if ! exiftool \
-overwrite_original \
-TagsFromFile "$src" \
-all:all \
-unsafe \
"$tmp" >/dev/null; then
echo "ERROR: metadata copy failed: $src"
rm -f "$tmp"
return 1
fi
touch -r "$src" "$tmp"
mv -f "$tmp" "$dst"
if [[ ! -s "$dst" ]]; then
echo "ERROR: final MP4 missing: $dst"
return 1
fi
2026-07-23 10:10:04 +02:00
rm -f "$src"
echo "Done: $dst"
echo "Removed: $src"
}
2026-07-31 13:47:29 +02:00
process_file() {
case "${1,,}" in
*.heic)
convert_one "$1"
;;
*.mov)
convert_mov "$1"
;;
*)
echo "Skipping unsupported file: $1"
;;
esac
}
2026-08-06 10:33:59 +02:00
HOSTNAME_EXPECTED="serverhost"
SOURCE_DIR="/torrent/alina/Dropfolder"
TARGET_DIR="/torrent/camera"
# If running on serverhost, perform initial sync
if [[ "$(hostname)" == "$HOSTNAME_EXPECTED" ]]; then
/home/lucas/scripts/serverhost/syncNC.sh -d -c
cd "$SOURCE_DIR" || exit 1
fi
2026-07-23 10:10:04 +02:00
if [[ $# -gt 0 ]]; then
2026-07-31 13:47:29 +02:00
process_file "$1"
2026-07-23 10:10:04 +02:00
else
2026-08-06 10:33:59 +02:00
shopt -s nullglob
2026-07-31 13:47:29 +02:00
files=( *.heic *.mov )
2026-07-23 10:10:04 +02:00
if [[ ${#files[@]} -eq 0 ]]; then
2026-07-31 13:47:29 +02:00
echo "No HEIC or MOV files found."
2026-08-06 10:33:59 +02:00
else
for f in "${files[@]}"; do
process_file "$f"
done
2026-07-23 10:10:04 +02:00
fi
2026-08-06 10:33:59 +02:00
fi
2026-07-23 10:10:04 +02:00
2026-08-06 10:33:59 +02:00
# Run sync again if on serverhost
if [[ "$(hostname)" == "$HOSTNAME_EXPECTED" ]]; then
shopt -s nullglob
for ext in jpg mp4; do
files=("$SOURCE_DIR"/*."$ext")
if ((${#files[@]})); then
mv -n "${files[@]}" "$TARGET_DIR"/
fi
2026-07-23 10:10:04 +02:00
done
2026-08-06 10:33:59 +02:00
shopt -u nullglob
/home/lucas/scripts/serverhost/syncNC.sh -d -c
fi