diff --git a/.gitignore b/.gitignore index bfc8577..dd64d9e 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -.claude/tmp/ \ No newline at end of file +.claude/tmp/ +tmp/ \ No newline at end of file diff --git a/CLAUDE.md b/CLAUDE.md index dffec24..561309c 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -63,9 +63,10 @@ When working in specific directories: - Load: `examples/vm-management/` - Load: `reference/vm-management/` -**Scripts directory (/scripts/)** +**Scripts directory (/scripts/, /scripts/*/)** - Load: `patterns/` (relevant to script type) -- Load: `reference/` (relevant troubleshooting guides) +- Load: `reference/` (relevant troubleshooting guides) +- Load: `scripts/*/README.md` (subsystem-specific documentation) - Context: Active operational scripts - treat as production code ### Keyword Triggers @@ -118,9 +119,11 @@ When user mentions specific terms, automatically load relevant docs: - Load: `examples/vm-management/` **Tdarr Keywords** -- "tdarr", "transcode", "ffmpeg", "gpu transcoding", "nvenc", "forEach error" +- "tdarr", "transcode", "ffmpeg", "gpu transcoding", "nvenc", "forEach error", "gaming detection", "scheduler" - Load: `reference/docker/tdarr-troubleshooting.md` - Load: `patterns/docker/distributed-transcoding.md` + - Load: `scripts/tdarr/README.md` (for automation and scheduling) + - Note: Gaming-aware scheduling system with configurable time windows available ### Priority Rules 1. **File extension triggers** take highest priority @@ -143,6 +146,8 @@ When user mentions specific terms, automatically load relevant docs: /examples/ # Complete working implementations /reference/ # Troubleshooting, cheat sheets, fallback info /scripts/ # Active scripts and utilities for home lab operations + ├── tdarr/ # Tdarr automation with gaming-aware scheduling + └── / # Other organized automation subsystems ``` Each pattern file should reference relevant examples and reference materials. @@ -150,6 +155,8 @@ Each pattern file should reference relevant examples and reference materials. ### Directory Usage Guidelines - `/scripts/` - Contains actively used scripts for home lab management and operations + - Organized by subsystem (e.g., `tdarr/`, `networking/`, `vm-management/`) + - Each subsystem includes its own README.md with complete documentation - `/examples/` - Contains example configurations and template scripts for reference - `/patterns/` - Best practices and architectural guidance - `/reference/` - Troubleshooting guides and technical references diff --git a/scripts/tdarr-manager b/scripts/tdarr-manager new file mode 100755 index 0000000..6495d7b --- /dev/null +++ b/scripts/tdarr-manager @@ -0,0 +1,6 @@ +#!/bin/bash +# Tdarr Manager - Quick access to Tdarr scheduler controls +# This is a convenience script that forwards to the main manager + +SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" +exec "${SCRIPT_DIR}/tdarr/tdarr-schedule-manager.sh" "$@" \ No newline at end of file diff --git a/scripts/tdarr/README.md b/scripts/tdarr/README.md new file mode 100644 index 0000000..856a73a --- /dev/null +++ b/scripts/tdarr/README.md @@ -0,0 +1,169 @@ +# Tdarr Gaming-Aware Scheduler + +Intelligent Tdarr node management with automatic gaming detection and flexible time-based scheduling. + +## 🎮 Overview + +This system automatically manages your Tdarr transcoding node to avoid conflicts with gaming and other GPU-intensive activities. It detects gaming processes, monitors GPU usage, and respects customizable time windows. + +## 📁 Files + +| File | Purpose | +|------|---------| +| `start-tdarr-gpu-podman-clean.sh` | Start Tdarr container with GPU support | +| `stop-tdarr-gpu-podman.sh` | Stop Tdarr container | +| `tdarr-cron-check-configurable.sh` | Main scheduler (runs every minute via cron) | +| `tdarr-schedule-manager.sh` | Management interface and configuration tool | +| `tdarr-schedule.conf` | Configuration file with schedule and settings | + +## 🧹 Automated Maintenance + +### Temporary Directory Cleanup +A cron job automatically cleans up abandoned Tdarr transcoding directories: + +```bash +# Runs every 6 hours (12 AM, 6 AM, 12 PM, 6 PM) +0 */6 * * * find /tmp -name "tdarr-workDir2-*" -type d -mmin +360 -exec rm -rf {} \; 2>/dev/null || true +``` + +**What it does:** +- Removes Tdarr temp directories older than 6 hours +- Protects active transcoding jobs (< 6 hours old) +- Prevents `/tmp` from filling up with abandoned work files +- Safe to run - only targets Tdarr-specific directories + +**When cleanup happens:** +- Failed transcoding jobs leave `tdarr-workDir2-*` directories +- Gaming interruptions can abandon partial work +- Cleanup preserves resume capability for active jobs + +## 🚀 Quick Start + +1. **Install the scheduler:** + ```bash + ./tdarr-schedule-manager.sh install + ``` + +2. **Check current status:** + ```bash + ./tdarr-schedule-manager.sh status + ``` + +3. **Test your current schedule:** + ```bash + ./tdarr-schedule-manager.sh test + ``` + +## ⚙️ Configuration + +### Apply Quick Presets +```bash +./tdarr-schedule-manager.sh preset night-only # 10PM-7AM only +./tdarr-schedule-manager.sh preset work-safe # Nights + work hours +./tdarr-schedule-manager.sh preset weekend-heavy # Maximum transcoding time +./tdarr-schedule-manager.sh preset gaming-only # No time limits, gaming detection only +``` + +### Custom Schedule Format +Edit `tdarr-schedule.conf` or use the manager: +```bash +./tdarr-schedule-manager.sh edit +``` + +**Time Block Format:** `"HOUR_START-HOUR_END:DAYS"` +- `"22-07:daily"` - 10PM to 7AM every day (overnight) +- `"09-17:1-5"` - 9AM to 5PM Monday-Friday +- `"14-16:6,7"` - 2PM to 4PM Saturday and Sunday +- `"08-20:6-7"` - 8AM to 8PM weekends only + +## 🎮 Gaming Detection + +Automatically detects these processes: +- Steam, Lutris, Heroic Games Launcher +- Wine, Bottles (Windows compatibility layers) +- GameMode, MangoHUD (gaming utilities) +- **GPU usage >15%** (configurable threshold) + +## 📊 Monitoring + +### View Status +```bash +./tdarr-schedule-manager.sh status +``` + +### Follow Real-time Logs +```bash +./tdarr-schedule-manager.sh logs +tail -f /tmp/tdarr-scheduler.log +``` + +### Check if Current Time is Allowed +```bash +./tdarr-schedule-manager.sh test +``` + +## 🔧 Manual Override + +### Start/Stop Manually +```bash +./start-tdarr-gpu-podman-clean.sh # Manual start +./stop-tdarr-gpu-podman.sh # Manual stop +``` + +### Remove Scheduler +```bash +crontab -e # Delete the tdarr line +``` + +## 🎯 How It Works + +1. **Cron runs every minute** → checks gaming processes & GPU usage +2. **Gaming detected** → immediately stops Tdarr +3. **No gaming + allowed time** → starts Tdarr +4. **Outside allowed hours** → stops Tdarr +5. **Logs all activity** → `/tmp/tdarr-scheduler.log` + +## 🏗️ Architecture + +``` +┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐ +│ cron (1min) │───▶│ configurable.sh │───▶│ start/stop.sh │ +└─────────────────┘ └──────────────────┘ └─────────────────┘ + │ + ┌────────▼────────┐ + │ schedule.conf │ + │ - Time blocks │ + │ - Gaming procs │ + │ - GPU threshold │ + └─────────────────┘ +``` + +## 🚨 Troubleshooting + +### Check Cron Installation +```bash +crontab -l | grep tdarr +# Should show both: +# * * * * * .../tdarr-cron-check-configurable.sh (scheduler) +# 0 */6 * * * find /tmp -name "tdarr-workDir2-*"... (cleanup) +``` + +### Verify Podman Access +```bash +podman ps # Should work without errors +``` + +### Test Gaming Detection +```bash +# Start Steam/game, then check: +tail -1 /tmp/tdarr-scheduler.log +``` + +### Reset to Defaults +```bash +./tdarr-schedule-manager.sh preset work-safe +./tdarr-schedule-manager.sh install +``` + +--- +*Generated by Claude Code - Gaming-aware home lab automation* \ No newline at end of file diff --git a/scripts/start-tdarr-gpu-podman-clean.sh b/scripts/tdarr/start-tdarr-gpu-podman-clean.sh similarity index 100% rename from scripts/start-tdarr-gpu-podman-clean.sh rename to scripts/tdarr/start-tdarr-gpu-podman-clean.sh diff --git a/scripts/tdarr/stop-tdarr-gpu-podman.sh b/scripts/tdarr/stop-tdarr-gpu-podman.sh new file mode 100755 index 0000000..d1a72f3 --- /dev/null +++ b/scripts/tdarr/stop-tdarr-gpu-podman.sh @@ -0,0 +1,14 @@ +#!/bin/bash +# Stop Tdarr Node Script +set -e + +CONTAINER_NAME="tdarr-node-gpu-unmapped" + +echo "🛑 Stopping Tdarr Node: ${CONTAINER_NAME}" + +if podman ps --format "{{.Names}}" | grep -q "^${CONTAINER_NAME}$"; then + podman stop "${CONTAINER_NAME}" 2>/dev/null || true + echo "✅ Tdarr Node stopped successfully" +else + echo "ℹ️ Tdarr Node was not running" +fi \ No newline at end of file diff --git a/scripts/tdarr/tdarr-cron-check-configurable.sh b/scripts/tdarr/tdarr-cron-check-configurable.sh new file mode 100755 index 0000000..2af72e5 --- /dev/null +++ b/scripts/tdarr/tdarr-cron-check-configurable.sh @@ -0,0 +1,142 @@ +#!/bin/bash +# Configurable Tdarr Gaming Scheduler (Cron Version) +# Uses tdarr-schedule.conf for flexible time-based scheduling + +SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" +CONFIG_FILE="${SCRIPT_DIR}/tdarr-schedule.conf" + +# Load configuration +if [[ -f "$CONFIG_FILE" ]]; then + source "$CONFIG_FILE" +else + echo "ERROR: Configuration file not found: $CONFIG_FILE" >&2 + exit 1 +fi + +# Set defaults if not configured +GAMING_PROCESSES=${GAMING_PROCESSES:-("steam" "lutris" "heroic" "gamemode")} +GPU_THRESHOLD=${GPU_THRESHOLD:-15} +CONTAINER_NAME=${CONTAINER_NAME:-"tdarr-node-gpu-unmapped"} +LOG_FILE=${LOG_FILE:-"/tmp/tdarr-scheduler.log"} +CHECK_GAMING_ONLY=${CHECK_GAMING_ONLY:-false} +QUIET_MODE=${QUIET_MODE:-false} + +log() { + if [[ "$QUIET_MODE" != "true" ]]; then + echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE" + fi +} + +is_gaming() { + # Check for gaming processes + for process in "${GAMING_PROCESSES[@]}"; do + if pgrep -f "$process" >/dev/null 2>&1; then + return 0 # Gaming detected + fi + done + + # Check GPU usage as backup indicator, but exclude Tdarr's own usage + if command -v nvidia-smi >/dev/null 2>&1; then + local gpu_usage=$(nvidia-smi --query-gpu=utilization.gpu --format=csv,noheader,nounits 2>/dev/null || echo "0") + if [[ $gpu_usage -gt $GPU_THRESHOLD ]]; then + # Check if Tdarr is running and likely causing the GPU usage + if is_tdarr_running && podman exec "$CONTAINER_NAME" pgrep -f "ffmpeg" >/dev/null 2>&1; then + log "📹 High GPU usage (${gpu_usage}%) but Tdarr transcoding active - ignoring" + return 1 # Not gaming, just Tdarr working + else + log "🎮 High GPU usage detected: ${gpu_usage}%" + return 0 # Gaming likely happening + fi + fi + fi + + return 1 # No gaming +} + +is_tdarr_running() { + podman ps --format "{{.Names}}" | grep -q "^${CONTAINER_NAME}$" +} + +is_time_allowed() { + # If gaming-only mode, always allow (time restrictions ignored) + if [[ "$CHECK_GAMING_ONLY" == "true" ]]; then + return 0 + fi + + local current_hour=$(date +%H | sed 's/^0//') # Remove leading zero + local current_day=$(date +%u) # 1=Monday, 7=Sunday + + # Check each time block in ALLOWED_TIMES + for time_block in "${ALLOWED_TIMES[@]}"; do + # Parse format: HOUR_START-HOUR_END:DAYS + local hours_part=$(echo "$time_block" | cut -d':' -f1) + local days_part=$(echo "$time_block" | cut -d':' -f2) + + local start_hour=$(echo "$hours_part" | cut -d'-' -f1 | sed 's/^0//') + local end_hour=$(echo "$hours_part" | cut -d'-' -f2 | sed 's/^0//') + + # Check if current day matches + local day_match=false + if [[ "$days_part" == "daily" ]]; then + day_match=true + else + # Check specific days (e.g., "1-5" or "3,5") + if [[ "$days_part" =~ ^[0-9]-[0-9]$ ]]; then + # Range format (e.g., "1-5") + local start_day=$(echo "$days_part" | cut -d'-' -f1) + local end_day=$(echo "$days_part" | cut -d'-' -f2) + if [[ $current_day -ge $start_day && $current_day -le $end_day ]]; then + day_match=true + fi + else + # Comma-separated format (e.g., "1,3,5") + if [[ ",$days_part," =~ ,$current_day, ]]; then + day_match=true + fi + fi + fi + + # Check if current time matches and day matches + if [[ "$day_match" == "true" ]]; then + # Handle overnight periods (e.g., 22-07) + if [[ $start_hour -gt $end_hour ]]; then + # Overnight: 22-07 means 22:00-23:59 OR 00:00-07:59 + if [[ $current_hour -ge $start_hour || $current_hour -le $end_hour ]]; then + return 0 # Time allowed + fi + else + # Same day: 09-17 means 09:00-17:59 + if [[ $current_hour -ge $start_hour && $current_hour -le $end_hour ]]; then + return 0 # Time allowed + fi + fi + fi + done + + return 1 # Time not allowed +} + +# Main logic +if is_gaming; then + # Gaming detected - stop Tdarr if running + if is_tdarr_running; then + log "🎮 Gaming detected - Stopping Tdarr Node" + "${SCRIPT_DIR}/stop-tdarr-gpu-podman.sh" >/dev/null 2>&1 + fi +else + # No gaming - check if we should start Tdarr + if is_time_allowed; then + if ! is_tdarr_running; then + local current_time=$(date '+%H:%M') + log "🎬 Starting Tdarr Node at ${current_time} (allowed time, no gaming)" + "${SCRIPT_DIR}/start-tdarr-gpu-podman-clean.sh" >/dev/null 2>&1 + fi + else + # Not allowed time - stop if running + if is_tdarr_running; then + local current_time=$(date '+%H:%M') + log "⏰ Stopping Tdarr Node at ${current_time} (outside allowed hours)" + "${SCRIPT_DIR}/stop-tdarr-gpu-podman.sh" >/dev/null 2>&1 + fi + fi +fi \ No newline at end of file diff --git a/scripts/tdarr/tdarr-schedule-manager.sh b/scripts/tdarr/tdarr-schedule-manager.sh new file mode 100755 index 0000000..aa9968c --- /dev/null +++ b/scripts/tdarr/tdarr-schedule-manager.sh @@ -0,0 +1,265 @@ +#!/bin/bash +# Tdarr Schedule Manager - Easy configuration and testing tool + +SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" +CONFIG_FILE="${SCRIPT_DIR}/tdarr-schedule.conf" +CRON_SCRIPT="${SCRIPT_DIR}/tdarr-cron-check-configurable.sh" + +show_help() { + cat << EOF +Tdarr Schedule Manager + +USAGE: + $0 [options] + +COMMANDS: + show - Show current schedule and status + edit - Open configuration file for editing + test - Test current time against schedule rules + preset - Apply a preset schedule + gaming-only - Enable gaming detection only (no time limits) + enable-times - Re-enable time-based scheduling + add-time - Add a new time block + install - Install/update the cron scheduler + logs - Show recent scheduler logs + status - Show Tdarr container status + +PRESETS: + night-only - Only 10PM-7AM daily + work-safe - Weekdays 9AM-5PM + nights + weekend-heavy - Weekdays 9AM-5PM + nights + weekend days + minimal - Only 2AM-6AM daily (very light usage) + gaming-only - No time limits, gaming detection only + +TIME FORMAT: + Examples: "22-07:daily" (10PM-7AM every day) + "09-17:1-5" (9AM-5PM Monday-Friday) + "14-16:6,7" (2PM-4PM Saturday,Sunday) + +EXAMPLES: + $0 show # Show current configuration + $0 preset night-only # Set to nights only + $0 add-time "08-10:6-7" # Add weekend mornings + $0 test # Test if current time is allowed +EOF +} + +show_current_config() { + echo "📋 Current Tdarr Schedule Configuration" + echo "======================================" + + if [[ -f "$CONFIG_FILE" ]]; then + echo "🕐 Allowed Time Blocks:" + grep -E '^[[:space:]]*"[0-9]' "$CONFIG_FILE" | sed 's/^[[:space:]]*/ /' + echo + + echo "🎮 Gaming Processes:" + grep -A1 'GAMING_PROCESSES=' "$CONFIG_FILE" | tail -1 | sed 's/^[[:space:]]*/ /' + + echo "⚙️ Settings:" + echo " GPU Threshold: $(grep 'GPU_THRESHOLD=' "$CONFIG_FILE" | cut -d'=' -f2)" + echo " Gaming Only Mode: $(grep 'CHECK_GAMING_ONLY=' "$CONFIG_FILE" | cut -d'=' -f2)" + echo " Quiet Mode: $(grep 'QUIET_MODE=' "$CONFIG_FILE" | cut -d'=' -f2)" + else + echo "❌ Configuration file not found: $CONFIG_FILE" + return 1 + fi +} + +test_current_time() { + echo "🧪 Testing Current Time Against Schedule" + echo "=======================================" + echo "Current Time: $(date '+%A, %B %d at %H:%M')" + echo "Current Day: $(date +%u) (1=Monday, 7=Sunday)" + echo + + if [[ -x "$CRON_SCRIPT" ]]; then + # Create a test version that shows the result + local test_result + export QUIET_MODE=true + if source "$CONFIG_FILE" && [[ "$CHECK_GAMING_ONLY" == "true" ]]; then + echo "✅ ALLOWED - Gaming-only mode is enabled" + else + # Test the is_time_allowed function + bash -c " + source '$CONFIG_FILE' + $(declare -f is_time_allowed) + + current_hour=\$(date +%H | sed 's/^0//') + current_day=\$(date +%u) + + if is_time_allowed; then + echo '✅ ALLOWED - Current time matches configured schedule' + else + echo '❌ NOT ALLOWED - Current time outside configured schedule' + fi + " 2>/dev/null || echo "⚠️ Error testing schedule" + fi + else + echo "❌ Scheduler script not found or not executable" + fi +} + +apply_preset() { + local preset="$1" + + case "$preset" in + "night-only") + cat > "$CONFIG_FILE" << 'EOF' +# Night-only preset: Tdarr runs 10PM-7AM daily +ALLOWED_TIMES=( + "22-07:daily" # 10PM to 7AM every day +) +GAMING_PROCESSES=("steam" "lutris" "heroic" "gamemode" "mangohud" "wine" "bottles") +GPU_THRESHOLD=15 +CHECK_GAMING_ONLY=false +CONTAINER_NAME="tdarr-node-gpu-unmapped" +LOG_FILE="/tmp/tdarr-scheduler.log" +STARTUP_DELAY=5 +QUIET_MODE=false +EOF + echo "✅ Applied preset: Night-only (10PM-7AM daily)" + ;; + "work-safe") + cat > "$CONFIG_FILE" << 'EOF' +# Work-safe preset: Nights + work hours on weekdays +ALLOWED_TIMES=( + "22-07:daily" # 10PM to 7AM every day + "09-17:1-5" # 9AM to 5PM Monday-Friday +) +GAMING_PROCESSES=("steam" "lutris" "heroic" "gamemode" "mangohud" "wine" "bottles") +GPU_THRESHOLD=15 +CHECK_GAMING_ONLY=false +CONTAINER_NAME="tdarr-node-gpu-unmapped" +LOG_FILE="/tmp/tdarr-scheduler.log" +STARTUP_DELAY=5 +QUIET_MODE=false +EOF + echo "✅ Applied preset: Work-safe (nights + weekday work hours)" + ;; + "weekend-heavy") + cat > "$CONFIG_FILE" << 'EOF' +# Weekend-heavy preset: Maximum transcoding time +ALLOWED_TIMES=( + "22-07:daily" # 10PM to 7AM every day + "09-17:1-5" # 9AM to 5PM Monday-Friday + "08-20:6-7" # 8AM to 8PM weekends +) +GAMING_PROCESSES=("steam" "lutris" "heroic" "gamemode" "mangohud" "wine" "bottles") +GPU_THRESHOLD=15 +CHECK_GAMING_ONLY=false +CONTAINER_NAME="tdarr-node-gpu-unmapped" +LOG_FILE="/tmp/tdarr-scheduler.log" +STARTUP_DELAY=5 +QUIET_MODE=false +EOF + echo "✅ Applied preset: Weekend-heavy (nights + work hours + most of weekend)" + ;; + "minimal") + cat > "$CONFIG_FILE" << 'EOF' +# Minimal preset: Very light usage, deep night hours only +ALLOWED_TIMES=( + "02-06:daily" # 2AM to 6AM every day +) +GAMING_PROCESSES=("steam" "lutris" "heroic" "gamemode" "mangohud" "wine" "bottles") +GPU_THRESHOLD=15 +CHECK_GAMING_ONLY=false +CONTAINER_NAME="tdarr-node-gpu-unmapped" +LOG_FILE="/tmp/tdarr-scheduler.log" +STARTUP_DELAY=5 +QUIET_MODE=false +EOF + echo "✅ Applied preset: Minimal (2AM-6AM daily only)" + ;; + "gaming-only") + sed -i 's/CHECK_GAMING_ONLY=false/CHECK_GAMING_ONLY=true/' "$CONFIG_FILE" + echo "✅ Applied preset: Gaming-only mode (no time restrictions)" + ;; + *) + echo "❌ Unknown preset: $preset" + echo "Available presets: night-only, work-safe, weekend-heavy, minimal, gaming-only" + return 1 + ;; + esac +} + +show_status() { + echo "📊 Tdarr System Status" + echo "=====================" + + # Container status + if podman ps --format "{{.Names}}\t{{.Status}}" | grep -q "tdarr-node-gpu"; then + echo "🟢 Tdarr Container: RUNNING" + podman ps --format "{{.Names}}\t{{.Status}}\t{{.CreatedAt}}" | grep tdarr + else + echo "🔴 Tdarr Container: STOPPED" + fi + echo + + # Cron status + if crontab -l 2>/dev/null | grep -q "tdarr-cron-check"; then + echo "🟢 Cron Scheduler: ACTIVE" + echo " $(crontab -l | grep tdarr-cron-check)" + else + echo "🔴 Cron Scheduler: NOT INSTALLED" + fi + echo + + # Recent activity + if [[ -f "/tmp/tdarr-scheduler.log" ]]; then + echo "📋 Last 3 scheduler events:" + tail -3 /tmp/tdarr-scheduler.log | sed 's/^/ /' + fi +} + +install_scheduler() { + echo "🔧 Installing/Updating Configurable Tdarr Scheduler" + + # Update crontab to use new script + (crontab -l 2>/dev/null | grep -v "tdarr-cron-check"; echo "* * * * * $CRON_SCRIPT") | crontab - + + echo "✅ Scheduler updated in crontab" + echo "🔍 Current cron entry:" + crontab -l | grep tdarr-cron-check +} + +case "${1:-help}" in + "show"|"config") + show_current_config + ;; + "edit") + ${EDITOR:-nano} "$CONFIG_FILE" + ;; + "test") + test_current_time + ;; + "preset") + if [[ -n "$2" ]]; then + apply_preset "$2" + else + echo "❌ Please specify a preset name" + echo "Available: night-only, work-safe, weekend-heavy, minimal, gaming-only" + fi + ;; + "gaming-only") + sed -i 's/CHECK_GAMING_ONLY=false/CHECK_GAMING_ONLY=true/' "$CONFIG_FILE" + echo "✅ Gaming-only mode enabled (no time restrictions)" + ;; + "enable-times") + sed -i 's/CHECK_GAMING_ONLY=true/CHECK_GAMING_ONLY=false/' "$CONFIG_FILE" + echo "✅ Time-based scheduling re-enabled" + ;; + "install") + install_scheduler + ;; + "status") + show_status + ;; + "logs") + echo "📋 Recent Tdarr Scheduler Logs:" + tail -20 /tmp/tdarr-scheduler.log 2>/dev/null || echo "No logs found" + ;; + "help"|*) + show_help + ;; +esac \ No newline at end of file diff --git a/scripts/tdarr/tdarr-schedule.conf b/scripts/tdarr/tdarr-schedule.conf new file mode 100644 index 0000000..fe50b03 --- /dev/null +++ b/scripts/tdarr/tdarr-schedule.conf @@ -0,0 +1,13 @@ +# Weekend-heavy preset: Maximum transcoding time +ALLOWED_TIMES=( + "22-07:daily" # 10PM to 7AM every day + "09-17:1-5" # 9AM to 5PM Monday-Friday + "08-20:6-7" # 8AM to 8PM weekends +) +GAMING_PROCESSES=("steam" "lutris" "heroic" "gamemode" "mangohud" "wine" "bottles") +GPU_THRESHOLD=95 +CHECK_GAMING_ONLY=true +CONTAINER_NAME="tdarr-node-gpu-unmapped" +LOG_FILE="/tmp/tdarr-scheduler.log" +STARTUP_DELAY=5 +QUIET_MODE=false