copying from private repo

This commit is contained in:
Q
2024-11-26 20:09:34 +02:00
parent 045f87ed7e
commit 6245fbcba0
14 changed files with 784 additions and 0 deletions

148
av/jhead-process Executable file
View File

@@ -0,0 +1,148 @@
#!/bin/bash
set -e
_help() {
self=$( readlink -f "$0" )
grep " # " "$self" | grep -v [\)]
exit
# jhead processor: renames images and videos with dates, and moves to subfolders
# Give filenames as arguments e.x.: *
#
}
which jhead &> /dev/null || {
echo "jhead missing"
exit 1
}
function is_image() {
jhead "$1" &>/dev/null
}
function gen_unique() {
if [[ ! -e "$1" ]]; then
echo "$1"
return
fi
pathdir=$( dirname "$1" )
fullname="${1##*/}"
extension="${fullname##*.}"
filename="${fullname%.*}"
aZ=( {a..z} {A..Z} )
idx=0
while true; do
newname="${filename}.${aZ[$idx]}.${extension}"
idx=$(( idx + 1 ))
if [[ ! -e "$pathdir/$newname" ]]; then
echo "$pathdir/$newname"
return
fi
if [[ -z "${aZ[$idx]}" ]]; then
echo "Cannot find unique filename for: $1" >&2
exit 1
fi
done
}
function image() {
newname=$( jhead -n%Y-%m-%d_%H%M%S "$1" )
if [[ -z "$newname" ]]; then
newname="$1"
else
newname=${newname##*--> }
fi
if [[ ! -e "$newname" ]]; then
echo Unexpected filename "$newname" >&2
exit 1
fi
jhead -c -ft -autorot -cl "-" "$newname"
move_to_dir "$newname"
}
function move_to_dir() {
if [[ $DIRS -eq 0 ]]; then
return
fi
pathdir=$( dirname "$1" )
fullname="${1##*/}"
date=$( date '+%Y-%m-%d' -d "$( date '+%Y/%m/%d %H:%M:%S' -r "$1" ) + 4" )
mkdir -p "$pathdir/$date"
tgt_name=$( gen_unique "$pathdir/$date/$fullname" )
mv -vi "$1" "$tgt_name"
}
function other() {
pathdir=$( dirname "$1" )
fullname="${1##*/}"
try_date=$( video_date "$1" )
[[ -n "$try_date" ]] && touch -d "$try_date" "$1"
dname=$( date '+%Y-%m-%d_%H%M%S' -d "$( date '+%Y/%m/%d %H:%M:%S' -r "$1" )" )
tgt=$( gen_unique "$pathdir/${dname}.$fullname" )
mv -v "$1" "$tgt"
move_to_dir "$tgt"
}
function video_date() {
ffprobe -hide_banner "$1" 2>&1 | grep creation_time | \
head -n 1 | cut -d: -f2- | xargs -II date -d I 2>/dev/null
}
if [[ -z "$1" ]]; then
_help
fi
DIRS=1
ONLYDIRS=0
for arg in "$@"; do
case "$arg" in
--nodir)
# --nodir Do not move files to subfolders
DIRS=0
;;
--onlydir)
# --onlydir Move files to subfolders, but do not rename
ONLYDIRS=1
DIRS=1
;;
--debug)
# --debug turn on set -x
set -x
;;
--help)
# --help This help message
_help
;;
-h) # This help message
_help
;;
esac
done
for file in "$@"; do
if [[ "$file" = "-"* ]]; then
continue
fi
if [[ -d "$file" ]]; then
continue
fi
if [[ $ONLYDIRS -eq 1 ]]; then
move_to_dir "$file"
continue
fi
if is_image "$file"; then
image "$file"
else
other "$file"
fi
done