initial comment
This commit is contained in:
128
update-database.py
Normal file
128
update-database.py
Normal file
@@ -0,0 +1,128 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Database Update Script
|
||||
Populates container_format for existing records in the database
|
||||
"""
|
||||
|
||||
import sqlite3
|
||||
import json
|
||||
import subprocess
|
||||
from pathlib import Path
|
||||
import sys
|
||||
|
||||
def get_container_format(filepath):
|
||||
"""Get container format using ffprobe"""
|
||||
try:
|
||||
result = subprocess.run(
|
||||
['ffprobe', '-v', 'quiet', '-print_format', 'json', '-show_format', str(filepath)],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=30
|
||||
)
|
||||
|
||||
if result.returncode == 0:
|
||||
info = json.loads(result.stdout)
|
||||
if 'format' in info:
|
||||
format_name = info['format'].get('format_name', '')
|
||||
return format_name.split(',')[0] if format_name else None
|
||||
except Exception as e:
|
||||
print(f"Error getting container format for {filepath}: {e}")
|
||||
|
||||
return None
|
||||
|
||||
def update_database(db_path):
|
||||
"""Update database with container format for existing records"""
|
||||
|
||||
print(f"Opening database: {db_path}")
|
||||
conn = sqlite3.connect(db_path)
|
||||
conn.row_factory = sqlite3.Row
|
||||
cursor = conn.cursor()
|
||||
|
||||
# Get all files without container_format
|
||||
cursor.execute("""
|
||||
SELECT id, filepath, container_format
|
||||
FROM files
|
||||
WHERE container_format IS NULL OR container_format = ''
|
||||
""")
|
||||
|
||||
files = cursor.fetchall()
|
||||
total = len(files)
|
||||
|
||||
if total == 0:
|
||||
print("No files need updating!")
|
||||
conn.close()
|
||||
return
|
||||
|
||||
print(f"Found {total} files to update")
|
||||
|
||||
updated = 0
|
||||
failed = 0
|
||||
|
||||
for i, file in enumerate(files, 1):
|
||||
filepath = Path(file['filepath'])
|
||||
|
||||
# Check if file exists
|
||||
if not filepath.exists():
|
||||
print(f"[{i}/{total}] Skipping (file not found): {filepath.name}")
|
||||
failed += 1
|
||||
continue
|
||||
|
||||
# Get container format
|
||||
container = get_container_format(filepath)
|
||||
|
||||
if container:
|
||||
cursor.execute("""
|
||||
UPDATE files
|
||||
SET container_format = ?
|
||||
WHERE id = ?
|
||||
""", (container, file['id']))
|
||||
|
||||
print(f"[{i}/{total}] Updated: {filepath.name} -> {container}")
|
||||
updated += 1
|
||||
else:
|
||||
print(f"[{i}/{total}] Failed to get format: {filepath.name}")
|
||||
failed += 1
|
||||
|
||||
# Commit every 10 files
|
||||
if i % 10 == 0:
|
||||
conn.commit()
|
||||
|
||||
# Final commit
|
||||
conn.commit()
|
||||
conn.close()
|
||||
|
||||
print(f"\nUpdate complete!")
|
||||
print(f" Updated: {updated}")
|
||||
print(f" Failed: {failed}")
|
||||
print(f" Total: {total}")
|
||||
|
||||
if __name__ == '__main__':
|
||||
# Check if ffprobe is available
|
||||
try:
|
||||
subprocess.run(['ffprobe', '-version'], capture_output=True, check=True)
|
||||
except (subprocess.CalledProcessError, FileNotFoundError):
|
||||
print("Error: ffprobe not found. Please install ffmpeg.")
|
||||
sys.exit(1)
|
||||
|
||||
# Get database path from command line or use default
|
||||
if len(sys.argv) > 1:
|
||||
db_path = sys.argv[1]
|
||||
else:
|
||||
# Try to find database in common locations
|
||||
possible_paths = [
|
||||
Path('data/state.db'),
|
||||
Path('C:/Users/ckoch/OneDrive/Documents/development/encoderPro/data/state.db'),
|
||||
]
|
||||
|
||||
db_path = None
|
||||
for p in possible_paths:
|
||||
if p.exists():
|
||||
db_path = p
|
||||
break
|
||||
|
||||
if not db_path:
|
||||
print("Error: Could not find database file.")
|
||||
print("Usage: python update-database.py [path/to/state.db]")
|
||||
sys.exit(1)
|
||||
|
||||
update_database(db_path)
|
||||
Reference in New Issue
Block a user