tank-sort.nix (2567B)
1 { pkgs, ... }: 2 3 let 4 media-sort = pkgs.callPackage ../common/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 extensions="mp4,m4v,mkv" 13 state_file="/tmp/tank-sort.cache" 14 destination_tvshows="/tank/media/videos/television" 15 template_tvshows="{{ .Name }}/{{ .Name }} S{{ printf \"%02d\" .Season }}E{{ printf \"%02d\" .Episode }}{{ if ne .ExtraEpisode -1 }}-{{ printf \"%02d\" .ExtraEpisode }}{{end}}.{{ .Ext }}" 16 destination_movies="/tank/media/videos/movies" 17 template_movies="{{ .Name }} ({{ .Year }})/{{ .Name }}.{{ .Ext }}" 18 19 # Cleanup function 20 cleanup() { 21 echo "Cleaning up..." 22 if mountpoint -q "$temp_mount" 2>/dev/null; then 23 fusermount -uz "$temp_mount" 2>/dev/null || true 24 fi 25 if [ -d "$temp_mount" ]; then 26 rmdir "$temp_mount" 2>/dev/null || true 27 fi 28 } 29 trap cleanup EXIT 30 31 # check for changes on remote 32 current_hash="$(${pkgs.rclone}/bin/rclone lsjson "$rclone_remote" \ 33 --include "*.{''${extensions}}" \ 34 | ${pkgs.jq}/bin/jq -S '.[] | {Path, Size, ModTime}' \ 35 | sort \ 36 | sha256sum | cut -d' ' -f1)" 37 if [ -f "$state_file" ]; then 38 previous_hash="$(cat "$state_file")" 39 else 40 previous_hash="" 41 fi 42 43 if [ "$current_hash" = "$previous_hash" ]; then 44 echo "No changes detected in remote. Exiting." 45 exit 0 46 fi 47 48 echo "Changes detected. Proceeding..." 49 echo "$current_hash" > "$state_file" 50 51 # mount remote 52 echo "Mounting rclone remote..." 53 if ! ${pkgs.rclone}/bin/rclone mount "$rclone_remote" "$temp_mount" \ 54 --vfs-cache-mode writes \ 55 --daemon-timeout 10s \ 56 --daemon; then 57 echo "ERROR: Failed to mount rclone remote" 58 exit 1 59 fi 60 61 # Wait for mount to be ready 62 echo "Waiting for mount to be ready..." 63 for i in {1..30}; do 64 if mountpoint -q "$temp_mount" 2>/dev/null; then 65 echo "Mount is ready" 66 break 67 fi 68 if [ $i -eq 30 ]; then 69 echo "ERROR: Mount failed to become ready within 30 seconds" 70 exit 1 71 fi 72 sleep 1 73 done 74 75 # sorting process 76 echo "Starting media sort..." 77 ${media-sort}/bin/media-sort \ 78 --action copy \ 79 --concurrency 1 \ 80 --accuracy-threshold 90 \ 81 --tv-dir "$destination_tvshows" \ 82 --movie-dir "$destination_movies" \ 83 --tv-template "$template_tvshows" \ 84 --movie-template "$template_movies" \ 85 --recursive \ 86 --overwrite-if-larger \ 87 --extensions "$extensions" \ 88 "$temp_mount" 89 90 # git tank logger 91 tank-log 92 93 echo "Media sort completed successfully" 94 ''; 95 in { 96 environment.systemPackages = [tank-sort media-sort]; 97 }