diff --git a/app/connectors/dooplay.py b/app/connectors/dooplay.py index f1af4b5..3d2cb62 100644 --- a/app/connectors/dooplay.py +++ b/app/connectors/dooplay.py @@ -187,6 +187,18 @@ class DooplayConnector(BaseMovieConnector): ) return r.text + # Bezpiecznik — dooplay listing potrafi mieć tysiące stron (streamporn.nl ma + # >2k filmów). Bez tego ingest wisi godzinami, jest killowany przy restartcie + # schedulera, blokując kolejne connectory w queue (bug-report 2026-05-28: "od + # wczoraj nie ma nowych filmów" — streamporn wisiał od 5-24, blokował + # mangoporn + pandamovies). Listing jest sortowany po dacie uploadu (NIE + # release_date filmu — release może być z 2013 a upload z dziś), ale upload + # date nie jest w markupie, więc filtrowanie po `since` przez release_date + # nie działa. Pragmatyczny cap stron: 3 dla delta (≈150 nowych pozycji/dzień + # to znacznie powyżej realnego upload-rate), 50 dla full ingestu (`since=None`). + _MAX_PAGES_DELTA = 3 + _MAX_PAGES_FULL = 50 + def fetch_movies( self, *, @@ -196,7 +208,8 @@ class DooplayConnector(BaseMovieConnector): seen = 0 page = 1 seen_urls: set[str] = set() - while True: + max_pages = self._MAX_PAGES_DELTA if since is not None else self._MAX_PAGES_FULL + while page <= max_pages: try: urls = list(self._fetch_listing(page)) except httpx.HTTPError as e: @@ -221,6 +234,10 @@ class DooplayConnector(BaseMovieConnector): if limit is not None and seen >= limit: return page += 1 + log.info( + "%s: hit max_pages=%d cap (delta=%s), stopping after seen=%d", + self.name, max_pages, since is not None, seen, + ) def _fetch_listing(self, page: int) -> Iterator[str]: path = self._listing_path(page)