1
0
mirror of https://github.com/RipMeApp/ripme.git synced 2025-08-28 08:10:11 +02:00

Merge pull request #1024 from cyian-1756/redditFreezeFix

Ripme no longer freezes when ripping from reddit
This commit is contained in:
cyian-1756
2018-10-28 11:55:49 -05:00
committed by GitHub
4 changed files with 60 additions and 10 deletions

View File

@@ -20,7 +20,7 @@ import org.jsoup.HttpStatusException;
import com.rarchives.ripme.ui.RipStatusMessage.STATUS; import com.rarchives.ripme.ui.RipStatusMessage.STATUS;
import com.rarchives.ripme.utils.Utils; import com.rarchives.ripme.utils.Utils;
import com.rarchives.ripme.ripper.AbstractRipper; import static java.lang.Math.toIntExact;
/** /**
* Thread for downloading files. * Thread for downloading files.
@@ -68,6 +68,8 @@ class DownloadFileThread extends Thread {
* Notifies observers upon completion/error/warn. * Notifies observers upon completion/error/warn.
*/ */
public void run() { public void run() {
// First thing we make sure the file name doesn't have any illegal chars in it
saveAs = new File(saveAs.getParentFile().getAbsolutePath() + File.separator + Utils.sanitizeSaveAs(saveAs.getName()));
long fileSize = 0; long fileSize = 0;
int bytesTotal = 0; int bytesTotal = 0;
int bytesDownloaded = 0; int bytesDownloaded = 0;
@@ -215,14 +217,16 @@ class DownloadFileThread extends Thread {
String[] saveAsSplit = saveAs.getName().split("\\."); String[] saveAsSplit = saveAs.getName().split("\\.");
// Get the file extension so when we shorten the file name we don't cut off the file extension // Get the file extension so when we shorten the file name we don't cut off the file extension
String fileExt = saveAsSplit[saveAsSplit.length - 1]; String fileExt = saveAsSplit[saveAsSplit.length - 1];
// The max limit for filenames on Linux with Ext3/4 is 255 bytes, on windows it's 256 chars so rather than // The max limit for filenames on Linux with Ext3/4 is 255 bytes
// bother with code with both platforms we just cut the file name down to 254 chars
logger.info(saveAs.getName().substring(0, 254 - fileExt.length()) + fileExt); logger.info(saveAs.getName().substring(0, 254 - fileExt.length()) + fileExt);
String filename = saveAs.getName().substring(0, 254 - fileExt.length()) + "." + fileExt; String filename = saveAs.getName().substring(0, 254 - fileExt.length()) + "." + fileExt;
// We can't just use the new file name as the saveAs because the file name doesn't include the // We can't just use the new file name as the saveAs because the file name doesn't include the
// users save path, so we get the user save path from the old saveAs // users save path, so we get the user save path from the old saveAs
saveAs = new File(saveAs.getParentFile().getAbsolutePath() + "/" + filename); saveAs = new File(saveAs.getParentFile().getAbsolutePath() + File.separator + filename);
fos = new FileOutputStream(saveAs); fos = new FileOutputStream(saveAs);
} else if (saveAs.getAbsolutePath().length() > 259 && Utils.isWindows()) {
// This if is for when the file path has gone above 260 chars which windows does not allow
fos = new FileOutputStream(Utils.shortenSaveAsWindows(saveAs.getParentFile().getPath(), saveAs.getName()));
} }
} }
} }

View File

@@ -249,7 +249,10 @@ public class RedditRipper extends AlbumRipper {
if (url.contains("v.redd.it")) { if (url.contains("v.redd.it")) {
String savePath = this.workingDir + File.separator; String savePath = this.workingDir + File.separator;
savePath += id + "-" + url.split("/")[3] + title + ".mp4"; savePath += id + "-" + url.split("/")[3] + title + ".mp4";
addURLToDownload(parseRedditVideoMPD(urls.get(0).toExternalForm()), new File(savePath)); URL urlToDownload = parseRedditVideoMPD(urls.get(0).toExternalForm());
if (urlToDownload != null) {
addURLToDownload(urlToDownload, new File(savePath));
}
} }
else { else {
addURLToDownload(urls.get(0), id + title, "", theUrl, null); addURLToDownload(urls.get(0), id + title, "", theUrl, null);

View File

@@ -11,10 +11,7 @@ import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip; import javax.sound.sampled.Clip;
import javax.sound.sampled.Line; import javax.sound.sampled.Line;
import javax.sound.sampled.LineEvent; import javax.sound.sampled.LineEvent;
import java.io.File; import java.io.*;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Array; import java.lang.reflect.Array;
import java.lang.reflect.Constructor; import java.lang.reflect.Constructor;
import java.net.URISyntaxException; import java.net.URISyntaxException;
@@ -33,6 +30,8 @@ import java.util.ResourceBundle;
import java.util.jar.JarEntry; import java.util.jar.JarEntry;
import java.util.jar.JarFile; import java.util.jar.JarFile;
import static java.lang.Math.toIntExact;
/** /**
* Common utility functions used in various places throughout the project. * Common utility functions used in various places throughout the project.
*/ */
@@ -179,7 +178,7 @@ public class Utils {
/** /**
* Determines if your current system is a Windows system. * Determines if your current system is a Windows system.
*/ */
private static boolean isWindows() { public static boolean isWindows() {
return OS.contains("win"); return OS.contains("win");
} }
@@ -773,4 +772,35 @@ public class Utils {
return false; return false;
} }
public static String sanitizeSaveAs(String fileNameToSan) {
return fileNameToSan.replaceAll("[\\\\/:*?\"<>|]", "_");
}
public static File shortenSaveAsWindows(String ripsDirPath, String fileName) throws FileNotFoundException {
// int ripDirLength = ripsDirPath.length();
// int maxFileNameLength = 260 - ripDirLength;
// LOGGER.info(maxFileNameLength);
LOGGER.error("The filename " + fileName + " is to long to be saved on this file system.");
LOGGER.info("Shortening filename");
String fullPath = ripsDirPath + File.separator + fileName;
// How long the path without the file name is
int pathLength = ripsDirPath.length();
int fileNameLength = fileName.length();
LOGGER.info(pathLength);
LOGGER.info(fileNameLength);
if (pathLength == 260) {
// We've reached the max length, there's nothing more we can do
throw new FileNotFoundException("File path is too long for this OS");
}
String[] saveAsSplit = fileName.split("\\.");
// Get the file extension so when we shorten the file name we don't cut off the file extension
String fileExt = saveAsSplit[saveAsSplit.length - 1];
// The max limit for paths on Windows is 260 chars
LOGGER.info(fullPath.substring(0, 260 - pathLength - fileExt.length() + 1) + "." + fileExt);
fullPath = fullPath.substring(0, 260 - pathLength - fileExt.length() + 1) + "." + fileExt;
LOGGER.info(fullPath);
LOGGER.info(fullPath.length());
return new File(fullPath);
}
} }

View File

@@ -3,6 +3,8 @@ package com.rarchives.ripme.tst;
import junit.framework.TestCase; import junit.framework.TestCase;
import com.rarchives.ripme.utils.Utils; import com.rarchives.ripme.utils.Utils;
import java.io.File;
import java.io.FileNotFoundException;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
@@ -44,4 +46,15 @@ public class UtilsTest extends TestCase {
assertEquals(Arrays.asList(" is a "), Utils.between("This is a test", "This", "test")); assertEquals(Arrays.asList(" is a "), Utils.between("This is a test", "This", "test"));
} }
public void testShortenFileNameWindows() throws FileNotFoundException {
String filename = "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff.png";
// Test filename shortening for windows
File f = Utils.shortenSaveAsWindows("D:/rips/test/reddit/deep", filename );
assertEquals(new File("D:/rips/test/reddit/deep/fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff.png"), f);
}
public void testSanitizeSaveAs() {
assertEquals("This is a _ !__ test", Utils.sanitizeSaveAs("This is a \" !<? test"));
}
} }