diff --git a/ordigi/media.py b/ordigi/media.py index 5f5e443..a6ccfe7 100644 --- a/ordigi/media.py +++ b/ordigi/media.py @@ -37,7 +37,13 @@ class ExifMetadata: 'QuickTime:CreationDate-und-US', 'QuickTime:MediaCreateDate', ] - tags_keys['date_modified'] = ['File:FileModifyDate', 'QuickTime:ModifyDate'] + tags_keys['date_modified'] = [ + 'EXIF:ModifyDate', + 'QuickTime:ModifyDate', + ] + tags_keys['file_modify_date'] = [ + 'File:FileModifyDate', + ] tags_keys['camera_make'] = ['EXIF:Make', 'QuickTime:Make'] tags_keys['camera_model'] = ['EXIF:Model', 'QuickTime:Model'] tags_keys['album'] = ['XMP-xmpDM:Album', 'XMP:Album'] @@ -80,9 +86,13 @@ class ExifMetadata: try: # correct nasty formated date - regex = re.compile(r'(\d{4}):(\d{2}):(\d{2})') - if re.match(regex, value) is not None: # noqa - value = re.sub(regex, r'\g<1>-\g<2>-\g<3>', value) + regex = re.compile(r'(\d{4}):(\d{2}):(\d{2})[-_ .]') + if re.match(regex, value): + value = re.sub(regex, r'\g<1>-\g<2>-\g<3> ', value) + else: + regex = re.compile(r'(\d{4})(\d{2})(\d{2})[-_ .]?(\d{2})?(\d{2})?(\d{2})?') + if re.match(regex, value): + value = re.sub(regex, r'\g<1>-\g<2>-\g<3> \g<4>:\g<5>:\g<6>', value) return parser.parse(value) except BaseException or parser._parser.ParserError as e: self.log.warning(e.args, value) @@ -338,13 +348,15 @@ class Media(ReadExif): stem = os.path.splitext(filename)[0] date_original = self.metadata['date_original'] if self.metadata['original_name']: - date_filename = self.get_date_format(self.metadata['original_name']) + date_filename = utils.get_date_from_string(self.metadata['original_name']) else: - date_filename = self.get_date_format(stem) + date_filename = utils.get_date_from_string(stem) + self.log.debug(f'date_filename: {date_filename}') date_original = self.metadata['date_original'] date_created = self.metadata['date_created'] date_modified = self.metadata['date_modified'] + file_modify_date = self.metadata['file_modify_date'] if self.metadata['date_original']: if date_filename and date_filename != date_original: self.log.warning( @@ -372,6 +384,8 @@ class Media(ReadExif): self.log.warning( f"{filename} time mark is more recent than {date_created}" ) + return date_created + if self.interactive: choices = [ (f"date filename:'{date_filename}'", date_filename), @@ -383,18 +397,24 @@ class Media(ReadExif): return date_filename - if self.use_file_dates: - if date_created: - self.log.warning( - f"use date created:{date_created} for {self.file_path}" - ) - return date_created + if date_created: + self.log.warning( + f"use date created:{date_created} for {self.file_path}" + ) + return date_created - if date_modified: + if date_modified: + self.log.warning( + f"use date modified:{date_modified} for {self.file_path}" + ) + return date_modified + + if self.use_file_dates: + if file_modify_date: self.log.warning( - f"use date modified:{date_modified} for {self.file_path}" + f"use date modified:{file_modify_date} for {self.file_path}" ) - return date_modified + return file_modify_date elif self.interactive: choices = [] @@ -404,6 +424,10 @@ class Media(ReadExif): choices.append((f"date created:'{date_created}'", date_created)) if date_modified: choices.append((f"date modified:'{date_modified}'", date_modified)) + if file_modify_date: + choices.append( + (f"date modified:'{file_modify_date}'", file_modify_date) + ) choices.append(("custom", None)) default = date_filename return self._get_date_media_interactive(choices, default) diff --git a/ordigi/utils.py b/ordigi/utils.py index c1af799..0a59f41 100644 --- a/ordigi/utils.py +++ b/ordigi/utils.py @@ -1,7 +1,10 @@ from math import radians, cos, sqrt from datetime import datetime import hashlib +import os +import platform import re +import subprocess def checksum(file_path, blocksize=65536): @@ -83,14 +86,17 @@ def get_date_regex(user_regex=None): return regex -def get_date_from_string(string, user_regex=None): +DATE_REGEX = get_date_regex() + + +def get_date_from_string(string): """Retrieve date stamp from string""" # If missing datetime from EXIF data check if filename is in datetime format. # For this use a user provided regex if possible. # Otherwise assume a filename such as IMG_20160915_123456.jpg as default. matches = [] - for i, regex in get_date_regex(user_regex).items(): + for i, regex in DATE_REGEX.items(): match = re.findall(regex, string) if match != []: if i == 'c': @@ -118,6 +124,13 @@ def get_date_from_string(string, user_regex=None): return date +def match_date_regex(regex, value): + if re.match(regex, value) is not None: + return re.sub(regex, r'\g<1>-\g<2>-\g<3>-', value) + + return value + + def split_part(dedup_regex, path_part, items=None): """ Split part from regex @@ -161,9 +174,6 @@ def camel2snake(name): r'(?!^)[A-Z]', lambda x: '_' + x.group(0).lower(), name[1:] ) -import os -import platform -import subprocess def open_file(path): if platform.system() == "Windows": diff --git a/tests/test_database.py b/tests/test_database.py index 4763588..6d323a9 100644 --- a/tests/test_database.py +++ b/tests/test_database.py @@ -24,6 +24,7 @@ class TestSqlite: 'DateOriginal': datetime(2013, 3, 27), 'DateCreated': 'date_created', 'DateModified': 'date_modified', + 'FileModifyDate': 'file_modify_date', 'CameraMake': 'camera_make', 'CameraModel': 'camera_model', 'OriginalName':'original_name', @@ -64,7 +65,24 @@ class TestSqlite: def test_add_metadata_data(self): result = tuple(self.sqlite.cur.execute("""select * from metadata where rowid=1""").fetchone()) - assert result == ('file_path', 'checksum', 'album', 'title', 2, '2012-03-27 00:00:00', '2013-03-27 00:00:00', 'date_created', 'date_modified', 'camera_make', 'camera_model', 'original_name', 'src_path', 'subdirs', 'filename') + assert result == ( + 'file_path', + 'checksum', + 'album', + 'title', + 2, + '2012-03-27 00:00:00', + '2013-03-27 00:00:00', + 'date_created', + 'date_modified', + 'file_modify_date', + 'camera_make', + 'camera_model', + 'original_name', + 'src_path', + 'subdirs', + 'filename' + ) def test_get_checksum(self): assert not self.sqlite.get_checksum('invalid') diff --git a/tests/test_media.py b/tests/test_media.py index bd12fe4..9b4a379 100644 --- a/tests/test_media.py +++ b/tests/test_media.py @@ -103,6 +103,8 @@ class TestMedia: assert date_media == media.metadata['date_created'] elif media.metadata['date_modified']: assert date_media == media.metadata['date_modified'] + elif media.metadata['file_modify_date']: + assert date_media == media.metadata['file_modify_date'] # Will be changed to get_metadata # check if metatadata type are correct