tasks.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. # background_remover/tasks.py
  2. import os
  3. import io
  4. import zipfile
  5. import csv
  6. from celery import shared_task
  7. from django.conf import settings
  8. from PIL import Image
  9. from .services import BiRefNetService
  10. @shared_task
  11. def process_bulk_images_task(file_paths, task_id):
  12. service = BiRefNetService()
  13. # Define paths
  14. results_dir = os.path.join(settings.MEDIA_ROOT, 'bulk_results', task_id)
  15. os.makedirs(results_dir, exist_ok=True)
  16. zip_output_path = os.path.join(results_dir, f"processed_{task_id}.zip")
  17. log_file_path = os.path.join(results_dir, "report.csv")
  18. log_data = [] # To store rows: [Filename, Status, Error]
  19. with zipfile.ZipFile(zip_output_path, "w", zipfile.ZIP_DEFLATED) as master_zip:
  20. for file_path in file_paths:
  21. full_path = os.path.join(settings.MEDIA_ROOT, file_path)
  22. original_name = os.path.basename(file_path)
  23. try:
  24. # CASE 1: INPUT IS A ZIP
  25. if original_name.lower().endswith('.zip'):
  26. with zipfile.ZipFile(full_path, 'r') as user_zip:
  27. for inner_name in user_zip.namelist():
  28. if inner_name.lower().endswith(('.png', '.jpg', '.jpeg', '.webp')):
  29. try:
  30. with user_zip.open(inner_name) as inner_file:
  31. img = Image.open(io.BytesIO(inner_file.read())).convert("RGB")
  32. output = service.remove_background(img)
  33. img_io = io.BytesIO()
  34. output.save(img_io, format="PNG")
  35. clean_name = inner_name.split('/')[-1].rsplit('.', 1)[0] + "_no_bg.png"
  36. master_zip.writestr(clean_name, img_io.getvalue())
  37. log_data.append([inner_name, "SUCCESS", ""])
  38. except Exception as e:
  39. log_data.append([inner_name, "FAILED", str(e)])
  40. # CASE 2: INPUT IS AN IMAGE
  41. else:
  42. try:
  43. img = Image.open(full_path).convert("RGB")
  44. output = service.remove_background(img)
  45. img_io = io.BytesIO()
  46. output.save(img_io, format="PNG")
  47. name = original_name.rsplit(".", 1)[0] + "_no_bg.png"
  48. master_zip.writestr(name, img_io.getvalue())
  49. log_data.append([original_name, "SUCCESS", ""])
  50. except Exception as e:
  51. log_data.append([original_name, "FAILED", str(e)])
  52. finally:
  53. # Cleanup temporary uploaded files
  54. if os.path.exists(full_path):
  55. os.remove(full_path)
  56. # Create the CSV log inside the task folder
  57. with open(log_file_path, mode='w', newline='') as csvfile:
  58. writer = csv.writer(csvfile)
  59. writer.writerow(["Filename", "Status", "Error Message"])
  60. writer.writerows(log_data)
  61. # Add the log file into the zip too
  62. master_zip.write(log_file_path, "report.csv")
  63. return {
  64. "zip_url": f"{settings.MEDIA_URL}bulk_results/{task_id}/processed_{task_id}.zip",
  65. "log_url": f"{settings.MEDIA_URL}bulk_results/{task_id}/report.csv"
  66. }