145 lines
4.2 KiB
Python
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)
|