KaraokeMerge/migrate_to_songs_json.py

145 lines
4.2 KiB
Python

#!/usr/bin/env python3
"""
Migration script to help users move from allSongs.json to songs.json
and update their configuration to use the new dynamic data directory.
"""
import os
import json
import shutil
from pathlib import Path
def load_json_file(file_path: str):
"""Load JSON file safely."""
try:
with open(file_path, 'r', encoding='utf-8') as f:
return json.load(f)
except Exception as e:
print(f"Error loading {file_path}: {e}")
return None
def save_json_file(file_path: str, data):
"""Save JSON file safely."""
try:
with open(file_path, 'w', encoding='utf-8') as f:
json.dump(data, f, indent=2, ensure_ascii=False)
return True
except Exception as e:
print(f"Error saving {file_path}: {e}")
return False
def migrate_songs_file():
"""Migrate allSongs.json to songs.json if it exists."""
old_file = 'data/allSongs.json'
new_file = 'data/songs.json'
if not os.path.exists(old_file):
print(f"⚠️ {old_file} not found - no migration needed")
return True
if os.path.exists(new_file):
print(f"⚠️ {new_file} already exists - skipping migration")
return True
print(f"🔄 Migrating {old_file} to {new_file}...")
# Load the old file
songs_data = load_json_file(old_file)
if not songs_data:
print(f"❌ Failed to load {old_file}")
return False
# Save to new file
if save_json_file(new_file, songs_data):
print(f"✅ Successfully migrated to {new_file}")
# Create backup of old file
backup_file = 'data/allSongs.json.backup'
shutil.copy2(old_file, backup_file)
print(f"📦 Created backup at {backup_file}")
return True
else:
print(f"❌ Failed to save {new_file}")
return False
def update_config():
"""Update config.json to include data_directory if not present."""
config_file = 'config/config.json'
if not os.path.exists(config_file):
print(f"{config_file} not found")
return False
print(f"🔄 Updating {config_file}...")
# Load current config
config = load_json_file(config_file)
if not config:
print(f"❌ Failed to load {config_file}")
return False
# Check if data_directory already exists
if 'data_directory' in config:
print(f"✅ data_directory already configured: {config['data_directory']}")
return True
# Add data_directory
config['data_directory'] = 'data'
# Create backup
backup_file = 'config/config.json.backup'
shutil.copy2(config_file, backup_file)
print(f"📦 Created backup at {backup_file}")
# Save updated config
if save_json_file(config_file, config):
print(f"✅ Successfully added data_directory to {config_file}")
return True
else:
print(f"❌ Failed to save {config_file}")
return False
def main():
"""Main migration function."""
print("🎤 KaraokeMerge Migration Script")
print("=" * 40)
print("This script will help you migrate to the new configuration:")
print("- Rename allSongs.json to songs.json")
print("- Add data_directory to config.json")
print()
# Check if we're in the right directory
if not os.path.exists('config') or not os.path.exists('data'):
print("❌ Please run this script from the KaraokeMerge root directory")
return False
success = True
# Migrate songs file
if not migrate_songs_file():
success = False
# Update config
if not update_config():
success = False
print()
if success:
print("✅ Migration completed successfully!")
print()
print("Next steps:")
print("1. Test the CLI tool: python cli/main.py --show-config")
print("2. Test the web UI: python start_web_ui.py")
print("3. If everything works, you can delete the backup files")
else:
print("❌ Migration failed - please check the errors above")
return False
return True
if __name__ == "__main__":
success = main()
if not success:
exit(1)