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) <noreply@anthropic.com>
This commit is contained in:
jtrzupek 2026-05-28 23:23:50 +02:00
parent 81090ca8d2
commit 6ee0516e62

View file

@ -187,6 +187,18 @@ class DooplayConnector(BaseMovieConnector):
) )
return r.text 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( def fetch_movies(
self, self,
*, *,
@ -196,7 +208,8 @@ class DooplayConnector(BaseMovieConnector):
seen = 0 seen = 0
page = 1 page = 1
seen_urls: set[str] = set() 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: try:
urls = list(self._fetch_listing(page)) urls = list(self._fetch_listing(page))
except httpx.HTTPError as e: except httpx.HTTPError as e:
@ -221,6 +234,10 @@ class DooplayConnector(BaseMovieConnector):
if limit is not None and seen >= limit: if limit is not None and seen >= limit:
return return
page += 1 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]: def _fetch_listing(self, page: int) -> Iterator[str]:
path = self._listing_path(page) path = self._listing_path(page)