diff --git a/comicapi/metadata/comet.py b/comicapi/metadata/comet.py index 688a6e7..67a42a3 100644 --- a/comicapi/metadata/comet.py +++ b/comicapi/metadata/comet.py @@ -165,9 +165,7 @@ class CoMet(Metadata): ET.SubElement(root, comet_entry).text = str(md_entry) # title is manditory - if md.title is None: - md.title = "" - assign("title", md.title) + assign("title", md.title or "") assign("series", md.series) assign("issue", md.issue) # must be int?? assign("volume", md.volume) @@ -184,10 +182,8 @@ class CoMet(Metadata): assign("lastMark", md.last_mark) assign("genre", ",".join(md.genres)) # TODO repeatable - if md.characters is not None: - char_list = [c.strip() for c in md.characters] - for c in char_list: - assign("character", c) + for c in md.characters: + assign("character", c.strip()) if md.manga is not None and md.manga == "YesAndRightToLeft": assign("readingDirection", "rtl") diff --git a/comicapi/metadata/comicbookinfo.py b/comicapi/metadata/comicbookinfo.py index 96f3183..2e90475 100644 --- a/comicapi/metadata/comicbookinfo.py +++ b/comicapi/metadata/comicbookinfo.py @@ -21,7 +21,7 @@ from typing import Any, Literal, TypedDict from comicapi import utils from comicapi.archivers import Archiver -from comicapi.genericmetadata import GenericMetadata +from comicapi.genericmetadata import Credit, GenericMetadata from comicapi.metadata import Metadata logger = logging.getLogger(__name__) @@ -46,12 +46,6 @@ _CBILiteralType = Literal[ ] -class _Credits(TypedDict): - person: str - role: str - primary: bool - - class _ComicBookInfoJson(TypedDict, total=False): series: str title: str @@ -66,7 +60,7 @@ class _ComicBookInfoJson(TypedDict, total=False): genre: str language: str country: str - credits: list[_Credits] + credits: list[Credit] tags: list[str] comments: str @@ -161,7 +155,7 @@ class ComicBookInfo(Metadata): metadata.critical_rating = utils.xlate_int(cbi.get("rating")) metadata.credits = [ - _Credits( + Credit( person=x["person"] if "person" in x else "", role=x["role"] if "role" in x else "", primary=x["primary"] if "primary" in x else False, diff --git a/comicapi/metadata/comicrack.py b/comicapi/metadata/comicrack.py index 5e4e3fc..43893da 100644 --- a/comicapi/metadata/comicrack.py +++ b/comicapi/metadata/comicrack.py @@ -92,7 +92,7 @@ class ComicRack(Metadata): return role.casefold() in self._get_parseable_credits() def supports_metadata(self, archive: Archiver) -> bool: - return True + return archive.supports_files() def has_metadata(self, archive: Archiver) -> bool: return ( @@ -178,22 +178,6 @@ class ComicRack(Metadata): if et_entry is not None: root.remove(et_entry) - assign("Title", md.title) - assign("Series", md.series) - assign("Number", md.issue) - assign("Count", md.issue_count) - assign("Volume", md.volume) - assign("AlternateSeries", md.alternate_series) - assign("AlternateNumber", md.alternate_number) - assign("StoryArc", md.story_arcs) - assign("SeriesGroup", md.series_groups) - assign("AlternateCount", md.alternate_count) - assign("Summary", md.description) - assign("Notes", md.notes) - assign("Year", md.year) - assign("Month", md.month) - assign("Day", md.day) - # need to specially process the credits, since they are structured # differently than CIX credit_writer_list = [] @@ -228,7 +212,40 @@ class ComicRack(Metadata): if credit["role"].casefold() in set(self._editor_synonyms): credit_editor_list.append(credit["person"].replace(",", "")) - # second, convert each list to string, and add to XML struct + assign("Series", md.series) + assign("Number", md.issue) + assign("Count", md.issue_count) + assign("Title", md.title) + assign("Volume", md.volume) + assign("Genre", md.genres) + assign("Summary", md.description) + assign("Notes", md.notes) + + assign("AlternateSeries", md.alternate_series) + assign("AlternateNumber", md.alternate_number) + assign("AlternateCount", md.alternate_count) + assign("StoryArc", md.story_arcs) + assign("SeriesGroup", md.series_groups) + + assign("Publisher", md.publisher) + assign("Imprint", md.imprint) + assign("Day", md.day) + assign("Month", md.month) + assign("Year", md.year) + assign("LanguageISO", md.language) + assign("Web", md.web_link) + assign("Format", md.format) + assign("Manga", md.manga) + assign("BlackAndWhite", "Yes" if md.black_and_white else None) + assign("AgeRating", md.maturity_rating) + assign("CommunityRating", md.critical_rating) + assign("ScanInformation", md.scan_info) + + assign("PageCount", md.page_count) + + assign("Characters", md.characters) + assign("Teams", md.teams) + assign("Locations", md.locations) assign("Writer", ", ".join(credit_writer_list)) assign("Penciller", ", ".join(credit_penciller_list)) assign("Inker", ", ".join(credit_inker_list)) @@ -237,22 +254,6 @@ class ComicRack(Metadata): assign("CoverArtist", ", ".join(credit_cover_list)) assign("Editor", ", ".join(credit_editor_list)) - assign("Publisher", md.publisher) - assign("Imprint", md.imprint) - assign("Genre", md.genres) - assign("Web", md.web_link) - assign("PageCount", md.page_count) - assign("LanguageISO", md.language) - assign("Format", md.format) - assign("AgeRating", md.maturity_rating) - assign("CommunityRating", md.critical_rating) - assign("BlackAndWhite", "Yes" if md.black_and_white else None) - assign("Manga", md.manga) - assign("Characters", md.characters) - assign("Teams", md.teams) - assign("Locations", md.locations) - assign("ScanInformation", md.scan_info) - # loop and add the page entries under pages node pages_node = root.find("Pages") if pages_node is not None: @@ -296,38 +297,42 @@ class ComicRack(Metadata): md = GenericMetadata() md.series = utils.xlate(get("Series")) - md.title = utils.xlate(get("Title")) md.issue = utils.xlate(get("Number")) md.issue_count = utils.xlate_int(get("Count")) + md.title = utils.xlate(get("Title")) md.volume = utils.xlate_int(get("Volume")) + md.genres = set(utils.split(get("Genre"), ",")) + md.description = utils.xlate(get("Summary")) + md.notes = utils.xlate(get("Notes")) + md.alternate_series = utils.xlate(get("AlternateSeries")) md.alternate_number = utils.xlate(get("AlternateNumber")) md.alternate_count = utils.xlate_int(get("AlternateCount")) - md.description = utils.xlate(get("Summary")) - md.notes = utils.xlate(get("Notes")) - md.year = utils.xlate_int(get("Year")) - md.month = utils.xlate_int(get("Month")) - md.day = utils.xlate_int(get("Day")) + md.story_arcs = utils.split(get("StoryArc"), ",") + md.series_groups = utils.split(get("SeriesGroup"), ",") + md.publisher = utils.xlate(get("Publisher")) md.imprint = utils.xlate(get("Imprint")) - md.genres = set(utils.split(get("Genre"), ",")) - md.web_link = utils.xlate(get("Web")) + md.day = utils.xlate_int(get("Day")) + md.month = utils.xlate_int(get("Month")) + md.year = utils.xlate_int(get("Year")) md.language = utils.xlate(get("LanguageISO")) + md.web_link = utils.xlate(get("Web")) md.format = utils.xlate(get("Format")) md.manga = utils.xlate(get("Manga")) + md.maturity_rating = utils.xlate(get("AgeRating")) + md.critical_rating = utils.xlate_float(get("CommunityRating")) + md.scan_info = utils.xlate(get("ScanInformation")) + + md.page_count = utils.xlate_int(get("PageCount")) + md.characters = set(utils.split(get("Characters"), ",")) md.teams = set(utils.split(get("Teams"), ",")) md.locations = set(utils.split(get("Locations"), ",")) - md.page_count = utils.xlate_int(get("PageCount")) - md.scan_info = utils.xlate(get("ScanInformation")) - md.story_arcs = utils.split(get("StoryArc"), ",") - md.series_groups = utils.split(get("SeriesGroup"), ",") - md.maturity_rating = utils.xlate(get("AgeRating")) - md.critical_rating = utils.xlate_float(get("CommunityRating")) tmp = utils.xlate(get("BlackAndWhite")) - if tmp is not None and tmp.casefold() in ["yes", "true", "1"]: - md.black_and_white = True + md.black_and_white = tmp is not None and tmp.casefold() in ["yes", "true", "1"] + # Now extract the credit info for n in root: if any( diff --git a/comictaggerlib/ctsettings/types.py b/comictaggerlib/ctsettings/types.py index 3be08cf..d8ac1c6 100644 --- a/comictaggerlib/ctsettings/types.py +++ b/comictaggerlib/ctsettings/types.py @@ -69,7 +69,6 @@ def metadata_type(types: str) -> list[str]: result = [] types = types.casefold() for typ in utils.split(types, ","): - typ = typ.strip() if typ not in metadata_styles: choices = ", ".join(metadata_styles) raise argparse.ArgumentTypeError(f"invalid choice: {typ} (choose from {choices.upper()})")