Skip to content

Commit

Permalink
Map ComicInfo Ratings to MetronInfo (#134)
Browse files Browse the repository at this point in the history
* Map `ComicInfo` ratings to `MetronInfo`
* Refactor get_issue_id_from_note()
  • Loading branch information
bpepple authored Nov 29, 2024
1 parent c54e3a3 commit e8c48b7
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 17 deletions.
35 changes: 31 additions & 4 deletions darkseid/metroninfo.py
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,15 @@ class MetronInfo:
}
)

unknown_synonyms = frozenset({"rating pending", "unknown"})
everyone_synonyms = frozenset(
{"everyone", "everyone 10+", "g", "kids to adults", "early childhood"}
)
teen_synonyms = frozenset({"pg", "teen"})
teen_plus_synonyms = frozenset({"ma15+"})
mature_synonyms = frozenset({"adults only 18+", "mature 17+", "r18+", "m"})
explicit_synonyms = frozenset({"x18+"})

def metadata_from_string(self, string: str) -> Metadata:
"""Convert an XML string to a Metadata object.
Expand Down Expand Up @@ -176,10 +185,28 @@ def _valid_info_source(cls, val: str | None = None) -> bool:
return val is not None and val.lower() in cls.mix_info_sources

@classmethod
def _valid_age_rating(cls, val: str | None = None) -> str | None:
def _valid_age_rating(cls, val: AgeRatings | None = None) -> str | None:
if val is None:
return None
return "Unknown" if val.lower() not in cls.mix_age_ratings else val
if val.metron_info:
return (
"Unknown" if val.metron_info.lower() not in cls.mix_age_ratings else val.metron_info
)

if val.comic_rack:
ratings_mapping = {
"Unknown": cls.unknown_synonyms,
"Everyone": cls.everyone_synonyms,
"Teen": cls.teen_synonyms,
"Teen Plus": cls.teen_plus_synonyms,
"Mature": cls.mature_synonyms,
"Explicit": cls.explicit_synonyms,
}
lower_val = val.comic_rack.lower()
for rating, synonyms in ratings_mapping.items():
if lower_val in synonyms:
return rating
return None

@staticmethod
def _get_or_create_element(parent: ET.Element, tag: str) -> ET.Element:
Expand Down Expand Up @@ -433,8 +460,8 @@ def convert_metadata_to_xml(self, md: Metadata, xml=None) -> ET.ElementTree: #
self._assign_basic_children(root, "Reprints", "Reprint", md.reprints)
if md.gtin:
self._assign_gtin(root, md.gtin)
if md.age_rating is not None and md.age_rating.metron_info:
self._assign(root, "AgeRating", self._valid_age_rating(md.age_rating.metron_info))
if md.age_rating is not None and (md.age_rating.metron_info or md.age_rating.comic_rack):
self._assign(root, "AgeRating", self._valid_age_rating(md.age_rating))
if md.web_link:
self._assign_urls(root, md.web_link)
self._assign_datetime(root, "LastModified", md.modified)
Expand Down
20 changes: 10 additions & 10 deletions darkseid/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,20 +33,20 @@ def get_issue_id_from_note(note_txt: str) -> dict[str, str] | None:
return None

note_lower = note_txt.lower()
source_map = {
"comic vine": DataSources.COMIC_VINE,
"metron": DataSources.METRON,
"grand comics database": DataSources.GCD,
}
if "metrontagger" in note_lower:
if match := re.search(r"issue_id:(\d+)", note_lower):
return {"source": DataSources.METRON.value, "id": match[1]}
elif "comictagger" in note_lower:
source_map = {
"comic vine": DataSources.COMIC_VINE,
"metron": DataSources.METRON,
"grand comics database": DataSources.GCD,
}

if "comictagger" in note_lower:
if match := re.search(r"(issue id (\d+))|(cvdb(\d+))", note_lower):
for website, src_enum in source_map.items():
if website in note_lower:
return {"source": src_enum, "id": match[2] or match[4]}
elif "metrontagger" in note_lower: # NOQA: SIM102
if match := re.search(r"issue_id:(\d+)", note_lower):
return {"source": DataSources.METRON, "id": match[1]}
return {"source": src_enum.value, "id": match[2] or match[4]}

return None

Expand Down
17 changes: 14 additions & 3 deletions tests/test_metroninfo.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

from darkseid.metadata import (
GTIN,
AgeRatings,
AlternativeNames,
Arc,
Basic,
Expand Down Expand Up @@ -70,13 +71,23 @@ def test_valid_info_source(metron_info, val, expected_result):
("val", "expected_result"),
[
# Happy path
("Teen", "Teen"),
(AgeRatings(metron_info="Teen"), "Teen"),
(AgeRatings(comic_rack="R18+"), "Mature"),
(AgeRatings(comic_rack="G"), "Everyone"),
(AgeRatings(comic_rack="M"), "Mature"),
# Edge case: None value
(None, None),
# Error case: invalid rating
("InvalidRating", "Unknown"),
(AgeRatings(metron_info="InvalidRating"), "Unknown"),
],
ids=[
"valid_mi_rating",
"valid_ci_rating",
"valid_ci_g_rating",
"valid_ci_m_rating",
"none_value",
"invalid_rating",
],
ids=["valid_rating", "none_value", "invalid_rating"],
)
def test_valid_age_rating(metron_info, val, expected_result):
# Act
Expand Down

0 comments on commit e8c48b7

Please sign in to comment.