Advertisement
keselyoleren

Untitled

Jun 30th, 2025
263
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.21 KB | None | 0 0
  1. import openslide
  2. import boto3
  3. from io import BytesIO
  4. from slugify import slugify
  5. import json
  6. import os
  7. import glob
  8.  
  9. class SVSFileProcessor:
  10.     def __init__(self, svs_file_path, file_name, aws_access_key, aws_secret_key, s3_bucket_name, s3_region):
  11.         self.svs_file_path = svs_file_path
  12.         self.original_filename = os.path.basename(svs_file_path)
  13.         self.s3_bucket_name = s3_bucket_name
  14.         self.s3_region = s3_region
  15.         self.safe_file_name = slugify(file_name)
  16.         self.s3_client = None
  17.         self.wsi = None
  18.  
  19.         # Initialize S3 client
  20.         try:
  21.             self.s3_client = boto3.client(
  22.                 's3',
  23.                 aws_access_key_id=aws_access_key,
  24.                 aws_secret_access_key=aws_secret_key,
  25.                 region_name=self.s3_region
  26.             )
  27.         except Exception as e:
  28.             print(f"Kesalahan Kredensial AWS: {str(e)}")
  29.  
  30.         # Open the SVS file
  31.         try:
  32.             self.wsi = openslide.OpenSlide(self.svs_file_path)
  33.             print(f"File SVS '{self.original_filename}' berhasil dibuka.")
  34.         except openslide.OpenSlideError as e:
  35.             print(f"Gagal membuka file SVS '{self.original_filename}': {e}")
  36.  
  37.     def extract_properties(self):
  38.         if not self.wsi:
  39.             return []
  40.  
  41.         data = []
  42.         try:
  43.             properties = self.wsi.properties
  44.             for key, value in properties.items():
  45.                 # Clean up key for better compatibility (e.g., in JSON)
  46.                 clean_key = key.replace(' ', '-').replace('.', '-')
  47.                 data.append({clean_key: str(value)})
  48.         except Exception as e:
  49.             print(f"Terjadi kesalahan saat mengekstrak properti: {e}")
  50.        
  51.         return data
  52.  
  53.     def generate_and_upload_thumbnail(self, thumb_size=(256, 256)):
  54.         if not self.wsi or not self.s3_client:
  55.             print("Tidak dapat membuat thumbnail. File SVS atau klien S3 tidak diinisialisasi.")
  56.             return None
  57.  
  58.         try:
  59.             thumb_image = self.wsi.get_thumbnail(thumb_size)
  60.            
  61.             thumb_buffer = BytesIO()
  62.             thumb_image.save(thumb_buffer, "PNG")
  63.             thumb_buffer.seek(0)
  64.             s3_key = f"thumbnails/{self.safe_file_name}_thumb.png"
  65.            
  66.             print(f"Mengunggah thumbnail ke bucket S3 '{self.s3_bucket_name}' dengan key '{s3_key}'...")
  67.  
  68.             self.s3_client.upload_fileobj(
  69.                 thumb_buffer,
  70.                 self.s3_bucket_name,
  71.                 s3_key,
  72.             )
  73.  
  74.             s3_url = f"https://{self.s3_bucket_name}.s3.{self.s3_region}.amazonaws.com/{s3_key}"
  75.             print(f"Thumbnail berhasil diunggah. URL: {s3_url}")            
  76.             return s3_url
  77.         except Exception as e:
  78.             print(f"Gagal mengunggah thumbnail: {e}")
  79.             return None
  80.  
  81.     def process_file(self):
  82.         if not self.wsi:
  83.             return {
  84.                 "filename": self.original_filename,
  85.                 "properties": [],
  86.                 "thumbnail": None,
  87.                 "error": "File SVS tidak dapat dibaca atau rusak."
  88.             }
  89.  
  90.         properties_data = self.extract_properties()
  91.         thumbnail_url = self.generate_and_upload_thumbnail()
  92.  
  93.         return {
  94.             "filename": self.original_filename,
  95.             "properties": properties_data,
  96.             "thumbnail": thumbnail_url
  97.         }
  98.  
  99.     def __del__(self):
  100.         if self.wsi:
  101.             self.wsi.close()
  102.  
  103. def process_svs_batch(directory_path, aws_access_key, aws_secret_key, s3_bucket_name, s3_region):
  104.     search_pattern = os.path.join(directory_path, '*.svs')
  105.     file_paths = glob.glob(search_pattern)
  106.  
  107.     if not file_paths:
  108.         print(f"Peringatan: Tidak ada file .svs yang ditemukan di '{directory_path}'")
  109.         return json.dumps([], indent=4)
  110.  
  111.     print(f"Ditemukan {len(file_paths)} file .svs untuk diproses.")
  112.     all_results = []
  113.  
  114.     for file_path in file_paths:
  115.         print("\n" + "="*20 + f" Memproses {os.path.basename(file_path)} " + "="*20)
  116.         file_name_base = os.path.splitext(os.path.basename(file_path))[0]
  117.  
  118.         processor = SVSFileProcessor(
  119.             svs_file_path=file_path,
  120.             file_name=file_name_base,
  121.             aws_access_key=aws_access_key,
  122.             aws_secret_key=aws_secret_key,
  123.             s3_bucket_name=s3_bucket_name,
  124.             s3_region=s3_region
  125.         )
  126.        
  127.         result = processor.process_file()
  128.         all_results.append(result)
  129.  
  130.     return json.dumps(all_results, indent=4)
  131.  
  132.  
  133. # --- CONTOH PENGGUNAAN ---
  134. if __name__ == '__main__':
  135.     SVS_DIRECTORY = input("Masukkan path lengkap ke direktori yang berisi file .svs .tiff \n contoh /Users/f/keselyoleren/neurabot/product/data/slide : ")
  136.     AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID', 'AKIA5XSKJQZJZCKNAUKI')
  137.     AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY', '7k9i7yFolA0jK289KoDVycYbADFTA9RGowDIg7sE')
  138.     S3_BUCKET = os.environ.get('S3_BUCKET', 'mylab-production')
  139.     S3_REGION = os.environ.get('S3_REGION', 'ap-southeast-3')
  140.  
  141.     if not os.path.isdir(SVS_DIRECTORY):
  142.         print("="*50)
  143.         print(f"Error: Direktori tidak ditemukan di '{SVS_DIRECTORY}'")
  144.         print("Harap jalankan kembali skrip dan masukkan path folder yang benar.")
  145.         print("Contoh /Users/f/keselyoleren/neurabot/product/data/slide")
  146.         print("="*50)
  147.     elif 'YOUR_AWS' in AWS_ACCESS_KEY_ID or 'your-s3' in S3_BUCKET:
  148.         print("="*50)
  149.         print(f"Peringatan: Kredensial AWS atau nama bucket belum diatur.")
  150.         print("Harap perbarui variabel kredensial AWS atau atur melalui environment variables.")
  151.         print("="*50)
  152.     else:
  153.         json_output = process_svs_batch(
  154.             directory_path=SVS_DIRECTORY,
  155.             aws_access_key=AWS_ACCESS_KEY_ID,
  156.             aws_secret_key=AWS_SECRET_ACCESS_KEY,
  157.             s3_bucket_name=S3_BUCKET,
  158.             s3_region=S3_REGION
  159.         )
  160.        
  161.         output_filename = 'svs_metadata_output.json'
  162.         print(f"\n\n--- HASIL OUTPUT JSON GABUNGAN ---")
  163.         print(f"Menyimpan hasil ke file '{output_filename}'...")
  164.         with open(output_filename, 'w') as f:
  165.             f.write(json_output)
  166.         print("Selesai.")
  167.  
  168.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement