From ebe9644701180605715ece3c1e155edebba0298e Mon Sep 17 00:00:00 2001 From: Peter Wood Date: Sat, 13 Dec 2025 18:50:02 -0500 Subject: [PATCH] feat: Add repair script for Jellyfin database with backup and integrity check functionality --- jellyfin/repair_jellyfin_db.sh | 97 ++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100755 jellyfin/repair_jellyfin_db.sh diff --git a/jellyfin/repair_jellyfin_db.sh b/jellyfin/repair_jellyfin_db.sh new file mode 100755 index 0000000..271f10d --- /dev/null +++ b/jellyfin/repair_jellyfin_db.sh @@ -0,0 +1,97 @@ +#!/bin/bash + +set -e + +# Configuration +CONTAINER_NAME="jellyfin" +DB_PATH_IN_CONTAINER="/config/data" +DB_FILES=("library.db" "jellyfin.db") +BACKUP_DIR="/tmp/jellyfin_db_backup_$(date +%Y%m%d_%H%M%S)" +REPAIR_DIR="/tmp/jellyfin_db_repair" + +# --- Functions --- + +# Function to print messages +log() { + echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" +} + +# Function to stop the Jellyfin container +stop_container() { + log "Stopping Jellyfin container..." + docker stop "$CONTAINER_NAME" +} + +# Function to start the Jellyfin container +start_container() { + log "Starting Jellyfin container..." + docker start "$CONTAINER_NAME" +} + +# Function to create a backup of the database files +backup_database() { + log "Backing up database files to $BACKUP_DIR..." + mkdir -p "$BACKUP_DIR" + for db_file in "${DB_FILES[@]}"; do + docker cp "${CONTAINER_NAME}:${DB_PATH_IN_CONTAINER}/${db_file}" "$BACKUP_DIR/" + done +} + +# Function to repair a database file +repair_database() { + local db_file="$1" + local db_path_in_repair_dir="${REPAIR_DIR}/${db_file}" + local sql_dump_file="${REPAIR_DIR}/${db_file}.sql" + local new_db_file="${REPAIR_DIR}/${db_file}.new" + + log "Repairing ${db_file}..." + + # Check for corruption + log "Running integrity check on ${db_file}..." + if sqlite3 "$db_path_in_repair_dir" "PRAGMA integrity_check;" | grep -q "ok"; then + log "${db_file} is not corrupted. Skipping repair." + return + fi + + log "Dumping ${db_file} to SQL file..." + sqlite3 "$db_path_in_repair_dir" .dump > "$sql_dump_file" + + log "Creating new database from SQL dump..." + sqlite3 "$new_db_file" < "$sql_dump_file" + + log "Replacing old database with the new one..." + mv "$new_db_file" "$db_path_in_repair_dir" +} + +# --- Main Script --- + +# Stop the container +stop_container + +# Create repair directory +mkdir -p "$REPAIR_DIR" + +# Copy database files to repair directory +log "Copying database files to repair directory..." +for db_file in "${DB_FILES[@]}"; do + docker cp "${CONTAINER_NAME}:${DB_PATH_IN_CONTAINER}/${db_file}" "$REPAIR_DIR/" +done + +# Repair each database file +for db_file in "${DB_FILES[@]}"; do + repair_database "$db_file" +done + +# Copy repaired files back to the container +log "Copying repaired files back to the container..." +for db_file in "${DB_FILES[@]}"; do + docker cp "${REPAIR_DIR}/${db_file}" "${CONTAINER_NAME}:${DB_PATH_IN_CONTAINER}/${db_file}" +done + +# Clean up repair directory +rm -rf "$REPAIR_DIR" + +# Start the container +start_container + +log "Database repair process completed."