diff --git a/src/scrapers/mangaplus/mangaplus.py b/src/scrapers/mangaplus/mangaplus.py index e23057c..c108063 100644 --- a/src/scrapers/mangaplus/mangaplus.py +++ b/src/scrapers/mangaplus/mangaplus.py @@ -11,8 +11,8 @@ from src.db.models.authors import AuthorPartial from src.db.models.manga import MangaService from src.enums import Status -from src.scrapers.base_scraper import BaseChapter, BaseScraperWhole, \ - BaseScraper, ScrapeServiceRetVal +from src.scrapers.base_scraper import (BaseChapter, BaseScraperWhole, + BaseScraper, ScrapeServiceRetVal) from src.utils.utilities import random_timedelta, utcnow, utcfromtimestamp from .protobuf import mangaplus_pb2 @@ -245,7 +245,7 @@ class MangaPlus(BaseScraperWhole): CHAPTER_REGEX = re.compile(r'#(\d+)') SPECIAL_CHAPTER_REGEX = re.compile(r'\s*(#?ex)s*', re.I) ONESHOT_REGEX = re.compile(r'\s*(one[- ]?shot)s*', re.I) - AWARD_REGEX = re.compile(r'\s*bronze award\s*', re.I) + AWARD_REGEX = re.compile(r'\s*bronze award(\s|:)*', re.I) CHAPTER_URL_FORMAT = 'https://mangaplus.shueisha.co.jp/viewer/{}' MANGA_URL_FORMAT = 'https://mangaplus.shueisha.co.jp/titles/{}' GROUP = 'Shueisha' @@ -402,11 +402,14 @@ def add_chapters(self, series: TitleDetailViewWrapper, service_id: int, manga_id if series.release_schedule: ReleaseSchedule = mangaplus_pb2.TitleLabels.ReleaseSchedule - if series.release_schedule == ReleaseSchedule.COMPLETED or series.release_schedule == ReleaseSchedule.DISABLED: + if series.release_schedule in (ReleaseSchedule.COMPLETED, ReleaseSchedule.DISABLED, ReleaseSchedule.OTHER): next_update = None disabled = True completed = False + if series.release_schedule == ReleaseSchedule.OTHER: + logger.warning(f'Release schedule is OTHER for {self.NAME} title {series.title.name} / {series.title.title_id}. Disabling it.') + newest_chapter = None for c in chapters: if not newest_chapter: diff --git a/src/tests/scrapers/mangaplus/test_mangaplus.py b/src/tests/scrapers/mangaplus/test_mangaplus.py index 46a8d53..19c6c72 100644 --- a/src/tests/scrapers/mangaplus/test_mangaplus.py +++ b/src/tests/scrapers/mangaplus/test_mangaplus.py @@ -39,6 +39,7 @@ class TestMangaPlusParser(BaseTestClasses.DatabaseTestCase): request_data_award: bytes request_data_hiatus: bytes request_data_all: bytes + request_data_otherschedule: bytes @staticmethod def read_title_detail_data(status: str) -> bytes: @@ -64,6 +65,7 @@ def setUpClass(cls) -> None: cls.request_data_notfound = cls.read_title_detail_data('notfound') cls.request_data_award = cls.read_title_detail_data('award') cls.request_data_hiatus = cls.read_title_detail_data('hiatus') + cls.request_data_otherschedule = cls.read_title_detail_data('otherschedule') cls.request_data_all = cls.read_all_titles_data() def setUp(self) -> None: @@ -190,6 +192,31 @@ def test_scrapes_correctly_for_complete_chapters(self): self.assertMangaServiceDisabled(ms.service_id, ms.title_id) + @responses.activate + def test_scrapes_correctly_for_other_schedule_chapters(self): + ms, chapter_ids = self.setup_with_data(self.request_data_otherschedule) + + self.assertIsNotNone(chapter_ids) + chapter_ids = cast(set[int], chapter_ids) + self.assertEqual(len(chapter_ids), 1) + self.assertEqual(len(responses.calls), 1) + + inserted = self.dbutil.get_chapters(ms.manga_id, ms.service_id, limit=len(chapter_ids)) + + correct = Chapter( + manga_id=ms.manga_id, + service_id=ms.service_id, + title="Bronze Award: METRA-K", + chapter_number=0, + chapter_decimal=None, + release_date=utcfromtimestamp(1699887600), + chapter_identifier='1019511', + group_id=self.group_id + ) + + self.assertDbChaptersEqual(inserted[0], correct) + self.assertMangaServiceDisabled(ms.service_id, ms.title_id) + @responses.activate def test_scrapes_correctly_for_oneshot(self): ms, chapter_ids = self.setup_with_data(self.request_data_oneshot) diff --git a/src/tests/scrapers/mangaplus/title_detailV3-otherschedule.dat b/src/tests/scrapers/mangaplus/title_detailV3-otherschedule.dat new file mode 100644 index 0000000..b61f4af Binary files /dev/null and b/src/tests/scrapers/mangaplus/title_detailV3-otherschedule.dat differ