Fix Track Number Repair findings returning 400 on fix
Finding was created with entity_id=None (file-based) but fix handler required entity_id for DB update. Rewrote handler to work with file_path as primary — writes corrected track number to file tags, renames file if needed, updates DB path. Also stores total_tracks in finding details for correct tag writing.
This commit is contained in:
parent
fc4e16337a
commit
1b95c05041
2 changed files with 66 additions and 6 deletions
|
|
@ -958,6 +958,7 @@ def _check_single_track(file_path: str, filename: str, api_tracks: List[Dict],
|
||||||
'details': {
|
'details': {
|
||||||
'current_track_num': current_num,
|
'current_track_num': current_num,
|
||||||
'correct_track_num': correct_num,
|
'correct_track_num': correct_num,
|
||||||
|
'total_tracks': total_tracks,
|
||||||
'matched_title': matched_track.get('name', ''),
|
'matched_title': matched_track.get('name', ''),
|
||||||
'file_title': file_title or filename,
|
'file_title': file_title or filename,
|
||||||
'changes': changes,
|
'changes': changes,
|
||||||
|
|
|
||||||
|
|
@ -933,17 +933,76 @@ class RepairWorker:
|
||||||
return {'success': False, 'error': f'Failed to delete file: {e}'}
|
return {'success': False, 'error': f'Failed to delete file: {e}'}
|
||||||
|
|
||||||
def _fix_track_number(self, entity_type, entity_id, file_path, details):
|
def _fix_track_number(self, entity_type, entity_id, file_path, details):
|
||||||
"""Update track number in the database to the correct value."""
|
"""Fix track number in file tags, rename file, and update DB."""
|
||||||
correct_num = details.get('correct_track_num')
|
correct_num = details.get('correct_track_num')
|
||||||
if correct_num is None:
|
if correct_num is None:
|
||||||
return {'success': False, 'error': 'No correct track number in finding details'}
|
return {'success': False, 'error': 'No correct track number in finding details'}
|
||||||
if not entity_id:
|
|
||||||
return {'success': False, 'error': 'No track ID associated with this finding'}
|
# If we have an entity_id (track DB ID), update DB directly
|
||||||
result = self.db.update_track_fields(int(entity_id), {'track_number': int(correct_num)})
|
if entity_id:
|
||||||
if result.get('success'):
|
try:
|
||||||
|
self.db.update_track_fields(int(entity_id), {'track_number': int(correct_num)})
|
||||||
|
except Exception as e:
|
||||||
|
logger.debug("DB track number update failed for entity %s: %s", entity_id, e)
|
||||||
|
|
||||||
|
# Fix the file tag (the primary fix — works even without entity_id)
|
||||||
|
if not file_path:
|
||||||
|
return {'success': False, 'error': 'No file path associated with this finding'}
|
||||||
|
|
||||||
|
# Resolve file path for cross-environment compat (Docker)
|
||||||
|
download_folder = None
|
||||||
|
if self._config_manager:
|
||||||
|
download_folder = self._config_manager.get('soulseek.download_path', '')
|
||||||
|
resolved = _resolve_file_path(file_path, self.transfer_folder, download_folder) or file_path
|
||||||
|
|
||||||
|
if not os.path.isfile(resolved):
|
||||||
|
return {'success': False, 'error': f'File not found: {os.path.basename(file_path)}'}
|
||||||
|
|
||||||
|
try:
|
||||||
|
from core.repair_jobs.track_number_repair import _fix_track_number_tag, _fix_filename_track_number
|
||||||
|
|
||||||
|
# Write corrected track number to file tags
|
||||||
|
total_tracks = details.get('total_tracks')
|
||||||
|
if not total_tracks:
|
||||||
|
# Fallback: read current total from file to preserve it
|
||||||
|
try:
|
||||||
|
from core.repair_jobs.track_number_repair import _read_track_number_tag
|
||||||
|
from mutagen import File as MutagenFile
|
||||||
|
audio = MutagenFile(resolved)
|
||||||
|
if audio:
|
||||||
|
_, total_tracks = _read_track_number_tag(audio)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
total_tracks = int(total_tracks or 0)
|
||||||
|
_fix_track_number_tag(resolved, int(correct_num), total_tracks)
|
||||||
|
|
||||||
|
# Rename file if it has a track number prefix
|
||||||
|
fname = os.path.basename(resolved)
|
||||||
|
new_path = _fix_filename_track_number(resolved, fname, int(correct_num))
|
||||||
|
|
||||||
|
# Update DB file path if renamed
|
||||||
|
if new_path:
|
||||||
|
conn = None
|
||||||
|
try:
|
||||||
|
conn = self.db._get_connection()
|
||||||
|
cursor = conn.cursor()
|
||||||
|
cursor.execute("UPDATE tracks SET file_path = ? WHERE file_path = ?",
|
||||||
|
(new_path, file_path))
|
||||||
|
if cursor.rowcount == 0:
|
||||||
|
cursor.execute("UPDATE tracks SET file_path = ? WHERE file_path = ?",
|
||||||
|
(new_path, resolved))
|
||||||
|
conn.commit()
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
finally:
|
||||||
|
if conn:
|
||||||
|
conn.close()
|
||||||
|
|
||||||
return {'success': True, 'action': 'fixed_track_number',
|
return {'success': True, 'action': 'fixed_track_number',
|
||||||
'message': f'Updated track number to {correct_num}'}
|
'message': f'Updated track number to {correct_num}'}
|
||||||
return {'success': False, 'error': result.get('error', 'Failed to update track number')}
|
except Exception as e:
|
||||||
|
logger.error("Error fixing track number for %s: %s", file_path, e)
|
||||||
|
return {'success': False, 'error': str(e)}
|
||||||
|
|
||||||
def _fix_missing_cover_art(self, entity_type, entity_id, file_path, details):
|
def _fix_missing_cover_art(self, entity_type, entity_id, file_path, details):
|
||||||
"""Update album thumbnail URL from the found artwork."""
|
"""Update album thumbnail URL from the found artwork."""
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue