From f0f8a061b5bfb1f00b8424da0cfb02754599976b Mon Sep 17 00:00:00 2001 From: lordwelch Date: Tue, 10 Sep 2019 14:34:09 -0700 Subject: [PATCH] Add publisher and imprint handling Imprint handling has been added to utils and uses a subclassed dict to return tuples for imprint matching may not be the best idea but it works for now. Add settings option auto_imprint Add cli flag -a, --auto-import --- comicapi/genericmetadata.py | 18 +++ comicapi/utils.py | 142 ++++++++++++++++++++++++ comictaggerlib/autotagstartwindow.py | 4 + comictaggerlib/cli.py | 9 ++ comictaggerlib/options.py | 3 + comictaggerlib/settings.py | 4 + comictaggerlib/taggerwindow.py | 10 ++ comictaggerlib/ui/autotagstartwindow.ui | 16 ++- comictaggerlib/ui/taggerwindow.ui | 10 ++ 9 files changed, 213 insertions(+), 3 deletions(-) diff --git a/comicapi/genericmetadata.py b/comicapi/genericmetadata.py index b3679a2..4195c43 100644 --- a/comicapi/genericmetadata.py +++ b/comicapi/genericmetadata.py @@ -319,3 +319,21 @@ class GenericMetadata: outstr += fmt_str.format(i[0] + ":", i[1]) return outstr + + def fixPublisher(self): + if self.publisher is None: + return + if self.imprint is None: + self.imprint = "" + + imprint, publisher = utils.getPublisher(self.publisher) + + self.publisher = publisher + + if self.imprint.lower() in publisher.lower(): + self.imprint = None + + if self.imprint is None or self.imprint == "": + self.imprint = imprint + elif self.imprint.lower() in imprint.lower(): + self.imprint = imprint diff --git a/comicapi/utils.py b/comicapi/utils.py index 1303689..fb44a12 100644 --- a/comicapi/utils.py +++ b/comicapi/utils.py @@ -592,3 +592,145 @@ def getLanguageFromISO(iso): return None else: return lang_dict[iso] + + +def getPublisher(publisher): + if publisher is None: + return ("", "") + imprint = "" + + for pub in publishers: + imprint, publisher, ok = pub[publisher] + if ok: + break + + return (imprint, publisher) + + +class ImprintDict(dict): + ''' + ImprintDict takes a publisher and a dict or mapping of lowercased + imprint names to the proper imprint name. Retreiving a value from an + ImportDict returns a tuple of (imprint, publisher, keyExists). + if the key does not exist the key is returned as the publisher unchanged + ''' + def __init__(self, publisher, mapping=(), **kwargs): + super().__init__(mapping, **kwargs) + self.publisher = publisher + + def __missing__(self, key): + return None + + def __getitem__(self, k): + item = super().__getitem__(k.lower()) + if item is None: + return ("", k, False) + else: + return (item, self.publisher, True) + +Marvel = ImprintDict("Marvel", { + "marvel comics":"", + "marvel":"", + "aircel comics": "Aircel Comics", + "aircel": "Aircel Comics", + "atlas comics": "Atlas Comics", + "atlas": "Atlas Comics", + "crossgen comics": "CrossGen comics", + "crossgen": "CrossGen comics", + "curtis magazines": "Curtis Magazines", + "disney books group": "Disney Books Group", + "disney books": "Disney Books Group", + "disney kingdoms": "Disney Kingdoms", + "epic comics": "Epic Comics", + "epic": "Epic Comics", + "eternity comics": "Eternity Comics", + "humorama": "Humorama", + "icon comics": "Icon Comics", + "infinite comics": "Infinite Comics", + "malibu comics": "Malibu Comics", + "malibu": "Malibu Comics", + "marvel 2099": "Marvel 2099", + "marvel absurd": "Marvel Absurd", + "marvel adventures": "Marvel Adventures", + "marvel age": "Marvel Age", + "marvel books": "Marvel Books", + "marvel comics 2": "Marvel Comics 2", + "marvel edge": "Marvel Edge", + "marvel frontier": "Marvel Frontier", + "marvel illustrated": "Marvel Illustrated", + "marvel knights": "Marvel Knights", + "marvel magazine group": "Marvel Magazine Group", + "marvel mangaverse": "Marvel Mangaverse", + "marvel monsters group": "Marvel Monsters Group", + "marvel music": "Marvel Music", + "marvel next": "Marvel Next", + "marvel noir": "Marvel Noir", + "marvel press": "Marvel Press", + "marvel uk": "Marvel UK", + "marvel unlimited": "Marvel Unlimited", + "max": "MAX", + "mc2": "Marvel Comics 2", + "new universe": "New Universe", + "non-pareil publishing corp.": "Non-Pareil Publishing Corp.", + "paramount comics": "Paramount Comics", + "power comics": "Power Comics", + "razorline": "Razorline", + "star comics": "Star Comics", + "timely comics": "Timely Comics", + "timely": "Timely Comics", + "tsunami": "Tsunami", + "ultimate comics": "Ultimate Comics", + "ultimate marvel": "Ultimate Marvel", + "vital publications, inc.": "Vital Publications, Inc." +}) + + +DC_Comics = ImprintDict("DC Comics", { + "dc comics":"", + "dc_comics":"", + "dc":"", + "dccomics":"", + "!mpact Comics": "Impact Comics", + "all star dc": "All-Star", + "all star": "All-Star", + "all-star dc": "All-Star", + "all-star": "All-Star", + "america's best comics": "America's Best Comics", + "black label": "DC Black Label", + "cliffhanger": "Cliffhanger", + "cmx manga": "CMX Manga", + "dc black label": "DC Black Label", + "dc focus": "DC Focus", + "dc ink": "DC Ink", + "dc zoom": "DC Zoom", + "earth m": "Earth M", + "earth one": "Earth One", + "earth-m": "Earth M", + "elseworlds": "Elseworlds", + "EO": "Earth One", + "first wave": "First Wave", + "focus": "DC Focus", + "helix": "Helix", + "homage comics": "Homage Comics", + "impact comics": "Impact Comics", + "Impact! Comics": "Impact Comics", + "johnny dc": "DC Entertainment", + "johnny dc": "Johnny DC", + "mad": "Mad", + "minx": "Minx", + "paradox press": "Paradox Press", + "piranha press": "Piranha Press", + "sandman universe": "Sandman Universe", + "tangent comics": "Tangent Comics", + "tsr": "TSR", + "vertigo": "Vertigo", + "wildstorm productions": "WildStorm Productions", + "wildstorm signature": "WildStorm Productions", + "wildstorm": "WildStorm Productions", + "wonder comics": "Wonder Comics", + "young animal": "Young Animal", + "zuda comics": "Zuda Comics", + "zuda": "Zuda Comics", +}) + +publishers = [Marvel, DC_Comics] diff --git a/comictaggerlib/autotagstartwindow.py b/comictaggerlib/autotagstartwindow.py index 653c369..97ac301 100644 --- a/comictaggerlib/autotagstartwindow.py +++ b/comictaggerlib/autotagstartwindow.py @@ -45,6 +45,7 @@ class AutoTagStartWindow(QtWidgets.QDialog): QtCore.Qt.Unchecked) self.cbxRemoveAfterSuccess.setCheckState(QtCore.Qt.Unchecked) self.cbxSpecifySearchString.setCheckState(QtCore.Qt.Unchecked) + self.cbxAutoImprint.setCheckState(QtCore.Qt.Unchecked) self.leNameLengthMatchTolerance.setText( str(self.settings.id_length_delta_thresh)) self.leSearchString.setEnabled(False) @@ -62,6 +63,9 @@ class AutoTagStartWindow(QtWidgets.QDialog): self.cbxRemoveAfterSuccess.setCheckState(QtCore.Qt.Checked) if self.settings.wait_and_retry_on_rate_limit: self.cbxWaitForRateLimit.setCheckState(QtCore.Qt.Checked) + if self.settings.auto_imprint: + self.cbxAutoImprint.setCheckState(QtCore.Qt.Checked) + nlmtTip = ( """ The Name Length Match Tolerance is for eliminating automatic diff --git a/comictaggerlib/cli.py b/comictaggerlib/cli.py index 688907d..0298de6 100644 --- a/comictaggerlib/cli.py +++ b/comictaggerlib/cli.py @@ -132,6 +132,10 @@ def display_match_set_for_choice(label, match_set, opts, settings): cv_md = actual_issue_data_fetch( match_set.matches[int(i)], settings, opts) md.overlay(cv_md) + + if settings.auto_imprint: + md.fixPublisher() + actual_metadata_save(ca, opts, md) @@ -219,6 +223,8 @@ def process_file_cli(filename, opts, settings, match_results): batch_mode = len(opts.file_list) > 1 + settings.auto_imprint = opts.auto_imprint + ca = ComicArchive( filename, settings.rar_exe_path, @@ -473,6 +479,9 @@ def process_file_cli(filename, opts, settings, match_results): md.overlay(cv_md) + if settings.auto_imprint: + md.fixPublisher() + # ok, done building our metadata. time to save if not actual_metadata_save(ca, opts, md): match_results.writeFailures.append(filename) diff --git a/comictaggerlib/options.py b/comictaggerlib/options.py index a4e055b..3125e31 100644 --- a/comictaggerlib/options.py +++ b/comictaggerlib/options.py @@ -112,6 +112,7 @@ For more help visit the wiki at: http://code.google.com/p/comictagger/ self.filename = None self.verbose = False self.terse = False + self.auto_imprint = False self.metadata = None self.print_tags = False self.copy_tags = False @@ -290,6 +291,8 @@ For more help visit the wiki at: http://code.google.com/p/comictagger/ self.delete_tags = True if o in ("-i", "--interactive"): self.interactive = True + if o in ("-a", "--auto-imprint"): + self.auto_imprint = True if o in ("-c", "--copy"): self.copy_tags = True if a.lower() == "cr": diff --git a/comictaggerlib/settings.py b/comictaggerlib/settings.py index 3879445..0a98def 100644 --- a/comictaggerlib/settings.py +++ b/comictaggerlib/settings.py @@ -104,6 +104,7 @@ class ComicTaggerSettings: self.clear_form_before_populating_from_cv = False self.remove_html_tables = False self.cv_api_key = "" + self.auto_imprint = False # CBL Tranform settings @@ -380,6 +381,8 @@ class ComicTaggerSettings: if self.config.has_option('autotag', 'wait_and_retry_on_rate_limit'): self.wait_and_retry_on_rate_limit = self.config.getboolean( 'autotag', 'wait_and_retry_on_rate_limit') + if self.config.has_option('autotag', 'auto_imprint'): + self.auto_imprint = self.config.getboolean('autotag', 'auto_imprint') def save(self): @@ -543,6 +546,7 @@ class ComicTaggerSettings: 'autotag', 'wait_and_retry_on_rate_limit', self.wait_and_retry_on_rate_limit) + self.config.set('autotag', 'auto_imprint', self.auto_imprint) with codecs.open(self.settings_file, 'wb', 'utf8') as configfile: self.config.write(configfile) diff --git a/comictaggerlib/taggerwindow.py b/comictaggerlib/taggerwindow.py index 5b2bfab..ce1068a 100644 --- a/comictaggerlib/taggerwindow.py +++ b/comictaggerlib/taggerwindow.py @@ -247,6 +247,8 @@ class TaggerWindow(QtWidgets.QMainWindow): self.fileSelectionList.addAppAction(self.actionRemoveAuto) self.fileSelectionList.addAppAction(self.actionRepackage) + self.btnAutoImprint.clicked.connect(self.autoImprint) + if len(file_list) != 0: self.fileSelectionList.addPathList(file_list) @@ -1848,6 +1850,9 @@ class TaggerWindow(QtWidgets.QMainWindow): if cv_md is not None: md.overlay(cv_md) + if self.settings.auto_imprint: + md.fixPublisher() + if not ca.writeMetadata(md, self.save_data_style): match_results.writeFailures.append(ca.path) self.autoTagLog("Save failed ;-(\n") @@ -2199,3 +2204,8 @@ class TaggerWindow(QtWidgets.QMainWindow): # self.show() self.setWindowFlags(flags) self.show() + + def autoImprint(self): + self.formToMetadata() + self.metadata.fixPublisher() + self.metadataToForm() diff --git a/comictaggerlib/ui/autotagstartwindow.ui b/comictaggerlib/ui/autotagstartwindow.ui index dc863d0..04d80a5 100644 --- a/comictaggerlib/ui/autotagstartwindow.ui +++ b/comictaggerlib/ui/autotagstartwindow.ui @@ -44,7 +44,7 @@ - + @@ -129,6 +129,16 @@ + + + + <html><head/><body><p>Checks the publisher against a list of imprints.</p></body></html> + + + Auto Imprint + + + @@ -145,7 +155,7 @@ - + @@ -155,7 +165,7 @@ - + diff --git a/comictaggerlib/ui/taggerwindow.ui b/comictaggerlib/ui/taggerwindow.ui index d5fcc3b..d4b9e79 100644 --- a/comictaggerlib/ui/taggerwindow.ui +++ b/comictaggerlib/ui/taggerwindow.ui @@ -512,6 +512,16 @@ + + + + <html><head/><body><p>Checks the publisher against a list of imprints.</p></body></html> + + + Auto Imprint + + +