From 27587468ba9407f4afcb3147450e31c3758ec469 Mon Sep 17 00:00:00 2001 From: Cedric Leporcq Date: Sun, 17 Apr 2022 21:58:56 +0200 Subject: [PATCH] Fix part --- ordigi/collection.py | 34 ++++++++++++++++++++-------------- ordigi/utils.py | 16 +++++++++++++++- 2 files changed, 35 insertions(+), 15 deletions(-) diff --git a/ordigi/collection.py b/ordigi/collection.py index 0679847..046ad0d 100644 --- a/ordigi/collection.py +++ b/ordigi/collection.py @@ -43,9 +43,9 @@ class FPath: 'camera_make': '{camera_make}', 'camera_model': '{camera_model}', 'city': '{city}', - 'custom': '{".*"}', + 'custom': r'{".*"}', 'country': '{country}', - 'date': '{(%[a-zA-Z][^a-zA-Z]*){1,8}}', # search for date format string + 'date': r'{(%[a-zA-Z][^a-zA-Z]*){1,8}}', # search for date format string 'ext': '{ext}', 'folder': '{folder}', 'folders': r'{folders(\[[0-9:]{0,3}\])?}', @@ -144,15 +144,16 @@ class FPath: date = metadata['date_media'] # early morning photos can be grouped with previous day if date is not None: - part = self.get_early_morning_photos_date(date, mask) - elif item == 'folder': - folder = os.path.basename(metadata['subdirs']) - if folder != metadata['src_dir']: - part = folder - elif item == 'folders': + part = str(self.get_early_morning_photos_date(date, mask)) + elif item in ('folder', 'folders'): folders = Path(metadata['subdirs']).parts - folders = self._get_folders(folders, mask) - part = os.path.join(*folders) + if folders: + if item == 'folder': + folder = folders[-1] + part = folder + else: + folders = self._get_folders(folders, mask) + part = os.path.join(*folders) elif item in ( 'album', @@ -169,14 +170,14 @@ class FPath: mask = 'default' if metadata[mask]: - part = metadata[mask] + part = str(metadata[mask]) elif item in 'custom': # Fallback string part = mask[1:-1] return part - def _set_case(self, regex, part, this_part): + def _substitute(self, regex, part, this_part): # Capitalization u_regex = '%u' + regex l_regex = '%l' + regex @@ -193,7 +194,9 @@ class FPath: for item, regex in self.items.items(): matched = re.search(regex, this_part) if matched: + self.log.debug(f'item: {item}, mask: {matched.group()[1:-1]}') part = self.get_part(item, matched.group()[1:-1], metadata) + self.log.debug(f'part: {part}') part = part.strip() @@ -207,7 +210,7 @@ class FPath: this_part = re.sub( self.whitespace_regex, self.whitespace_sub, this_part ) - this_part = self._set_case(regex, part, this_part) + this_part = self._substitute(regex, part, this_part) # remove alternate parts inside bracket separated by | regex = r'[-_ .]?\(\|\)' @@ -228,6 +231,9 @@ class FPath: if re.match(regex, this_part[0]): this_part = this_part[1:] + # Remove unwanted chars in filename + this_part = utils.filename_filter(this_part) + return this_part def get_path(self, metadata: dict) -> list: @@ -256,7 +262,7 @@ class FPath: # If last path is empty or start with dot if part == '' or re.match(r'^\..*', part): - path.append(metadata['filename']) + path.append(utils.filename_filter(metadata['filename'])) return os.path.join(*path) diff --git a/ordigi/utils.py b/ordigi/utils.py index 4bc1c37..c1af799 100644 --- a/ordigi/utils.py +++ b/ordigi/utils.py @@ -42,6 +42,21 @@ def empty_dir(dir_path): return not next(os.scandir(dir_path), None) +def filename_filter(filename): + """ + Take a string and return a valid filename constructed from the string. + """ + blacklist = '/\\:*"<>|' + if filename is None: + return filename + + # Remove blacklisted chars. + for char in blacklist: + filename = filename.replace(char, '') + + return filename + + def get_date_regex(user_regex=None): """Return date regex generator""" if user_regex: @@ -146,7 +161,6 @@ def camel2snake(name): r'(?!^)[A-Z]', lambda x: '_' + x.group(0).lower(), name[1:] ) - import os import platform import subprocess