empyrean: cron job to move files from phone to NAS
This commit is contained in:
parent
ba3c46b8f4
commit
44583f670f
@ -11,6 +11,7 @@
|
||||
#./amanuensis.nix
|
||||
./catacomb.nix
|
||||
./gitea.nix
|
||||
./sync-pipeline.nix
|
||||
];
|
||||
|
||||
beatific.hostName = "empyrean";
|
||||
@ -39,6 +40,7 @@
|
||||
networking.interfaces.eth0.useDHCP = true;
|
||||
|
||||
environment.systemPackages = with pkgs; [
|
||||
exiftool
|
||||
tinc_pre
|
||||
gitea
|
||||
];
|
||||
|
74
machine/empyrean/sync-pipeline.nix
Normal file
74
machine/empyrean/sync-pipeline.nix
Normal file
@ -0,0 +1,74 @@
|
||||
{ pkgs, ... }:
|
||||
|
||||
# exiftool config and script based on that of @numinit
|
||||
|
||||
let
|
||||
# An exiftool config that adds the OriginTimestamp property containing the best guess for file creation time
|
||||
exiftool-config = pkgs.writeText "exiftool.config" ''
|
||||
%Image::ExifTool::UserDefined = (
|
||||
'Image::ExifTool::Composite' => {
|
||||
OriginTimestamp => {
|
||||
Desire => {
|
||||
0 => 'CreateDate',
|
||||
1 => 'DateTimeOriginal',
|
||||
2 => 'FileModifyDate'
|
||||
},
|
||||
ValueConv => '$val[0] || $val[1] || $val[2] || undef',
|
||||
PrintConv => '$self->ConvertDateTime($val)',
|
||||
PrintConvInv => '$self->InverseDateTime($val)'
|
||||
}
|
||||
}
|
||||
)
|
||||
'';
|
||||
|
||||
# A tool to use `find` and `exiftool` to sort images into YMD folders
|
||||
sibd = pkgs.writeShellScriptBin "sort-images-by-date" ''
|
||||
set -euo pipefail
|
||||
|
||||
if [ $# -lt 3 ]; then
|
||||
echo "Usage: $0 [prefix] [src] [dest] [exiftool args...]" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
prefix="$1"
|
||||
src="$2"
|
||||
dest="$3"
|
||||
# Remove $1, $2, $3 from $@ so the remainder can be passed to exiftool
|
||||
shift; shift; shift
|
||||
|
||||
# This find expression matches .jpg/.png modified 14+ days ago.
|
||||
# The -not (-name -prune) expressions exclude directories from the results by name.
|
||||
# The exiftool command will move matched files to $dest/$prefix/year/month/day/filename.ext.
|
||||
# -config loads the config defined above, which adds the OriginTimestamp composite property
|
||||
# -filename tells exiftool to move each file to a new filename, $OriginTimestamp
|
||||
# -d defines how the timestamp will be converted to a string, which ends up handling the pathing
|
||||
${pkgs.findutils}/bin/find $src \
|
||||
-not \( -name FalseKnees -prune \) \
|
||||
-not \( -name Background -prune \) \
|
||||
-type f \
|
||||
-mtime +14 \
|
||||
\( -name "*.jpg" -or -name "*.png" \) \
|
||||
-exec ${pkgs.exiftool}/bin/exiftool \
|
||||
-config ${exiftool-config} \
|
||||
-api largefilesupport=1 \
|
||||
-progress \
|
||||
-filename'<OriginTimestamp' \
|
||||
-d "''${dest}/''${prefix}/%Y-%m-%d/%%f%%-c.%%le" \
|
||||
"$@" \
|
||||
{} +
|
||||
'';
|
||||
|
||||
# Script for cron jobs that sends output to journalctl -t sync-pipeline
|
||||
sibd-cron = prefix: src: dest: pkgs.writeShellScript "sibd-cron" ''
|
||||
${systemd}/bin/systemd-cat -t sync-pipeline ${sibd}/bin/sort-images-by-date ${prefix} ${src} ${dest}
|
||||
'';
|
||||
in {
|
||||
environment.systemPackages = [ sort-images-by-date ];
|
||||
|
||||
services.cron = {
|
||||
enable = true;
|
||||
systemCronJobs = [
|
||||
"0 0 * * 1 tvb ${sibd-cron "nokia" "/home/tvb/phone-sync/DCIM" "/home/tvb/phone-sync/staging"}"
|
||||
"0 0 * * 1 tvb ${sibd-cron "nokia" "/home/tvb/phone-sync/Pictures" "/home/tvb/phone-sync/staging"}"
|
||||
];
|
||||
}
|
Loading…
Reference in New Issue
Block a user