\s*'
+ r'
\s*
(?P[^<]+)
\s*
(?P\d{4})',
+ r'
\s*
(?P[^<]+)
\s*
(?P\d{4})',
re.DOTALL,
)
# Id produktu Adult Empire z adresu okładki, w obu formatach (to ta sama numeracja).
diff --git a/tests/test_dooplay_listing.py b/tests/test_dooplay_listing.py
new file mode 100644
index 0000000..be8d5c8
--- /dev/null
+++ b/tests/test_dooplay_listing.py
@@ -0,0 +1,23 @@
+from app.connectors.dooplay import _LIST_ITEM_RE
+
+
+def _urls(html):
+ return [m.group("url") or m.group("url2") for m in _LIST_ITEM_RE.finditer(html)]
+
+
+def test_mangoporn_class_before_href():
+ # mangoporn od 2026-10: klasa przed href, wczesniej wzorzec nie lapal nic.
+ html = (
+ '
'
+ '
'
+ ''
+ )
+ assert _urls(html) == [
+ "https://mangoporn.net/movies/major-creampie/",
+ "https://mangoporn.net/movies/major-creampie/",
+ ]
+
+
+def test_old_layouts_still_match():
+ assert _urls('x') == ["https://mangoporn.net/movies/old-one/"]
+ assert _urls('
') == ["https://streamporn.li/watch-xxx-a/"]
diff --git a/tests/test_yourdailypornmovies_cards.py b/tests/test_yourdailypornmovies_cards.py
index 9434ce4..85127fd 100644
--- a/tests/test_yourdailypornmovies_cards.py
+++ b/tests/test_yourdailypornmovies_cards.py
@@ -36,3 +36,18 @@ def test_adultempire_id_from_both_poster_formats():
assert (old.group(1) or old.group(2)) == "5128705"
assert (new.group(1) or new.group(2)) == "5136742"
assert _AE_ID_RE.search("https://i.ibb.co/DHDd9pm9/Private-POV.jpg") is None
+
+
+_MULTILINE = (
+ '\n
\n'
+ '

\n
\n'
+ '
\n
Busty Treats Vol. 2
\n
2026 '
+)
+
+
+def test_card_with_newlines_between_tags():
+ # Uklad strony od 2026-10: nowe linie miedzy znacznikami (0 filmow do poprawki).
+ cards = list(_CARD_RE.finditer(_MULTILINE + _MULTILINE.replace("busty-treats-vol-2", "b2")))
+ assert [c.group("title") for c in cards] == ["Busty Treats Vol. 2", "Busty Treats Vol. 2"]
+ assert cards[0].group("url").endswith("/busty-treats-vol-2/")