Commit 7cf54240 authored by Joel Collins's avatar Joel Collins
Browse files

Temp capture folder now handled by camera

parent a1965f60
Loading
Loading
Loading
Loading
+8 −10
Original line number Diff line number Diff line
@@ -14,7 +14,7 @@ except ImportError:
    except ImportError:
        from _thread import get_ident

from .capture import CaptureObject, capture_from_dict, BASE_CAPTURE_PATH
from .capture import CaptureObject, capture_from_dict, BASE_CAPTURE_PATH, TEMP_CAPTURE_PATH
from openflexure_microscope.config import USER_CONFIG_DIR
from openflexure_microscope.utilities import entry_by_id
from openflexure_microscope.lock import StrictLock
@@ -111,6 +111,8 @@ class BaseCamera(object):
        self.paths = {
            'image': BASE_CAPTURE_PATH,
            'video': BASE_CAPTURE_PATH,
            'image_tmp': TEMP_CAPTURE_PATH,
            'video_tpm': TEMP_CAPTURE_PATH
        }  #: dict: Dictionary of capture paths

        # Capture data
@@ -284,7 +286,7 @@ class BaseCamera(object):
            write_to_file: bool = False,
            temporary: bool = True,
            filename: str = None,
            folder: str = None,
            folder: str = "",
            fmt: str = 'jpeg'):

        """
@@ -303,10 +305,8 @@ class BaseCamera(object):
            logging.debug(filename)

        # Generate folder
        if folder:
            folder = os.path.join(self.paths['image'], folder)
        else:
            folder = self.paths['image']
        base_folder = self.paths['image_tmp'] if temporary else self.paths['image']
        folder = os.path.join(base_folder, folder)

        # Create capture object
        output = CaptureObject(
@@ -349,10 +349,8 @@ class BaseCamera(object):
            logging.debug(filename)

        # Generate folder
        if folder:
            folder = os.path.join(self.paths['video'], folder)
        else:
            folder = self.paths['video']
        base_folder = self.paths['video_tmp'] if temporary else self.paths['video']
        folder = os.path.join(base_folder, folder)

        # Create capture object
        output = CaptureObject(
+11 −27
Original line number Diff line number Diff line
@@ -81,8 +81,8 @@ def capture_from_dict(capture_dict):

    # Get inherent capture information from database
    capture.file = capture_dict['path']
    capture.split_file_path(capture.file)
    capture.temporary = capture_dict['temporary']
    capture.split_file_path(capture.file)

    if capture.format.upper() in EXIF_FORMATS:
        md_exif = pull_usercomment_dict(capture.file)
@@ -137,9 +137,7 @@ class CaptureObject(object):
            filename = self.id
        self.filename = "{}.{}".format(filename, fmt)

        # Create folder path. Default to BASE_CAPTURE_PATH
        if not folder:
            folder = BASE_CAPTURE_PATH
        # Create folder path
        self.folder = folder

        # Dictionary for storing custom metadata
@@ -185,7 +183,7 @@ class CaptureObject(object):
        file on disk.

        """
        self.build_file_path(self.filename, self.folder)
        self.build_file_path()

        # Byte bytestream properties
        self.bytestream = io.BytesIO()  # Byte bytestream that data will be written to
@@ -201,31 +199,23 @@ class CaptureObject(object):
        # Save initial metadata file
        self.save_metadata()

    def build_file_path(
            self,
            filename: str,
            folder: str):
    def build_file_path(self):
        """
        Construct a full file path, based on filename, folder, and file format.
        Defaults to UUID.

        Args:
            filename (str): Filename of capture
            folder (str): Directory on disk to store capture file
        """
        global TEMP_CAPTURE_PATH
        # TODO: Combine this and split_file_path, and tidy. Let the device (camera) handle folders. This should be more basic.
        # TODO: Even let the base camera manage moving captures to temp folder
        # This module will clear out the temp folder, but won't MOVE anything there.
        # In Base cameras new_image method, the full folder is constructed. Temp folder should be inserted there.

        if self.temporary:
            # Store original file path
            self.file_notmp = os.path.join(folder, filename) 
            # Move user-specified folder to TEMP
            self.folder = os.path.join(TEMP_CAPTURE_PATH, self.folder)

        self.file = os.path.join(folder, filename)  # Full file name by joining given folder to given name
        self.file = os.path.join(self.folder, self.filename)  # Full file name by joining given folder to given name

        self.split_file_path(self.file)  # Split file path into folder, filename, and basename

        # Check directory is a subdirectory of BASE_CAPTURE_PATH
        # TODO: Do we need this?
        if not os.path.commonprefix([self.file, BASE_CAPTURE_PATH]) == BASE_CAPTURE_PATH:
            raise Exception("Captures cannot be stored in a lower-level directory than {}.".format(BASE_CAPTURE_PATH))

@@ -448,13 +438,6 @@ class CaptureObject(object):

    def save_file(self) -> bool:
        """Write the StreamObjects bytestream to a file."""
        if self.temporary:  # If capture is currently temporary
            self.load_file()  # Load data from tmp file into bytestream, if tmp file exists
            self.temporary = False  # Flag as kept on disk
            self.file = self.file_notmp  # Reset file path to non-temporary path
            self.split_file_path(self.file)  # Set split properties based on new path
            logging.info("Moved temporary file out to {}".format(self.file))

        if self.stream_exists:  # If there's a bytestream to save
            with open(self.file, 'ab') as f:  # Load file as bytes
                logging.debug("Writing bytestream to file {}".format(self.file))
@@ -504,6 +487,7 @@ class CaptureObject(object):
        """Both clear the bytestream, and delete any associated on-disk data."""
        logging.info("Closing {}".format(self.id))
        self.delete_stream()
        # Delete the file from disk if temporary
        if self.temporary:
            self.delete()

+2 −2
Original line number Diff line number Diff line
@@ -62,14 +62,14 @@ class ScanPlugin(MicroscopePlugin):

        # Construct a tile filename
        filename = "{}_{}_{}_{}".format(basename, *self.microscope.stage.position)
        foldername = "SCAN_{}".format(basename)
        folder = "SCAN_{}".format(basename)

        # Create output object
        output = self.microscope.camera.new_image(
            write_to_file=True,
            temporary=temporary,
            filename=filename,
            folder=foldername)
            folder=folder)

        # Capture
        self.microscope.camera.capture(