Skip to content

Commit

Permalink
Map ComicInfo ratings to MetronInfo
Browse files Browse the repository at this point in the history
  • Loading branch information
bpepple committed Nov 29, 2024
1 parent 6f819f6 commit 8c9981c
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 7 deletions.
33 changes: 29 additions & 4 deletions darkseid/metroninfo.py
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,13 @@ class MetronInfo:
}
)

unknown_synonyms = frozenset({"rating pending"})
everyone_synonyms = frozenset({"everyone 10+", "g", "kids to adults", "early childhood"})
teen_synonyms = frozenset({"pg"})
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 +183,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 +458,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
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 8c9981c

Please sign in to comment.