Fix date detection in filenames
This commit is contained in:
		
							parent
							
								
									52768f64db
								
							
						
					
					
						commit
						01b47c8c40
					
				| @ -218,7 +218,7 @@ def _check(**kwargs): | |||||||
| @click.argument('subdirs', required=False, nargs=-1, type=click.Path()) | @click.argument('subdirs', required=False, nargs=-1, type=click.Path()) | ||||||
| @click.argument('collection', required=True, nargs=1, type=click.Path()) | @click.argument('collection', required=True, nargs=1, type=click.Path()) | ||||||
| def _clean(**kwargs): | def _clean(**kwargs): | ||||||
|     """Remove empty folders""" |     """Clean media collection""" | ||||||
| 
 | 
 | ||||||
|     folders = kwargs['folders'] |     folders = kwargs['folders'] | ||||||
|     log_level = log.get_level(kwargs['verbose']) |     log_level = log.get_level(kwargs['verbose']) | ||||||
|  | |||||||
| @ -138,14 +138,12 @@ class FPath: | |||||||
|         elif item == 'name': |         elif item == 'name': | ||||||
|             # Remove date prefix added to the name. |             # Remove date prefix added to the name. | ||||||
|             part = stem |             part = stem | ||||||
|             for regex in utils.get_date_regex().values(): |             date_filename, regex, sep = utils.get_date_from_string(stem) | ||||||
|                 part = re.sub(regex, '', part) |             if date_filename: | ||||||
|  |                 part = re.sub(regex, sep, part) | ||||||
|                 # Delete separator |                 # Delete separator | ||||||
|                 if re.search('^[-_ .]', part): |                 if re.search('^[-_ .]', part): | ||||||
|                     part = part[1:] |                     part = part[1:] | ||||||
|                 if part != stem: |  | ||||||
|                     # We only want to match first result |  | ||||||
|                     break |  | ||||||
|         elif item == 'date': |         elif item == 'date': | ||||||
|             date = metadata['date_media'] |             date = metadata['date_media'] | ||||||
|             # early morning photos can be grouped with previous day |             # early morning photos can be grouped with previous day | ||||||
| @ -643,7 +641,7 @@ class SortMedias: | |||||||
| 
 | 
 | ||||||
|             conflict = self.check_conflicts(src_path, dest_path, remove_duplicates) |             conflict = self.check_conflicts(src_path, dest_path, remove_duplicates) | ||||||
| 
 | 
 | ||||||
|             for i in range(1, 100): |             for i in range(1, 1000): | ||||||
|                 if conflict != 1: |                 if conflict != 1: | ||||||
|                     break |                     break | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -359,9 +359,9 @@ class Media(ReadExif): | |||||||
|         stem = os.path.splitext(filename)[0] |         stem = os.path.splitext(filename)[0] | ||||||
|         date_original = self.metadata['date_original'] |         date_original = self.metadata['date_original'] | ||||||
|         if self.metadata['original_name']: |         if self.metadata['original_name']: | ||||||
|             date_filename = utils.get_date_from_string(self.metadata['original_name']) |             date_filename, _, _ = utils.get_date_from_string(self.metadata['original_name']) | ||||||
|         else: |         else: | ||||||
|             date_filename = utils.get_date_from_string(stem) |             date_filename, _, _ = utils.get_date_from_string(stem) | ||||||
|             self.log.debug(f'date_filename: {date_filename}') |             self.log.debug(f'date_filename: {date_filename}') | ||||||
| 
 | 
 | ||||||
|         date_original = self.metadata['date_original'] |         date_original = self.metadata['date_original'] | ||||||
| @ -387,7 +387,7 @@ class Media(ReadExif): | |||||||
| 
 | 
 | ||||||
|             return self.metadata['date_original'] |             return self.metadata['date_original'] | ||||||
| 
 | 
 | ||||||
|         self.log.warning(f"could not find original date for {self.file_path}") |         self.log.warning(f"could not find date original for {self.file_path}") | ||||||
| 
 | 
 | ||||||
|         if self.use_date_filename and date_filename: |         if self.use_date_filename and date_filename: | ||||||
|             self.log.info( |             self.log.info( | ||||||
|  | |||||||
| @ -69,17 +69,17 @@ def get_date_regex(user_regex=None): | |||||||
|             # regex to match date format type %Y%m%d, %y%m%d, %d%m%Y, |             # regex to match date format type %Y%m%d, %y%m%d, %d%m%Y, | ||||||
|             # etc... |             # etc... | ||||||
|             'a': re.compile( |             'a': re.compile( | ||||||
|                 r'[-_./](?P<year>\d{4})[-_.]?(?P<month>\d{2})[-_.]?(?P<day>\d{2})[-_.]?(?P<hour>\d{2})[-_.]?(?P<minute>\d{2})[-_.]?(?P<second>\d{2})' |                 r'[-_./ ](?P<year>\d{4})[-_.]?(?P<month>\d{2})[-_.]?(?P<day>\d{2})[-_.]?(?P<hour>\d{2})[-_.]?(?P<minute>\d{2})[-_.]?(?P<second>\d{2})([-_./ ])' | ||||||
|             ), |             ), | ||||||
|             'b': re.compile( |             'b': re.compile( | ||||||
|                 r'[-_./](?P<year>\d{4})[-_.]?(?P<month>\d{2})[-_.]?(?P<day>\d{2})[-_./]' |                 r'[-_./ ](?P<year>\d{4})[-_.]?(?P<month>\d{2})[-_.]?(?P<day>\d{2})([-_./ ])' | ||||||
|             ), |             ), | ||||||
|             # not very accurate |             # not very accurate | ||||||
|             'c': re.compile( |             'c': re.compile( | ||||||
|                 r'[-_./](?P<year>\d{2})[-_.]?(?P<month>\d{2})[-_.]?(?P<day>\d{2})[-_./]' |                 r'[-_./ ](?P<year>\d{2})[-_.]?(?P<month>\d{2})[-_.]?(?P<day>\d{2})([-_./ ])' | ||||||
|             ), |             ), | ||||||
|             'd': re.compile( |             'd': re.compile( | ||||||
|                 r'[-_./](?P<day>\d{2})[-_.](?P<month>\d{2})[-_.](?P<year>\d{4})[-_./]' |                 r'[-_./ ](?P<day>\d{2})[-_.](?P<month>\d{2})[-_.](?P<year>\d{4})([-_./ ])' | ||||||
|             ), |             ), | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
| @ -96,15 +96,18 @@ def get_date_from_string(string): | |||||||
|     # Otherwise assume a filename such as IMG_20160915_123456.jpg as default. |     # Otherwise assume a filename such as IMG_20160915_123456.jpg as default. | ||||||
| 
 | 
 | ||||||
|     matches = [] |     matches = [] | ||||||
|  |     sep = '' | ||||||
|     for i, regex in DATE_REGEX.items(): |     for i, regex in DATE_REGEX.items(): | ||||||
|         match = re.findall(regex, string) |         match = re.findall(regex, string) | ||||||
|         if match != []: |         if match != []: | ||||||
|  |             sep = match[0][3] | ||||||
|             if i == 'c': |             if i == 'c': | ||||||
|                 match = [('20' + match[0][0], match[0][1], match[0][2])] |                 match = [('20' + match[0][0], match[0][1], match[0][2])] | ||||||
|             elif i == 'd': |             elif i == 'd': | ||||||
|                 # reorder items |                 # reorder items | ||||||
|                 match = [(match[0][2], match[0][1], match[0][0])] |                 match = [(match[0][2], match[0][1], match[0][0])] | ||||||
|             # matches = match + matches |             else: | ||||||
|  |                 match = [(match[0][0], match[0][1], match[0][2])] | ||||||
|             if len(match) != 1: |             if len(match) != 1: | ||||||
|                 # The time string is not uniq |                 # The time string is not uniq | ||||||
|                 continue |                 continue | ||||||
| @ -119,9 +122,11 @@ def get_date_from_string(string): | |||||||
|             date_object = tuple(map(int, matches[0][0])) |             date_object = tuple(map(int, matches[0][0])) | ||||||
|             date = datetime(*date_object) |             date = datetime(*date_object) | ||||||
|         except (KeyError, ValueError): |         except (KeyError, ValueError): | ||||||
|             return None |             return None, matches[0][1], sep | ||||||
| 
 | 
 | ||||||
|         return date |         return date, matches[0][1], sep | ||||||
|  | 
 | ||||||
|  |     return None, None, sep | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def match_date_regex(regex, value): | def match_date_regex(regex, value): | ||||||
|  | |||||||
| @ -90,10 +90,10 @@ class TestMedia: | |||||||
|             date_filename = None |             date_filename = None | ||||||
|             for tag in media.tags_keys['original_name']: |             for tag in media.tags_keys['original_name']: | ||||||
|                 if tag in exif_data: |                 if tag in exif_data: | ||||||
|                     date_filename = get_date_from_string(exif_data[tag]) |                     date_filename, _, _ = get_date_from_string(exif_data[tag]) | ||||||
|                 break |                 break | ||||||
|             if not date_filename: |             if not date_filename: | ||||||
|                 date_filename = get_date_from_string(file_path.name) |                 date_filename, _, _ = get_date_from_string(file_path.name) | ||||||
| 
 | 
 | ||||||
|             if media.metadata['date_original']: |             if media.metadata['date_original']: | ||||||
|                 assert date_media == media.metadata['date_original'] |                 assert date_media == media.metadata['date_original'] | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user