parent
							
								
									086c26c198
								
							
						
					
					
						commit
						2e2c103cfb
					
				@ -472,7 +472,35 @@ class FileSystem(object):
 | 
			
		||||
 | 
			
		||||
        return folder_name
 | 
			
		||||
 | 
			
		||||
    def process_checksum(self, _file, allow_duplicate):
 | 
			
		||||
        db = Db()
 | 
			
		||||
        checksum = db.checksum(_file)
 | 
			
		||||
        if(checksum is None):
 | 
			
		||||
            log.info('Could not get checksum for %s.' % _file)
 | 
			
		||||
            return None
 | 
			
		||||
 | 
			
		||||
        # If duplicates are not allowed then we check if we've seen this file
 | 
			
		||||
        #  before via checksum. We also check that the file exists at the
 | 
			
		||||
        #   location we believe it to be.
 | 
			
		||||
        # If we find a checksum match but the file doesn't exist where we
 | 
			
		||||
        #  believe it to be then we write a debug log and proceed to import.
 | 
			
		||||
        checksum_file = db.get_hash(checksum)
 | 
			
		||||
        if(allow_duplicate is False and checksum_file is not None):
 | 
			
		||||
            if(os.path.isfile(checksum_file)):
 | 
			
		||||
                log.info('%s already at %s.' % (
 | 
			
		||||
                    _file,
 | 
			
		||||
                    checksum_file
 | 
			
		||||
                ))
 | 
			
		||||
                return None
 | 
			
		||||
            else:
 | 
			
		||||
                log.info('%s matched checksum but file not found at %s.' % (  # noqa
 | 
			
		||||
                    _file,
 | 
			
		||||
                    checksum_file
 | 
			
		||||
                ))
 | 
			
		||||
        return checksum
 | 
			
		||||
 | 
			
		||||
    def process_file(self, _file, destination, media, **kwargs):
 | 
			
		||||
 | 
			
		||||
        move = False
 | 
			
		||||
        if('move' in kwargs):
 | 
			
		||||
            move = kwargs['move']
 | 
			
		||||
@ -481,10 +509,18 @@ class FileSystem(object):
 | 
			
		||||
        if('allowDuplicate' in kwargs):
 | 
			
		||||
            allow_duplicate = kwargs['allowDuplicate']
 | 
			
		||||
 | 
			
		||||
        stat_info_original = os.stat(_file)
 | 
			
		||||
 | 
			
		||||
        if(not media.is_valid()):
 | 
			
		||||
            print('%s is not a valid media file. Skipping...' % _file)
 | 
			
		||||
            return
 | 
			
		||||
 | 
			
		||||
        checksum = self.process_checksum(_file, allow_duplicate)
 | 
			
		||||
        if(checksum is None):
 | 
			
		||||
            log.info('Original checksum returned None for %s. Skipping...' %
 | 
			
		||||
                     _file)
 | 
			
		||||
            return
 | 
			
		||||
 | 
			
		||||
        media.set_original_name()
 | 
			
		||||
        metadata = media.get_metadata()
 | 
			
		||||
 | 
			
		||||
@ -494,31 +530,6 @@ class FileSystem(object):
 | 
			
		||||
        file_name = self.get_file_name(media)
 | 
			
		||||
        dest_path = os.path.join(dest_directory, file_name)
 | 
			
		||||
 | 
			
		||||
        db = Db()
 | 
			
		||||
        checksum = db.checksum(_file)
 | 
			
		||||
        if(checksum is None):
 | 
			
		||||
            log.info('Could not get checksum for %s. Skipping...' % _file)
 | 
			
		||||
            return
 | 
			
		||||
 | 
			
		||||
        # If duplicates are not allowed then we check if we've seen this file
 | 
			
		||||
        #  before via checksum. We also check that the file exists at the
 | 
			
		||||
        #   location we believe it to be.
 | 
			
		||||
        # If we find a checksum match but the file doesn't exist where we
 | 
			
		||||
        #  believe it to be then we write a debug log and proceed to import.
 | 
			
		||||
        checksum_file = db.get_hash(checksum)
 | 
			
		||||
        if(allow_duplicate is False and checksum_file is not None):
 | 
			
		||||
            if(os.path.isfile(checksum_file)):
 | 
			
		||||
                log.info('%s already exists at %s. Skipping...' % (
 | 
			
		||||
                    _file,
 | 
			
		||||
                    checksum_file
 | 
			
		||||
                ))
 | 
			
		||||
                return
 | 
			
		||||
            else:
 | 
			
		||||
                log.info('%s matched checksum but file not found at %s. Importing again...' % (  # noqa
 | 
			
		||||
                    _file,
 | 
			
		||||
                    checksum_file
 | 
			
		||||
                ))
 | 
			
		||||
 | 
			
		||||
        # If source and destination are identical then
 | 
			
		||||
        #  we should not write the file. gh-210
 | 
			
		||||
        if(_file == dest_path):
 | 
			
		||||
@ -527,14 +538,43 @@ class FileSystem(object):
 | 
			
		||||
 | 
			
		||||
        self.create_directory(dest_directory)
 | 
			
		||||
 | 
			
		||||
        # exiftool renames the original file by appending '_original' to the
 | 
			
		||||
        # file name. A new file is written with new tags with the initial file
 | 
			
		||||
        # name. See exiftool man page for more details.
 | 
			
		||||
        exif_original_file = _file + '_original'
 | 
			
		||||
 | 
			
		||||
        # Check if the source file was processed by exiftool and an _original
 | 
			
		||||
        # file was created.
 | 
			
		||||
        exif_original_file_exists = False
 | 
			
		||||
        if(os.path.exists(exif_original_file)):
 | 
			
		||||
            exif_original_file_exists = True
 | 
			
		||||
 | 
			
		||||
        if(move is True):
 | 
			
		||||
            stat = os.stat(_file)
 | 
			
		||||
            # Move the processed file into the destination directory
 | 
			
		||||
            shutil.move(_file, dest_path)
 | 
			
		||||
 | 
			
		||||
            if(exif_original_file_exists is True):
 | 
			
		||||
                # We can remove it as we don't need the initial file.
 | 
			
		||||
                os.remove(exif_original_file)
 | 
			
		||||
            os.utime(dest_path, (stat.st_atime, stat.st_mtime))
 | 
			
		||||
        else:
 | 
			
		||||
            if(exif_original_file_exists is True):
 | 
			
		||||
                # Move the newly processed file with any updated tags to the
 | 
			
		||||
                # destination directory
 | 
			
		||||
                shutil.move(_file, dest_path)
 | 
			
		||||
                # Move the exif _original back to the initial source file
 | 
			
		||||
                shutil.move(exif_original_file, _file)
 | 
			
		||||
            else:
 | 
			
		||||
                compatability._copyfile(_file, dest_path)
 | 
			
		||||
 | 
			
		||||
            # Set the utime based on what the original file contained 
 | 
			
		||||
            #  before we made any changes.
 | 
			
		||||
            # Then set the utime on the destination file based on metadata.
 | 
			
		||||
            os.utime(_file, (stat_info_original.st_atime, stat_info_original.st_mtime))
 | 
			
		||||
            self.set_utime_from_metadata(media.get_metadata(), dest_path)
 | 
			
		||||
 | 
			
		||||
        db = Db()
 | 
			
		||||
        db.add_hash(checksum, dest_path)
 | 
			
		||||
        db.update_hash_db()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -53,7 +53,6 @@ class Media(Base):
 | 
			
		||||
        self.original_name_key = 'XMP:OriginalFileName'
 | 
			
		||||
        self.set_gps_ref = True
 | 
			
		||||
        self.exiftool_addedargs = [
 | 
			
		||||
            '-overwrite_original',
 | 
			
		||||
            u'-config',
 | 
			
		||||
            u'"{}"'.format(constants.exiftool_config)
 | 
			
		||||
        ]
 | 
			
		||||
 | 
			
		||||
@ -7,7 +7,7 @@ are tracked by Elodie.
 | 
			
		||||
 | 
			
		||||
from json import dumps, loads
 | 
			
		||||
import os
 | 
			
		||||
from shutil import copyfileobj
 | 
			
		||||
from shutil import copy2, copyfileobj
 | 
			
		||||
import time
 | 
			
		||||
 | 
			
		||||
# load modules
 | 
			
		||||
@ -176,6 +176,11 @@ class Text(Base):
 | 
			
		||||
            metadata_line[name] = kwargs[name]
 | 
			
		||||
 | 
			
		||||
        metadata_as_json = dumps(metadata_line)
 | 
			
		||||
        
 | 
			
		||||
        # Create an _original copy just as we do with exiftool
 | 
			
		||||
        # This is to keep all file processing logic in line with exiftool
 | 
			
		||||
        copy2(source, source + '_original')
 | 
			
		||||
 | 
			
		||||
        if has_metadata:
 | 
			
		||||
            # Update the first line of this file in place
 | 
			
		||||
            # http://stackoverflow.com/a/14947384
 | 
			
		||||
 | 
			
		||||
@ -639,6 +639,7 @@ def test_process_file_plain():
 | 
			
		||||
    origin = os.path.join(folder,'photo.jpg')
 | 
			
		||||
    shutil.copyfile(helper.get_file('plain.jpg'), origin)
 | 
			
		||||
 | 
			
		||||
    origin_checksum_preprocess = helper.checksum(origin)
 | 
			
		||||
    media = Photo(origin)
 | 
			
		||||
    destination = filesystem.process_file(origin, temporary_folder, media, allowDuplicate=True)
 | 
			
		||||
 | 
			
		||||
@ -648,8 +649,10 @@ def test_process_file_plain():
 | 
			
		||||
    shutil.rmtree(folder)
 | 
			
		||||
    shutil.rmtree(os.path.dirname(os.path.dirname(destination)))
 | 
			
		||||
 | 
			
		||||
    assert origin_checksum is not None, origin_checksum
 | 
			
		||||
    assert origin_checksum == destination_checksum, destination_checksum
 | 
			
		||||
    assert origin_checksum_preprocess is not None
 | 
			
		||||
    assert origin_checksum is not None
 | 
			
		||||
    assert destination_checksum is not None
 | 
			
		||||
    assert origin_checksum_preprocess == origin_checksum
 | 
			
		||||
    assert helper.path_tz_fix(os.path.join('2015-12-Dec','Unknown Location','2015-12-05_00-59-26-photo.jpg')) in destination, destination
 | 
			
		||||
 | 
			
		||||
def test_process_file_with_title():
 | 
			
		||||
@ -659,6 +662,7 @@ def test_process_file_with_title():
 | 
			
		||||
    origin = '%s/photo.jpg' % folder
 | 
			
		||||
    shutil.copyfile(helper.get_file('with-title.jpg'), origin)
 | 
			
		||||
 | 
			
		||||
    origin_checksum_preprocess = helper.checksum(origin)
 | 
			
		||||
    media = Photo(origin)
 | 
			
		||||
    destination = filesystem.process_file(origin, temporary_folder, media, allowDuplicate=True)
 | 
			
		||||
 | 
			
		||||
@ -668,8 +672,10 @@ def test_process_file_with_title():
 | 
			
		||||
    shutil.rmtree(folder)
 | 
			
		||||
    shutil.rmtree(os.path.dirname(os.path.dirname(destination)))
 | 
			
		||||
 | 
			
		||||
    assert origin_checksum is not None, origin_checksum
 | 
			
		||||
    assert origin_checksum == destination_checksum, destination_checksum
 | 
			
		||||
    assert origin_checksum_preprocess is not None
 | 
			
		||||
    assert origin_checksum is not None
 | 
			
		||||
    assert destination_checksum is not None
 | 
			
		||||
    assert origin_checksum_preprocess == origin_checksum
 | 
			
		||||
    assert helper.path_tz_fix(os.path.join('2015-12-Dec','Unknown Location','2015-12-05_00-59-26-photo-some-title.jpg')) in destination, destination
 | 
			
		||||
 | 
			
		||||
def test_process_file_with_location():
 | 
			
		||||
@ -679,6 +685,7 @@ def test_process_file_with_location():
 | 
			
		||||
    origin = os.path.join(folder,'photo.jpg')
 | 
			
		||||
    shutil.copyfile(helper.get_file('with-location.jpg'), origin)
 | 
			
		||||
 | 
			
		||||
    origin_checksum_preprocess = helper.checksum(origin)
 | 
			
		||||
    media = Photo(origin)
 | 
			
		||||
    destination = filesystem.process_file(origin, temporary_folder, media, allowDuplicate=True)
 | 
			
		||||
 | 
			
		||||
@ -688,10 +695,35 @@ def test_process_file_with_location():
 | 
			
		||||
    shutil.rmtree(folder)
 | 
			
		||||
    shutil.rmtree(os.path.dirname(os.path.dirname(destination)))
 | 
			
		||||
 | 
			
		||||
    assert origin_checksum is not None, origin_checksum
 | 
			
		||||
    assert origin_checksum == destination_checksum, destination_checksum
 | 
			
		||||
    assert origin_checksum_preprocess is not None
 | 
			
		||||
    assert origin_checksum is not None
 | 
			
		||||
    assert destination_checksum is not None
 | 
			
		||||
    assert origin_checksum_preprocess == origin_checksum
 | 
			
		||||
    assert helper.path_tz_fix(os.path.join('2015-12-Dec','Sunnyvale','2015-12-05_00-59-26-photo.jpg')) in destination, destination
 | 
			
		||||
 | 
			
		||||
def test_process_file_validate_original_checksum():
 | 
			
		||||
    filesystem = FileSystem()
 | 
			
		||||
    temporary_folder, folder = helper.create_working_folder()
 | 
			
		||||
 | 
			
		||||
    origin = os.path.join(folder,'photo.jpg')
 | 
			
		||||
    shutil.copyfile(helper.get_file('plain.jpg'), origin)
 | 
			
		||||
 | 
			
		||||
    origin_checksum_preprocess = helper.checksum(origin)
 | 
			
		||||
    media = Photo(origin)
 | 
			
		||||
    destination = filesystem.process_file(origin, temporary_folder, media, allowDuplicate=True)
 | 
			
		||||
 | 
			
		||||
    origin_checksum = helper.checksum(origin)
 | 
			
		||||
    destination_checksum = helper.checksum(destination)
 | 
			
		||||
 | 
			
		||||
    shutil.rmtree(folder)
 | 
			
		||||
    shutil.rmtree(os.path.dirname(os.path.dirname(destination)))
 | 
			
		||||
 | 
			
		||||
    assert origin_checksum_preprocess is not None, origin_checksum_preprocess
 | 
			
		||||
    assert origin_checksum is not None, origin_checksum
 | 
			
		||||
    assert destination_checksum is not None, destination_checksum
 | 
			
		||||
    assert origin_checksum_preprocess == origin_checksum, (origin_checksum_preprocess, origin_checksum)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def test_process_file_with_location_and_title():
 | 
			
		||||
    filesystem = FileSystem()
 | 
			
		||||
    temporary_folder, folder = helper.create_working_folder()
 | 
			
		||||
@ -699,6 +731,7 @@ def test_process_file_with_location_and_title():
 | 
			
		||||
    origin = os.path.join(folder,'photo.jpg')
 | 
			
		||||
    shutil.copyfile(helper.get_file('with-location-and-title.jpg'), origin)
 | 
			
		||||
 | 
			
		||||
    origin_checksum_preprocess = helper.checksum(origin)
 | 
			
		||||
    media = Photo(origin)
 | 
			
		||||
    destination = filesystem.process_file(origin, temporary_folder, media, allowDuplicate=True)
 | 
			
		||||
 | 
			
		||||
@ -708,8 +741,10 @@ def test_process_file_with_location_and_title():
 | 
			
		||||
    shutil.rmtree(folder)
 | 
			
		||||
    shutil.rmtree(os.path.dirname(os.path.dirname(destination)))
 | 
			
		||||
 | 
			
		||||
    assert origin_checksum is not None, origin_checksum
 | 
			
		||||
    assert origin_checksum == destination_checksum, destination_checksum
 | 
			
		||||
    assert origin_checksum_preprocess is not None
 | 
			
		||||
    assert origin_checksum is not None
 | 
			
		||||
    assert destination_checksum is not None
 | 
			
		||||
    assert origin_checksum_preprocess == origin_checksum
 | 
			
		||||
    assert helper.path_tz_fix(os.path.join('2015-12-Dec','Sunnyvale','2015-12-05_00-59-26-photo-some-title.jpg')) in destination, destination
 | 
			
		||||
 | 
			
		||||
def test_process_file_with_album():
 | 
			
		||||
@ -719,6 +754,7 @@ def test_process_file_with_album():
 | 
			
		||||
    origin = os.path.join(folder,'photo.jpg')
 | 
			
		||||
    shutil.copyfile(helper.get_file('with-album.jpg'), origin)
 | 
			
		||||
 | 
			
		||||
    origin_checksum_preprocess = helper.checksum(origin)
 | 
			
		||||
    media = Photo(origin)
 | 
			
		||||
    destination = filesystem.process_file(origin, temporary_folder, media, allowDuplicate=True)
 | 
			
		||||
 | 
			
		||||
@ -728,8 +764,10 @@ def test_process_file_with_album():
 | 
			
		||||
    shutil.rmtree(folder)
 | 
			
		||||
    shutil.rmtree(os.path.dirname(os.path.dirname(destination)))
 | 
			
		||||
 | 
			
		||||
    assert origin_checksum is not None, origin_checksum
 | 
			
		||||
    assert origin_checksum == destination_checksum, destination_checksum
 | 
			
		||||
    assert origin_checksum_preprocess is not None
 | 
			
		||||
    assert origin_checksum is not None
 | 
			
		||||
    assert destination_checksum is not None
 | 
			
		||||
    assert origin_checksum_preprocess == origin_checksum
 | 
			
		||||
    assert helper.path_tz_fix(os.path.join('2015-12-Dec','Test Album','2015-12-05_00-59-26-photo.jpg')) in destination, destination
 | 
			
		||||
 | 
			
		||||
def test_process_file_with_album_and_title():
 | 
			
		||||
@ -739,6 +777,7 @@ def test_process_file_with_album_and_title():
 | 
			
		||||
    origin = os.path.join(folder,'photo.jpg')
 | 
			
		||||
    shutil.copyfile(helper.get_file('with-album-and-title.jpg'), origin)
 | 
			
		||||
 | 
			
		||||
    origin_checksum_preprocess = helper.checksum(origin)
 | 
			
		||||
    media = Photo(origin)
 | 
			
		||||
    destination = filesystem.process_file(origin, temporary_folder, media, allowDuplicate=True)
 | 
			
		||||
 | 
			
		||||
@ -748,8 +787,10 @@ def test_process_file_with_album_and_title():
 | 
			
		||||
    shutil.rmtree(folder)
 | 
			
		||||
    shutil.rmtree(os.path.dirname(os.path.dirname(destination)))
 | 
			
		||||
 | 
			
		||||
    assert origin_checksum is not None, origin_checksum
 | 
			
		||||
    assert origin_checksum == destination_checksum, destination_checksum
 | 
			
		||||
    assert origin_checksum_preprocess is not None
 | 
			
		||||
    assert origin_checksum is not None
 | 
			
		||||
    assert destination_checksum is not None
 | 
			
		||||
    assert origin_checksum_preprocess == origin_checksum
 | 
			
		||||
    assert helper.path_tz_fix(os.path.join('2015-12-Dec','Test Album','2015-12-05_00-59-26-photo-some-title.jpg')) in destination, destination
 | 
			
		||||
 | 
			
		||||
def test_process_file_with_album_and_title_and_location():
 | 
			
		||||
@ -759,6 +800,7 @@ def test_process_file_with_album_and_title_and_location():
 | 
			
		||||
    origin = os.path.join(folder,'photo.jpg')
 | 
			
		||||
    shutil.copyfile(helper.get_file('with-album-and-title-and-location.jpg'), origin)
 | 
			
		||||
 | 
			
		||||
    origin_checksum_preprocess = helper.checksum(origin)
 | 
			
		||||
    media = Photo(origin)
 | 
			
		||||
    destination = filesystem.process_file(origin, temporary_folder, media, allowDuplicate=True)
 | 
			
		||||
 | 
			
		||||
@ -768,8 +810,10 @@ def test_process_file_with_album_and_title_and_location():
 | 
			
		||||
    shutil.rmtree(folder)
 | 
			
		||||
    shutil.rmtree(os.path.dirname(os.path.dirname(destination)))
 | 
			
		||||
 | 
			
		||||
    assert origin_checksum is not None, origin_checksum
 | 
			
		||||
    assert origin_checksum == destination_checksum, destination_checksum
 | 
			
		||||
    assert origin_checksum_preprocess is not None
 | 
			
		||||
    assert origin_checksum is not None
 | 
			
		||||
    assert destination_checksum is not None
 | 
			
		||||
    assert origin_checksum_preprocess == origin_checksum
 | 
			
		||||
    assert helper.path_tz_fix(os.path.join('2015-12-Dec','Test Album','2015-12-05_00-59-26-photo-some-title.jpg')) in destination, destination
 | 
			
		||||
 | 
			
		||||
# gh-89 (setting album then title reverts album)
 | 
			
		||||
@ -782,6 +826,7 @@ def test_process_video_with_album_then_title():
 | 
			
		||||
 | 
			
		||||
    origin_checksum = helper.checksum(origin)
 | 
			
		||||
 | 
			
		||||
    origin_checksum_preprocess = helper.checksum(origin)
 | 
			
		||||
    media = Video(origin)
 | 
			
		||||
    media.set_album('test_album')
 | 
			
		||||
    media.set_title('test_title')
 | 
			
		||||
@ -792,8 +837,10 @@ def test_process_video_with_album_then_title():
 | 
			
		||||
    shutil.rmtree(folder)
 | 
			
		||||
    shutil.rmtree(os.path.dirname(os.path.dirname(destination)))
 | 
			
		||||
 | 
			
		||||
    assert origin_checksum is not None, origin_checksum
 | 
			
		||||
    assert origin_checksum != destination_checksum, destination_checksum
 | 
			
		||||
    assert origin_checksum_preprocess is not None
 | 
			
		||||
    assert origin_checksum is not None
 | 
			
		||||
    assert destination_checksum is not None
 | 
			
		||||
    assert origin_checksum_preprocess == origin_checksum
 | 
			
		||||
    assert helper.path_tz_fix(os.path.join('2015-01-Jan','test_album','2015-01-19_12-45-11-movie-test_title.mov')) in destination, destination
 | 
			
		||||
 | 
			
		||||
@mock.patch('elodie.config.config_file', '%s/config.ini-fallback-folder' % gettempdir())
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user