diff --git a/scripts/dump_all.sh b/scripts/dump_all.sh index 16bea1f6c..b0e8b3556 100755 --- a/scripts/dump_all.sh +++ b/scripts/dump_all.sh @@ -3,37 +3,25 @@ DB_PATH="/mnt/docker/work/books/audiobookshelf/config/absdatabase.sqlite" -echo "==============================================" -echo "DOCKER PATH SUMMARY" -echo "==============================================" - -echo "" -echo ">>> 1. LIBRARY FOLDERS (libraryFolders.path)" -echo "==============================================" +echo "=== libraryFolders ===" sqlite3 -header -column "$DB_PATH" "SELECT id, path, libraryId FROM libraryFolders;" echo "" -echo ">>> 2. LIBRARY ITEMS - Path Prefixes" -echo "==============================================" +echo "=== libraryItems path prefixes ===" sqlite3 "$DB_PATH" "SELECT DISTINCT SUBSTR(path, 1, INSTR(path || '/', '/') - 1) AS prefix FROM libraryItems ORDER BY prefix;" | sort -u echo "" -echo ">>> 3. BOOKS - Cover Path Prefixes" -echo "==============================================" +echo "=== books coverPath prefixes ===" sqlite3 "$DB_PATH" "SELECT DISTINCT SUBSTR(coverPath, 1, INSTR(coverPath || '/', '/') - 1) AS prefix FROM books WHERE coverPath IS NOT NULL ORDER BY prefix;" | sort -u echo "" -echo ">>> 4. FEEDS - Server Addresses (Docker hostnames)" -echo "==============================================" +echo "=== feeds serverAddresses ===" sqlite3 "$DB_PATH" "SELECT DISTINCT serverAddress FROM feeds WHERE serverAddress IS NOT NULL;" echo "" -echo ">>> 5. SETTINGS - Path-related Values" -echo "==============================================" +echo "=== settings (paths/URLs) ===" sqlite3 "$DB_PATH" "SELECT key, SUBSTR(value, 1, 200) FROM settings WHERE value LIKE '%/metadata/%' OR value LIKE '%/audiobooks%' OR value LIKE 'http://%' OR value LIKE 'https://%';" echo "" -echo ">>> 6. ALL LIKELY DOCKER PATHS (Quick scan)" -echo "==============================================" -echo "Scanning for paths starting with '/' or URLs..." +echo "=== Quick path scan ===" sqlite3 "$DB_PATH" "SELECT 'libraryFolders.path' AS source, path AS value FROM libraryFolders WHERE path LIKE '/%' UNION ALL SELECT 'libraryItems.path', path FROM libraryItems WHERE path LIKE '/%' UNION ALL SELECT 'books.coverPath', coverPath FROM books WHERE coverPath LIKE '/%' UNION ALL SELECT 'feeds.serverAddress', serverAddress FROM feeds WHERE serverAddress LIKE 'http://%' OR serverAddress LIKE 'https://%';" 2>/dev/null | head -50 diff --git a/scripts/dump_books.sh b/scripts/dump_books.sh index 62b643482..ddbefbf15 100755 --- a/scripts/dump_books.sh +++ b/scripts/dump_books.sh @@ -9,5 +9,5 @@ echo "---|-----------" sqlite3 -header -column "$DB_PATH" "SELECT id, coverPath FROM books LIMIT 50;" echo "" -echo "=== Unique Cover Path Prefixes ===" +echo "Unique cover path prefixes:" sqlite3 "$DB_PATH" "SELECT DISTINCT SUBSTR(coverPath, 1, INSTR(coverPath || '/', '/') - 1) FROM books WHERE coverPath IS NOT NULL;" | sort -u diff --git a/scripts/dump_feeds.sh b/scripts/dump_feeds.sh index f93198cbe..b05408606 100755 --- a/scripts/dump_feeds.sh +++ b/scripts/dump_feeds.sh @@ -3,11 +3,8 @@ DB_PATH="/mnt/docker/work/books/audiobookshelf/config/absdatabase.sqlite" -echo "=== feeds (URLs and Addresses) ===" -echo "ID | SERVER_ADDRESS | FEED_URL | COVER_PATH" -echo "---|----------------|----------|-----------" sqlite3 -header -column "$DB_PATH" "SELECT id, serverAddress, feedURL, coverPath FROM feeds;" echo "" -echo "=== Unique Server Addresses ===" +echo "Unique server addresses:" sqlite3 "$DB_PATH" "SELECT DISTINCT serverAddress FROM feeds WHERE serverAddress IS NOT NULL;" diff --git a/scripts/dump_library_folders.sh b/scripts/dump_library_folders.sh index 748d98b96..abf80f1b6 100755 --- a/scripts/dump_library_folders.sh +++ b/scripts/dump_library_folders.sh @@ -3,7 +3,4 @@ DB_PATH="/mnt/docker/work/books/audiobookshelf/config/absdatabase.sqlite" -echo "=== libraryFolders ===" -echo "ID | PATH | LIBRARY_ID" -echo "---|------|-----------" sqlite3 -header -column "$DB_PATH" "SELECT id, path, libraryId FROM libraryFolders;" diff --git a/scripts/dump_library_items.sh b/scripts/dump_library_items.sh index dd08a4b71..711e1f1dc 100755 --- a/scripts/dump_library_items.sh +++ b/scripts/dump_library_items.sh @@ -3,11 +3,8 @@ DB_PATH="/mnt/docker/work/books/audiobookshelf/config/absdatabase.sqlite" -echo "=== libraryItems (Paths) ===" -echo "ID | PATH | REL_PATH" -echo "---|------|---------" sqlite3 -header -column "$DB_PATH" "SELECT id, path, relPath FROM libraryItems LIMIT 100;" echo "" -echo "=== Unique Path Prefixes ===" +echo "Unique path prefixes:" sqlite3 "$DB_PATH" "SELECT DISTINCT SUBSTR(path, 1, INSTR(path || '/', '/') - 1) FROM libraryItems;" | sort -u diff --git a/scripts/dump_settings.sh b/scripts/dump_settings.sh index c7f4a916a..5b5a32086 100755 --- a/scripts/dump_settings.sh +++ b/scripts/dump_settings.sh @@ -3,9 +3,6 @@ DB_PATH="/mnt/docker/work/books/audiobookshelf/config/absdatabase.sqlite" -echo "=== settings (Path-related JSON values) ===" - -# Extract and display server-settings JSON with key paths highlighted sqlite3 "$DB_PATH" "SELECT key, value FROM settings;" | while read -r key value; do echo "--- $key ---" echo "$value" | python3 -c "import sys, json; d=json.load(sys.stdin); [print(f' {k}: {v}') for k,v in d.items() if 'path' in k.lower() or 'url' in k.lower() or 'address' in k.lower()]" 2>/dev/null || echo " (No path-related keys found or JSON parse error)" diff --git a/scripts/migrate_to_relative_paths.sh b/scripts/migrate_to_relative_paths.sh new file mode 100755 index 000000000..874f5aff5 --- /dev/null +++ b/scripts/migrate_to_relative_paths.sh @@ -0,0 +1,104 @@ +#!/bin/bash +# +# Migration Script: Convert absolute paths to relative paths +# Makes the database portable within the current working directory +# + +set -e + +DB_SOURCE="/mnt/docker/work/books/audiobookshelf/config/absdatabase.sqlite" +DB_BACKUP="/mnt/docker/work/books/audiobookshelf/config/absdatabase.sqlite.backup" +DB_MIGRATED="/mnt/docker/work/books/audiobookshelf/config/absdatabase.sqlite" + +echo "=== Audiobookshelf Path Migration ===" +echo "Converting absolute paths to relative paths for portability" +echo "" + +# Step 1: Create backup +echo "[1/4] Creating backup at $DB_BACKUP..." +if [ -f "$DB_BACKUP" ]; then + echo " Backup already exists, removing..." + rm -f "$DB_BACKUP" +fi +cp "$DB_SOURCE" "$DB_BACKUP" +echo " Backup created successfully" +echo "" + +# Step 2: Show current state +echo "[2/4] Current state:" +echo " Library folders:" +sqlite3 "$DB_SOURCE" "SELECT id, path FROM libraryFolders;" | while read line; do + echo " - $line" +done +echo "" +echo " Settings with paths:" +sqlite3 "$DB_SOURCE" "SELECT key, value FROM settings WHERE key LIKE '%path%' OR key IN ('backupPath');" | while read line; do + echo " - $line" +done +echo "" + +# Step 3: Run migration +echo "[3/4] Migrating paths..." + +# Migrate libraryFolders paths +echo " Converting libraryFolders paths..." +sqlite3 "$DB_SOURCE" " + UPDATE libraryFolders SET path = 'audiobooks' WHERE path = '/audiobooks'; + UPDATE libraryFolders SET path = 'romance' WHERE path = '/libraries/romance'; +" +echo " libraryFolders: OK" + +# Migrate libraryItems paths +echo " Converting libraryItems paths..." +sqlite3 "$DB_SOURCE" " + UPDATE libraryItems SET path = REPLACE(path, '/audiobooks/', 'audiobooks/'); + UPDATE libraryItems SET path = REPLACE(path, '/libraries/romance/', 'romance/'); + UPDATE libraryItems SET relPath = REPLACE(relPath, '/audiobooks/', 'audiobooks/'); + UPDATE libraryItems SET relPath = REPLACE(relPath, '/libraries/romance/', 'romance/'); +" +echo " libraryItems: OK" + +# Migrate book cover paths +echo " Converting book cover paths..." +sqlite3 "$DB_SOURCE" " + UPDATE books SET coverPath = REPLACE(coverPath, '/metadata/items/', 'metadata/items/'); +" +echo " books: OK" + +# Migrate settings (backupPath) +echo " Converting settings..." +sqlite3 "$DB_SOURCE" " + UPDATE settings SET value = 'metadata/backups' WHERE key = 'backupPath' AND value = '/metadata/backups'; +" +echo " settings: OK" + +# Verify migration +echo "" +echo "[4/4] Verification:" +echo " Library folders after migration:" +sqlite3 "$DB_SOURCE" "SELECT id, path FROM libraryFolders;" | while read line; do + echo " - $line" +done +echo "" +echo " Sample libraryItems paths:" +sqlite3 "$DB_SOURCE" "SELECT DISTINCT substr(path, 1, 50) FROM libraryItems LIMIT 5;" | while read line; do + echo " - $line" +done +echo "" +echo " Sample cover paths:" +sqlite3 "$DB_SOURCE" "SELECT DISTINCT substr(coverPath, 1, 50) FROM books LIMIT 5;" | while read line; do + echo " - $line" +done +echo "" +echo " Settings after migration:" +sqlite3 "$DB_SOURCE" "SELECT key, value FROM settings WHERE key LIKE '%path%' OR key IN ('backupPath');" | while read line; do + echo " - $line" +done + +echo "" +echo "=== Migration Complete ===" +echo "Backup saved at: $DB_BACKUP" +echo "Database migrated: $DB_SOURCE" +echo "" +echo "To use the migrated database, run audiobookshelf from /mnt/docker/work/books/audiobookshelf:" +echo " cd /mnt/docker/work/books/audiobookshelf && npm start"