Fix 'Delete File Too' silently failing when file path cannot be resolved
When the DB stored a path the resolver couldn't map to a local file (common with Navidrome virtual paths or Docker path mismatches), file deletion was silently skipped — the DB record was removed but the file stayed on disk with no indication to the user. Now logs the resolution failure with the stored path, returns a file_error in the API response, and the frontend shows a warning toast explaining the file wasn't deleted plus a second toast with the specific reason (e.g. Navidrome 'Report Real Path' instructions).
This commit is contained in:
parent
4dab3de2d6
commit
1c8a25cff9
2 changed files with 20 additions and 3 deletions
|
|
@ -14621,6 +14621,7 @@ def library_delete_track(track_id):
|
||||||
track_info = cursor.fetchone()
|
track_info = cursor.fetchone()
|
||||||
|
|
||||||
# Delete file from disk if requested
|
# Delete file from disk if requested
|
||||||
|
file_error = None
|
||||||
if delete_file and track_info and track_info['file_path']:
|
if delete_file and track_info and track_info['file_path']:
|
||||||
resolved = _resolve_library_file_path(track_info['file_path'])
|
resolved = _resolve_library_file_path(track_info['file_path'])
|
||||||
if resolved and os.path.exists(resolved):
|
if resolved and os.path.exists(resolved):
|
||||||
|
|
@ -14630,6 +14631,10 @@ def library_delete_track(track_id):
|
||||||
logger.info(f"Deleted file from disk: {resolved}")
|
logger.info(f"Deleted file from disk: {resolved}")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.warning(f"Failed to delete file: {e}")
|
logger.warning(f"Failed to delete file: {e}")
|
||||||
|
file_error = str(e)
|
||||||
|
else:
|
||||||
|
logger.warning(f"Could not resolve file path for deletion: {track_info['file_path']} (resolved={resolved})")
|
||||||
|
file_error = _get_file_not_found_error(track_info['file_path'])
|
||||||
|
|
||||||
# Add to blacklist if requested
|
# Add to blacklist if requested
|
||||||
if add_blacklist and track_info and track_info['file_path']:
|
if add_blacklist and track_info and track_info['file_path']:
|
||||||
|
|
@ -14651,7 +14656,10 @@ def library_delete_track(track_id):
|
||||||
if cursor.rowcount == 0:
|
if cursor.rowcount == 0:
|
||||||
return jsonify({"success": False, "error": "Track not found"}), 404
|
return jsonify({"success": False, "error": "Track not found"}), 404
|
||||||
|
|
||||||
return jsonify({"success": True, "deleted_count": cursor.rowcount, "file_deleted": file_deleted, "blacklisted": blacklisted})
|
result = {"success": True, "deleted_count": cursor.rowcount, "file_deleted": file_deleted, "blacklisted": blacklisted}
|
||||||
|
if delete_file and not file_deleted and file_error:
|
||||||
|
result["file_error"] = file_error
|
||||||
|
return jsonify(result)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Error deleting track {track_id}: {e}")
|
print(f"Error deleting track {track_id}: {e}")
|
||||||
import traceback
|
import traceback
|
||||||
|
|
|
||||||
|
|
@ -46295,9 +46295,18 @@ async function deleteLibraryTrack(trackId, albumId) {
|
||||||
if (!result.success) throw new Error(result.error);
|
if (!result.success) throw new Error(result.error);
|
||||||
|
|
||||||
let msg = 'Track removed from library';
|
let msg = 'Track removed from library';
|
||||||
if (result.file_deleted) msg = 'Track deleted from library and disk';
|
let toastType = 'success';
|
||||||
|
if (result.file_deleted) {
|
||||||
|
msg = 'Track deleted from library and disk';
|
||||||
|
} else if (result.file_error) {
|
||||||
|
msg = 'Track removed from library but file could not be deleted';
|
||||||
|
toastType = 'warning';
|
||||||
|
}
|
||||||
if (result.blacklisted) msg += ' (source blacklisted)';
|
if (result.blacklisted) msg += ' (source blacklisted)';
|
||||||
showToast(msg, 'success');
|
showToast(msg, toastType);
|
||||||
|
if (result.file_error) {
|
||||||
|
showToast(result.file_error, 'error', 8000);
|
||||||
|
}
|
||||||
|
|
||||||
if (artistDetailPageState.enhancedData) {
|
if (artistDetailPageState.enhancedData) {
|
||||||
const albums = artistDetailPageState.enhancedData.albums || [];
|
const albums = artistDetailPageState.enhancedData.albums || [];
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue