From 216a91c73c6aa4df373979ed088ff4f75d9abb62 Mon Sep 17 00:00:00 2001 From: MetaPrime Date: Thu, 2 Jan 2025 03:48:07 -0800 Subject: [PATCH 1/6] Fix XvideosRipper: update URL pattern to match current URL scheme. Also, extract patterns to be compiled once in static members to avoid repeating the match patterns and make the code read a little more clearly. Improve album name for the video case. --- .../ripme/ripper/rippers/XvideosRipper.java | 39 ++++++++++++------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/rarchives/ripme/ripper/rippers/XvideosRipper.java b/src/main/java/com/rarchives/ripme/ripper/rippers/XvideosRipper.java index 6f591d18b..f73d1d462 100644 --- a/src/main/java/com/rarchives/ripme/ripper/rippers/XvideosRipper.java +++ b/src/main/java/com/rarchives/ripme/ripper/rippers/XvideosRipper.java @@ -9,20 +9,26 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; - import com.rarchives.ripme.ripper.AbstractSingleFileRipper; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; -import com.rarchives.ripme.utils.Http; - public class XvideosRipper extends AbstractSingleFileRipper { + private static final Logger logger = LogManager.getLogger(XvideosRipper.class); + private static final String HOST = "xvideos"; + private static final Pattern videoPattern = Pattern.compile("^https?://[wm.]*xvideos\\.com/video([0-9]+|\\.[^/]*)(.*)$"); + private static final Pattern albumPattern = Pattern.compile("^https?://[wm.]*xvideos\\.com/profiles/([a-zA-Z0-9_-]+)/photos/(\\d+)/([a-zA-Z0-9_-]+)$"); + public XvideosRipper(URL url) throws IOException { super(url); + logger.debug("Attempting to initialize XvideosRipper video from " + url); } @Override @@ -37,12 +43,13 @@ public String getDomain() { @Override public boolean canRip(URL url) { - Pattern p = Pattern.compile("^https?://[wm.]*xvideos\\.com/video[0-9]+.*$"); + logger.debug("Checking if XvideosRipper can rip " + url); + Pattern p = videoPattern; Matcher m = p.matcher(url.toExternalForm()); if (m.matches()) { return true; } - p = Pattern.compile("^https?://[wm.]*xvideos\\.com/profiles/[a-zA-Z0-9_-]+/photos/\\d+/[a-zA-Z0-9_-]+$"); + p = albumPattern; m = p.matcher(url.toExternalForm()); if (m.matches()) { return true; @@ -52,15 +59,15 @@ public boolean canRip(URL url) { @Override public String getGID(URL url) throws MalformedURLException { - Pattern p = Pattern.compile("^https?://[wm.]*xvideos\\.com/video([0-9]+).*$"); + Pattern p = videoPattern; Matcher m = p.matcher(url.toExternalForm()); if (m.matches()) { return m.group(1); } - p = Pattern.compile("^https?://[wm.]*xvideos\\.com/profiles/[a-zA-Z0-9_-]+/photos/(\\d+)/[a-zA-Z0-9_-]+$"); + p = albumPattern; m = p.matcher(url.toExternalForm()); if (m.matches()) { - return m.group(1); + return m.group(2); } throw new MalformedURLException( @@ -72,7 +79,7 @@ public String getGID(URL url) throws MalformedURLException { @Override public List getURLsFromPage(Document doc) { List results = new ArrayList<>(); - Pattern p = Pattern.compile("^https?://[wm.]*xvideos\\.com/video([0-9]+).*$"); + Pattern p = videoPattern; Matcher m = p.matcher(url.toExternalForm()); if (m.matches()) { Elements scripts = doc.select("script"); @@ -106,12 +113,18 @@ public void downloadURL(URL url, int index) { @Override public String getAlbumTitle(URL url) throws MalformedURLException, URISyntaxException { - Pattern p = Pattern.compile("^https?://[wm.]*xvideos\\.com/profiles/([a-zA-Z0-9_-]+)/photos/(\\d+)/([a-zA-Z0-9_-]+)$"); + Pattern p = albumPattern; Matcher m = p.matcher(url.toExternalForm()); if (m.matches()) { return getHost() + "_" + m.group(1) + "_" + m.group(3) + "_" + m.group(2); - } else { - return super.getAlbumTitle(url); } + + p = videoPattern; + m = p.matcher(url.toExternalForm()); + if (m.matches()) { + return getHost() + "_" + m.group(1) + "_" + m.group(2); + } + + return super.getAlbumTitle(url); } -} \ No newline at end of file +} From c9460760e862074730b1d883fc83956292df314d Mon Sep 17 00:00:00 2001 From: MetaPrime Date: Thu, 2 Jan 2025 04:40:44 -0800 Subject: [PATCH 2/6] Update XvideosRipper for more kinds of albums --- .../com/rarchives/ripme/ripper/rippers/XvideosRipper.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/rarchives/ripme/ripper/rippers/XvideosRipper.java b/src/main/java/com/rarchives/ripme/ripper/rippers/XvideosRipper.java index f73d1d462..3620a52ed 100644 --- a/src/main/java/com/rarchives/ripme/ripper/rippers/XvideosRipper.java +++ b/src/main/java/com/rarchives/ripme/ripper/rippers/XvideosRipper.java @@ -24,7 +24,7 @@ public class XvideosRipper extends AbstractSingleFileRipper { private static final String HOST = "xvideos"; private static final Pattern videoPattern = Pattern.compile("^https?://[wm.]*xvideos\\.com/video([0-9]+|\\.[^/]*)(.*)$"); - private static final Pattern albumPattern = Pattern.compile("^https?://[wm.]*xvideos\\.com/profiles/([a-zA-Z0-9_-]+)/photos/(\\d+)/([a-zA-Z0-9_-]+)$"); + private static final Pattern albumPattern = Pattern.compile("^https?://[wm.]*xvideos\\.com/(profiles|amateurs)/([a-zA-Z0-9_-]+)/photos/(\\d+)/([a-zA-Z0-9_-]+)$"); public XvideosRipper(URL url) throws IOException { super(url); @@ -67,7 +67,7 @@ public String getGID(URL url) throws MalformedURLException { p = albumPattern; m = p.matcher(url.toExternalForm()); if (m.matches()) { - return m.group(2); + return m.group(3); } throw new MalformedURLException( @@ -116,7 +116,7 @@ public String getAlbumTitle(URL url) throws MalformedURLException, URISyntaxExce Pattern p = albumPattern; Matcher m = p.matcher(url.toExternalForm()); if (m.matches()) { - return getHost() + "_" + m.group(1) + "_" + m.group(3) + "_" + m.group(2); + return getHost() + "_" + m.group(1) + "_" + m.group(2) + "_" + m.group(4) + "_" + m.group(3); } p = videoPattern; From ab5effd062ba243f0c8267fbb7fcbe2d1c00a943 Mon Sep 17 00:00:00 2001 From: MetaPrime Date: Thu, 2 Jan 2025 04:45:27 -0800 Subject: [PATCH 3/6] Clean up --- .../com/rarchives/ripme/ripper/rippers/XvideosRipper.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main/java/com/rarchives/ripme/ripper/rippers/XvideosRipper.java b/src/main/java/com/rarchives/ripme/ripper/rippers/XvideosRipper.java index 3620a52ed..fa064959b 100644 --- a/src/main/java/com/rarchives/ripme/ripper/rippers/XvideosRipper.java +++ b/src/main/java/com/rarchives/ripme/ripper/rippers/XvideosRipper.java @@ -11,16 +11,12 @@ import com.rarchives.ripme.ripper.AbstractSingleFileRipper; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; public class XvideosRipper extends AbstractSingleFileRipper { - private static final Logger logger = LogManager.getLogger(XvideosRipper.class); - private static final String HOST = "xvideos"; private static final Pattern videoPattern = Pattern.compile("^https?://[wm.]*xvideos\\.com/video([0-9]+|\\.[^/]*)(.*)$"); @@ -28,7 +24,6 @@ public class XvideosRipper extends AbstractSingleFileRipper { public XvideosRipper(URL url) throws IOException { super(url); - logger.debug("Attempting to initialize XvideosRipper video from " + url); } @Override @@ -43,7 +38,6 @@ public String getDomain() { @Override public boolean canRip(URL url) { - logger.debug("Checking if XvideosRipper can rip " + url); Pattern p = videoPattern; Matcher m = p.matcher(url.toExternalForm()); if (m.matches()) { From cffdec9b0af2d178cba213be9a4cdf64f799d549 Mon Sep 17 00:00:00 2001 From: MetaPrime Date: Thu, 2 Jan 2025 04:48:02 -0800 Subject: [PATCH 4/6] Update pattern again --- .../ripme/ripper/rippers/XvideosRipper.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/rarchives/ripme/ripper/rippers/XvideosRipper.java b/src/main/java/com/rarchives/ripme/ripper/rippers/XvideosRipper.java index fa064959b..5c89b6c3f 100644 --- a/src/main/java/com/rarchives/ripme/ripper/rippers/XvideosRipper.java +++ b/src/main/java/com/rarchives/ripme/ripper/rippers/XvideosRipper.java @@ -19,7 +19,7 @@ public class XvideosRipper extends AbstractSingleFileRipper { private static final String HOST = "xvideos"; - private static final Pattern videoPattern = Pattern.compile("^https?://[wm.]*xvideos\\.com/video([0-9]+|\\.[^/]*)(.*)$"); + private static final Pattern videoPattern = Pattern.compile("^https?://[wm.]*xvideos\\.com/video\\.([^/]*)(.*)$"); private static final Pattern albumPattern = Pattern.compile("^https?://[wm.]*xvideos\\.com/(profiles|amateurs)/([a-zA-Z0-9_-]+)/photos/(\\d+)/([a-zA-Z0-9_-]+)$"); public XvideosRipper(URL url) throws IOException { @@ -107,11 +107,8 @@ public void downloadURL(URL url, int index) { @Override public String getAlbumTitle(URL url) throws MalformedURLException, URISyntaxException { - Pattern p = albumPattern; - Matcher m = p.matcher(url.toExternalForm()); - if (m.matches()) { - return getHost() + "_" + m.group(1) + "_" + m.group(2) + "_" + m.group(4) + "_" + m.group(3); - } + Pattern p; + Matcher m; p = videoPattern; m = p.matcher(url.toExternalForm()); @@ -119,6 +116,12 @@ public String getAlbumTitle(URL url) throws MalformedURLException, URISyntaxExce return getHost() + "_" + m.group(1) + "_" + m.group(2); } + p = albumPattern; + m = p.matcher(url.toExternalForm()); + if (m.matches()) { + return getHost() + "_" + m.group(1) + "_" + m.group(2) + "_" + m.group(4) + "_" + m.group(3); + } + return super.getAlbumTitle(url); } } From 9b2ddec207aa7b84a7d78d3b172f82bc9cbaaf8b Mon Sep 17 00:00:00 2001 From: MetaPrime Date: Thu, 2 Jan 2025 04:38:57 -0800 Subject: [PATCH 5/6] Updated XvideosRipperTest for new URL format --- .../ripme/tst/ripper/rippers/XvideosRipperTest.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/rarchives/ripme/tst/ripper/rippers/XvideosRipperTest.java b/src/test/java/com/rarchives/ripme/tst/ripper/rippers/XvideosRipperTest.java index cde9d1119..aae559974 100644 --- a/src/test/java/com/rarchives/ripme/tst/ripper/rippers/XvideosRipperTest.java +++ b/src/test/java/com/rarchives/ripme/tst/ripper/rippers/XvideosRipperTest.java @@ -9,9 +9,17 @@ public class XvideosRipperTest extends RippersTest { @Test - public void testXhamsterAlbum1() throws IOException, URISyntaxException { - XvideosRipper ripper = new XvideosRipper(new URI("https://www.xvideos.com/video23515878/dee_s_pool_toys").toURL()); + public void testXvideosVideo1() throws IOException, URISyntaxException { + // This format is obsolete + // XvideosRipper ripper = new XvideosRipper(new URI("https://www.xvideos.com/video23515878/dee_s_pool_toys").toURL()); + // The website now redirects that video to this page + XvideosRipper ripper = new XvideosRipper(new URI("https://www.xvideos.com/video.hppdiepcbfe/dee_s_pool_toys").toURL()); testRipper(ripper); } + @Test + public void testXvideosVideo2() throws IOException, URISyntaxException { + XvideosRipper ripper = new XvideosRipper(new URI("https://www.xvideos.com/video.ufkmptkc4ae/big_tit_step_sis_made_me_cum_inside_her").toURL()); + testRipper(ripper); + } } From 85f85df98081ec74410e45d555709a0b22111dcc Mon Sep 17 00:00:00 2001 From: MetaPrime Date: Thu, 2 Jan 2025 04:50:38 -0800 Subject: [PATCH 6/6] Add tests for amateurs and profiles albums --- .../ripme/tst/ripper/rippers/XvideosRipperTest.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/test/java/com/rarchives/ripme/tst/ripper/rippers/XvideosRipperTest.java b/src/test/java/com/rarchives/ripme/tst/ripper/rippers/XvideosRipperTest.java index aae559974..63d383175 100644 --- a/src/test/java/com/rarchives/ripme/tst/ripper/rippers/XvideosRipperTest.java +++ b/src/test/java/com/rarchives/ripme/tst/ripper/rippers/XvideosRipperTest.java @@ -22,4 +22,16 @@ public void testXvideosVideo2() throws IOException, URISyntaxException { XvideosRipper ripper = new XvideosRipper(new URI("https://www.xvideos.com/video.ufkmptkc4ae/big_tit_step_sis_made_me_cum_inside_her").toURL()); testRipper(ripper); } + + @Test + public void testXvideosAmateursAlbum() throws IOException, URISyntaxException { + XvideosRipper ripper = new XvideosRipper(new URI("https://www.xvideos.com/amateurs/nikibeee/photos/2476083/lanikki").toURL()); + testRipper(ripper); + } + + @Test + public void testXvideosProfilesAlbum() throws IOException, URISyntaxException { + XvideosRipper ripper = new XvideosRipper(new URI("https://www.xvideos.com/profiles/dmthate/photos/8259625/sexy").toURL()); + testRipper(ripper); + } }