diff --git a/src/core/workers.py b/src/core/workers.py index 9f4ac2a..377c79e 100644 --- a/src/core/workers.py +++ b/src/core/workers.py @@ -77,6 +77,7 @@ class PostProcessorWorker: scan_content_for_images =False , creator_download_folder_ignore_words =None , manga_global_file_counter_ref =None , + use_date_prefix_for_subfolder=False, session_file_path=None, session_lock=None, ): @@ -128,6 +129,7 @@ class PostProcessorWorker: self .override_output_dir =override_output_dir self .scan_content_for_images =scan_content_for_images self .creator_download_folder_ignore_words =creator_download_folder_ignore_words + self.use_date_prefix_for_subfolder = use_date_prefix_for_subfolder self.session_file_path = session_file_path self.session_lock = session_lock if self .compress_images and Image is None : @@ -1003,6 +1005,20 @@ class PostProcessorWorker: else : original_cleaned_post_title_for_sub =cleaned_post_title_for_sub + if self.use_date_prefix_for_subfolder: + # Prioritize 'published' date, fall back to 'added' date + published_date_str = self.post.get('published') or self.post.get('added') + if published_date_str: + try: + # Extract just the date part (YYYY-MM-DD) + date_prefix = published_date_str.split('T')[0] + # Prepend the date to the folder name + original_cleaned_post_title_for_sub = f"{date_prefix} {original_cleaned_post_title_for_sub}" + self.logger(f" ℹ️ Applying date prefix to subfolder: '{original_cleaned_post_title_for_sub}'") + except Exception as e: + self.logger(f" ⚠️ Could not parse date '{published_date_str}' for prefix. Using original name. Error: {e}") + else: + self.logger(" ⚠️ 'Date Prefix' is checked, but post has no 'published' or 'added' date. Omitting prefix.") base_path_for_post_subfolder =determined_post_save_path_for_history @@ -1443,6 +1459,7 @@ class DownloadThread (QThread ): use_cookie =False , scan_content_for_images =False , creator_download_folder_ignore_words =None , + use_date_prefix_for_subfolder=False, cookie_text ="", session_file_path=None, session_lock=None, @@ -1495,6 +1512,7 @@ class DownloadThread (QThread ): self .manga_date_file_counter_ref =manga_date_file_counter_ref self .scan_content_for_images =scan_content_for_images self .creator_download_folder_ignore_words =creator_download_folder_ignore_words + self.use_date_prefix_for_subfolder = use_date_prefix_for_subfolder self .manga_global_file_counter_ref =manga_global_file_counter_ref self.session_file_path = session_file_path self.session_lock = session_lock @@ -1627,6 +1645,7 @@ class DownloadThread (QThread ): manga_global_file_counter_ref =self .manga_global_file_counter_ref , use_cookie =self .use_cookie , manga_date_file_counter_ref =self .manga_date_file_counter_ref , + use_date_prefix_for_subfolder=self.use_date_prefix_for_subfolder, creator_download_folder_ignore_words =self .creator_download_folder_ignore_words , session_file_path=self.session_file_path, session_lock=self.session_lock, diff --git a/src/ui/main_window.py b/src/ui/main_window.py index 8cce81f..46c9911 100644 --- a/src/ui/main_window.py +++ b/src/ui/main_window.py @@ -1223,6 +1223,11 @@ class DownloaderApp (QWidget ): self .use_subfolder_per_post_checkbox .toggled .connect (self .update_ui_for_subfolders ) advanced_row1_layout .addWidget (self .use_subfolder_per_post_checkbox ) + self.date_prefix_checkbox = QCheckBox("Date Prefix") + self.date_prefix_checkbox.setChecked(False) + self.date_prefix_checkbox.setToolTip("When 'Subfolder per Post' is active, prefix the folder name with the post's upload date (e.g., YYYY-MM-DD Post Title).") + advanced_row1_layout.addWidget(self.date_prefix_checkbox) + self .use_cookie_checkbox =QCheckBox ("Use Cookie") self .use_cookie_checkbox .setChecked (self .use_cookie_setting ) @@ -2721,6 +2726,13 @@ class DownloaderApp (QWidget ): if not can_enable_subfolder_per_post_checkbox : self .use_subfolder_per_post_checkbox .setChecked (False ) + if hasattr(self, 'date_prefix_checkbox'): + # The Date Prefix checkbox should only be enabled if "Subfolder per Post" is both enabled and checked + can_enable_date_prefix = self.use_subfolder_per_post_checkbox.isEnabled() and self.use_subfolder_per_post_checkbox.isChecked() + self.date_prefix_checkbox.setEnabled(can_enable_date_prefix) + if not can_enable_date_prefix: + self.date_prefix_checkbox.setChecked(False) + self .update_custom_folder_visibility () @@ -3718,6 +3730,7 @@ class DownloaderApp (QWidget ): 'session_file_path': self.session_file_path, 'session_lock': self.session_lock, 'creator_download_folder_ignore_words':creator_folder_ignore_words_for_run , + 'use_date_prefix_for_subfolder': self.date_prefix_checkbox.isChecked() if hasattr(self, 'date_prefix_checkbox') else False, } args_template ['override_output_dir']=override_output_dir @@ -4070,21 +4083,56 @@ class DownloaderApp (QWidget ): num_file_dl_threads_for_each_worker =worker_args_template .get ('num_file_threads_for_worker',1 ) - ppw_expected_keys =[ - 'post_data','download_root','known_names','filter_character_list','unwanted_keywords', - 'filter_mode','skip_zip','skip_rar','use_subfolders','use_post_subfolders', - 'target_post_id_from_initial_url','custom_folder_name','compress_images','emitter','pause_event', - 'download_thumbnails','service','user_id','api_url_input', - 'cancellation_event','downloaded_files','downloaded_file_hashes', - 'downloaded_files_lock','downloaded_file_hashes_lock','remove_from_filename_words_list','dynamic_character_filter_holder', - 'skip_words_list','skip_words_scope','char_filter_scope', - 'show_external_links','extract_links_only','allow_multipart_download','use_cookie','cookie_text', - 'app_base_dir','selected_cookie_file','override_output_dir', - 'num_file_threads','skip_current_file_flag','manga_date_file_counter_ref','scan_content_for_images', - 'manga_mode_active','manga_filename_style','manga_date_prefix', - 'manga_global_file_counter_ref' - ,'creator_download_folder_ignore_words' - , 'session_file_path', 'session_lock' + ppw_expected_keys = [ + 'post_data', + 'download_root', + 'known_names', + 'filter_character_list', + 'unwanted_keywords', + 'filter_mode', + 'skip_zip', + 'skip_rar', + 'use_subfolders', + 'use_post_subfolders', + 'target_post_id_from_initial_url', + 'custom_folder_name', + 'compress_images', + 'emitter', + 'pause_event', + 'download_thumbnails', + 'service', + 'user_id', + 'api_url_input', + 'cancellation_event', + 'downloaded_files', + 'downloaded_file_hashes', + 'downloaded_files_lock', + 'downloaded_file_hashes_lock', + 'remove_from_filename_words_list', + 'dynamic_character_filter_holder', + 'skip_words_list', + 'skip_words_scope', + 'char_filter_scope', + 'show_external_links', + 'extract_links_only', + 'allow_multipart_download', + 'use_cookie', + 'cookie_text', + 'app_base_dir', + 'selected_cookie_file', + 'override_output_dir', + 'num_file_threads', + 'skip_current_file_flag', + 'manga_date_file_counter_ref', + 'scan_content_for_images', + 'manga_mode_active', + 'manga_filename_style', + 'manga_date_prefix', + 'use_date_prefix_for_subfolder', + 'manga_global_file_counter_ref', + 'creator_download_folder_ignore_words', + 'session_file_path', + 'session_lock' ] ppw_optional_keys_with_defaults ={