diff --git a/comictaggerlib/autotagmatchwindow.py b/comictaggerlib/autotagmatchwindow.py index e492373..4df71d9 100644 --- a/comictaggerlib/autotagmatchwindow.py +++ b/comictaggerlib/autotagmatchwindow.py @@ -52,7 +52,7 @@ class AutoTagMatchWindow(QtWidgets.QDialog): self.current_match_set: MultipleMatch = match_set_list[0] self.altCoverWidget = CoverImageWidget( - self.altCoverContainer, CoverImageWidget.AltCoverMode, config.Runtime_Options_config.user_cache_dir, talker + self.altCoverContainer, CoverImageWidget.AltCoverMode, config.Runtime_Options__config.user_cache_dir, talker ) gridlayout = QtWidgets.QGridLayout(self.altCoverContainer) gridlayout.addWidget(self.altCoverWidget) @@ -233,10 +233,10 @@ class AutoTagMatchWindow(QtWidgets.QDialog): md = ca.read_metadata(self._style) if md.is_empty: md = ca.metadata_from_filename( - self.config.Filename_Parsing_complicated_parser, - self.config.Filename_Parsing_remove_c2c, - self.config.Filename_Parsing_remove_fcbd, - self.config.Filename_Parsing_remove_publisher, + self.config.Filename_Parsing__complicated_parser, + self.config.Filename_Parsing__remove_c2c, + self.config.Filename_Parsing__remove_fcbd, + self.config.Filename_Parsing__remove_publisher, ) # now get the particular issue data diff --git a/comictaggerlib/autotagstartwindow.py b/comictaggerlib/autotagstartwindow.py index 44c2949..957a941 100644 --- a/comictaggerlib/autotagstartwindow.py +++ b/comictaggerlib/autotagstartwindow.py @@ -40,15 +40,15 @@ class AutoTagStartWindow(QtWidgets.QDialog): self.cbxSpecifySearchString.setChecked(False) self.cbxSplitWords.setChecked(False) - self.sbNameMatchSearchThresh.setValue(self.config.Issue_Identifier_series_match_identify_thresh) + self.sbNameMatchSearchThresh.setValue(self.config.Issue_Identifier__series_match_identify_thresh) self.leSearchString.setEnabled(False) - self.cbxSaveOnLowConfidence.setChecked(self.config.Auto_Tag_save_on_low_confidence) - self.cbxDontUseYear.setChecked(self.config.Auto_Tag_dont_use_year_when_identifying) - self.cbxAssumeIssueOne.setChecked(self.config.Auto_Tag_assume_1_if_no_issue_num) - self.cbxIgnoreLeadingDigitsInFilename.setChecked(self.config.Auto_Tag_ignore_leading_numbers_in_filename) - self.cbxRemoveAfterSuccess.setChecked(self.config.Auto_Tag_remove_archive_after_successful_match) - self.cbxAutoImprint.setChecked(self.config.Issue_Identifier_auto_imprint) + self.cbxSaveOnLowConfidence.setChecked(self.config.Auto_Tag__save_on_low_confidence) + self.cbxDontUseYear.setChecked(self.config.Auto_Tag__dont_use_year_when_identifying) + self.cbxAssumeIssueOne.setChecked(self.config.Auto_Tag__assume_1_if_no_issue_num) + self.cbxIgnoreLeadingDigitsInFilename.setChecked(self.config.Auto_Tag__ignore_leading_numbers_in_filename) + self.cbxRemoveAfterSuccess.setChecked(self.config.Auto_Tag__remove_archive_after_successful_match) + self.cbxAutoImprint.setChecked(self.config.Issue_Identifier__auto_imprint) nlmt_tip = """The Name Match Ratio Threshold: Auto-Identify is for eliminating automatic search matches that are too long compared to your series name search. The lower @@ -73,7 +73,7 @@ class AutoTagStartWindow(QtWidgets.QDialog): self.ignore_leading_digits_in_filename = False self.remove_after_success = False self.search_string = "" - self.name_length_match_tolerance = self.config.Issue_Identifier_series_match_search_thresh + self.name_length_match_tolerance = self.config.Issue_Identifier__series_match_search_thresh self.split_words = self.cbxSplitWords.isChecked() def search_string_toggle(self) -> None: @@ -92,11 +92,11 @@ class AutoTagStartWindow(QtWidgets.QDialog): self.split_words = self.cbxSplitWords.isChecked() # persist some settings - self.config.Auto_Tag_save_on_low_confidence = self.auto_save_on_low - self.config.Auto_Tag_dont_use_year_when_identifying = self.dont_use_year - self.config.Auto_Tag_assume_1_if_no_issue_num = self.assume_issue_one - self.config.Auto_Tag_ignore_leading_numbers_in_filename = self.ignore_leading_digits_in_filename - self.config.Auto_Tag_remove_archive_after_successful_match = self.remove_after_success + self.config.Auto_Tag__save_on_low_confidence = self.auto_save_on_low + self.config.Auto_Tag__dont_use_year_when_identifying = self.dont_use_year + self.config.Auto_Tag__assume_1_if_no_issue_num = self.assume_issue_one + self.config.Auto_Tag__ignore_leading_numbers_in_filename = self.ignore_leading_digits_in_filename + self.config.Auto_Tag__remove_archive_after_successful_match = self.remove_after_success if self.cbxSpecifySearchString.isChecked(): self.search_string = self.leSearchString.text() diff --git a/comictaggerlib/cbltransformer.py b/comictaggerlib/cbltransformer.py index e52bf5f..3d0ea04 100644 --- a/comictaggerlib/cbltransformer.py +++ b/comictaggerlib/cbltransformer.py @@ -29,7 +29,7 @@ class CBLTransformer: self.config = config def apply(self) -> GenericMetadata: - if self.config.Comic_Book_Lover_assume_lone_credit_is_primary: + if self.config.Comic_Book_Lover__assume_lone_credit_is_primary: # helper def set_lone_primary(role_list: list[str]) -> tuple[Credit | None, int]: lone_credit: Credit | None = None @@ -55,19 +55,19 @@ class CBLTransformer: c["primary"] = False self.metadata.add_credit(c["person"], "Artist", True) - if self.config.Comic_Book_Lover_copy_characters_to_tags: + if self.config.Comic_Book_Lover__copy_characters_to_tags: self.metadata.tags.update(x for x in self.metadata.characters) - if self.config.Comic_Book_Lover_copy_teams_to_tags: + if self.config.Comic_Book_Lover__copy_teams_to_tags: self.metadata.tags.update(x for x in self.metadata.teams) - if self.config.Comic_Book_Lover_copy_locations_to_tags: + if self.config.Comic_Book_Lover__copy_locations_to_tags: self.metadata.tags.update(x for x in self.metadata.locations) - if self.config.Comic_Book_Lover_copy_storyarcs_to_tags: + if self.config.Comic_Book_Lover__copy_storyarcs_to_tags: self.metadata.tags.update(x for x in self.metadata.story_arcs) - if self.config.Comic_Book_Lover_copy_notes_to_comments: + if self.config.Comic_Book_Lover__copy_notes_to_comments: if self.metadata.notes is not None: if self.metadata.description is None: self.metadata.description = "" @@ -76,7 +76,7 @@ class CBLTransformer: if self.metadata.notes not in self.metadata.description: self.metadata.description += self.metadata.notes - if self.config.Comic_Book_Lover_copy_weblink_to_comments: + if self.config.Comic_Book_Lover__copy_weblink_to_comments: if self.metadata.web_link is not None: if self.metadata.description is None: self.metadata.description = "" diff --git a/comictaggerlib/cli.py b/comictaggerlib/cli.py index b51b5bd..1c2ff19 100644 --- a/comictaggerlib/cli.py +++ b/comictaggerlib/cli.py @@ -44,9 +44,9 @@ class CLI: self.batch_mode = False def current_talker(self) -> ComicTalker: - if self.config.Sources_source in self.talkers: - return self.talkers[self.config.Sources_source] - logger.error("Could not find the '%s' talker", self.config.Sources_source) + if self.config.Sources__source in self.talkers: + return self.talkers[self.config.Sources__source] + logger.error("Could not find the '%s' talker", self.config.Sources__source) raise SystemExit(2) def actual_issue_data_fetch(self, issue_id: str) -> GenericMetadata: @@ -57,14 +57,14 @@ class CLI: logger.exception(f"Error retrieving issue details. Save aborted.\n{e}") return GenericMetadata() - if self.config.Comic_Book_Lover_apply_transform_on_import: + if self.config.Comic_Book_Lover__apply_transform_on_import: ct_md = CBLTransformer(ct_md, self.config).apply() return ct_md def actual_metadata_save(self, ca: ComicArchive, md: GenericMetadata) -> bool: - if not self.config.Runtime_Options_dryrun: - for metadata_style in self.config.Runtime_Options_type: + if not self.config.Runtime_Options__dryrun: + for metadata_style in self.config.Runtime_Options__type: # write out the new data if not ca.write_metadata(md, metadata_style): logger.error("The tag save seemed to fail for style: %s!", MetaDataStyle.name[metadata_style]) @@ -73,7 +73,7 @@ class CLI: print("Save complete.") logger.info("Save complete.") else: - if self.config.Runtime_Options_quiet: + if self.config.Runtime_Options__quiet: logger.info("dry-run option was set, so nothing was written") print("dry-run option was set, so nothing was written") else: @@ -100,7 +100,7 @@ class CLI: m["issue_title"], ) ) - if self.config.Runtime_Options_interactive: + if self.config.Runtime_Options__interactive: while True: i = input("Choose a match #, or 's' to skip: ") if (i.isdigit() and int(i) in range(1, len(match_set.matches) + 1)) or i == "s": @@ -111,7 +111,7 @@ class CLI: ca = match_set.ca md = self.create_local_metadata(ca) ct_md = self.actual_issue_data_fetch(match_set.matches[int(i) - 1]["issue_id"]) - if self.config.Issue_Identifier_clear_metadata_on_import: + if self.config.Issue_Identifier__clear_metadata_on_import: md = ct_md else: notes = ( @@ -120,14 +120,14 @@ class CLI: ) md.overlay(ct_md.replace(notes=utils.combine_notes(md.notes, notes, "Tagged with ComicTagger"))) - if self.config.Issue_Identifier_auto_imprint: + if self.config.Issue_Identifier__auto_imprint: md.fix_publisher() self.actual_metadata_save(ca, md) def post_process_matches(self, match_results: OnlineMatchResults) -> None: # now go through the match results - if self.config.Runtime_Options_summary: + if self.config.Runtime_Options__summary: if len(match_results.good_matches) > 0: print("\nSuccessful matches:\n------------------") for f in match_results.good_matches: @@ -148,7 +148,7 @@ class CLI: for f in match_results.fetch_data_failures: print(f) - if not self.config.Runtime_Options_summary and not self.config.Runtime_Options_interactive: + if not self.config.Runtime_Options__summary and not self.config.Runtime_Options__interactive: # just quit if we're not interactive or showing the summary return @@ -168,20 +168,20 @@ class CLI: self.display_match_set_for_choice(label, match_set) def run(self) -> None: - if len(self.config.Runtime_Options_files) < 1: + if len(self.config.Runtime_Options__files) < 1: logger.error("You must specify at least one filename. Use the -h option for more info") return match_results = OnlineMatchResults() - self.batch_mode = len(self.config.Runtime_Options_files) > 1 + self.batch_mode = len(self.config.Runtime_Options__files) > 1 - for f in self.config.Runtime_Options_files: + for f in self.config.Runtime_Options__files: self.process_file_cli(f, match_results) sys.stdout.flush() self.post_process_matches(match_results) - if self.config.Runtime_Options_online: + if self.config.Runtime_Options__online: print( f"\nFiles tagged with metadata provided by {self.current_talker().name} {self.current_talker().website}" ) @@ -191,18 +191,18 @@ class CLI: md.set_default_page_list(ca.get_number_of_pages()) # now, overlay the parsed filename info - if self.config.Runtime_Options_parse_filename: + if self.config.Runtime_Options__parse_filename: f_md = ca.metadata_from_filename( - self.config.Filename_Parsing_complicated_parser, - self.config.Filename_Parsing_remove_c2c, - self.config.Filename_Parsing_remove_fcbd, - self.config.Filename_Parsing_remove_publisher, - self.config.Runtime_Options_split_words, + self.config.Filename_Parsing__complicated_parser, + self.config.Filename_Parsing__remove_c2c, + self.config.Filename_Parsing__remove_fcbd, + self.config.Filename_Parsing__remove_publisher, + self.config.Runtime_Options__split_words, ) md.overlay(f_md) - for metadata_style in self.config.Runtime_Options_type: + for metadata_style in self.config.Runtime_Options__type: if ca.has_metadata(metadata_style): try: t_md = ca.read_metadata(metadata_style) @@ -212,12 +212,12 @@ class CLI: logger.error("Failed to load metadata for %s: %s", ca.path, e) # finally, use explicit stuff - md.overlay(self.config.Runtime_Options_metadata) + md.overlay(self.config.Runtime_Options__metadata) return md def print(self, ca: ComicArchive) -> None: - if not self.config.Runtime_Options_type: + if not self.config.Runtime_Options__type: page_count = ca.get_number_of_pages() brief = "" @@ -247,17 +247,17 @@ class CLI: print(brief) - if self.config.Runtime_Options_quiet: + if self.config.Runtime_Options__quiet: return print() raw: str | bytes = "" - if not self.config.Runtime_Options_type or MetaDataStyle.CIX in self.config.Runtime_Options_type: + if not self.config.Runtime_Options__type or MetaDataStyle.CIX in self.config.Runtime_Options__type: if ca.has_metadata(MetaDataStyle.CIX): print("--------- ComicRack tags ---------") try: - if self.config.Runtime_Options_raw: + if self.config.Runtime_Options__raw: raw = ca.read_raw_cix() if isinstance(raw, bytes): raw = raw.decode("utf-8") @@ -267,11 +267,11 @@ class CLI: except Exception as e: logger.error("Failed to load metadata for %s: %s", ca.path, e) - if not self.config.Runtime_Options_type or MetaDataStyle.CBI in self.config.Runtime_Options_type: + if not self.config.Runtime_Options__type or MetaDataStyle.CBI in self.config.Runtime_Options__type: if ca.has_metadata(MetaDataStyle.CBI): print("------- ComicBookLover tags -------") try: - if self.config.Runtime_Options_raw: + if self.config.Runtime_Options__raw: raw = ca.read_raw_cbi() if isinstance(raw, bytes): raw = raw.decode("utf-8") @@ -281,11 +281,11 @@ class CLI: except Exception as e: logger.error("Failed to load metadata for %s: %s", ca.path, e) - if not self.config.Runtime_Options_type or MetaDataStyle.COMET in self.config.Runtime_Options_type: + if not self.config.Runtime_Options__type or MetaDataStyle.COMET in self.config.Runtime_Options__type: if ca.has_metadata(MetaDataStyle.COMET): print("----------- CoMet tags -----------") try: - if self.config.Runtime_Options_raw: + if self.config.Runtime_Options__raw: raw = ca.read_raw_comet() if isinstance(raw, bytes): raw = raw.decode("utf-8") @@ -296,10 +296,10 @@ class CLI: logger.error("Failed to load metadata for %s: %s", ca.path, e) def delete(self, ca: ComicArchive) -> None: - for metadata_style in self.config.Runtime_Options_type: + for metadata_style in self.config.Runtime_Options__type: style_name = MetaDataStyle.name[metadata_style] if ca.has_metadata(metadata_style): - if not self.config.Runtime_Options_dryrun: + if not self.config.Runtime_Options__dryrun: if not ca.remove_metadata(metadata_style): print(f"{ca.path}: Tag removal seemed to fail!") else: @@ -310,25 +310,25 @@ class CLI: print(f"{ca.path}: This archive doesn't have {style_name} tags to remove.") def copy(self, ca: ComicArchive) -> None: - for metadata_style in self.config.Runtime_Options_type: + for metadata_style in self.config.Runtime_Options__type: dst_style_name = MetaDataStyle.name[metadata_style] - if not self.config.Runtime_Options_overwrite and ca.has_metadata(metadata_style): + if not self.config.Runtime_Options__overwrite and ca.has_metadata(metadata_style): print(f"{ca.path}: Already has {dst_style_name} tags. Not overwriting.") return - if self.config.Commands_copy == metadata_style: + if self.config.Commands__copy == metadata_style: print(f"{ca.path}: Destination and source are same: {dst_style_name}. Nothing to do.") return - src_style_name = MetaDataStyle.name[self.config.Commands_copy] - if ca.has_metadata(self.config.Commands_copy): - if not self.config.Runtime_Options_dryrun: + src_style_name = MetaDataStyle.name[self.config.Commands__copy] + if ca.has_metadata(self.config.Commands__copy): + if not self.config.Runtime_Options__dryrun: try: - md = ca.read_metadata(self.config.Commands_copy) + md = ca.read_metadata(self.config.Commands__copy) except Exception as e: md = GenericMetadata() logger.error("Failed to load metadata for %s: %s", ca.path, e) - if self.config.Comic_Book_Lover_apply_transform_on_bulk_operation == MetaDataStyle.CBI: + if self.config.Comic_Book_Lover__apply_transform_on_bulk_operation == MetaDataStyle.CBI: md = CBLTransformer(md, self.config).apply() if not ca.write_metadata(md, metadata_style): @@ -341,8 +341,8 @@ class CLI: print(f"{ca.path}: This archive doesn't have {src_style_name} tags to copy.") def save(self, ca: ComicArchive, match_results: OnlineMatchResults) -> None: - if not self.config.Runtime_Options_overwrite: - for metadata_style in self.config.Runtime_Options_type: + if not self.config.Runtime_Options__overwrite: + for metadata_style in self.config.Runtime_Options__type: if ca.has_metadata(metadata_style): print(f"{ca.path}: Already has {MetaDataStyle.name[metadata_style]} tags. Not overwriting.") return @@ -352,26 +352,26 @@ class CLI: md = self.create_local_metadata(ca) if md.issue is None or md.issue == "": - if self.config.Auto_Tag_assume_1_if_no_issue_num: + if self.config.Auto_Tag__assume_1_if_no_issue_num: md.issue = "1" # now, search online - if self.config.Runtime_Options_online: - if self.config.Runtime_Options_issue_id is not None: + if self.config.Runtime_Options__online: + if self.config.Runtime_Options__issue_id is not None: # we were given the actual issue ID to search with try: - ct_md = self.current_talker().fetch_comic_data(self.config.Runtime_Options_issue_id) + ct_md = self.current_talker().fetch_comic_data(self.config.Runtime_Options__issue_id) except TalkerError as e: logger.exception(f"Error retrieving issue details. Save aborted.\n{e}") match_results.fetch_data_failures.append(str(ca.path.absolute())) return if ct_md is None: - logger.error("No match for ID %s was found.", self.config.Runtime_Options_issue_id) + logger.error("No match for ID %s was found.", self.config.Runtime_Options__issue_id) match_results.no_matches.append(str(ca.path.absolute())) return - if self.config.Comic_Book_Lover_apply_transform_on_import: + if self.config.Comic_Book_Lover__apply_transform_on_import: ct_md = CBLTransformer(ct_md, self.config).apply() else: if md is None or md.is_empty: @@ -382,7 +382,7 @@ class CLI: ii = IssueIdentifier(ca, self.config, self.current_talker()) def myoutput(text: str) -> None: - if self.config.Runtime_Options_verbose: + if self.config.Runtime_Options__verbose: IssueIdentifier.default_write_output(text) # use our overlaid MD struct to search @@ -422,7 +422,7 @@ class CLI: logger.error("Online search: Multiple good matches. Save aborted") match_results.multiple_matches.append(MultipleMatch(ca, matches)) return - if low_confidence and self.config.Runtime_Options_abort_on_low_confidence: + if low_confidence and self.config.Runtime_Options__abort_on_low_confidence: logger.error("Online search: Low confidence match. Save aborted") match_results.low_confidence_matches.append(MultipleMatch(ca, matches)) return @@ -439,7 +439,7 @@ class CLI: match_results.fetch_data_failures.append(str(ca.path.absolute())) return - if self.config.Issue_Identifier_clear_metadata_on_import: + if self.config.Issue_Identifier__clear_metadata_on_import: md = GenericMetadata() notes = ( @@ -449,11 +449,11 @@ class CLI: md.overlay( ct_md.replace( notes=utils.combine_notes(md.notes, notes, "Tagged with ComicTagger"), - description=cleanup_html(ct_md.description, self.config.Sources_remove_html_tables), + description=cleanup_html(ct_md.description, self.config.Sources__remove_html_tables), ) ) - if self.config.Issue_Identifier_auto_imprint: + if self.config.Issue_Identifier__auto_imprint: md.fix_publisher() # ok, done building our metadata. time to save @@ -475,18 +475,18 @@ class CLI: return new_ext = "" # default - if self.config.File_Rename_set_extension_based_on_archive: + if self.config.File_Rename__set_extension_based_on_archive: new_ext = ca.extension() renamer = FileRenamer( md, - platform="universal" if self.config.File_Rename_strict else "auto", - replacements=self.config.File_Rename_replacements, + platform="universal" if self.config.File_Rename__strict else "auto", + replacements=self.config.File_Rename__replacements, ) - renamer.set_template(self.config.File_Rename_template) - renamer.set_issue_zero_padding(self.config.File_Rename_issue_number_padding) - renamer.set_smart_cleanup(self.config.File_Rename_use_smart_string_cleanup) - renamer.move = self.config.File_Rename_move_to_dir + renamer.set_template(self.config.File_Rename__template) + renamer.set_issue_zero_padding(self.config.File_Rename__issue_number_padding) + renamer.set_smart_cleanup(self.config.File_Rename__use_smart_string_cleanup) + renamer.move = self.config.File_Rename__move_to_dir try: new_name = renamer.determine_name(ext=new_ext) @@ -498,14 +498,14 @@ class CLI: "Please consult the template help in the settings " "and the documentation on the format at " "https://docs.python.org/3/library/string.html#format-string-syntax", - self.config.File_Rename_template, + self.config.File_Rename__template, ) return except Exception: - logger.exception("Formatter failure: %s metadata: %s", self.config.File_Rename_template, renamer.metadata) + logger.exception("Formatter failure: %s metadata: %s", self.config.File_Rename__template, renamer.metadata) return - folder = get_rename_dir(ca, self.config.File_Rename_dir if self.config.File_Rename_move_to_dir else None) + folder = get_rename_dir(ca, self.config.File_Rename__dir if self.config.File_Rename__move_to_dir else None) full_path = folder / new_name @@ -514,7 +514,7 @@ class CLI: return suffix = "" - if not self.config.Runtime_Options_dryrun: + if not self.config.Runtime_Options__dryrun: # rename the file try: ca.rename(utils.unique_file(full_path)) @@ -537,7 +537,7 @@ class CLI: filename_path = ca.path new_file = filename_path.with_suffix(".cbz") - if self.config.Runtime_Options_abort_on_conflict and new_file.exists(): + if self.config.Runtime_Options__abort_on_conflict and new_file.exists(): print(msg_hdr + f"{new_file.name} already exists in the that folder.") return @@ -545,10 +545,10 @@ class CLI: delete_success = False export_success = False - if not self.config.Runtime_Options_dryrun: + if not self.config.Runtime_Options__dryrun: if ca.export_as_zip(new_file): export_success = True - if self.config.Runtime_Options_delete_after_zip_export: + if self.config.Runtime_Options__delete_after_zip_export: try: filename_path.unlink(missing_ok=True) delete_success = True @@ -560,7 +560,7 @@ class CLI: new_file.unlink(missing_ok=True) else: msg = msg_hdr + f"Dry-run: Would try to create {os.path.split(new_file)[1]}" - if self.config.Runtime_Options_delete_after_zip_export: + if self.config.Runtime_Options__delete_after_zip_export: msg += " and delete original." print(msg) return @@ -568,7 +568,7 @@ class CLI: msg = msg_hdr if export_success: msg += f"Archive exported successfully to: {os.path.split(new_file)[1]}" - if self.config.Runtime_Options_delete_after_zip_export and delete_success: + if self.config.Runtime_Options__delete_after_zip_export and delete_success: msg += " (Original deleted) " else: msg += "Archive failed to export!" @@ -587,28 +587,28 @@ class CLI: return if not ca.is_writable() and ( - self.config.Commands_delete - or self.config.Commands_copy - or self.config.Commands_save - or self.config.Commands_rename + self.config.Commands__delete + or self.config.Commands__copy + or self.config.Commands__save + or self.config.Commands__rename ): logger.error("This archive is not writable") return - if self.config.Commands_print: + if self.config.Commands__print: self.print(ca) - elif self.config.Commands_delete: + elif self.config.Commands__delete: self.delete(ca) - elif self.config.Commands_copy is not None: + elif self.config.Commands__copy is not None: self.copy(ca) - elif self.config.Commands_save: + elif self.config.Commands__save: self.save(ca, match_results) - elif self.config.Commands_rename: + elif self.config.Commands__rename: self.rename(ca) - elif self.config.Commands_export_to_zip: + elif self.config.Commands__export_to_zip: self.export(ca) diff --git a/comictaggerlib/ctsettings/commandline.py b/comictaggerlib/ctsettings/commandline.py index 437dd4f..24cfad9 100644 --- a/comictaggerlib/ctsettings/commandline.py +++ b/comictaggerlib/ctsettings/commandline.py @@ -247,55 +247,55 @@ def register_commandline_settings(parser: settngs.Manager) -> None: def validate_commandline_settings(config: settngs.Config[ct_ns], parser: settngs.Manager) -> settngs.Config[ct_ns]: - if config[0].Commands_version: + if config[0].Commands__version: parser.exit( status=1, message=f"ComicTagger {ctversion.version}: Copyright (c) 2012-2022 ComicTagger Team\n" "Distributed under Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)\n", ) - config[0].Runtime_Options_no_gui = any( + config[0].Runtime_Options__no_gui = any( [ - config[0].Commands_print, - config[0].Commands_delete, - config[0].Commands_save, - config[0].Commands_copy, - config[0].Commands_rename, - config[0].Commands_export_to_zip, - config[0].Commands_only_save_config, - config[0].Commands_list_plugins, - config[0].Runtime_Options_no_gui, + config[0].Commands__print, + config[0].Commands__delete, + config[0].Commands__save, + config[0].Commands__copy, + config[0].Commands__rename, + config[0].Commands__export_to_zip, + config[0].Commands__only_save_config, + config[0].Commands__list_plugins, + config[0].Runtime_Options__no_gui, ] ) - if platform.system() == "Windows" and config[0].Runtime_Options_glob: + if platform.system() == "Windows" and config[0].Runtime_Options__glob: # no globbing on windows shell, so do it for them import glob - globs = config[0].Runtime_Options_files - config[0].Runtime_Options_files = [] + globs = config[0].Runtime_Options__files + config[0].Runtime_Options__files = [] for item in globs: - config[0].Runtime_Options_files.extend(glob.glob(item)) + config[0].Runtime_Options__files.extend(glob.glob(item)) if ( - not config[0].Commands_only_save_config - and config[0].Runtime_Options_no_gui - and not config[0].Runtime_Options_files + not config[0].Commands__only_save_config + and config[0].Runtime_Options__no_gui + and not config[0].Runtime_Options__files ): parser.exit(message="Command requires at least one filename!\n", status=1) - if config[0].Commands_delete and not config[0].Runtime_Options_type: + if config[0].Commands__delete and not config[0].Runtime_Options__type: parser.exit(message="Please specify the type to delete with -t\n", status=1) - if config[0].Commands_save and not config[0].Runtime_Options_type: + if config[0].Commands__save and not config[0].Runtime_Options__type: parser.exit(message="Please specify the type to save with -t\n", status=1) - if config[0].Commands_copy: - if not config[0].Runtime_Options_type: + if config[0].Commands__copy: + if not config[0].Runtime_Options__type: parser.exit(message="Please specify the type to copy to with -t\n", status=1) - if config[0].Runtime_Options_recursive: - config[0].Runtime_Options_files = utils.get_recursive_filelist(config[0].Runtime_Options_files) + if config[0].Runtime_Options__recursive: + config[0].Runtime_Options__files = utils.get_recursive_filelist(config[0].Runtime_Options__files) # take a crack at finding rar exe if it's not in the path if not utils.which("rar"): diff --git a/comictaggerlib/ctsettings/file.py b/comictaggerlib/ctsettings/file.py index 860fcc4..c712423 100644 --- a/comictaggerlib/ctsettings/file.py +++ b/comictaggerlib/ctsettings/file.py @@ -235,7 +235,7 @@ def autotag(parser: settngs.Manager) -> None: def parse_filter(config: settngs.Config[ct_ns]) -> settngs.Config[ct_ns]: new_filter = [] remove = [] - for x in config[0].Issue_Identifier_publisher_filter: + for x in config[0].Issue_Identifier__publisher_filter: x = x.strip() if x: # ignore empty arguments if x[-1] == "-": # this publisher needs to be removed. We remove after all publishers have been enumerated @@ -246,18 +246,18 @@ def parse_filter(config: settngs.Config[ct_ns]) -> settngs.Config[ct_ns]: for x in remove: # remove publishers if x in new_filter: new_filter.remove(x) - config[0].Issue_Identifier_publisher_filter = new_filter + config[0].Issue_Identifier__publisher_filter = new_filter return config def validate_file_settings(config: settngs.Config[ct_ns]) -> settngs.Config[ct_ns]: config = parse_filter(config) - if config[0].Filename_Parsing_protofolius_issue_number_scheme: - config[0].Filename_Parsing_allow_issue_start_with_letter = True + if config[0].Filename_Parsing__protofolius_issue_number_scheme: + config[0].Filename_Parsing__allow_issue_start_with_letter = True - config[0].File_Rename_replacements = Replacements( - [Replacement(x[0], x[1], x[2]) for x in config[0].File_Rename_replacements[0]], - [Replacement(x[0], x[1], x[2]) for x in config[0].File_Rename_replacements[1]], + config[0].File_Rename__replacements = Replacements( + [Replacement(x[0], x[1], x[2]) for x in config[0].File_Rename__replacements[0]], + [Replacement(x[0], x[1], x[2]) for x in config[0].File_Rename__replacements[1]], ) return config diff --git a/comictaggerlib/ctsettings/settngs_namespace.py b/comictaggerlib/ctsettings/settngs_namespace.py index 64e432c..f8cfab8 100644 --- a/comictaggerlib/ctsettings/settngs_namespace.py +++ b/comictaggerlib/ctsettings/settngs_namespace.py @@ -8,104 +8,104 @@ import comictaggerlib.defaults class settngs_namespace(settngs.TypedNS): - Commands_version: bool - Commands_print: bool - Commands_delete: bool - Commands_copy: int - Commands_save: bool - Commands_rename: bool - Commands_export_to_zip: bool - Commands_only_save_config: bool - Commands_list_plugins: bool + Commands__version: bool + Commands__print: bool + Commands__delete: bool + Commands__copy: int + Commands__save: bool + Commands__rename: bool + Commands__export_to_zip: bool + Commands__only_save_config: bool + Commands__list_plugins: bool - Runtime_Options_config: comictaggerlib.ctsettings.types.ComicTaggerPaths - Runtime_Options_verbose: int - Runtime_Options_abort_on_conflict: bool - Runtime_Options_delete_after_zip_export: bool - Runtime_Options_parse_filename: bool - Runtime_Options_issue_id: str - Runtime_Options_online: bool - Runtime_Options_metadata: comicapi.genericmetadata.GenericMetadata - Runtime_Options_interactive: bool - Runtime_Options_abort_on_low_confidence: bool - Runtime_Options_summary: bool - Runtime_Options_raw: bool - Runtime_Options_recursive: bool - Runtime_Options_split_words: bool - Runtime_Options_dryrun: bool - Runtime_Options_darkmode: bool - Runtime_Options_glob: bool - Runtime_Options_quiet: bool - Runtime_Options_type: list[int] - Runtime_Options_overwrite: bool - Runtime_Options_no_gui: bool - Runtime_Options_files: list[str] + Runtime_Options__config: comictaggerlib.ctsettings.types.ComicTaggerPaths + Runtime_Options__verbose: int + Runtime_Options__abort_on_conflict: bool + Runtime_Options__delete_after_zip_export: bool + Runtime_Options__parse_filename: bool + Runtime_Options__issue_id: str + Runtime_Options__online: bool + Runtime_Options__metadata: comicapi.genericmetadata.GenericMetadata + Runtime_Options__interactive: bool + Runtime_Options__abort_on_low_confidence: bool + Runtime_Options__summary: bool + Runtime_Options__raw: bool + Runtime_Options__recursive: bool + Runtime_Options__split_words: bool + Runtime_Options__dryrun: bool + Runtime_Options__darkmode: bool + Runtime_Options__glob: bool + Runtime_Options__quiet: bool + Runtime_Options__type: list[int] + Runtime_Options__overwrite: bool + Runtime_Options__no_gui: bool + Runtime_Options__files: list[str] - internal_install_id: str - internal_save_data_style: int - internal_load_data_style: int - internal_last_opened_folder: str - internal_window_width: int - internal_window_height: int - internal_window_x: int - internal_window_y: int - internal_form_width: int - internal_list_width: int - internal_sort_column: int - internal_sort_direction: int + internal__install_id: str + internal__save_data_style: int + internal__load_data_style: int + internal__last_opened_folder: str + internal__window_width: int + internal__window_height: int + internal__window_x: int + internal__window_y: int + internal__form_width: int + internal__list_width: int + internal__sort_column: int + internal__sort_direction: int - Issue_Identifier_series_match_identify_thresh: int - Issue_Identifier_border_crop_percent: int - Issue_Identifier_publisher_filter: list[str] - Issue_Identifier_series_match_search_thresh: int - Issue_Identifier_clear_metadata_on_import: bool - Issue_Identifier_auto_imprint: bool - Issue_Identifier_sort_series_by_year: bool - Issue_Identifier_exact_series_matches_first: bool - Issue_Identifier_always_use_publisher_filter: bool - Issue_Identifier_clear_form_before_populating: bool + Issue_Identifier__series_match_identify_thresh: int + Issue_Identifier__border_crop_percent: int + Issue_Identifier__publisher_filter: list[str] + Issue_Identifier__series_match_search_thresh: int + Issue_Identifier__clear_metadata_on_import: bool + Issue_Identifier__auto_imprint: bool + Issue_Identifier__sort_series_by_year: bool + Issue_Identifier__exact_series_matches_first: bool + Issue_Identifier__always_use_publisher_filter: bool + Issue_Identifier__clear_form_before_populating: bool - Filename_Parsing_complicated_parser: bool - Filename_Parsing_remove_c2c: bool - Filename_Parsing_remove_fcbd: bool - Filename_Parsing_remove_publisher: bool - Filename_Parsing_protofolius_issue_number_scheme: bool - Filename_Parsing_allow_issue_start_with_letter: bool + Filename_Parsing__complicated_parser: bool + Filename_Parsing__remove_c2c: bool + Filename_Parsing__remove_fcbd: bool + Filename_Parsing__remove_publisher: bool + Filename_Parsing__protofolius_issue_number_scheme: bool + Filename_Parsing__allow_issue_start_with_letter: bool - Sources_source: str - Sources_remove_html_tables: bool + Sources__source: str + Sources__remove_html_tables: bool - Comic_Book_Lover_assume_lone_credit_is_primary: bool - Comic_Book_Lover_copy_characters_to_tags: bool - Comic_Book_Lover_copy_teams_to_tags: bool - Comic_Book_Lover_copy_locations_to_tags: bool - Comic_Book_Lover_copy_storyarcs_to_tags: bool - Comic_Book_Lover_copy_notes_to_comments: bool - Comic_Book_Lover_copy_weblink_to_comments: bool - Comic_Book_Lover_apply_transform_on_import: bool - Comic_Book_Lover_apply_transform_on_bulk_operation: bool + Comic_Book_Lover__assume_lone_credit_is_primary: bool + Comic_Book_Lover__copy_characters_to_tags: bool + Comic_Book_Lover__copy_teams_to_tags: bool + Comic_Book_Lover__copy_locations_to_tags: bool + Comic_Book_Lover__copy_storyarcs_to_tags: bool + Comic_Book_Lover__copy_notes_to_comments: bool + Comic_Book_Lover__copy_weblink_to_comments: bool + Comic_Book_Lover__apply_transform_on_import: bool + Comic_Book_Lover__apply_transform_on_bulk_operation: bool - File_Rename_template: str - File_Rename_issue_number_padding: int - File_Rename_use_smart_string_cleanup: bool - File_Rename_set_extension_based_on_archive: bool - File_Rename_dir: str - File_Rename_move_to_dir: bool - File_Rename_strict: bool - File_Rename_replacements: comictaggerlib.defaults.Replacements + File_Rename__template: str + File_Rename__issue_number_padding: int + File_Rename__use_smart_string_cleanup: bool + File_Rename__set_extension_based_on_archive: bool + File_Rename__dir: str + File_Rename__move_to_dir: bool + File_Rename__strict: bool + File_Rename__replacements: comictaggerlib.defaults.Replacements - Auto_Tag_save_on_low_confidence: bool - Auto_Tag_dont_use_year_when_identifying: bool - Auto_Tag_assume_1_if_no_issue_num: bool - Auto_Tag_ignore_leading_numbers_in_filename: bool - Auto_Tag_remove_archive_after_successful_match: bool + Auto_Tag__save_on_low_confidence: bool + Auto_Tag__dont_use_year_when_identifying: bool + Auto_Tag__assume_1_if_no_issue_num: bool + Auto_Tag__ignore_leading_numbers_in_filename: bool + Auto_Tag__remove_archive_after_successful_match: bool - General_check_for_new_version: bool + General__check_for_new_version: bool - Dialog_Flags_show_disclaimer: bool - Dialog_Flags_dont_notify_about_this_version: str - Dialog_Flags_ask_about_usage_stats: bool + Dialog_Flags__show_disclaimer: bool + Dialog_Flags__dont_notify_about_this_version: str + Dialog_Flags__ask_about_usage_stats: bool - Source_comicvine_comicvine_key: str - Source_comicvine_comicvine_url: str - Source_comicvine_cv_use_series_start_as_volume: bool + Source_comicvine__comicvine_key: str + Source_comicvine__comicvine_url: str + Source_comicvine__cv_use_series_start_as_volume: bool diff --git a/comictaggerlib/gui.py b/comictaggerlib/gui.py index f4e0422..e8e0348 100644 --- a/comictaggerlib/gui.py +++ b/comictaggerlib/gui.py @@ -97,7 +97,7 @@ def open_tagger_window( ) -> None: os.environ["QtWidgets.QT_AUTO_SCREEN_SCALE_FACTOR"] = "1" args = [sys.argv[0]] - if config[0].Runtime_Options_darkmode: + if config[0].Runtime_Options__darkmode: args.extend(["-platform", "windows:darkmode=2"]) app = Application(args) if error is not None: @@ -106,7 +106,7 @@ def open_tagger_window( raise SystemExit(1) # needed to catch initial open file events (macOS) - app.openFileRequest.connect(lambda x: config[0].Runtime_Options_files.append(x.toLocalFile())) + app.openFileRequest.connect(lambda x: config[0].Runtime_Options__files.append(x.toLocalFile())) if platform.system() == "Darwin": # Set the MacOS dock icon @@ -134,7 +134,7 @@ def open_tagger_window( QtWidgets.QApplication.processEvents() try: - tagger_window = TaggerWindow(config[0].Runtime_Options_files, config, talkers) + tagger_window = TaggerWindow(config[0].Runtime_Options__files, config, talkers) tagger_window.setWindowIcon(QtGui.QIcon(str(graphics_path / "app.png"))) tagger_window.show() diff --git a/comictaggerlib/issueidentifier.py b/comictaggerlib/issueidentifier.py index 0f3339c..a2fe036 100644 --- a/comictaggerlib/issueidentifier.py +++ b/comictaggerlib/issueidentifier.py @@ -96,10 +96,10 @@ class IssueIdentifier: # used to eliminate series names that are too long based on our search # string - self.series_match_thresh = config.Issue_Identifier_series_match_identify_thresh + self.series_match_thresh = config.Issue_Identifier__series_match_identify_thresh # used to eliminate unlikely publishers - self.publisher_filter = [s.strip().casefold() for s in config.Issue_Identifier_publisher_filter] + self.publisher_filter = [s.strip().casefold() for s in config.Issue_Identifier__publisher_filter] self.additional_metadata = GenericMetadata() self.output_function: Callable[[str], None] = IssueIdentifier.default_write_output @@ -239,10 +239,10 @@ class IssueIdentifier: # try to get some metadata from filename md_from_filename = ca.metadata_from_filename( - self.config.Filename_Parsing_complicated_parser, - self.config.Filename_Parsing_remove_c2c, - self.config.Filename_Parsing_remove_fcbd, - self.config.Filename_Parsing_remove_publisher, + self.config.Filename_Parsing__complicated_parser, + self.config.Filename_Parsing__remove_c2c, + self.config.Filename_Parsing__remove_fcbd, + self.config.Filename_Parsing__remove_publisher, ) working_md = md_from_filename.copy() @@ -291,7 +291,7 @@ class IssueIdentifier: return Score(score=100, url="", hash=0) try: - url_image_data = ImageFetcher(self.config.Runtime_Options_config.user_cache_dir).fetch( + url_image_data = ImageFetcher(self.config.Runtime_Options__config.user_cache_dir).fetch( primary_img_url, blocking=True ) except ImageFetcherException as e: @@ -313,7 +313,7 @@ class IssueIdentifier: if use_remote_alternates: for alt_url in alt_urls: try: - alt_url_image_data = ImageFetcher(self.config.Runtime_Options_config.user_cache_dir).fetch( + alt_url_image_data = ImageFetcher(self.config.Runtime_Options__config.user_cache_dir).fetch( alt_url, blocking=True ) except ImageFetcherException as e: @@ -499,7 +499,7 @@ class IssueIdentifier: if narrow_cover_hash is not None: hash_list.append(narrow_cover_hash) - cropped_border = self.crop_border(cover_image_data, self.config.Issue_Identifier_border_crop_percent) + cropped_border = self.crop_border(cover_image_data, self.config.Issue_Identifier__border_crop_percent) if cropped_border is not None: hash_list.append(self.calculate_hash(cropped_border)) logger.info("Adding cropped cover to the hashlist") diff --git a/comictaggerlib/issueselectionwindow.py b/comictaggerlib/issueselectionwindow.py index 9000378..8818bee 100644 --- a/comictaggerlib/issueselectionwindow.py +++ b/comictaggerlib/issueselectionwindow.py @@ -54,7 +54,7 @@ class IssueSelectionWindow(QtWidgets.QDialog): self.coverWidget = CoverImageWidget( self.coverImageContainer, CoverImageWidget.AltCoverMode, - config.Runtime_Options_config.user_cache_dir, + config.Runtime_Options__config.user_cache_dir, talker, ) gridlayout = QtWidgets.QGridLayout(self.coverImageContainer) @@ -98,7 +98,7 @@ class IssueSelectionWindow(QtWidgets.QDialog): self.imageIssuesSourceWidget = CoverImageWidget( self.imageIssuesSourceLogo, CoverImageWidget.URLMode, - config.Runtime_Options_config.user_cache_dir, + config.Runtime_Options__config.user_cache_dir, talker, False, ) diff --git a/comictaggerlib/main.py b/comictaggerlib/main.py index 60e5e8e..976ad27 100644 --- a/comictaggerlib/main.py +++ b/comictaggerlib/main.py @@ -91,7 +91,7 @@ def configure_locale() -> None: def update_publishers(config: settngs.Config[ct_ns]) -> None: - json_file = config[0].Runtime_Options_config.user_config_dir / "publishers.json" + json_file = config[0].Runtime_Options__config.user_config_dir / "publishers.json" if json_file.exists(): try: comicapi.utils.update_publishers(json.loads(json_file.read_text("utf-8"))) @@ -154,7 +154,7 @@ class App: config_paths.user_config_dir / "settings.json", list(args) or None ) config = cast(settngs.Config[ct_ns], self.manager.get_namespace(cfg, file=True, cmdline=True)) - config[0].Runtime_Options_config = config_paths + config[0].Runtime_Options__config = config_paths config = ctsettings.validate_commandline_settings(config, self.manager) config = ctsettings.validate_file_settings(config) @@ -184,7 +184,7 @@ class App: if len(talkers) < 1: error = error = ( "Failed to load any talkers, please re-install and check the log located in '" - + str(self.config[0].Runtime_Options_config.user_log_dir) + + str(self.config[0].Runtime_Options__config.user_log_dir) + "' for more details", True, ) @@ -198,13 +198,13 @@ class App: comicapi.utils.load_publishers() update_publishers(self.config) - if self.config[0].Commands_list_plugins: + if self.config[0].Commands__list_plugins: self.list_plugins(list(talkers.values()), comicapi.comicarchive.archivers) return - if self.config[0].Commands_only_save_config: + if self.config[0].Commands__only_save_config: if self.config_load_success: - settings_path = self.config[0].Runtime_Options_config.user_config_dir / "settings.json" + settings_path = self.config[0].Runtime_Options__config.user_config_dir / "settings.json" if self.config_load_success: self.manager.save_file(self.config[0], settings_path) print("Key set") # noqa: T201 @@ -213,12 +213,12 @@ class App: if not self.config_load_success: error = ( "Failed to load settings, check the log located in '" - + str(self.config[0].Runtime_Options_config.user_log_dir) + + str(self.config[0].Runtime_Options__config.user_log_dir) + "' for more details", True, ) - if not self.config[0].Runtime_Options_no_gui: + if not self.config[0].Runtime_Options__no_gui: try: from comictaggerlib import gui @@ -226,7 +226,7 @@ class App: raise gui.import_error return gui.open_tagger_window(talkers, self.config, error) except ImportError: - self.config[0].Runtime_Options_no_gui = True + self.config[0].Runtime_Options__no_gui = True logger.warning("PyQt5 is not available. ComicTagger is limited to command-line mode.") # GUI mode is not available or CLI mode was requested diff --git a/comictaggerlib/matchselectionwindow.py b/comictaggerlib/matchselectionwindow.py index 1e6046a..cd64148 100644 --- a/comictaggerlib/matchselectionwindow.py +++ b/comictaggerlib/matchselectionwindow.py @@ -45,7 +45,7 @@ class MatchSelectionWindow(QtWidgets.QDialog): uic.loadUi(ui_path / "matchselectionwindow.ui", self) self.altCoverWidget = CoverImageWidget( - self.altCoverContainer, CoverImageWidget.AltCoverMode, config.Runtime_Options_config.user_cache_dir, talker + self.altCoverContainer, CoverImageWidget.AltCoverMode, config.Runtime_Options__config.user_cache_dir, talker ) gridlayout = QtWidgets.QGridLayout(self.altCoverContainer) gridlayout.addWidget(self.altCoverWidget) diff --git a/comictaggerlib/renamewindow.py b/comictaggerlib/renamewindow.py index aa4b408..28ef3df 100644 --- a/comictaggerlib/renamewindow.py +++ b/comictaggerlib/renamewindow.py @@ -62,32 +62,32 @@ class RenameWindow(QtWidgets.QDialog): self.rename_list: list[str] = [] self.btnSettings.clicked.connect(self.modify_settings) - platform = "universal" if self.config[0].File_Rename_strict else "auto" - self.renamer = FileRenamer(None, platform=platform, replacements=self.config[0].File_Rename_replacements) + platform = "universal" if self.config[0].File_Rename__strict else "auto" + self.renamer = FileRenamer(None, platform=platform, replacements=self.config[0].File_Rename__replacements) self.do_preview() def config_renamer(self, ca: ComicArchive, md: GenericMetadata | None = None) -> str: - self.renamer.set_template(self.config[0].File_Rename_template) - self.renamer.set_issue_zero_padding(self.config[0].File_Rename_issue_number_padding) - self.renamer.set_smart_cleanup(self.config[0].File_Rename_use_smart_string_cleanup) - self.renamer.replacements = self.config[0].File_Rename_replacements + self.renamer.set_template(self.config[0].File_Rename__template) + self.renamer.set_issue_zero_padding(self.config[0].File_Rename__issue_number_padding) + self.renamer.set_smart_cleanup(self.config[0].File_Rename__use_smart_string_cleanup) + self.renamer.replacements = self.config[0].File_Rename__replacements new_ext = ca.path.suffix # default - if self.config[0].File_Rename_set_extension_based_on_archive: + if self.config[0].File_Rename__set_extension_based_on_archive: new_ext = ca.extension() if md is None: md = ca.read_metadata(self.data_style) if md.is_empty: md = ca.metadata_from_filename( - self.config[0].Filename_Parsing_complicated_parser, - self.config[0].Filename_Parsing_remove_c2c, - self.config[0].Filename_Parsing_remove_fcbd, - self.config[0].Filename_Parsing_remove_publisher, + self.config[0].Filename_Parsing__complicated_parser, + self.config[0].Filename_Parsing__remove_c2c, + self.config[0].Filename_Parsing__remove_fcbd, + self.config[0].Filename_Parsing__remove_publisher, ) self.renamer.set_metadata(md) - self.renamer.move = self.config[0].File_Rename_move_to_dir + self.renamer.move = self.config[0].File_Rename__move_to_dir return new_ext def do_preview(self) -> None: @@ -100,7 +100,7 @@ class RenameWindow(QtWidgets.QDialog): try: new_name = self.renamer.determine_name(new_ext) except ValueError as e: - logger.exception("Invalid format string: %s", self.config[0].File_Rename_template) + logger.exception("Invalid format string: %s", self.config[0].File_Rename__template) QtWidgets.QMessageBox.critical( self, "Invalid format string!", @@ -114,7 +114,7 @@ class RenameWindow(QtWidgets.QDialog): return except Exception as e: logger.exception( - "Formatter failure: %s metadata: %s", self.config[0].File_Rename_template, self.renamer.metadata + "Formatter failure: %s metadata: %s", self.config[0].File_Rename__template, self.renamer.metadata ) QtWidgets.QMessageBox.critical( self, @@ -189,7 +189,7 @@ class RenameWindow(QtWidgets.QDialog): folder = get_rename_dir( comic[0], - self.config[0].File_Rename_dir if self.config[0].File_Rename_move_to_dir else None, + self.config[0].File_Rename__dir if self.config[0].File_Rename__move_to_dir else None, ) full_path = folder / comic[1] diff --git a/comictaggerlib/seriesselectionwindow.py b/comictaggerlib/seriesselectionwindow.py index 7d205df..df9908f 100644 --- a/comictaggerlib/seriesselectionwindow.py +++ b/comictaggerlib/seriesselectionwindow.py @@ -116,7 +116,7 @@ class SeriesSelectionWindow(QtWidgets.QDialog): uic.loadUi(ui_path / "seriesselectionwindow.ui", self) self.imageWidget = CoverImageWidget( - self.imageContainer, CoverImageWidget.URLMode, config.Runtime_Options_config.user_cache_dir, talker + self.imageContainer, CoverImageWidget.URLMode, config.Runtime_Options__config.user_cache_dir, talker ) gridlayout = QtWidgets.QGridLayout(self.imageContainer) gridlayout.addWidget(self.imageWidget) @@ -161,7 +161,7 @@ class SeriesSelectionWindow(QtWidgets.QDialog): self.progdialog: QtWidgets.QProgressDialog | None = None self.search_thread: SearchThread | None = None - self.use_filter = self.config.Issue_Identifier_always_use_publisher_filter + self.use_filter = self.config.Issue_Identifier__always_use_publisher_filter # Load to retrieve settings self.talker = talker @@ -172,7 +172,7 @@ class SeriesSelectionWindow(QtWidgets.QDialog): self.imageSourceWidget = CoverImageWidget( self.imageSourceLogo, CoverImageWidget.URLMode, - config.Runtime_Options_config.user_cache_dir, + config.Runtime_Options__config.user_cache_dir, talker, False, ) @@ -360,7 +360,7 @@ class SeriesSelectionWindow(QtWidgets.QDialog): self.series_name, refresh, self.literal, - self.config.Issue_Identifier_series_match_search_thresh, + self.config.Issue_Identifier__series_match_search_thresh, ) self.search_thread.searchComplete.connect(self.search_complete) self.search_thread.progressUpdate.connect(self.search_progress_update) @@ -413,7 +413,7 @@ class SeriesSelectionWindow(QtWidgets.QDialog): # filter the publishers if enabled set if self.use_filter: try: - publisher_filter = {s.strip().casefold() for s in self.config.Issue_Identifier_publisher_filter} + publisher_filter = {s.strip().casefold() for s in self.config.Issue_Identifier__publisher_filter} # use '' as publisher name if None self.series_list = dict( filter( @@ -429,7 +429,7 @@ class SeriesSelectionWindow(QtWidgets.QDialog): # compare as str in case extra chars ie. '1976?' # - missing (none) values being converted to 'None' - consistent with prior behaviour in v1.2.3 # sort by start_year if set - if self.config.Issue_Identifier_sort_series_by_year: + if self.config.Issue_Identifier__sort_series_by_year: try: self.series_list = dict( natsort.natsorted( @@ -449,7 +449,7 @@ class SeriesSelectionWindow(QtWidgets.QDialog): logger.exception("bad data error sorting results by count_of_issues") # move sanitized matches to the front - if self.config.Issue_Identifier_exact_series_matches_first: + if self.config.Issue_Identifier__exact_series_matches_first: try: sanitized = utils.sanitize_title(self.series_name, False).casefold() sanitized_no_articles = utils.sanitize_title(self.series_name, True).casefold() diff --git a/comictaggerlib/settingswindow.py b/comictaggerlib/settingswindow.py index 264775f..a2dd42e 100644 --- a/comictaggerlib/settingswindow.py +++ b/comictaggerlib/settingswindow.py @@ -371,48 +371,50 @@ class SettingsWindow(QtWidgets.QDialog): self.leRarExePath.setText(getattr(self.config[0], self.config[1]["archiver"].v["rar"].internal_name)) else: self.leRarExePath.setEnabled(False) - self.sbNameMatchIdentifyThresh.setValue(self.config[0].Issue_Identifier_series_match_identify_thresh) - self.sbNameMatchSearchThresh.setValue(self.config[0].Issue_Identifier_series_match_search_thresh) - self.tePublisherFilter.setPlainText("\n".join(self.config[0].Issue_Identifier_publisher_filter)) + self.sbNameMatchIdentifyThresh.setValue(self.config[0].Issue_Identifier__series_match_identify_thresh) + self.sbNameMatchSearchThresh.setValue(self.config[0].Issue_Identifier__series_match_search_thresh) + self.tePublisherFilter.setPlainText("\n".join(self.config[0].Issue_Identifier__publisher_filter)) - self.cbxCheckForNewVersion.setChecked(self.config[0].General_check_for_new_version) + self.cbxCheckForNewVersion.setChecked(self.config[0].General__check_for_new_version) - self.cbxComplicatedParser.setChecked(self.config[0].Filename_Parsing_complicated_parser) - self.cbxRemoveC2C.setChecked(self.config[0].Filename_Parsing_remove_c2c) - self.cbxRemoveFCBD.setChecked(self.config[0].Filename_Parsing_remove_fcbd) - self.cbxRemovePublisher.setChecked(self.config[0].Filename_Parsing_remove_publisher) - self.cbxProtofoliusIssueNumberScheme.setChecked(self.config[0].Filename_Parsing_protofolius_issue_number_scheme) - self.cbxAllowIssueStartWithLetter.setChecked(self.config[0].Filename_Parsing_allow_issue_start_with_letter) + self.cbxComplicatedParser.setChecked(self.config[0].Filename_Parsing__complicated_parser) + self.cbxRemoveC2C.setChecked(self.config[0].Filename_Parsing__remove_c2c) + self.cbxRemoveFCBD.setChecked(self.config[0].Filename_Parsing__remove_fcbd) + self.cbxRemovePublisher.setChecked(self.config[0].Filename_Parsing__remove_publisher) + self.cbxProtofoliusIssueNumberScheme.setChecked( + self.config[0].Filename_Parsing__protofolius_issue_number_scheme + ) + self.cbxAllowIssueStartWithLetter.setChecked(self.config[0].Filename_Parsing__allow_issue_start_with_letter) self.switch_parser() - self.cbxClearFormBeforePopulating.setChecked(self.config[0].Issue_Identifier_clear_form_before_populating) - self.cbxUseFilter.setChecked(self.config[0].Issue_Identifier_always_use_publisher_filter) - self.cbxSortByYear.setChecked(self.config[0].Issue_Identifier_sort_series_by_year) - self.cbxExactMatches.setChecked(self.config[0].Issue_Identifier_exact_series_matches_first) + self.cbxClearFormBeforePopulating.setChecked(self.config[0].Issue_Identifier__clear_form_before_populating) + self.cbxUseFilter.setChecked(self.config[0].Issue_Identifier__always_use_publisher_filter) + self.cbxSortByYear.setChecked(self.config[0].Issue_Identifier__sort_series_by_year) + self.cbxExactMatches.setChecked(self.config[0].Issue_Identifier__exact_series_matches_first) - self.cbxAssumeLoneCreditIsPrimary.setChecked(self.config[0].Comic_Book_Lover_assume_lone_credit_is_primary) - self.cbxCopyCharactersToTags.setChecked(self.config[0].Comic_Book_Lover_copy_characters_to_tags) - self.cbxCopyTeamsToTags.setChecked(self.config[0].Comic_Book_Lover_copy_teams_to_tags) - self.cbxCopyLocationsToTags.setChecked(self.config[0].Comic_Book_Lover_copy_locations_to_tags) - self.cbxCopyStoryArcsToTags.setChecked(self.config[0].Comic_Book_Lover_copy_storyarcs_to_tags) - self.cbxCopyNotesToComments.setChecked(self.config[0].Comic_Book_Lover_copy_notes_to_comments) - self.cbxCopyWebLinkToComments.setChecked(self.config[0].Comic_Book_Lover_copy_weblink_to_comments) - self.cbxApplyCBLTransformOnCVIMport.setChecked(self.config[0].Comic_Book_Lover_apply_transform_on_import) + self.cbxAssumeLoneCreditIsPrimary.setChecked(self.config[0].Comic_Book_Lover__assume_lone_credit_is_primary) + self.cbxCopyCharactersToTags.setChecked(self.config[0].Comic_Book_Lover__copy_characters_to_tags) + self.cbxCopyTeamsToTags.setChecked(self.config[0].Comic_Book_Lover__copy_teams_to_tags) + self.cbxCopyLocationsToTags.setChecked(self.config[0].Comic_Book_Lover__copy_locations_to_tags) + self.cbxCopyStoryArcsToTags.setChecked(self.config[0].Comic_Book_Lover__copy_storyarcs_to_tags) + self.cbxCopyNotesToComments.setChecked(self.config[0].Comic_Book_Lover__copy_notes_to_comments) + self.cbxCopyWebLinkToComments.setChecked(self.config[0].Comic_Book_Lover__copy_weblink_to_comments) + self.cbxApplyCBLTransformOnCVIMport.setChecked(self.config[0].Comic_Book_Lover__apply_transform_on_import) self.cbxApplyCBLTransformOnBatchOperation.setChecked( - self.config[0].Comic_Book_Lover_apply_transform_on_bulk_operation + self.config[0].Comic_Book_Lover__apply_transform_on_bulk_operation ) - self.leRenameTemplate.setText(self.config[0].File_Rename_template) - self.leIssueNumPadding.setText(str(self.config[0].File_Rename_issue_number_padding)) - self.cbxSmartCleanup.setChecked(self.config[0].File_Rename_use_smart_string_cleanup) - self.cbxChangeExtension.setChecked(self.config[0].File_Rename_set_extension_based_on_archive) - self.cbxMoveFiles.setChecked(self.config[0].File_Rename_move_to_dir) - self.leDirectory.setText(self.config[0].File_Rename_dir) - self.cbxRenameStrict.setChecked(self.config[0].File_Rename_strict) + self.leRenameTemplate.setText(self.config[0].File_Rename__template) + self.leIssueNumPadding.setText(str(self.config[0].File_Rename__issue_number_padding)) + self.cbxSmartCleanup.setChecked(self.config[0].File_Rename__use_smart_string_cleanup) + self.cbxChangeExtension.setChecked(self.config[0].File_Rename__set_extension_based_on_archive) + self.cbxMoveFiles.setChecked(self.config[0].File_Rename__move_to_dir) + self.leDirectory.setText(self.config[0].File_Rename__dir) + self.cbxRenameStrict.setChecked(self.config[0].File_Rename__strict) for table, replacments in zip( - (self.twLiteralReplacements, self.twValueReplacements), self.config[0].File_Rename_replacements + (self.twLiteralReplacements, self.twValueReplacements), self.config[0].File_Rename__replacements ): table.clearContents() for i in reversed(range(table.rowCount())): @@ -452,30 +454,30 @@ class SettingsWindow(QtWidgets.QDialog): self.rename_test() if self.rename_error is not None: if isinstance(self.rename_error, ValueError): - logger.exception("Invalid format string: %s", self.config[0].File_Rename_template) + logger.exception("Invalid format string: %s", self.config[0].File_Rename__template) QtWidgets.QMessageBox.critical( self, "Invalid format string!", "Your rename template is invalid!" - f"

{self.rename_error}

" - "Please consult the template help in the " - "settings and the documentation on the format at " - "" - "https://docs.python.org/3/library/string.html#format-string-syntax", + + f"

{self.rename_error}

" + + "Please consult the template help in the " + + "settings and the documentation on the format at " + + "" + + "https://docs.python.org/3/library/string.html#format-string-syntax", ) return else: logger.exception( - "Formatter failure: %s metadata: %s", self.config[0].File_Rename_template, self.renamer.metadata + "Formatter failure: %s metadata: %s", self.config[0].File_Rename__template, self.renamer.metadata ) QtWidgets.QMessageBox.critical( self, "The formatter had an issue!", "The formatter has experienced an unexpected error!" - f"

{type(self.rename_error).__name__}: {self.rename_error}

" - "Please open an issue at " - "" - "https://github.com/comictagger/comictagger", + + f"

{type(self.rename_error).__name__}: {self.rename_error}

" + + "Please open an issue at " + + "" + + "https://github.com/comictagger/comictagger", ) # Copy values from form to settings and save @@ -489,54 +491,54 @@ class SettingsWindow(QtWidgets.QDialog): if not str(self.leIssueNumPadding.text()).isdigit(): self.leIssueNumPadding.setText("0") - self.config[0].General_check_for_new_version = self.cbxCheckForNewVersion.isChecked() + self.config[0].General__check_for_new_version = self.cbxCheckForNewVersion.isChecked() - self.config[0].Issue_Identifier_series_match_identify_thresh = self.sbNameMatchIdentifyThresh.value() - self.config[0].Issue_Identifier_series_match_search_thresh = self.sbNameMatchSearchThresh.value() - self.config[0].Issue_Identifier_publisher_filter = utils.split(self.tePublisherFilter.toPlainText(), "\n") + self.config[0].Issue_Identifier__series_match_identify_thresh = self.sbNameMatchIdentifyThresh.value() + self.config[0].Issue_Identifier__series_match_search_thresh = self.sbNameMatchSearchThresh.value() + self.config[0].Issue_Identifier__publisher_filter = utils.split(self.tePublisherFilter.toPlainText(), "\n") - self.config[0].Filename_Parsing_complicated_parser = self.cbxComplicatedParser.isChecked() - self.config[0].Filename_Parsing_remove_c2c = self.cbxRemoveC2C.isChecked() - self.config[0].Filename_Parsing_remove_fcbd = self.cbxRemoveFCBD.isChecked() - self.config[0].Filename_Parsing_remove_publisher = self.cbxRemovePublisher.isChecked() - self.config[0].Filename_Parsing_allow_issue_start_with_letter = self.cbxAllowIssueStartWithLetter.isChecked() - self.config.values.Filename_Parsing_protofolius_issue_number_scheme = ( + self.config[0].Filename_Parsing__complicated_parser = self.cbxComplicatedParser.isChecked() + self.config[0].Filename_Parsing__remove_c2c = self.cbxRemoveC2C.isChecked() + self.config[0].Filename_Parsing__remove_fcbd = self.cbxRemoveFCBD.isChecked() + self.config[0].Filename_Parsing__remove_publisher = self.cbxRemovePublisher.isChecked() + self.config[0].Filename_Parsing__allow_issue_start_with_letter = self.cbxAllowIssueStartWithLetter.isChecked() + self.config.values.Filename_Parsing__protofolius_issue_number_scheme = ( self.cbxProtofoliusIssueNumberScheme.isChecked() ) - self.config[0].Issue_Identifier_clear_form_before_populating = self.cbxClearFormBeforePopulating.isChecked() - self.config[0].Issue_Identifier_always_use_publisher_filter = self.cbxUseFilter.isChecked() - self.config[0].Issue_Identifier_sort_series_by_year = self.cbxSortByYear.isChecked() - self.config[0].Issue_Identifier_exact_series_matches_first = self.cbxExactMatches.isChecked() + self.config[0].Issue_Identifier__clear_form_before_populating = self.cbxClearFormBeforePopulating.isChecked() + self.config[0].Issue_Identifier__always_use_publisher_filter = self.cbxUseFilter.isChecked() + self.config[0].Issue_Identifier__sort_series_by_year = self.cbxSortByYear.isChecked() + self.config[0].Issue_Identifier__exact_series_matches_first = self.cbxExactMatches.isChecked() - self.config[0].Comic_Book_Lover_assume_lone_credit_is_primary = self.cbxAssumeLoneCreditIsPrimary.isChecked() - self.config[0].Comic_Book_Lover_copy_characters_to_tags = self.cbxCopyCharactersToTags.isChecked() - self.config[0].Comic_Book_Lover_copy_teams_to_tags = self.cbxCopyTeamsToTags.isChecked() - self.config[0].Comic_Book_Lover_copy_locations_to_tags = self.cbxCopyLocationsToTags.isChecked() - self.config[0].Comic_Book_Lover_copy_storyarcs_to_tags = self.cbxCopyStoryArcsToTags.isChecked() - self.config[0].Comic_Book_Lover_copy_notes_to_comments = self.cbxCopyNotesToComments.isChecked() - self.config[0].Comic_Book_Lover_copy_weblink_to_comments = self.cbxCopyWebLinkToComments.isChecked() - self.config[0].Comic_Book_Lover_apply_transform_on_import = self.cbxApplyCBLTransformOnCVIMport.isChecked() - self.config.values.Comic_Book_Lover_apply_transform_on_bulk_operation = ( + self.config[0].Comic_Book_Lover__assume_lone_credit_is_primary = self.cbxAssumeLoneCreditIsPrimary.isChecked() + self.config[0].Comic_Book_Lover__copy_characters_to_tags = self.cbxCopyCharactersToTags.isChecked() + self.config[0].Comic_Book_Lover__copy_teams_to_tags = self.cbxCopyTeamsToTags.isChecked() + self.config[0].Comic_Book_Lover__copy_locations_to_tags = self.cbxCopyLocationsToTags.isChecked() + self.config[0].Comic_Book_Lover__copy_storyarcs_to_tags = self.cbxCopyStoryArcsToTags.isChecked() + self.config[0].Comic_Book_Lover__copy_notes_to_comments = self.cbxCopyNotesToComments.isChecked() + self.config[0].Comic_Book_Lover__copy_weblink_to_comments = self.cbxCopyWebLinkToComments.isChecked() + self.config[0].Comic_Book_Lover__apply_transform_on_import = self.cbxApplyCBLTransformOnCVIMport.isChecked() + self.config.values.Comic_Book_Lover__apply_transform_on_bulk_operation = ( self.cbxApplyCBLTransformOnBatchOperation.isChecked() ) - self.config[0].File_Rename_template = str(self.leRenameTemplate.text()) - self.config[0].File_Rename_issue_number_padding = int(self.leIssueNumPadding.text()) - self.config[0].File_Rename_use_smart_string_cleanup = self.cbxSmartCleanup.isChecked() - self.config[0].File_Rename_set_extension_based_on_archive = self.cbxChangeExtension.isChecked() - self.config[0].File_Rename_move_to_dir = self.cbxMoveFiles.isChecked() - self.config[0].File_Rename_dir = self.leDirectory.text() + self.config[0].File_Rename__template = str(self.leRenameTemplate.text()) + self.config[0].File_Rename__issue_number_padding = int(self.leIssueNumPadding.text()) + self.config[0].File_Rename__use_smart_string_cleanup = self.cbxSmartCleanup.isChecked() + self.config[0].File_Rename__set_extension_based_on_archive = self.cbxChangeExtension.isChecked() + self.config[0].File_Rename__move_to_dir = self.cbxMoveFiles.isChecked() + self.config[0].File_Rename__dir = self.leDirectory.text() - self.config[0].File_Rename_strict = self.cbxRenameStrict.isChecked() - self.config[0].File_Rename_replacements = self.get_replacements() + self.config[0].File_Rename__strict = self.cbxRenameStrict.isChecked() + self.config[0].File_Rename__replacements = self.get_replacements() # Read settings from talker tabs self.config = comictaggerlib.ui.talkeruigenerator.form_settings_to_config(self.sources, self.config) self.update_talkers_config() - settngs.save_file(self.config, self.config[0].Runtime_Options_config.user_config_dir / "settings.json") + settngs.save_file(self.config, self.config[0].Runtime_Options__config.user_config_dir / "settings.json") self.parent().config = self.config QtWidgets.QDialog.accept(self) @@ -549,8 +551,8 @@ class SettingsWindow(QtWidgets.QDialog): self.select_file(self.leRarExePath, "RAR") def clear_cache(self) -> None: - ImageFetcher(self.config[0].Runtime_Options_config.user_cache_dir).clear_cache() - ComicCacher(self.config[0].Runtime_Options_config.user_cache_dir, version).clear_cache() + ImageFetcher(self.config[0].Runtime_Options__config.user_cache_dir).clear_cache() + ComicCacher(self.config[0].Runtime_Options__config.user_cache_dir, version).clear_cache() QtWidgets.QMessageBox.information(self, self.name, "Cache has been cleared.") def reset_settings(self) -> None: diff --git a/comictaggerlib/taggerwindow.py b/comictaggerlib/taggerwindow.py index 4cc3fb0..5dbcd25 100644 --- a/comictaggerlib/taggerwindow.py +++ b/comictaggerlib/taggerwindow.py @@ -93,11 +93,11 @@ class TaggerWindow(QtWidgets.QMainWindow): # prevent multiple instances socket = QtNetwork.QLocalSocket(self) - socket.connectToServer(config[0].internal_install_id) + socket.connectToServer(config[0].internal__install_id) alive = socket.waitForConnected(3000) if alive: logger.setLevel(logging.INFO) - logger.info("Another application with key [%s] is already running", config[0].internal_install_id) + logger.info("Another application with key [%s] is already running", config[0].internal__install_id) # send file list to other instance if file_list: socket.write(pickle.dumps(file_list)) @@ -109,15 +109,15 @@ class TaggerWindow(QtWidgets.QMainWindow): # listen on a socket to prevent multiple instances self.socketServer = QtNetwork.QLocalServer(self) self.socketServer.newConnection.connect(self.on_incoming_socket_connection) - ok = self.socketServer.listen(config[0].internal_install_id) + ok = self.socketServer.listen(config[0].internal__install_id) if not ok: if self.socketServer.serverError() == QtNetwork.QAbstractSocket.SocketError.AddressInUseError: - self.socketServer.removeServer(config[0].internal_install_id) - ok = self.socketServer.listen(config[0].internal_install_id) + self.socketServer.removeServer(config[0].internal__install_id) + ok = self.socketServer.listen(config[0].internal__install_id) if not ok: logger.error( "Cannot start local socket with key [%s]. Reason: %s", - config[0].internal_install_id, + config[0].internal__install_id, self.socketServer.errorString(), ) sys.exit() @@ -138,7 +138,7 @@ class TaggerWindow(QtWidgets.QMainWindow): self.fileSelectionList.selectionChanged.connect(self.file_list_selection_changed) self.fileSelectionList.listCleared.connect(self.file_list_cleared) self.fileSelectionList.set_sorting( - self.config[0].internal_sort_column, QtCore.Qt.SortOrder(self.config[0].internal_sort_direction) + self.config[0].internal__sort_column, QtCore.Qt.SortOrder(self.config[0].internal__sort_direction) ) # we can't specify relative font sizes in the UI designer, so @@ -156,13 +156,13 @@ class TaggerWindow(QtWidgets.QMainWindow): self.setWindowIcon(QtGui.QIcon(str(graphics_path / "app.png"))) - if config[0].Runtime_Options_type and isinstance(config[0].Runtime_Options_type[0], int): + if config[0].Runtime_Options__type and isinstance(config[0].Runtime_Options__type[0], int): # respect the command line option tag type - config[0].internal_save_data_style = config[0].Runtime_Options_type[0] - config[0].internal_load_data_style = config[0].Runtime_Options_type[0] + config[0].internal__save_data_style = config[0].Runtime_Options__type[0] + config[0].internal__load_data_style = config[0].Runtime_Options__type[0] - self.save_data_style = config[0].internal_save_data_style - self.load_data_style = config[0].internal_load_data_style + self.save_data_style = config[0].internal__save_data_style + self.load_data_style = config[0].internal__load_data_style self.setAcceptDrops(True) self.config_menus() @@ -228,8 +228,8 @@ class TaggerWindow(QtWidgets.QMainWindow): self.show() self.set_app_position() - if self.config[0].internal_form_width != -1: - self.splitter.setSizes([self.config[0].internal_form_width, self.config[0].internal_list_width]) + if self.config[0].internal__form_width != -1: + self.splitter.setSizes([self.config[0].internal__form_width, self.config[0].internal__list_width]) self.raise_() QtCore.QCoreApplication.processEvents() self.resizeEvent(None) @@ -246,7 +246,7 @@ class TaggerWindow(QtWidgets.QMainWindow): if len(file_list) != 0: self.fileSelectionList.add_path_list(file_list) - if self.config[0].Dialog_Flags_show_disclaimer: + if self.config[0].Dialog_Flags__show_disclaimer: checked = OptionalMessageDialog.msg( self, "Welcome!", @@ -265,15 +265,15 @@ class TaggerWindow(QtWidgets.QMainWindow): Have fun! """, ) - self.config[0].Dialog_Flags_show_disclaimer = not checked + self.config[0].Dialog_Flags__show_disclaimer = not checked - if self.config[0].General_check_for_new_version: + if self.config[0].General__check_for_new_version: self.check_latest_version_online() def current_talker(self) -> ComicTalker: - if self.config[0].Sources_source in self.talkers: - return self.talkers[self.config[0].Sources_source] - logger.error("Could not find the '%s' talker", self.config[0].Sources_source) + if self.config[0].Sources__source in self.talkers: + return self.talkers[self.config[0].Sources__source] + logger.error("Could not find the '%s' talker", self.config[0].Sources__source) raise SystemExit(2) def open_file_event(self, url: QtCore.QUrl) -> None: @@ -286,7 +286,7 @@ class TaggerWindow(QtWidgets.QMainWindow): def setup_logger(self) -> ApplicationLogWindow: try: - current_logs = (self.config[0].Runtime_Options_config.user_log_dir / "ComicTagger.log").read_text("utf-8") + current_logs = (self.config[0].Runtime_Options__config.user_log_dir / "ComicTagger.log").read_text("utf-8") except Exception: current_logs = "" root_logger = logging.getLogger() @@ -618,10 +618,10 @@ class TaggerWindow(QtWidgets.QMainWindow): def actual_load_current_archive(self) -> None: if self.metadata.is_empty and self.comic_archive is not None: self.metadata = self.comic_archive.metadata_from_filename( - self.config[0].Filename_Parsing_complicated_parser, - self.config[0].Filename_Parsing_remove_c2c, - self.config[0].Filename_Parsing_remove_fcbd, - self.config[0].Filename_Parsing_remove_publisher, + self.config[0].Filename_Parsing__complicated_parser, + self.config[0].Filename_Parsing__remove_c2c, + self.config[0].Filename_Parsing__remove_fcbd, + self.config[0].Filename_Parsing__remove_publisher, ) if len(self.metadata.pages) == 0 and self.comic_archive is not None: self.metadata.set_default_page_list(self.comic_archive.get_number_of_pages()) @@ -967,10 +967,10 @@ class TaggerWindow(QtWidgets.QMainWindow): # copy the form onto metadata object self.form_to_metadata() new_metadata = self.comic_archive.metadata_from_filename( - self.config[0].Filename_Parsing_complicated_parser, - self.config[0].Filename_Parsing_remove_c2c, - self.config[0].Filename_Parsing_remove_fcbd, - self.config[0].Filename_Parsing_remove_publisher, + self.config[0].Filename_Parsing__complicated_parser, + self.config[0].Filename_Parsing__remove_c2c, + self.config[0].Filename_Parsing__remove_fcbd, + self.config[0].Filename_Parsing__remove_publisher, split_words, ) if new_metadata is not None: @@ -1006,8 +1006,8 @@ class TaggerWindow(QtWidgets.QMainWindow): dialog.setNameFilters(filters) dialog.setFileMode(QtWidgets.QFileDialog.FileMode.ExistingFiles) - if self.config[0].internal_last_opened_folder is not None: - dialog.setDirectory(self.config[0].internal_last_opened_folder) + if self.config[0].internal__last_opened_folder is not None: + dialog.setDirectory(self.config[0].internal__last_opened_folder) return dialog def auto_identify_search(self) -> None: @@ -1079,10 +1079,10 @@ class TaggerWindow(QtWidgets.QMainWindow): else: QtWidgets.QApplication.restoreOverrideCursor() if new_metadata is not None: - if self.config[0].Comic_Book_Lover_apply_transform_on_import: + if self.config[0].Comic_Book_Lover__apply_transform_on_import: new_metadata = CBLTransformer(new_metadata, self.config[0]).apply() - if self.config[0].Issue_Identifier_clear_form_before_populating: + if self.config[0].Issue_Identifier__clear_form_before_populating: self.clear_form() notes = ( @@ -1093,7 +1093,7 @@ class TaggerWindow(QtWidgets.QMainWindow): new_metadata.replace( notes=utils.combine_notes(self.metadata.notes, notes, "Tagged with ComicTagger"), description=cleanup_html( - new_metadata.description, self.config[0].Sources_remove_html_tables + new_metadata.description, self.config[0].Sources__remove_html_tables ), ) ) @@ -1140,7 +1140,7 @@ class TaggerWindow(QtWidgets.QMainWindow): "Change Tag Read Style", "If you change read tag style now, data in the form will be lost. Are you sure?" ): self.load_data_style = self.cbLoadDataStyle.itemData(s) - self.config[0].internal_load_data_style = self.load_data_style + self.config[0].internal__load_data_style = self.load_data_style self.update_menus() if self.comic_archive is not None: self.load_archive(self.comic_archive) @@ -1151,12 +1151,12 @@ class TaggerWindow(QtWidgets.QMainWindow): def set_save_data_style(self, s: int) -> None: self.save_data_style = self.cbSaveDataStyle.itemData(s) - self.config[0].internal_save_data_style = self.save_data_style + self.config[0].internal__save_data_style = self.save_data_style self.update_style_tweaks() self.update_menus() def set_source(self, s: int) -> None: - self.config[0].Sources_source = self.cbx_sources.itemData(s) + self.config[0].Sources__source = self.cbx_sources.itemData(s) def update_credit_colors(self) -> None: # !!!ATB qt5 porting TODO @@ -1378,16 +1378,16 @@ class TaggerWindow(QtWidgets.QMainWindow): self.adjust_source_combo() def set_app_position(self) -> None: - if self.config[0].internal_window_width != 0: - self.move(self.config[0].internal_window_x, self.config[0].internal_window_y) - self.resize(self.config[0].internal_window_width, self.config[0].internal_window_height) + if self.config[0].internal__window_width != 0: + self.move(self.config[0].internal__window_x, self.config[0].internal__window_y) + self.resize(self.config[0].internal__window_width, self.config[0].internal__window_height) else: screen = QtGui.QGuiApplication.primaryScreen().geometry() size = self.frameGeometry() self.move(int((screen.width() - size.width()) / 2), int((screen.height() - size.height()) / 2)) def adjust_source_combo(self) -> None: - self.cbx_sources.setCurrentIndex(self.cbx_sources.findData(self.config[0].Sources_source)) + self.cbx_sources.setCurrentIndex(self.cbx_sources.findData(self.config[0].Sources__source)) def adjust_load_style_combo(self) -> None: # select the current style @@ -1649,7 +1649,7 @@ class TaggerWindow(QtWidgets.QMainWindow): if ( dest_style == MetaDataStyle.CBI - and self.config[0].Comic_Book_Lover_apply_transform_on_bulk_operation + and self.config[0].Comic_Book_Lover__apply_transform_on_bulk_operation ): md = CBLTransformer(md, self.config[0]).apply() @@ -1688,7 +1688,7 @@ class TaggerWindow(QtWidgets.QMainWindow): logger.exception("Save aborted.") if not ct_md.is_empty: - if self.config[0].Comic_Book_Lover_apply_transform_on_import: + if self.config[0].Comic_Book_Lover__apply_transform_on_import: ct_md = CBLTransformer(ct_md, self.config[0]).apply() QtWidgets.QApplication.restoreOverrideCursor() @@ -1718,10 +1718,10 @@ class TaggerWindow(QtWidgets.QMainWindow): logger.error("Failed to load metadata for %s: %s", ca.path, e) if md.is_empty: md = ca.metadata_from_filename( - self.config[0].Filename_Parsing_complicated_parser, - self.config[0].Filename_Parsing_remove_c2c, - self.config[0].Filename_Parsing_remove_fcbd, - self.config[0].Filename_Parsing_remove_publisher, + self.config[0].Filename_Parsing__complicated_parser, + self.config[0].Filename_Parsing__remove_c2c, + self.config[0].Filename_Parsing__remove_fcbd, + self.config[0].Filename_Parsing__remove_publisher, dlg.split_words, ) if dlg.ignore_leading_digits_in_filename and md.series is not None: @@ -1807,7 +1807,7 @@ class TaggerWindow(QtWidgets.QMainWindow): ) md.overlay(ct_md.replace(notes=utils.combine_notes(md.notes, notes, "Tagged with ComicTagger"))) - if self.config[0].Issue_Identifier_auto_imprint: + if self.config[0].Issue_Identifier__auto_imprint: md.fix_publisher() if not ca.write_metadata(md, self.save_data_style): @@ -1984,17 +1984,17 @@ class TaggerWindow(QtWidgets.QMainWindow): f"Exit {self.appName}", "If you quit now, data in the form will be lost. Are you sure?" ): appsize = self.size() - self.config[0].internal_window_width = appsize.width() - self.config[0].internal_window_height = appsize.height() - self.config[0].internal_window_x = self.x() - self.config[0].internal_window_y = self.y() - self.config[0].internal_form_width = self.splitter.sizes()[0] - self.config[0].internal_list_width = self.splitter.sizes()[1] + self.config[0].internal__window_width = appsize.width() + self.config[0].internal__window_height = appsize.height() + self.config[0].internal__window_x = self.x() + self.config[0].internal__window_y = self.y() + self.config[0].internal__form_width = self.splitter.sizes()[0] + self.config[0].internal__list_width = self.splitter.sizes()[1] ( - self.config[0].internal_sort_column, - self.config[0].internal_sort_direction, + self.config[0].internal__sort_column, + self.config[0].internal__sort_direction, ) = self.fileSelectionList.get_sorting() - settngs.save_file(self.config, self.config[0].Runtime_Options_config.user_config_dir / "settings.json") + settngs.save_file(self.config, self.config[0].Runtime_Options__config.user_config_dir / "settings.json") event.accept() else: @@ -2087,7 +2087,7 @@ class TaggerWindow(QtWidgets.QMainWindow): QtCore.QTimer.singleShot(1, self.fileSelectionList.revert_selection) return - self.config[0].internal_last_opened_folder = os.path.abspath(os.path.split(comic_archive.path)[0]) + self.config[0].internal__last_opened_folder = os.path.abspath(os.path.split(comic_archive.path)[0]) self.comic_archive = comic_archive try: self.metadata = self.comic_archive.read_metadata(self.load_data_style) @@ -2118,10 +2118,10 @@ class TaggerWindow(QtWidgets.QMainWindow): def check_latest_version_online(self) -> None: version_checker = VersionChecker() - self.version_check_complete(version_checker.get_latest_version(self.config[0].internal_install_id)) + self.version_check_complete(version_checker.get_latest_version(self.config[0].internal__install_id)) def version_check_complete(self, new_version: tuple[str, str]) -> None: - if new_version[0] not in (self.version, self.config[0].Dialog_Flags_dont_notify_about_this_version): + if new_version[0] not in (self.version, self.config[0].Dialog_Flags__dont_notify_about_this_version): website = "https://github.com/comictagger/comictagger" checked = OptionalMessageDialog.msg( self, @@ -2132,7 +2132,7 @@ class TaggerWindow(QtWidgets.QMainWindow): "Don't tell me about this version again", ) if checked: - self.config[0].Dialog_Flags_dont_notify_about_this_version = new_version[0] + self.config[0].Dialog_Flags__dont_notify_about_this_version = new_version[0] def on_incoming_socket_connection(self) -> None: # Accept connection from other instance. diff --git a/comictaggerlib/ui/talkeruigenerator.py b/comictaggerlib/ui/talkeruigenerator.py index dbd9bee..7326bd5 100644 --- a/comictaggerlib/ui/talkeruigenerator.py +++ b/comictaggerlib/ui/talkeruigenerator.py @@ -204,7 +204,7 @@ def generate_talker_info(talker: ComicTalker, config: settngs.Config[ct_ns], lay logo = CoverImageWidget( talker_info_layout.parentWidget(), CoverImageWidget.URLMode, - config.values.Runtime_Options_config.user_cache_dir, + config.values.Runtime_Options__config.user_cache_dir, talker, False, ) @@ -248,7 +248,7 @@ def generate_combobox(option: settngs.Setting, layout: QtWidgets.QGridLayout) -> def settings_to_talker_form(sources: Sources, config: settngs.Config[ct_ns]) -> None: # Set the active talker via id in sources combo box - sources[0].setCurrentIndex(sources[0].findData(config[0].Sources_source)) + sources[0].setCurrentIndex(sources[0].findData(config[0].Sources__source)) # Iterate over the tabs, the talker is included in the tab so no extra lookup is needed for talker, tab in sources.tabs: @@ -322,7 +322,7 @@ def get_config_from_tab(tab: TalkerTab, definitions: settngs.Group) -> dict[str, def form_settings_to_config(sources: Sources, config: settngs.Config[ct_ns]) -> settngs.Config[ct_ns]: # Update the currently selected talker - config.values.Sources_source = sources.cbx_sources.currentData() + config.values.Sources__source = sources.cbx_sources.currentData() cfg = settngs.normalize_config(config, True, True) # Iterate over the tabs, the talker is included in the tab so no extra lookup is needed diff --git a/setup.cfg b/setup.cfg index 64ad4b6..ea95110 100644 --- a/setup.cfg +++ b/setup.cfg @@ -45,7 +45,7 @@ install_requires = pyrate-limiter>=2.6,<3 rapidfuzz>=2.12.0 requests==2.* - settngs==0.7.2 + settngs==0.8.0 text2digits typing-extensions>=4.3.0 wordninja @@ -81,7 +81,6 @@ QTW = all = PyQt5 PyQtWebEngine - metron-talker>=0.1.1 py7zr rarfile>=4.0 pyicu;sys_platform == 'linux' or sys_platform == 'darwin' diff --git a/tests/comiccacher_test.py b/tests/comiccacher_test.py index 6baf56e..785e265 100644 --- a/tests/comiccacher_test.py +++ b/tests/comiccacher_test.py @@ -10,8 +10,8 @@ from testing.comicdata import search_results def test_create_cache(config, mock_version): config, definitions = config - comictalker.comiccacher.ComicCacher(config.Runtime_Options_config.user_cache_dir, mock_version[0]) - assert config.Runtime_Options_config.user_cache_dir.exists() + comictalker.comiccacher.ComicCacher(config.Runtime_Options__config.user_cache_dir, mock_version[0]) + assert config.Runtime_Options__config.user_cache_dir.exists() def test_search_results(comic_cache): diff --git a/tests/conftest.py b/tests/conftest.py index e150d15..c20e5ba 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -117,7 +117,7 @@ def comicvine_api(monkeypatch, cbz, comic_cache, mock_version, config) -> comict cv = comictalker.talkers.comicvine.ComicVineTalker( version=mock_version[0], - cache_folder=config[0].Runtime_Options_config.user_cache_dir, + cache_folder=config[0].Runtime_Options__config.user_cache_dir, ) manager = settngs.Manager() manager.add_persistent_group("comicvine", cv.register_settings) @@ -174,14 +174,14 @@ def config(tmp_path): app.register_settings() defaults = app.parse_settings(comictaggerlib.ctsettings.ComicTaggerPaths(tmp_path / "config"), "") - defaults[0].Runtime_Options_config.user_data_dir.mkdir(parents=True, exist_ok=True) - defaults[0].Runtime_Options_config.user_config_dir.mkdir(parents=True, exist_ok=True) - defaults[0].Runtime_Options_config.user_cache_dir.mkdir(parents=True, exist_ok=True) - defaults[0].Runtime_Options_config.user_state_dir.mkdir(parents=True, exist_ok=True) - defaults[0].Runtime_Options_config.user_log_dir.mkdir(parents=True, exist_ok=True) + defaults[0].Runtime_Options__config.user_data_dir.mkdir(parents=True, exist_ok=True) + defaults[0].Runtime_Options__config.user_config_dir.mkdir(parents=True, exist_ok=True) + defaults[0].Runtime_Options__config.user_cache_dir.mkdir(parents=True, exist_ok=True) + defaults[0].Runtime_Options__config.user_state_dir.mkdir(parents=True, exist_ok=True) + defaults[0].Runtime_Options__config.user_log_dir.mkdir(parents=True, exist_ok=True) yield defaults @pytest.fixture def comic_cache(config, mock_version) -> Generator[comictalker.comiccacher.ComicCacher, Any, None]: - yield comictalker.comiccacher.ComicCacher(config[0].Runtime_Options_config.user_cache_dir, mock_version[0]) + yield comictalker.comiccacher.ComicCacher(config[0].Runtime_Options__config.user_cache_dir, mock_version[0])