From 6ee0516e62d022f83b9d3595aecfcade29054d99 Mon Sep 17 00:00:00 2001 From: jtrzupek Date: Thu, 28 May 2026 23:23:50 +0200 Subject: [PATCH] fix(connectors/dooplay): max_pages cap to unblock movie ingest queue Bug-report 2026-05-28 ("od wczoraj nie ma nowych filmow"). DooplayConnector .fetch_movies mial `while True` po stronach bez bound; streamporn (>2k filmow) wisial godzinami az do dailowego killa schedulera, blokujac kolejke mangoporn + pandamovies. Watermark zamrozony, dziennie 0 nowych filmow. Fix: cap _MAX_PAGES_DELTA=3 (since-driven runs, ~144 najnowszych pozycji) i _MAX_PAGES_FULL=50 (full backfill gdy since=None). Wczesniejsza proba filtrowania przez release_date odrzucona - release_date to data wydania filmu (np. 2013), nie data uploadu na strone, wiec sortowanie listing nie matchuje. Po deployu manualne re-run: streamporn 144/46s, pandamovies 120/47s, mangoporn 108 z 72 NEW filmow w 58s. Scheduler queue unblocked. Co-Authored-By: Claude Opus 4.7 (1M context) --- app/connectors/dooplay.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) 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)