nix-configs

Personal NixOS and home-manager configuration files
Log | Files | Refs

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 }