70 lines
2.9 KiB
Python
70 lines
2.9 KiB
Python
|
|
"""Management command to fix audio file extensions in database"""
|
||
|
|
|
||
|
|
from django.core.management.base import BaseCommand
|
||
|
|
from audio.models import Audio
|
||
|
|
import os
|
||
|
|
|
||
|
|
|
||
|
|
class Command(BaseCommand):
|
||
|
|
help = 'Fix audio file extensions in database to match actual files'
|
||
|
|
|
||
|
|
def handle(self, *args, **options):
|
||
|
|
self.stdout.write('Checking for audio files with incorrect extensions...\n')
|
||
|
|
|
||
|
|
# Find all audio entries with non-.m4a extensions
|
||
|
|
problematic = Audio.objects.exclude(file_path__endswith='.m4a').exclude(file_path='')
|
||
|
|
total = problematic.count()
|
||
|
|
|
||
|
|
if total == 0:
|
||
|
|
self.stdout.write(self.style.SUCCESS('✅ No files need fixing'))
|
||
|
|
return
|
||
|
|
|
||
|
|
self.stdout.write(f'Found {total} files with non-.m4a extensions\n')
|
||
|
|
|
||
|
|
fixed_count = 0
|
||
|
|
missing_count = 0
|
||
|
|
|
||
|
|
for audio in problematic:
|
||
|
|
old_path = audio.file_path
|
||
|
|
|
||
|
|
# Try different extensions that might be in database
|
||
|
|
for ext in ['.webm', '.opus', '.mp3', '.ogg', '.wav']:
|
||
|
|
if old_path.endswith(ext):
|
||
|
|
# Try .m4a version (our post-processor creates .m4a files)
|
||
|
|
new_path = old_path[:-len(ext)] + '.m4a'
|
||
|
|
full_path = f"/app/audio/{new_path}"
|
||
|
|
|
||
|
|
if os.path.exists(full_path):
|
||
|
|
audio.file_path = new_path
|
||
|
|
audio.save()
|
||
|
|
size = os.path.getsize(full_path)
|
||
|
|
self.stdout.write(
|
||
|
|
self.style.SUCCESS(
|
||
|
|
f'✅ Fixed: {audio.youtube_id} ({size/1024/1024:.1f} MB)'
|
||
|
|
)
|
||
|
|
)
|
||
|
|
fixed_count += 1
|
||
|
|
else:
|
||
|
|
# Check if original file exists
|
||
|
|
old_full_path = f"/app/audio/{old_path}"
|
||
|
|
if os.path.exists(old_full_path):
|
||
|
|
self.stdout.write(
|
||
|
|
self.style.WARNING(
|
||
|
|
f'⚠️ File exists but with wrong extension: {audio.youtube_id}'
|
||
|
|
)
|
||
|
|
)
|
||
|
|
else:
|
||
|
|
self.stdout.write(
|
||
|
|
self.style.ERROR(
|
||
|
|
f'❌ File missing: {audio.youtube_id}'
|
||
|
|
)
|
||
|
|
)
|
||
|
|
missing_count += 1
|
||
|
|
break
|
||
|
|
|
||
|
|
self.stdout.write('\n' + '='*50)
|
||
|
|
self.stdout.write(self.style.SUCCESS(f'✅ Fixed: {fixed_count} file(s)'))
|
||
|
|
if missing_count > 0:
|
||
|
|
self.stdout.write(self.style.ERROR(f'❌ Missing: {missing_count} file(s)'))
|
||
|
|
self.stdout.write('='*50)
|