From b643b2cb773222f166830d52c689da5756c92744 Mon Sep 17 00:00:00 2001 From: jtrzupek Date: Sun, 21 Jun 2026 22:26:50 +0200 Subject: [PATCH] fix(movies): dedup playback sources by target (cross-mirror dupes) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Movie detail showed ~100 playback links (report 41ca1fa4) because the 3 dooplay mirrors (mangoporn/pandamovies/streamporn) each record the SAME hoster embed as a separate row (e.g. luluvid/e/X from all three). Dedup by real target (embed_url/stream_url/page_url) after the priority sort, keeping the highest-priority copy — one verified movie drops 101 -> 58 unique. Co-Authored-By: Claude Opus 4.8 (1M context) --- app/api/movies.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/app/api/movies.py b/app/api/movies.py index c26b3af..ee93b6a 100644 --- a/app/api/movies.py +++ b/app/api/movies.py @@ -251,6 +251,20 @@ def _movie_to_out(session: Session, movie: Movie, *, device_id: str = LEGACY_DEV if has_subhost: pb_rows = [p for p in pb_rows if p.origin not in _MOVIE_LANDING_HIDE] pb_rows = sorted(pb_rows, key=lambda p: _movie_origin_priority(p.origin)) + # Dedup po realnym celu: 3 mirrory dooplay (mangoporn/pandamovies/streamporn) + # zapisują TEN SAM embed hostera jako osobne wiersze (np. luluvid/e/X z każdego + # mirrora) → film miał ~100 linków, z czego ~połowa to ten sam film (bug-report + # 41ca1fa4). Zostawiamy pierwszy = najwyższy priorytet (sort wyżej). + seen_targets: set[str] = set() + deduped: list[MoviePlaybackSource] = [] + for p in pb_rows: + target = (p.embed_url or p.stream_url or p.page_url or "").strip() + if target and target in seen_targets: + continue + if target: + seen_targets.add(target) + deduped.append(p) + pb_rows = deduped playback_sources = [PlaybackSourceOut.model_validate(p) for p in pb_rows] is_fav = session.get(FavoriteMovie, (device_id, movie.id)) is not None