code: def get_image_uri(self, image_id: str) -> str:
      logger.info(f"Image ID: {image_id}")
      image_dir = os.path.realpath(
          os.path.join(self._datastore.image_path(), image_id)
      )
      logger.info(f"Image Dir (cache): {image_dir}")
  
      if not os.path.exists(image_dir) or not os.listdir(image_dir):
          dicom_web_download_series(
              None,
              image_id,
              image_dir,
              self._client,
              self._fetch_by_frame,
          )
  
      if not self._convert_to_nifti:
          return image_dir
  
      image_nii_gz = os.path.realpath(
          os.path.join(
              self._datastore.image_path(), f"{image_id}.nii.gz"
          )
      )
      if not os.path.exists(image_nii_gz):
          image_nii_gz = dicom_to_nifti(image_dir)
          super().add_image(
              image_id, image_nii_gz, self._dicom_info(image_id)
          )
  
      return image_nii_gz
  
imports: import logging
  import os
  import pathlib
  import shutil
  from typing import Any, Dict, Iterator, List, Optional, Tuple
  import requests
  from cachetools import TTLCache, cached
  from dicomweb_client import DICOMwebClient
  from pydicom.dataset import Dataset
  from monailabel.config import settings
  from monailabel.datastore.local import LocalDatastore
  from monailabel.datastore.utils.convert import binary_to_image, dicom_to_nifti, nifti_to_dicom_seg
  from monailabel.datastore.utils.dicom import dicom_web_download_series, dicom_web_upload_dcm
  from monailabel.interfaces.datastore import DefaultLabelTag
  from monailabel.utils.others.generic import md5_digest
label_desc: Use image node_id 4 for calling the DICOMWebDatastore obj's underlying member method code with example usage: obj.get_image_uri(image_id) and returns: image_nii_gz, image_dir