tank-sort.nix (2521B)
1 { pkgs, username, ... }: 2 3 let 4 media-sort = pkgs.callPackage ./media-sort.nix {}; 5 6 tank-sort = pkgs.writeShellScriptBin "tank-sort" '' 7 set -euo pipefail # Exit on any error 8 9 # variables 10 temp_mount="$(mktemp -d)" 11 rclone_remote="seedbox:" 12 destination_tvshows="/tank/media/videos/television" 13 template_tvshows="{{ .Name }}/{{ .Name }} S{{ printf \"%02d\" .Season }}E{{ printf \"%02d\" .Episode }}{{ if ne .ExtraEpisode -1 }}-{{ printf \"%02d\" .ExtraEpisode }}{{end}}.{{ .Ext }}" 14 destination_movies="/tank/media/videos/movies" 15 template_movies="{{ .Name }} ({{ .Year }})/{{ .Name }}.{{ .Ext }}" 16 17 # Cleanup function 18 cleanup() { 19 echo "Cleaning up..." 20 if mountpoint -q "$temp_mount" 2>/dev/null; then 21 fusermount -uz "$temp_mount" 2>/dev/null || true 22 fi 23 if [ -d "$temp_mount" ]; then 24 rmdir "$temp_mount" 2>/dev/null || true 25 fi 26 } 27 trap cleanup EXIT 28 29 # mount remote 30 echo "Mounting rclone remote..." 31 if ! ${pkgs.rclone}/bin/rclone mount "$rclone_remote" "$temp_mount" \ 32 --vfs-cache-mode writes \ 33 --daemon-timeout 10s \ 34 --daemon; then 35 echo "ERROR: Failed to mount rclone remote" 36 exit 1 37 fi 38 39 # Wait for mount to be ready 40 echo "Waiting for mount to be ready..." 41 for i in {1..30}; do 42 if mountpoint -q "$temp_mount" 2>/dev/null; then 43 echo "Mount is ready" 44 break 45 fi 46 if [ $i -eq 30 ]; then 47 echo "ERROR: Mount failed to become ready within 30 seconds" 48 exit 1 49 fi 50 sleep 1 51 done 52 53 # sorting process 54 echo "Starting media sort..." 55 ${media-sort}/bin/media-sort \ 56 --action copy \ 57 --concurrency 1 \ 58 --accuracy-threshold 90 \ 59 --tv-dir "$destination_tvshows" \ 60 --movie-dir "$destination_movies" \ 61 --tv-template "$template_tvshows" \ 62 --movie-template "$template_movies" \ 63 --recursive \ 64 --overwrite-if-larger \ 65 --extensions "mp4,m4v,mkv" \ 66 "$temp_mount" 67 68 echo "Media sort completed successfully" 69 ''; 70 in { 71 environment.systemPackages = [tank-sort media-sort]; 72 73 systemd.timers.tank-sort = { 74 wantedBy = [ "timers.target" ]; 75 timerConfig = { 76 OnCalendar = "0/12:00:00"; 77 RandomizedDelaySec = "5min"; 78 Persistent = true; 79 }; 80 }; 81 82 systemd.services.tank-sort = { 83 script = "tank-sort"; 84 path = with pkgs; [ "/run/current-system/sw" rclone fuse util-linux media-sort ]; 85 serviceConfig = { 86 Type = "oneshot"; 87 User = "${username}"; 88 Restart = "no"; 89 RestartSec = "30s"; 90 SupplementaryGroups = [ "fuse" ]; 91 WorkingDirectory = "/tmp"; 92 TimeoutStartSec = "300s"; 93 }; 94 }; 95 }