This commit is contained in:
Gaboso 2018-06-02 09:51:17 -04:00
commit 3529d679ff
5 changed files with 150 additions and 82 deletions

View File

@ -1,5 +1,5 @@
{ {
"currentHash": "689d4a5b270b62be7defbdbb696de79c8a223ab7497391e1d610eaf1cb860510", "currentHash": "f6e1e6c931abfbeffdd37dabb65f83e4335ca11ccc017f31e1d835ee6e6bec7a",
"changeList": [ "changeList": [
"1.7.50: Ripme now checks file hash before running update; fixed update bug which cased ripme to report every update as new", "1.7.50: Ripme now checks file hash before running update; fixed update bug which cased ripme to report every update as new",
"1.7.49: Fixed -n flag; Added ability to change locale at runtime and from gui; Update kr_KR translation; Removed support for tnbtu.com; No longer writes url to url_history file is save urls only is checked", "1.7.49: Fixed -n flag; Added ability to change locale at runtime and from gui; Update kr_KR translation; Removed support for tnbtu.com; No longer writes url to url_history file is save urls only is checked",

View File

@ -241,6 +241,10 @@ public class App {
ripURL(url, !cl.hasOption("n")); ripURL(url, !cl.hasOption("n"));
} }
if (cl.hasOption('j')) {
UpdateUtils.updateProgramCLI();
}
} }
/** /**
@ -290,6 +294,7 @@ public class App {
opts.addOption("v", "version", false, "Show current version"); opts.addOption("v", "version", false, "Show current version");
opts.addOption("s", "socks-server", true, "Use socks server ([user:password]@host[:port])"); opts.addOption("s", "socks-server", true, "Use socks server ([user:password]@host[:port])");
opts.addOption("p", "proxy-server", true, "Use HTTP Proxy server ([user:password]@host[:port])"); opts.addOption("p", "proxy-server", true, "Use HTTP Proxy server ([user:password]@host[:port])");
opts.addOption("j", "update", false, "Update ripme");
return opts; return opts;
} }

View File

@ -23,8 +23,8 @@ import com.rarchives.ripme.utils.Utils;
public class TumblrRipper extends AlbumRipper { public class TumblrRipper extends AlbumRipper {
private static final String DOMAIN = "tumblr.com", private static final String DOMAIN = "tumblr.com",
HOST = "tumblr", HOST = "tumblr",
IMAGE_PATTERN = "([^\\s]+(\\.(?i)(jpg|png|gif|bmp))$)"; IMAGE_PATTERN = "([^\\s]+(\\.(?i)(jpg|png|gif|bmp))$)";
private enum ALBUM_TYPE { private enum ALBUM_TYPE {
SUBDOMAIN, SUBDOMAIN,
@ -37,11 +37,8 @@ public class TumblrRipper extends AlbumRipper {
private static final String TUMBLR_AUTH_CONFIG_KEY = "tumblr.auth"; private static final String TUMBLR_AUTH_CONFIG_KEY = "tumblr.auth";
private static boolean useDefaultApiKey = false; // fall-back for bad user-specified key private static boolean useDefaultApiKey = false; // fall-back for bad user-specified key
private static final List<String> APIKEYS = Arrays.asList("JFNLu3CbINQjRdUvZibXW9VpSEVYYtiPJ86o8YmvgLZIoKyuNX", private static String API_KEY = null;
"FQrwZMCxVnzonv90rgNUJcAk4FpnoS0mYuSuGYqIpM2cFgp9L4",
"qpdkY6nMknksfvYAhf2xIHp0iNRLkMlcWShxqzXyFJRxIsZ1Zz");
private static int genNum = new Random().nextInt(APIKEYS.size());
private static final String API_KEY = APIKEYS.get(genNum); // Select random API key from APIKEYS
/** /**
* Gets the API key. * Gets the API key.
@ -49,6 +46,10 @@ public class TumblrRipper extends AlbumRipper {
* @return Tumblr API key * @return Tumblr API key
*/ */
public static String getApiKey() { public static String getApiKey() {
if (API_KEY == null) {
API_KEY = pickRandomApiKey();
}
if (useDefaultApiKey || Utils.getConfigString(TUMBLR_AUTH_CONFIG_KEY, "JFNLu3CbINQjRdUvZibXW9VpSEVYYtiPJ86o8YmvgLZIoKyuNX").equals("JFNLu3CbINQjRdUvZibXW9VpSEVYYtiPJ86o8YmvgLZIoKyuNX")) { if (useDefaultApiKey || Utils.getConfigString(TUMBLR_AUTH_CONFIG_KEY, "JFNLu3CbINQjRdUvZibXW9VpSEVYYtiPJ86o8YmvgLZIoKyuNX").equals("JFNLu3CbINQjRdUvZibXW9VpSEVYYtiPJ86o8YmvgLZIoKyuNX")) {
logger.info("Using api key: " + API_KEY); logger.info("Using api key: " + API_KEY);
return API_KEY; return API_KEY;
@ -60,9 +61,19 @@ public class TumblrRipper extends AlbumRipper {
} }
private static String pickRandomApiKey() {
final List<String> APIKEYS = Arrays.asList("JFNLu3CbINQjRdUvZibXW9VpSEVYYtiPJ86o8YmvgLZIoKyuNX",
"FQrwZMCxVnzonv90rgNUJcAk4FpnoS0mYuSuGYqIpM2cFgp9L4",
"qpdkY6nMknksfvYAhf2xIHp0iNRLkMlcWShxqzXyFJRxIsZ1Zz");
int genNum = new Random().nextInt(APIKEYS.size());
logger.info(genNum);
final String API_KEY = APIKEYS.get(genNum); // Select random API key from APIKEYS
return API_KEY;
}
public TumblrRipper(URL url) throws IOException { public TumblrRipper(URL url) throws IOException {
super(url); super(url);
if (API_KEY == null) { if (getApiKey() == null) {
throw new IOException("Could not find tumblr authentication key in configuration"); throw new IOException("Could not find tumblr authentication key in configuration");
} }
} }
@ -100,7 +111,7 @@ public class TumblrRipper extends AlbumRipper {
checkURL += "/info?api_key=" + getApiKey(); checkURL += "/info?api_key=" + getApiKey();
try { try {
JSONObject json = Http.url(checkURL) JSONObject json = Http.url(checkURL)
.getJSON(); .getJSON();
int status = json.getJSONObject("meta").getInt("status"); int status = json.getJSONObject("meta").getInt("status");
return status == 200; return status == 200;
} catch (IOException e) { } catch (IOException e) {
@ -245,11 +256,11 @@ public class TumblrRipper extends AlbumRipper {
} }
} else if (post.has("video_url")) { } else if (post.has("video_url")) {
try { try {
fileURL = new URL(post.getString("video_url").replaceAll("http", "https")); fileURL = new URL(post.getString("video_url").replaceAll("http:", "https:"));
addURLToDownload(fileURL); addURLToDownload(fileURL);
} catch (Exception e) { } catch (Exception e) {
logger.error("[!] Error while parsing video in " + post, e); logger.error("[!] Error while parsing video in " + post, e);
return true; return true;
} }
} }
if (albumType == ALBUM_TYPE.POST) { if (albumType == ALBUM_TYPE.POST) {
@ -263,24 +274,24 @@ public class TumblrRipper extends AlbumRipper {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
if (albumType == ALBUM_TYPE.POST) { if (albumType == ALBUM_TYPE.POST) {
sb.append("http://api.tumblr.com/v2/blog/") sb.append("http://api.tumblr.com/v2/blog/")
.append(subdomain) .append(subdomain)
.append("/posts?id=") .append("/posts?id=")
.append(postNumber) .append(postNumber)
.append("&api_key=") .append("&api_key=")
.append(getApiKey()); .append(getApiKey());
return sb.toString(); return sb.toString();
} }
sb.append("http://api.tumblr.com/v2/blog/") sb.append("http://api.tumblr.com/v2/blog/")
.append(subdomain) .append(subdomain)
.append("/posts/") .append("/posts/")
.append(mediaType) .append(mediaType)
.append("?api_key=") .append("?api_key=")
.append(getApiKey()) .append(getApiKey())
.append("&offset=") .append("&offset=")
.append(offset); .append(offset);
if (albumType == ALBUM_TYPE.TAG) { if (albumType == ALBUM_TYPE.TAG) {
sb.append("&tag=") sb.append("&tag=")
.append(tagName); .append(tagName);
} }
return sb.toString(); return sb.toString();
} }

View File

@ -198,7 +198,7 @@ public final class MainWindow implements Runnable, RipStatusHandler {
if (!configurationPanel.isVisible()) { if (!configurationPanel.isVisible()) {
optionConfiguration.doClick(); optionConfiguration.doClick();
} }
Runnable r = () -> UpdateUtils.updateProgram(configUpdateLabel); Runnable r = () -> UpdateUtils.updateProgramGUI(configUpdateLabel);
new Thread(r).start(); new Thread(r).start();
} }
@ -786,7 +786,7 @@ public final class MainWindow implements Runnable, RipStatusHandler {
} }
}); });
configUpdateButton.addActionListener(arg0 -> { configUpdateButton.addActionListener(arg0 -> {
Thread t = new Thread(() -> UpdateUtils.updateProgram(configUpdateLabel)); Thread t = new Thread(() -> UpdateUtils.updateProgramGUI(configUpdateLabel));
t.start(); t.start();
}); });
configLogLevelCombobox.addActionListener(arg0 -> { configLogLevelCombobox.addActionListener(arg0 -> {

View File

@ -39,8 +39,57 @@ public class UpdateUtils {
} }
return thisVersion; return thisVersion;
} }
public static void updateProgramCLI() {
logger.info("Checking for update...");
public static void updateProgram(JLabel configUpdateLabel) { Document doc = null;
try {
logger.debug("Retrieving " + UpdateUtils.updateJsonURL);
doc = Jsoup.connect(UpdateUtils.updateJsonURL)
.timeout(10 * 1000)
.ignoreContentType(true)
.get();
} catch (IOException e) {
logger.error("Error while fetching update: ", e);
JOptionPane.showMessageDialog(null,
"<html><font color=\"red\">Error while fetching update: " + e.getMessage() + "</font></html>",
"RipMe Updater",
JOptionPane.ERROR_MESSAGE);
return;
} finally {
logger.info("Current version: " + getThisJarVersion());
}
String jsonString = doc.body().html().replaceAll("&quot;", "\"");
ripmeJson = new JSONObject(jsonString);
JSONArray jsonChangeList = ripmeJson.getJSONArray("changeList");
StringBuilder changeList = new StringBuilder();
for (int i = 0; i < jsonChangeList.length(); i++) {
String change = jsonChangeList.getString(i);
if (change.startsWith(UpdateUtils.getThisJarVersion() + ":")) {
break;
}
changeList.append("<br> + ").append(change);
}
String latestVersion = ripmeJson.getString("latestVersion");
if (UpdateUtils.isNewerVersion(latestVersion)) {
logger.info("Found newer version: " + latestVersion);
logger.info("Downloading new version...");
logger.info("New version found, downloading...");
try {
UpdateUtils.downloadJarAndLaunch(getUpdateJarURL(latestVersion), false);
} catch (IOException e) {
logger.error("Error while updating: ", e);
}
} else {
logger.debug("This version (" + UpdateUtils.getThisJarVersion() +
") is the same or newer than the website's version (" + latestVersion + ")");
logger.info("v" + UpdateUtils.getThisJarVersion() + " is the latest version");
logger.debug("Running latest version: " + UpdateUtils.getThisJarVersion());
}
}
public static void updateProgramGUI(JLabel configUpdateLabel) {
configUpdateLabel.setText("Checking for update..."); configUpdateLabel.setText("Checking for update...");
Document doc = null; Document doc = null;
@ -90,7 +139,7 @@ public class UpdateUtils {
configUpdateLabel.setText("<html><font color=\"green\">Downloading new version...</font></html>"); configUpdateLabel.setText("<html><font color=\"green\">Downloading new version...</font></html>");
logger.info("New version found, downloading..."); logger.info("New version found, downloading...");
try { try {
UpdateUtils.downloadJarAndLaunch(getUpdateJarURL(latestVersion)); UpdateUtils.downloadJarAndLaunch(getUpdateJarURL(latestVersion), true);
} catch (IOException e) { } catch (IOException e) {
JOptionPane.showMessageDialog(null, JOptionPane.showMessageDialog(null,
"Error while updating: " + e.getMessage(), "Error while updating: " + e.getMessage(),
@ -166,7 +215,7 @@ public class UpdateUtils {
return null; return null;
} }
private static void downloadJarAndLaunch(String updateJarURL) private static void downloadJarAndLaunch(String updateJarURL, Boolean shouldLaunch)
throws IOException { throws IOException {
Response response; Response response;
response = Jsoup.connect(updateJarURL) response = Jsoup.connect(updateJarURL)
@ -190,58 +239,61 @@ public class UpdateUtils {
} else { } else {
logger.info("Hash is good"); logger.info("Hash is good");
} }
if (shouldLaunch) {
// Setup updater script
final String batchFile, script;
final String[] batchExec;
String os = System.getProperty("os.name").toLowerCase();
if (os.contains("win")) {
// Windows
batchFile = "update_ripme.bat";
String batchPath = new File(batchFile).getAbsolutePath();
script = "@echo off\r\n"
+ "timeout 1" + "\r\n"
+ "copy " + updateFileName + " " + mainFileName + "\r\n"
+ "del " + updateFileName + "\r\n"
+ "ripme.jar" + "\r\n"
+ "del " + batchPath + "\r\n";
batchExec = new String[]{batchPath};
// Setup updater script } else {
final String batchFile, script; // Mac / Linux
final String[] batchExec; batchFile = "update_ripme.sh";
String os = System.getProperty("os.name").toLowerCase(); String batchPath = new File(batchFile).getAbsolutePath();
if (os.contains("win")) { script = "#!/bin/sh\n"
// Windows + "sleep 1" + "\n"
batchFile = "update_ripme.bat"; + "cd " + new File(mainFileName).getAbsoluteFile().getParent() + "\n"
String batchPath = new File(batchFile).getAbsolutePath(); + "cp -f " + updateFileName + " " + mainFileName + "\n"
script = "@echo off\r\n" + "rm -f " + updateFileName + "\n"
+ "timeout 1" + "\r\n" + "java -jar \"" + new File(mainFileName).getAbsolutePath() + "\" &\n"
+ "copy " + updateFileName + " " + mainFileName + "\r\n" + "sleep 1" + "\n"
+ "del " + updateFileName + "\r\n" + "rm -f " + batchPath + "\n";
+ "ripme.jar" + "\r\n" batchExec = new String[]{"sh", batchPath};
+ "del " + batchPath + "\r\n";
batchExec = new String[] { batchPath };
}
else {
// Mac / Linux
batchFile = "update_ripme.sh";
String batchPath = new File(batchFile).getAbsolutePath();
script = "#!/bin/sh\n"
+ "sleep 1" + "\n"
+ "cd " + new File(mainFileName).getAbsoluteFile().getParent() + "\n"
+ "cp -f " + updateFileName + " " + mainFileName + "\n"
+ "rm -f " + updateFileName + "\n"
+ "java -jar \"" + new File(mainFileName).getAbsolutePath() + "\" &\n"
+ "sleep 1" + "\n"
+ "rm -f " + batchPath + "\n";
batchExec = new String[] { "sh", batchPath };
}
// Create updater script
try (BufferedWriter bw = new BufferedWriter(new FileWriter(batchFile))) {
bw.write(script);
bw.flush();
}
logger.info("Saved update script to " + batchFile);
// Run updater script on exit
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
try {
logger.info("Executing: " + batchFile);
Runtime.getRuntime().exec(batchExec);
} catch (IOException e) {
//TODO implement proper stack trace handling this is really just intented as a placeholder until you implement proper error handling
e.printStackTrace();
} }
}));
logger.info("Exiting older version, should execute update script (" + batchFile + ") during exit"); // Create updater script
System.exit(0); try (BufferedWriter bw = new BufferedWriter(new FileWriter(batchFile))) {
bw.write(script);
bw.flush();
}
logger.info("Saved update script to " + batchFile);
// Run updater script on exit
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
try {
logger.info("Executing: " + batchFile);
Runtime.getRuntime().exec(batchExec);
} catch (IOException e) {
//TODO implement proper stack trace handling this is really just intented as a placeholder until you implement proper error handling
e.printStackTrace();
}
}));
logger.info("Exiting older version, should execute update script (" + batchFile + ") during exit");
System.exit(0);
} else {
new File(mainFileName).delete();
new File(updateFileName).renameTo(new File(mainFileName));
}
} }
} }