From 51132c061bdacc79e1570f20fc5f3813804434f9 Mon Sep 17 00:00:00 2001 From: lordwelch Date: Thu, 5 Sep 2019 14:40:14 -0700 Subject: [PATCH] Cleanup metadata handling Mainly corrects for consistency in most situations CoMet is not touched as there is no support in the gui and has an odd requirements on attributes --- comicapi/comicbookinfo.py | 86 +++++++++++-------------- comicapi/comicinfoxml.py | 85 ++++++++++++------------- comicapi/utils.py | 17 +++++ comictaggerlib/comicvinetalker.py | 20 +++--- comictaggerlib/taggerwindow.py | 101 +++++++++++++++--------------- 5 files changed, 152 insertions(+), 157 deletions(-) diff --git a/comicapi/comicbookinfo.py b/comicapi/comicbookinfo.py index cb2d9e2..e55fac9 100644 --- a/comicapi/comicbookinfo.py +++ b/comicapi/comicbookinfo.py @@ -24,39 +24,33 @@ from . import utils class ComicBookInfo: - def metadataFromString(self, string): - + class Default(dict): + def __missing__(self, key): + return None cbi_container = json.loads(str(string, 'utf-8')) metadata = GenericMetadata() - cbi = cbi_container['ComicBookInfo/1.0'] + cbi = Default(cbi_container['ComicBookInfo/1.0']) - # helper func - # If item is not in CBI, return None - def xlate(cbi_entry): - if cbi_entry in cbi: - return cbi[cbi_entry] - else: - return None + metadata.series = utils.xlate(cbi['series']) + metadata.title = utils.xlate(cbi['title']) + metadata.issue = utils.xlate(cbi['issue']) + metadata.publisher = utils.xlate(cbi['publisher']) + metadata.month = utils.xlate(cbi['publicationMonth'], True) + metadata.year = utils.xlate(cbi['publicationYear'], True) + metadata.issueCount = utils.xlate(cbi['numberOfIssues'], True) + metadata.comments = utils.xlate(cbi['comments']) + metadata.genre = utils.xlate(cbi['genre']) + metadata.volume = utils.xlate(cbi['volume'], True) + metadata.volumeCount = utils.xlate(cbi['numberOfVolumes'], True) + metadata.language = utils.xlate(cbi['language']) + metadata.country = utils.xlate(cbi['country']) + metadata.criticalRating = utils.xlate(cbi['rating']) - metadata.series = xlate('series') - metadata.title = xlate('title') - metadata.issue = xlate('issue') - metadata.publisher = xlate('publisher') - metadata.month = xlate('publicationMonth') - metadata.year = xlate('publicationYear') - metadata.issueCount = xlate('numberOfIssues') - metadata.comments = xlate('comments') - metadata.credits = xlate('credits') - metadata.genre = xlate('genre') - metadata.volume = xlate('volume') - metadata.volumeCount = xlate('numberOfVolumes') - metadata.language = xlate('language') - metadata.country = xlate('country') - metadata.criticalRating = xlate('rating') - metadata.tags = xlate('tags') + metadata.credits = cbi['credits'] + metadata.tags = cbi['tags'] # make sure credits and tags are at least empty lists and not None if metadata.credits is None: @@ -103,33 +97,23 @@ class ComicBookInfo: # helper func def assign(cbi_entry, md_entry): - if md_entry is not None: + if md_entry is not None or isinstance(md_entry, str) and md_entry != "": cbi[cbi_entry] = md_entry - # helper func - def toInt(s): - i = None - if type(s) in [str, str, int]: - try: - i = int(s) - except ValueError: - pass - return i - - assign('series', metadata.series) - assign('title', metadata.title) - assign('issue', metadata.issue) - assign('publisher', metadata.publisher) - assign('publicationMonth', toInt(metadata.month)) - assign('publicationYear', toInt(metadata.year)) - assign('numberOfIssues', toInt(metadata.issueCount)) - assign('comments', metadata.comments) - assign('genre', metadata.genre) - assign('volume', toInt(metadata.volume)) - assign('numberOfVolumes', toInt(metadata.volumeCount)) - assign('language', utils.getLanguageFromISO(metadata.language)) - assign('country', metadata.country) - assign('rating', metadata.criticalRating) + assign('series', utils.xlate(metadata.series)) + assign('title', utils.xlate(metadata.title)) + assign('issue', utils.xlate(metadata.issue)) + assign('publisher', utils.xlate(metadata.publisher)) + assign('publicationMonth', utils.xlate(metadata.month, True)) + assign('publicationYear', utils.xlate(metadata.year, True)) + assign('numberOfIssues', utils.xlate(metadata.issueCount, True)) + assign('comments', utils.xlate(metadata.comments)) + assign('genre', utils.xlate(metadata.genre)) + assign('volume', utils.xlate(metadata.volume, True)) + assign('numberOfVolumes', utils.xlate(metadata.volumeCount, True)) + assign('language', utils.xlate(utils.getLanguageFromISO(metadata.language))) + assign('country', utils.xlate(metadata.country)) + assign('rating', utils.xlate(metadata.criticalRating)) assign('credits', metadata.credits) assign('tags', metadata.tags) diff --git a/comicapi/comicinfoxml.py b/comicapi/comicinfoxml.py index 757fa46..5c38902 100644 --- a/comicapi/comicinfoxml.py +++ b/comicapi/comicinfoxml.py @@ -20,6 +20,7 @@ import xml.etree.ElementTree as ET #import zipfile from .genericmetadata import GenericMetadata +from .issuestring import IssueString from . import utils @@ -206,48 +207,44 @@ class ComicInfoXml: raise 1 return None - metadata = GenericMetadata() - md = metadata - - # Helper function - def xlate(tag): - node = root.find(tag) - if node is not None: - return node.text - else: + def get(name): + tag = root.find(name) + if tag is None: return None + return tag.text - md.series = xlate('Series') - md.title = xlate('Title') - md.issue = xlate('Number') - md.issueCount = xlate('Count') - md.volume = xlate('Volume') - md.alternateSeries = xlate('AlternateSeries') - md.alternateNumber = xlate('AlternateNumber') - md.alternateCount = xlate('AlternateCount') - md.comments = xlate('Summary') - md.notes = xlate('Notes') - md.year = xlate('Year') - md.month = xlate('Month') - md.day = xlate('Day') - md.publisher = xlate('Publisher') - md.imprint = xlate('Imprint') - md.genre = xlate('Genre') - md.webLink = xlate('Web') - md.language = xlate('LanguageISO') - md.format = xlate('Format') - md.manga = xlate('Manga') - md.characters = xlate('Characters') - md.teams = xlate('Teams') - md.locations = xlate('Locations') - md.pageCount = xlate('PageCount') - md.scanInfo = xlate('ScanInformation') - md.storyArc = xlate('StoryArc') - md.seriesGroup = xlate('SeriesGroup') - md.maturityRating = xlate('AgeRating') + md = GenericMetadata() - tmp = xlate('BlackAndWhite') - md.blackAndWhite = False + md.series = utils.xlate(get('Series')) + md.title = utils.xlate(get('Title')) + md.issue = IssueString(utils.xlate(get('Number'))).asString() + md.issueCount = utils.xlate(get('Count'), True) + md.volume = utils.xlate(get('Volume'), True) + md.alternateSeries = utils.xlate(get('AlternateSeries')) + md.alternateNumber = IssueString(utils.xlate(get('AlternateNumber'))).asString() + md.alternateCount = utils.xlate(get('AlternateCount'), True) + md.comments = utils.xlate(get('Summary')) + md.notes = utils.xlate(get('Notes')) + md.year = utils.xlate(get('Year'), True) + md.month = utils.xlate(get('Month'), True) + md.day = utils.xlate(get('Day'), True) + md.publisher = utils.xlate(get('Publisher')) + md.imprint = utils.xlate(get('Imprint')) + md.genre = utils.xlate(get('Genre')) + md.webLink = utils.xlate(get('Web')) + md.language = utils.xlate(get('LanguageISO')) + md.format = utils.xlate(get('Format')) + md.manga = utils.xlate(get('Manga')) + md.characters = utils.xlate(get('Characters')) + md.teams = utils.xlate(get('Teams')) + md.locations = utils.xlate(get('Locations')) + md.pageCount = utils.xlate(get('PageCount'), True) + md.scanInfo = utils.xlate(get('ScanInformation')) + md.storyArc = utils.xlate(get('StoryArc')) + md.seriesGroup = utils.xlate(get('SeriesGroup')) + md.maturityRating = utils.xlate(get('AgeRating')) + + tmp = utils.xlate(get('BlackAndWhite')) if tmp is not None and tmp.lower() in ["yes", "true", "1"]: md.blackAndWhite = True # Now extract the credit info @@ -261,23 +258,23 @@ class ComicInfoXml: ): if n.text is not None: for name in n.text.split(','): - metadata.addCredit(name.strip(), n.tag) + md.addCredit(name.strip(), n.tag) if n.tag == 'CoverArtist': if n.text is not None: for name in n.text.split(','): - metadata.addCredit(name.strip(), "Cover") + md.addCredit(name.strip(), "Cover") # parse page data now pages_node = root.find("Pages") if pages_node is not None: for page in pages_node: - metadata.pages.append(page.attrib) + md.pages.append(page.attrib) # print page.attrib - metadata.isEmpty = False + md.isEmpty = False - return metadata + return md def writeToExternalFile(self, filename, metadata): diff --git a/comicapi/utils.py b/comicapi/utils.py index 1303689..aeec166 100644 --- a/comicapi/utils.py +++ b/comicapi/utils.py @@ -121,6 +121,23 @@ def which(program): return None +def xlate(data, isInt=False): + class Default(dict): + def __missing__(self, key): + return None + if data is None or data == "": + return None + if isInt: + i = str(data).translate(Default(zip((ord(c) for c in "1234567890"),"1234567890"))) + if i == "0": + return "0" + if i is "": + return None + return int(i) + else: + return str(data) + + def removearticles(text): text = text.lower() articles = ['and', 'a', '&', 'issue', 'the'] diff --git a/comictaggerlib/comicvinetalker.py b/comictaggerlib/comicvinetalker.py index cc0d2bc..66f8468 100644 --- a/comictaggerlib/comicvinetalker.py +++ b/comictaggerlib/comicvinetalker.py @@ -124,11 +124,11 @@ class ComicVineTalker(QObject): year = None if date_str is not None: parts = date_str.split('-') - year = parts[0] + year = utils.xlate(parts[0], True) if len(parts) > 1: - month = parts[1] + month = utils.xlate(parts[1], True) if len(parts) > 2: - day = parts[2] + day = utils.xlate(parts[2], True) return day, month, year def testKey(self, key): @@ -497,15 +497,13 @@ class ComicVineTalker(QObject): # Now, map the Comic Vine data to generic metadata metadata = GenericMetadata() - metadata.series = issue_results['volume']['name'] + metadata.series = utils.xlate(issue_results['volume']['name']) + metadata.issue = IssueString(issue_results['issue_number']).asString() + metadata.title = utils.xlate(issue_results['name']) - num_s = IssueString(issue_results['issue_number']).asString() - metadata.issue = num_s - metadata.title = issue_results['name'] - - metadata.publisher = volume_results['publisher']['name'] - metadata.day, metadata.month, metadata.year = self.parseDateStr( - issue_results['cover_date']) + if volume_results['publisher'] is not None: + metadata.publisher = utils.xlate(volume_results['publisher']['name']) + metadata.day, metadata.month, metadata.year = self.parseDateStr(issue_results['cover_date']) #metadata.issueCount = volume_results['count_of_issues'] metadata.comments = self.cleanup_html( diff --git a/comictaggerlib/taggerwindow.py b/comictaggerlib/taggerwindow.py index 5b2bfab..35c9ae5 100644 --- a/comictaggerlib/taggerwindow.py +++ b/comictaggerlib/taggerwindow.py @@ -51,6 +51,7 @@ from .cbltransformer import CBLTransformer from .renamewindow import RenameWindow from .exportwindow import ExportWindow, ExportConflictOpts from .issueidentifier import IssueIdentifier +from .issuestring import IssueString from .autotagstartwindow import AutoTagStartWindow from .autotagprogresswindow import AutoTagProgressWindow from .autotagmatchwindow import AutoTagMatchWindow @@ -788,14 +789,12 @@ class TaggerWindow(QtWidgets.QMainWindow): for child in widget.children(): self.clearChildren(child) + # Copy all of the metadata object into to the form. + # Merging of metadata should be done via the overlay function def metadataToForm(self): - # copy the the metadata object into to the form - - # helper func def assignText(field, value): if value is not None: field.setText(str(value)) - md = self.metadata assignText(self.leSeries, md.series) @@ -837,23 +836,33 @@ class TaggerWindow(QtWidgets.QMainWindow): self.cbMaturityRating.setEditText(md.maturityRating) else: self.cbMaturityRating.setCurrentIndex(i) + else: + self.cbMaturityRating.setCurrentIndex(0) if md.language is not None: i = self.cbLanguage.findData(md.language) self.cbLanguage.setCurrentIndex(i) + else: + self.cbLanguage.setCurrentIndex(0) if md.country is not None: i = self.cbCountry.findText(md.country) self.cbCountry.setCurrentIndex(i) + else: + self.cbCountry.setCurrentIndex(0) if md.manga is not None: i = self.cbManga.findData(md.manga) self.cbManga.setCurrentIndex(i) + else: + self.cbManga.setCurrentIndex(0) - if md.blackAndWhite is not None and md.blackAndWhite: + if md.blackAndWhite != None and md.blackAndWhite: self.cbBW.setChecked(True) + else: + self.cbBW.setChecked(False) - assignText(self.teTags, utils.listToString(md.tags)) + self.teTags.setText(utils.listToString(md.tags)) # !!! Should we clear the credits table or just avoid duplicates? while self.twCredits.rowCount() > 0: @@ -912,58 +921,47 @@ class TaggerWindow(QtWidgets.QMainWindow): return False def formToMetadata(self): - - # helper func - def xlate(data, type_str): - s = "{0}".format(data).strip() - if s == "": - return None - elif type_str == "str": - return s - else: - return int(s) - # copy the data from the form into the metadata - md = self.metadata - md.series = xlate(self.leSeries.text(), "str") - md.issue = xlate(self.leIssueNum.text(), "str") - md.issueCount = xlate(self.leIssueCount.text(), "int") - md.volume = xlate(self.leVolumeNum.text(), "int") - md.volumeCount = xlate(self.leVolumeCount.text(), "int") - md.title = xlate(self.leTitle.text(), "str") - md.publisher = xlate(self.lePublisher.text(), "str") - md.month = xlate(self.lePubMonth.text(), "int") - md.year = xlate(self.lePubYear.text(), "int") - md.day = xlate(self.lePubDay.text(), "int") - md.genre = xlate(self.leGenre.text(), "str") - md.imprint = xlate(self.leImprint.text(), "str") - md.comments = xlate(self.teComments.toPlainText(), "str") - md.notes = xlate(self.teNotes.toPlainText(), "str") - md.criticalRating = xlate(self.leCriticalRating.text(), "int") - md.maturityRating = xlate(self.cbMaturityRating.currentText(), "str") + md = GenericMetadata() + md.isEmpty = False + md.alternateNumber = IssueString(self.leAltIssueNum.text()).asString() + md.issue = IssueString(self.leIssueNum.text()).asString() + md.issueCount = utils.xlate(self.leIssueCount.text(), True) + md.volume = utils.xlate(self.leVolumeNum.text(), True) + md.volumeCount = utils.xlate(self.leVolumeCount.text(), True) + md.month = utils.xlate(self.lePubMonth.text(), True) + md.year = utils.xlate(self.lePubYear.text(), True) + md.day = utils.xlate(self.lePubDay.text(), True) + md.criticalRating = utils.xlate(self.leCriticalRating.text(), True) + md.alternateCount = utils.xlate(self.leAltIssueCount.text(), True) - md.storyArc = xlate(self.leStoryArc.text(), "str") - md.scanInfo = xlate(self.leScanInfo.text(), "str") - md.seriesGroup = xlate(self.leSeriesGroup.text(), "str") - md.alternateSeries = xlate(self.leAltSeries.text(), "str") - md.alternateNumber = xlate(self.leAltIssueNum.text(), "int") - md.alternateCount = xlate(self.leAltIssueCount.text(), "int") - md.webLink = xlate(self.leWebLink.text(), "str") - md.characters = xlate(self.teCharacters.toPlainText(), "str") - md.teams = xlate(self.teTeams.toPlainText(), "str") - md.locations = xlate(self.teLocations.toPlainText(), "str") + md.series = self.leSeries.text() + md.title = self.leTitle.text() + md.publisher = self.lePublisher.text() + md.genre = self.leGenre.text() + md.imprint = self.leImprint.text() + md.comments = self.teComments.toPlainText() + md.notes = self.teNotes.toPlainText() + md.maturityRating = self.cbMaturityRating.currentText() - md.format = xlate(self.cbFormat.currentText(), "str") - md.country = xlate(self.cbCountry.currentText(), "str") + md.storyArc = self.leStoryArc.text() + md.scanInfo = self.leScanInfo.text() + md.seriesGroup = self.leSeriesGroup.text() + md.alternateSeries = self.leAltSeries.text() + md.webLink = self.leWebLink.text() + md.characters = self.teCharacters.toPlainText() + md.teams = self.teTeams.toPlainText() + md.locations = self.teLocations.toPlainText() - langiso = self.cbLanguage.itemData(self.cbLanguage.currentIndex()) - md.language = xlate(langiso, "str") + md.format = self.cbFormat.currentText() + md.country = self.cbCountry.currentText() - manga_code = self.cbManga.itemData(self.cbManga.currentIndex()) - md.manga = xlate(manga_code, "str") + md.language = utils.xlate(self.cbLanguage.itemData(self.cbLanguage.currentIndex())) + + md.manga = utils.xlate(self.cbManga.itemData(self.cbManga.currentIndex())) # Make a list from the coma delimited tags string - tmp = xlate(self.teTags.toPlainText(), "str") + tmp = self.teTags.toPlainText() if tmp is not None: def striplist(l): return([x.strip() for x in l]) @@ -987,6 +985,7 @@ class TaggerWindow(QtWidgets.QMainWindow): row += 1 md.pages = self.pageListEditor.getPageList() + self.metadata = md def useFilename(self): if self.comic_archive is not None: