From a299cee9bb9d133a749140b7a2fe1cf5bb79b8ae Mon Sep 17 00:00:00 2001 From: Keith Solomon Date: Tue, 29 Sep 2026 06:59:18 -0500 Subject: [PATCH] feat: Add new recovery and scanning scripts for Plex Media Server --- plex-db-verify => plex-db-verify.sh | 3 +++ plex-deep-scan => plex-deep-scan.sh | 3 +++ plex-plugin-scan => plex-plugin-scan.sh | 3 +++ plex-recover.sh | 1 + plex-scan.sh | 1 + plex-state.py | 3 ++- recover.sh | 2 ++ restore-tree.py | 1 + salvage.py | 1 + scan.sh | 2 ++ 10 files changed, 19 insertions(+), 1 deletion(-) rename plex-db-verify => plex-db-verify.sh (90%) mode change 100644 => 100755 rename plex-deep-scan => plex-deep-scan.sh (93%) mode change 100644 => 100755 rename plex-plugin-scan => plex-plugin-scan.sh (94%) mode change 100644 => 100755 diff --git a/plex-db-verify b/plex-db-verify.sh old mode 100644 new mode 100755 similarity index 90% rename from plex-db-verify rename to plex-db-verify.sh index 099ed45..d2c4a8b --- a/plex-db-verify +++ b/plex-db-verify.sh @@ -1,3 +1,6 @@ +#!/usr/bin/env bash +set -uo pipefail + DB_DIR="/mnt/recovery/plexmediaserver/Library/Application Support/Plex Media Server/Plug-in Support/Databases" SQLITE="/usr/lib/plexmediaserver/Plex SQLite" diff --git a/plex-deep-scan b/plex-deep-scan.sh old mode 100644 new mode 100755 similarity index 93% rename from plex-deep-scan rename to plex-deep-scan.sh index c7dad96..e5c9db2 --- a/plex-deep-scan +++ b/plex-deep-scan.sh @@ -1,3 +1,6 @@ +#!/usr/bin/env bash +set -uo pipefail + LV='/dev/mapper/plex--new-plex--new' BASE='/plexmediaserver/Library/Application Support/Plex Media Server' diff --git a/plex-plugin-scan b/plex-plugin-scan.sh old mode 100644 new mode 100755 similarity index 94% rename from plex-plugin-scan rename to plex-plugin-scan.sh index a425bb5..f36103d --- a/plex-plugin-scan +++ b/plex-plugin-scan.sh @@ -1,3 +1,6 @@ +#!/usr/bin/env bash +set -uo pipefail + LV='/dev/mapper/plex--new-plex--new' BASE='/plexmediaserver/Library/Application Support/Plex Media Server' diff --git a/plex-recover.sh b/plex-recover.sh index 761ecae..6666fb6 100755 --- a/plex-recover.sh +++ b/plex-recover.sh @@ -1,4 +1,5 @@ #!/usr/bin/env bash set -Eeuo pipefail + SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" exec python3 "$SCRIPT_DIR/plex-state.py" recover "${1:-core}" diff --git a/plex-scan.sh b/plex-scan.sh index 5c55983..04fecfd 100755 --- a/plex-scan.sh +++ b/plex-scan.sh @@ -1,4 +1,5 @@ #!/usr/bin/env bash set -Eeuo pipefail + SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" exec python3 "$SCRIPT_DIR/plex-state.py" scan "${1:-core}" diff --git a/plex-state.py b/plex-state.py index 7171422..f644fda 100755 --- a/plex-state.py +++ b/plex-state.py @@ -1,5 +1,6 @@ #!/usr/bin/env python3 -"""Strict, selective, read-only Plex state salvage from Banshee's damaged ext4 LV.""" + +"""Strict, selective, read-only Plex state salvage from a damaged ext4 LV.""" import argparse import datetime as dt import hashlib diff --git a/recover.sh b/recover.sh index 8950348..cbd9707 100755 --- a/recover.sh +++ b/recover.sh @@ -1,8 +1,10 @@ #!/usr/bin/env bash set -Eeuo pipefail + if [[ $# -ne 1 ]]; then echo "Usage: $0 '/absolute/source/path'" >&2 exit 2 fi + SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" exec python3 "$SCRIPT_DIR/salvage.py" recover "$1" diff --git a/restore-tree.py b/restore-tree.py index 646a660..993febb 100755 --- a/restore-tree.py +++ b/restore-tree.py @@ -1,4 +1,5 @@ #!/usr/bin/env python3 + """Dry-run or rebuild empty folder tree on an explicitly mounted new filesystem.""" import argparse diff --git a/salvage.py b/salvage.py index 95a0a8a..068023e 100755 --- a/salvage.py +++ b/salvage.py @@ -1,4 +1,5 @@ #!/usr/bin/env python3 + import argparse import hashlib import json diff --git a/scan.sh b/scan.sh index dd074ff..3a765de 100755 --- a/scan.sh +++ b/scan.sh @@ -1,8 +1,10 @@ #!/usr/bin/env bash set -Eeuo pipefail + if [[ $# -ne 1 ]]; then echo "Usage: $0 '/absolute/source/path'" >&2 exit 2 fi + SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" exec python3 "$SCRIPT_DIR/salvage.py" scan "$1"