mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2026-03-01 05:29:41 +00:00
add migration script
This commit is contained in:
parent
d442b46d7e
commit
5b9b43640b
7 changed files with 113 additions and 33 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;"
|
||||
|
|
|
|||
|
|
@ -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;"
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)"
|
||||
|
|
|
|||
104
scripts/migrate_to_relative_paths.sh
Executable file
104
scripts/migrate_to_relative_paths.sh
Executable file
|
|
@ -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"
|
||||
Loading…
Add table
Add a link
Reference in a new issue