From a2ce906fd07660130b6b4c1377fcc3d05cea6ff5 Mon Sep 17 00:00:00 2001 From: Alexander Graf <17130992+aandergr@users.noreply.github.com> Date: Mon, 4 Jan 2021 17:26:50 +0100 Subject: [PATCH] Fix efficiency bug regarding {filename} in filename-pattern Avoid evaluating 'url' when preparing the filename if the filename-pattern does not contain the "{filename}" token. This avoids the URL to be queried even though it is not needed (e.g. with --no-pictures). --- instaloader/instaloader.py | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/instaloader/instaloader.py b/instaloader/instaloader.py index ed53d4b..90ff125 100644 --- a/instaloader/instaloader.py +++ b/instaloader/instaloader.py @@ -524,11 +524,15 @@ class Instaloader: self.context.two_factor_login(two_factor_code) @staticmethod - def __prepare_filename(filename_template: str, url: str) -> str: + def __prepare_filename(filename_template: str, url: Callable[[], str]) -> str: """Replace filename token inside filename_template with url's filename and assure the directories exist. .. versionadded:: 4.6""" - filename = filename_template.replace("{filename}", os.path.splitext(os.path.basename(urlparse(url).path))[0]) + if "{filename}" in filename_template: + filename = filename_template.replace("{filename}", + os.path.splitext(os.path.basename(urlparse(url()).path))[0]) + else: + filename = filename_template os.makedirs(os.path.dirname(filename), exist_ok=True) return filename @@ -549,7 +553,7 @@ class Instaloader: dirname = _PostPathFormatter(post).format(self.dirname_pattern, target=target) filename_template = os.path.join(dirname, self.format_filename(post, target=target)) - filename = self.__prepare_filename(filename_template, post.url) + filename = self.__prepare_filename(filename_template, lambda: post.url) # Download the image(s) / video thumbnail and videos within sidecars if desired downloaded = True @@ -563,7 +567,8 @@ class Instaloader: suffix = str(edge_number) if '{filename}' in self.filename_pattern: suffix = '' - filename = self.__prepare_filename(filename_template, sidecar_node.display_url) + # pylint:disable=cell-var-from-loop + filename = self.__prepare_filename(filename_template, lambda: sidecar_node.display_url) # Download sidecar picture or video thumbnail (--no-pictures implies --no-video-thumbnails) downloaded &= self.download_pic(filename=filename, url=sidecar_node.display_url, mtime=post.date_local, filename_suffix=suffix) @@ -571,7 +576,8 @@ class Instaloader: suffix = str(edge_number) if '{filename}' in self.filename_pattern: suffix = '' - filename = self.__prepare_filename(filename_template, sidecar_node.video_url) + # pylint:disable=cell-var-from-loop + filename = self.__prepare_filename(filename_template, lambda: sidecar_node.video_url) # Download sidecar video if desired downloaded &= self.download_pic(filename=filename, url=sidecar_node.video_url, mtime=post.date_local, filename_suffix=suffix) @@ -690,13 +696,13 @@ class Instaloader: date_local = item.date_local dirname = _PostPathFormatter(item).format(self.dirname_pattern, target=target) filename_template = os.path.join(dirname, self.format_filename(item, target=target)) - filename = self.__prepare_filename(filename_template, item.url) + filename = self.__prepare_filename(filename_template, lambda: item.url) downloaded = False if not item.is_video or self.download_video_thumbnails is True: url = item.url downloaded = self.download_pic(filename=filename, url=url, mtime=date_local) if item.is_video and self.download_videos is True: - filename = self.__prepare_filename(filename_template, str(item.video_url)) + filename = self.__prepare_filename(filename_template, lambda: str(item.video_url)) downloaded |= self.download_pic(filename=filename, url=item.video_url, mtime=date_local) # Save caption if desired metadata_string = _ArbitraryItemFormatter(item).format(self.storyitem_metadata_txt_pattern).strip()